From 4c997eee21f9cde7705a5893f2087c2698e98a58 Mon Sep 17 00:00:00 2001 From: ScriptSorcerer Date: Thu, 24 Sep 2026 17:57:54 +0200 Subject: [PATCH] slop game oder so --- .claude/launch.json | 11 + .env.example | 24 + .gitignore | 31 + README.md | 218 ++ app/__init__.py | 89 + app/api.py | 168 ++ app/config.py | 177 ++ app/models.py | 296 +++ app/routes.py | 28 + .../kenney/audio/License-ImpactSounds.txt | 23 + .../kenney/audio/License-InterfaceSounds.txt | 22 + .../kenney/audio/License-MusicJingles.txt | 21 + .../kenney/audio/License-SciFiSounds.txt | 22 + app/static/assets/kenney/audio/click_001.ogg | Bin 0 -> 4876 bytes .../assets/kenney/audio/confirmation_001.ogg | Bin 0 -> 8968 bytes .../assets/kenney/audio/confirmation_002.ogg | Bin 0 -> 14169 bytes app/static/assets/kenney/audio/error_001.ogg | Bin 0 -> 7373 bytes .../kenney/audio/explosionCrunch_000.ogg | Bin 0 -> 28274 bytes .../kenney/audio/explosionCrunch_001.ogg | Bin 0 -> 47916 bytes .../kenney/audio/explosionCrunch_002.ogg | Bin 0 -> 47907 bytes .../kenney/audio/explosionCrunch_003.ogg | Bin 0 -> 54824 bytes .../kenney/audio/impactMetal_light_000.ogg | Bin 0 -> 7651 bytes .../kenney/audio/impactMetal_light_001.ogg | Bin 0 -> 6967 bytes .../kenney/audio/impactMetal_light_002.ogg | Bin 0 -> 6804 bytes .../kenney/audio/impactPlate_light_000.ogg | Bin 0 -> 10474 bytes .../kenney/audio/impactPunch_heavy_000.ogg | Bin 0 -> 11617 bytes .../kenney/audio/impactPunch_heavy_001.ogg | Bin 0 -> 10861 bytes .../kenney/audio/impactSoft_medium_000.ogg | Bin 0 -> 5351 bytes .../kenney/audio/impactSoft_medium_001.ogg | Bin 0 -> 5506 bytes .../kenney/audio/impactSoft_medium_002.ogg | Bin 0 -> 5358 bytes .../assets/kenney/audio/jingles_HIT11.ogg | Bin 0 -> 17932 bytes .../assets/kenney/audio/jingles_HIT15.ogg | Bin 0 -> 19626 bytes .../assets/kenney/audio/jingles_PIZZI07.ogg | Bin 0 -> 19137 bytes .../assets/kenney/audio/jingles_STEEL07.ogg | Bin 0 -> 22460 bytes .../assets/kenney/audio/laserLarge_000.ogg | Bin 0 -> 25566 bytes .../assets/kenney/audio/laserLarge_001.ogg | Bin 0 -> 26220 bytes .../assets/kenney/audio/laserRetro_000.ogg | Bin 0 -> 12588 bytes .../assets/kenney/audio/laserRetro_001.ogg | Bin 0 -> 12732 bytes .../assets/kenney/audio/laserRetro_002.ogg | Bin 0 -> 13130 bytes .../assets/kenney/audio/laserSmall_000.ogg | Bin 0 -> 7286 bytes .../assets/kenney/audio/laserSmall_001.ogg | Bin 0 -> 7448 bytes .../assets/kenney/audio/laserSmall_002.ogg | Bin 0 -> 8973 bytes .../assets/kenney/audio/laserSmall_003.ogg | Bin 0 -> 8179 bytes .../assets/kenney/audio/laserSmall_004.ogg | Bin 0 -> 8632 bytes .../audio/lowFrequency_explosion_000.ogg | Bin 0 -> 14317 bytes .../audio/lowFrequency_explosion_001.ogg | Bin 0 -> 9408 bytes .../assets/kenney/audio/maximize_001.ogg | Bin 0 -> 12111 bytes app/static/assets/kenney/audio/select_001.ogg | Bin 0 -> 5468 bytes app/static/assets/kenney/audio/slime_000.ogg | Bin 0 -> 20870 bytes app/static/assets/kenney/audio/slime_001.ogg | Bin 0 -> 159177 bytes app/static/assets/kenney/audio/tick_001.ogg | Bin 0 -> 4497 bytes .../assets/kenney/particles/License.txt | 23 + app/static/assets/kenney/particles/fire.png | Bin 0 -> 14479 bytes app/static/assets/kenney/particles/glow.png | Bin 0 -> 16354 bytes app/static/assets/kenney/particles/muzzle.png | Bin 0 -> 11976 bytes app/static/assets/kenney/particles/scorch.png | Bin 0 -> 11412 bytes app/static/assets/kenney/particles/smoke.png | Bin 0 -> 14742 bytes app/static/assets/kenney/particles/spark.png | Bin 0 -> 9834 bytes app/static/assets/kenney/tiles/License.txt | 21 + .../assets/kenney/tiles/ground_strip.png | Bin 0 -> 6837 bytes app/static/assets/sprites/blechsoldat.svg | 12 + app/static/assets/sprites/brutmutter.svg | 22 + app/static/assets/sprites/emblem.svg | 15 + app/static/assets/sprites/krabbler.svg | 14 + app/static/assets/sprites/nieter.svg | 14 + app/static/assets/sprites/president.svg | 21 + app/static/assets/sprites/sprungkralle.svg | 15 + app/static/assets/sprites/supply-pod.svg | 10 + app/static/assets/sprites/turret.svg | 8 + app/static/assets/sprites/walzmeister.svg | 23 + app/static/css/site.css | 231 ++ app/static/favicon.svg | 7 + app/static/js/config.js | 449 ++++ app/static/js/content/texts.js | 227 ++ app/static/js/entities/Deployables.js | 106 + app/static/js/entities/Enemy.js | 250 ++ app/static/js/entities/Player.js | 180 ++ app/static/js/entities/ProjectilePool.js | 78 + app/static/js/lib/PHASER_LICENSE.md | 20 + app/static/js/lib/phaser.min.js | 1 + app/static/js/logic/comboInput.js | 132 + app/static/js/logic/cooldowns.js | 72 + app/static/js/logic/enemyAi.js | 225 ++ app/static/js/logic/format.js | 94 + app/static/js/logic/marchPattern.js | 87 + app/static/js/logic/math.js | 137 ++ app/static/js/logic/rng.js | 69 + app/static/js/logic/scoring.js | 127 + app/static/js/logic/steering.js | 145 ++ app/static/js/logic/waveDirector.js | 111 + app/static/js/logic/waves.js | 230 ++ app/static/js/logic/weapon.js | 146 ++ app/static/js/main.js | 110 + app/static/js/scenes/BootScene.js | 47 + app/static/js/scenes/BriefingScene.js | 68 + app/static/js/scenes/DisclaimerScene.js | 56 + app/static/js/scenes/GameOverScene.js | 185 ++ app/static/js/scenes/GameScene.js | 664 +++++ app/static/js/scenes/HudScene.js | 292 +++ app/static/js/scenes/InfoScenes.js | 136 ++ app/static/js/scenes/MenuScene.js | 118 + app/static/js/scenes/PauseScene.js | 110 + app/static/js/systems/ApiClient.js | 129 + app/static/js/systems/Arena.js | 79 + app/static/js/systems/Assets.js | 76 + app/static/js/systems/AudioAssets.js | 87 + app/static/js/systems/AudioManager.js | 188 ++ app/static/js/systems/Effects.js | 237 ++ app/static/js/systems/GroundMarker.js | 85 + app/static/js/systems/Music.js | 130 + app/static/js/systems/OrbitalSystem.js | 179 ++ app/static/js/systems/Overlay.js | 121 + app/static/js/systems/Placeholders.js | 212 ++ app/static/js/systems/Settings.js | 157 ++ app/static/js/systems/Synth.js | 138 ++ app/static/js/systems/keyboard.js | 30 + app/static/js/ui/MenuList.js | 93 + app/static/js/ui/theme.js | 53 + app/templates/_disclaimer_content.html | 9 + app/templates/base.html | 14 + app/templates/disclaimer.html | 11 + app/templates/index.html | 23 + app/validation.py | 219 ++ docs/ARCHITECTURE.md | 180 ++ docs/ASSETS.md | 199 ++ docs/DEPLOYMENT_CPANEL.md | 175 ++ docs/GAME_DESIGN.md | 211 ++ docs/TESTING.md | 103 + docs/images/gameplay.png | Bin 0 -> 197062 bytes docs/images/menu.png | Bin 0 -> 110831 bytes eslint.config.js | 31 + package-lock.json | 2172 +++++++++++++++++ package.json | 23 + passenger_wsgi.py | 27 + pyproject.toml | 31 + requirements-dev.txt | 11 + requirements.txt | 4 + scripts/build_deploy_zip.py | 72 + scripts/vendor-phaser.mjs | 26 + tests/conftest.py | 79 + tests/e2e/test_smoke.py | 254 ++ tests/js/apiClient.test.js | 82 + tests/js/audio.test.js | 242 ++ tests/js/comboInput.test.js | 126 + tests/js/config.test.js | 114 + tests/js/cooldowns.test.js | 41 + tests/js/enemyAi.test.js | 165 ++ tests/js/format.test.js | 75 + tests/js/keyboard.test.js | 28 + tests/js/mathRng.test.js | 88 + tests/js/scoring.test.js | 88 + tests/js/settings.test.js | 100 + tests/js/steering.test.js | 110 + tests/js/waveDirector.test.js | 110 + tests/js/waves.test.js | 185 ++ tests/js/weapon.test.js | 129 + tests/test_api_highscores.py | 298 +++ tests/test_assets.py | 119 + tests/test_config.py | 122 + tests/test_deploy_zip.py | 86 + tests/test_models.py | 107 + tests/test_moderation.py | 140 ++ tests/test_passenger_wsgi.py | 85 + tests/test_routes.py | 127 + tests/test_validation.py | 94 + vitest.config.js | 9 + 166 files changed, 14976 insertions(+) create mode 100644 .claude/launch.json create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/api.py create mode 100644 app/config.py create mode 100644 app/models.py create mode 100644 app/routes.py create mode 100644 app/static/assets/kenney/audio/License-ImpactSounds.txt create mode 100644 app/static/assets/kenney/audio/License-InterfaceSounds.txt create mode 100644 app/static/assets/kenney/audio/License-MusicJingles.txt create mode 100644 app/static/assets/kenney/audio/License-SciFiSounds.txt create mode 100644 app/static/assets/kenney/audio/click_001.ogg create mode 100644 app/static/assets/kenney/audio/confirmation_001.ogg create mode 100644 app/static/assets/kenney/audio/confirmation_002.ogg create mode 100644 app/static/assets/kenney/audio/error_001.ogg create mode 100644 app/static/assets/kenney/audio/explosionCrunch_000.ogg create mode 100644 app/static/assets/kenney/audio/explosionCrunch_001.ogg create mode 100644 app/static/assets/kenney/audio/explosionCrunch_002.ogg create mode 100644 app/static/assets/kenney/audio/explosionCrunch_003.ogg create mode 100644 app/static/assets/kenney/audio/impactMetal_light_000.ogg create mode 100644 app/static/assets/kenney/audio/impactMetal_light_001.ogg create mode 100644 app/static/assets/kenney/audio/impactMetal_light_002.ogg create mode 100644 app/static/assets/kenney/audio/impactPlate_light_000.ogg create mode 100644 app/static/assets/kenney/audio/impactPunch_heavy_000.ogg create mode 100644 app/static/assets/kenney/audio/impactPunch_heavy_001.ogg create mode 100644 app/static/assets/kenney/audio/impactSoft_medium_000.ogg create mode 100644 app/static/assets/kenney/audio/impactSoft_medium_001.ogg create mode 100644 app/static/assets/kenney/audio/impactSoft_medium_002.ogg create mode 100644 app/static/assets/kenney/audio/jingles_HIT11.ogg create mode 100644 app/static/assets/kenney/audio/jingles_HIT15.ogg create mode 100644 app/static/assets/kenney/audio/jingles_PIZZI07.ogg create mode 100644 app/static/assets/kenney/audio/jingles_STEEL07.ogg create mode 100644 app/static/assets/kenney/audio/laserLarge_000.ogg create mode 100644 app/static/assets/kenney/audio/laserLarge_001.ogg create mode 100644 app/static/assets/kenney/audio/laserRetro_000.ogg create mode 100644 app/static/assets/kenney/audio/laserRetro_001.ogg create mode 100644 app/static/assets/kenney/audio/laserRetro_002.ogg create mode 100644 app/static/assets/kenney/audio/laserSmall_000.ogg create mode 100644 app/static/assets/kenney/audio/laserSmall_001.ogg create mode 100644 app/static/assets/kenney/audio/laserSmall_002.ogg create mode 100644 app/static/assets/kenney/audio/laserSmall_003.ogg create mode 100644 app/static/assets/kenney/audio/laserSmall_004.ogg create mode 100644 app/static/assets/kenney/audio/lowFrequency_explosion_000.ogg create mode 100644 app/static/assets/kenney/audio/lowFrequency_explosion_001.ogg create mode 100644 app/static/assets/kenney/audio/maximize_001.ogg create mode 100644 app/static/assets/kenney/audio/select_001.ogg create mode 100644 app/static/assets/kenney/audio/slime_000.ogg create mode 100644 app/static/assets/kenney/audio/slime_001.ogg create mode 100644 app/static/assets/kenney/audio/tick_001.ogg create mode 100644 app/static/assets/kenney/particles/License.txt create mode 100644 app/static/assets/kenney/particles/fire.png create mode 100644 app/static/assets/kenney/particles/glow.png create mode 100644 app/static/assets/kenney/particles/muzzle.png create mode 100644 app/static/assets/kenney/particles/scorch.png create mode 100644 app/static/assets/kenney/particles/smoke.png create mode 100644 app/static/assets/kenney/particles/spark.png create mode 100644 app/static/assets/kenney/tiles/License.txt create mode 100644 app/static/assets/kenney/tiles/ground_strip.png create mode 100644 app/static/assets/sprites/blechsoldat.svg create mode 100644 app/static/assets/sprites/brutmutter.svg create mode 100644 app/static/assets/sprites/emblem.svg create mode 100644 app/static/assets/sprites/krabbler.svg create mode 100644 app/static/assets/sprites/nieter.svg create mode 100644 app/static/assets/sprites/president.svg create mode 100644 app/static/assets/sprites/sprungkralle.svg create mode 100644 app/static/assets/sprites/supply-pod.svg create mode 100644 app/static/assets/sprites/turret.svg create mode 100644 app/static/assets/sprites/walzmeister.svg create mode 100644 app/static/css/site.css create mode 100644 app/static/favicon.svg create mode 100644 app/static/js/config.js create mode 100644 app/static/js/content/texts.js create mode 100644 app/static/js/entities/Deployables.js create mode 100644 app/static/js/entities/Enemy.js create mode 100644 app/static/js/entities/Player.js create mode 100644 app/static/js/entities/ProjectilePool.js create mode 100644 app/static/js/lib/PHASER_LICENSE.md create mode 100644 app/static/js/lib/phaser.min.js create mode 100644 app/static/js/logic/comboInput.js create mode 100644 app/static/js/logic/cooldowns.js create mode 100644 app/static/js/logic/enemyAi.js create mode 100644 app/static/js/logic/format.js create mode 100644 app/static/js/logic/marchPattern.js create mode 100644 app/static/js/logic/math.js create mode 100644 app/static/js/logic/rng.js create mode 100644 app/static/js/logic/scoring.js create mode 100644 app/static/js/logic/steering.js create mode 100644 app/static/js/logic/waveDirector.js create mode 100644 app/static/js/logic/waves.js create mode 100644 app/static/js/logic/weapon.js create mode 100644 app/static/js/main.js create mode 100644 app/static/js/scenes/BootScene.js create mode 100644 app/static/js/scenes/BriefingScene.js create mode 100644 app/static/js/scenes/DisclaimerScene.js create mode 100644 app/static/js/scenes/GameOverScene.js create mode 100644 app/static/js/scenes/GameScene.js create mode 100644 app/static/js/scenes/HudScene.js create mode 100644 app/static/js/scenes/InfoScenes.js create mode 100644 app/static/js/scenes/MenuScene.js create mode 100644 app/static/js/scenes/PauseScene.js create mode 100644 app/static/js/systems/ApiClient.js create mode 100644 app/static/js/systems/Arena.js create mode 100644 app/static/js/systems/Assets.js create mode 100644 app/static/js/systems/AudioAssets.js create mode 100644 app/static/js/systems/AudioManager.js create mode 100644 app/static/js/systems/Effects.js create mode 100644 app/static/js/systems/GroundMarker.js create mode 100644 app/static/js/systems/Music.js create mode 100644 app/static/js/systems/OrbitalSystem.js create mode 100644 app/static/js/systems/Overlay.js create mode 100644 app/static/js/systems/Placeholders.js create mode 100644 app/static/js/systems/Settings.js create mode 100644 app/static/js/systems/Synth.js create mode 100644 app/static/js/systems/keyboard.js create mode 100644 app/static/js/ui/MenuList.js create mode 100644 app/static/js/ui/theme.js create mode 100644 app/templates/_disclaimer_content.html create mode 100644 app/templates/base.html create mode 100644 app/templates/disclaimer.html create mode 100644 app/templates/index.html create mode 100644 app/validation.py create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/ASSETS.md create mode 100644 docs/DEPLOYMENT_CPANEL.md create mode 100644 docs/GAME_DESIGN.md create mode 100644 docs/TESTING.md create mode 100644 docs/images/gameplay.png create mode 100644 docs/images/menu.png create mode 100644 eslint.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 passenger_wsgi.py create mode 100644 pyproject.toml create mode 100644 requirements-dev.txt create mode 100644 requirements.txt create mode 100644 scripts/build_deploy_zip.py create mode 100644 scripts/vendor-phaser.mjs create mode 100644 tests/conftest.py create mode 100644 tests/e2e/test_smoke.py create mode 100644 tests/js/apiClient.test.js create mode 100644 tests/js/audio.test.js create mode 100644 tests/js/comboInput.test.js create mode 100644 tests/js/config.test.js create mode 100644 tests/js/cooldowns.test.js create mode 100644 tests/js/enemyAi.test.js create mode 100644 tests/js/format.test.js create mode 100644 tests/js/keyboard.test.js create mode 100644 tests/js/mathRng.test.js create mode 100644 tests/js/scoring.test.js create mode 100644 tests/js/settings.test.js create mode 100644 tests/js/steering.test.js create mode 100644 tests/js/waveDirector.test.js create mode 100644 tests/js/waves.test.js create mode 100644 tests/js/weapon.test.js create mode 100644 tests/test_api_highscores.py create mode 100644 tests/test_assets.py create mode 100644 tests/test_config.py create mode 100644 tests/test_deploy_zip.py create mode 100644 tests/test_models.py create mode 100644 tests/test_moderation.py create mode 100644 tests/test_passenger_wsgi.py create mode 100644 tests/test_routes.py create mode 100644 tests/test_validation.py create mode 100644 vitest.config.js diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..5d8cf8b --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "glory-defense", + "runtimeExecutable": ".venv/Scripts/python.exe", + "runtimeArgs": ["-m", "flask", "run", "--port", "5057", "--debug"], + "port": 5057 + } + ] +} diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..272c8a6 --- /dev/null +++ b/.env.example @@ -0,0 +1,24 @@ +# Beispielkonfiguration für Glory Defense. +# Kopieren nach ".env" (lokal) oder die Werte in cPanel unter +# "Setup Python App" -> "Environment variables" eintragen. + +# Geheimer Schlüssel zum Signieren der Run-Tokens und zum Hashen von IP-Adressen. +# Erzeugen z. B. mit: python -c "import secrets; print(secrets.token_hex(32))" +# Bleibt er leer, erzeugt die App beim ersten Start instance/secret_key. +SECRET_KEY= + +# Pfad zur SQLite-Datenbank. Relative Pfade gelten relativ zum Projektordner. +GLORY_DB_PATH=instance/glory_defense.sqlite3 + +# Rate-Limit für neue Highscore-Einträge: maximal GLORY_RATE_LIMIT_MAX Versuche +# pro Client innerhalb von GLORY_RATE_LIMIT_WINDOW Sekunden. +GLORY_RATE_LIMIT_MAX=5 +GLORY_RATE_LIMIT_WINDOW=600 + +# Nur auf "1" setzen, wenn ein Reverse-Proxy X-Forwarded-For-Header setzt, denen +# vertraut werden kann. Bei cPanel/Passenger normalerweise nicht nötig. +GLORY_TRUST_PROXY=0 + +# Optionale Sperrliste für Namen auf der Ehrentafel (ein Begriff pro Zeile, # = Kommentar). +# Fehlt die Datei, ist nichts gesperrt. Relative Pfade gelten ab Projektordner. +GLORY_NAME_BLOCKLIST=instance/name_blocklist.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b1ccda --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Python +__pycache__/ +*.py[cod] +.venv/ +venv/ +.pytest_cache/ +.ruff_cache/ + +# Laufzeitdaten (SQLite-Datenbank, automatisch erzeugter Schlüssel) +instance/ +*.sqlite3 +.env + +# Upload-Paket (scripts/build_deploy_zip.py) +dist/ + +# Node / Tests +node_modules/ +test-results/ +playwright-report/ +coverage/ + +# cPanel / Passenger +tmp/ +stderr.log + +# Editor / OS +.vscode/ +.idea/ +Thumbs.db +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea8f822 --- /dev/null +++ b/README.md @@ -0,0 +1,218 @@ +# Glory Defense + +**Für Freiheit und Frieden!** – Ein satirischer 2D-Browser-Shooter in Draufsicht. +Als *Präsident Maximilian Valor* verteidigt man die „Vereinigte Erde“ gegen +außerirdische Invasoren, begleitet von pathetischen Durchsagen des „Ministeriums +für Zuversicht“. Der Humor richtet sich gegen Militarismus und Propaganda im +Allgemeinen. Alle Figuren und Organisationen sind frei erfunden (siehe +[Disclaimer](#disclaimer)). + +![Hauptmenü](docs/images/menu.png) +![Spielszene](docs/images/gameplay.png) + +- **Frontend:** Phaser 3.90 (lokal eingebunden, kein CDN), native ES-Module, kein Build-Schritt +- **Backend:** Flask (monolithisch), SQLite, kleine JSON-API für Highscores +- **Hosting:** läuft auf cPanel über „Setup Python App“ (Phusion Passenger) + +## Inhalt + +- [Spielprinzip](#spielprinzip) +- [Steuerung](#steuerung) +- [Lokales Setup](#lokales-setup) +- [Starten](#starten) +- [Tests](#tests) +- [Projektstruktur](#projektstruktur) +- [Konfiguration](#konfiguration) +- [Weitere Dokumentation](#weitere-dokumentation) +- [Disclaimer](#disclaimer) + +## Spielprinzip + +- **Wellen-Modus:** endlose Angriffswellen mit steigender Schwierigkeit, dazwischen + kurze Pausen mit Propaganda-Durchsage, Wellenbonus und etwas Heilung. +- **Zwei Fraktionen mit je drei Gegnertypen:** + - *Die Schwärmer* (insektoid, schnell, Nahkampf): Krabbler, Sprungkralle, Brutmutter + - *Die Blechlegion* (Roboter, langsam, Fernkampf): Nieter-Drohne, Blechsoldat, Walzmeister +- **Gegner-KI:** verfolgen, umzingeln, Abstand halten, flankieren, Sprungangriff mit + Vorwarnung, Mörser mit Bodenmarkierung. +- **Drei Waffen:** Karabiner »Zuversicht«, Schrotflinte »Überzeugungskraft« und die + Dienstpistole »Anstand« mit unbegrenzter Munition. +- **Orbital-Befehle** per Tastenkombination (Q halten): Orbitalschlag »Morgenröte«, + Nachschubkapsel »Fürsorgepaket« und Geschütz »Wachsamer Nachbar«. Alle mit + Abklingzeit und Bodenmarkierung bis zum Einschlag. +- **Punkte:** Abschüsse in schneller Folge bauen eine Serie auf (Multiplikator bis ×4). + Treffer am Präsidenten beenden sie. +- **Ehrentafel:** Top 10 werden auf dem Server gespeichert (mit Plausibilitätsprüfung + und Rate-Limit). + +Details und alle Balancing-Werte: [docs/GAME_DESIGN.md](docs/GAME_DESIGN.md). + +## Steuerung + +| Taste | Aktion | +|---|---| +| **W A S D** | Bewegen (8 Richtungen) | +| **Maus** | Zielen | +| **Linksklick** | Schießen (Karabiner: gedrückt halten) | +| **R** | Nachladen | +| **1 / 2 / 3**, **Mausrad** | Waffe wechseln | +| **Leertaste** | Ausweichrolle (kurz unverwundbar, 1,5 s Abklingzeit) | +| **Q halten + Pfeiltasten oder WASD** | Orbital-Befehl eingeben, Ziel ist der Mauszeiger | +| **Esc** | Pause mit Lautstärkereglern | + +| Orbital-Befehl | Code | Abklingzeit | +|---|---|---| +| Orbitalschlag »Morgenröte« | ↑ → ↓ ↓ | 30 s | +| Nachschubkapsel »Fürsorgepaket« | ← ← ↓ → | 45 s | +| Geschütz »Wachsamer Nachbar« | → ← → ↑ ↑ | 60 s | + +Warum **Q** als Halte-Taste: Mit gehaltener **Strg** würde **W** den Browser-Tab +schließen (lässt sich nicht abfangen), und fünfmal **Shift** öffnet unter Windows die +Einrastfunktion. + +## Lokales Setup + +Voraussetzungen: + +- **Python 3.10 oder neuer** (für Server und Python-Tests) +- optional **Node.js 22 (ab 22.13) oder 24** (nur für JavaScript-Unit-Tests und ESLint) +- optional **Microsoft Edge oder Google Chrome** (für die End-to-End-Tests) + +Fürs Spielen und für den Server-Betrieb ist Node nicht nötig: Phaser liegt bereits +unter `app/static/js/lib/`. + +**Windows (PowerShell):** + +```powershell +python -m venv .venv +.\.venv\Scripts\Activate.ps1 +python -m pip install -r requirements-dev.txt +Copy-Item .env.example .env +``` + +Blockiert Windows `Activate.ps1` („Die Ausführung von Skripts ist auf diesem System +deaktiviert“), gibt es zwei Wege: + +- die Ausführungsrichtlinie nur für den eigenen Benutzer lockern: + `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`, oder +- ohne Aktivierung arbeiten und jeden Befehl über den Python der venv aufrufen: + `.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt`, + `.\.venv\Scripts\python.exe -m flask run`, `.\.venv\Scripts\python.exe -m pytest`. + +**Linux/macOS:** + +```bash +python3 -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements-dev.txt +cp .env.example .env +``` + +In `.env` einen eigenen `SECRET_KEY` eintragen, zum Beispiel erzeugt mit: + +```bash +python -c "import secrets; print(secrets.token_hex(32))" +``` + +Bleibt `SECRET_KEY` leer, erzeugt die App beim ersten Start automatisch +`instance/secret_key`. Für die JavaScript-Werkzeuge (optional): + +```bash +npm install +``` + +## Starten + +Bei aktivierter venv: + +```bash +flask run +``` + +Dann öffnen. Mit `flask run --debug` lädt der Server bei +Codeänderungen neu. Die Datenbank (`instance/glory_defense.sqlite3`) wird beim +ersten Start automatisch angelegt. Nachträglich geht das auch mit `flask init-db`. + +Weitere Adressen: + +- `/disclaimer`: Disclaimer als eigene Seite (auch ohne JavaScript lesbar) +- `/api/highscores`: Top 10 als JSON +- `/healthz`: Funktionstest für das Deployment + +## Tests + +Kurzfassung. Die Details stehen in [docs/TESTING.md](docs/TESTING.md). + +```bash +pytest # Backend, Assets, Passenger-Import und End-to-End im Browser +pytest -m "not e2e" # ohne Browser-Tests +npm test # JavaScript-Unit-Tests (Vitest) +ruff check . +ruff format --check . +npm run lint # ESLint +``` + +## Projektstruktur + +``` +passenger_wsgi.py Einstiegspunkt für Phusion Passenger (cPanel) +app/ + __init__.py App-Factory, Security-Header, Fehlerbehandlung + config.py Konfiguration aus Umgebungsvariablen, Plausibilitätsgrenzen + routes.py Seiten: /, /disclaimer, /healthz + api.py JSON-API: /api/highscores, /api/runs + models.py SQLite: Schema, Highscores, Rate-Limit, Run-Tokens, CLI (flask scores …) + validation.py Namensbereinigung und Plausibilitätsprüfung + templates/ HTML (Disclaimer-Text liegt nur einmal vor) + static/ + css/site.css + js/main.js Start: Dienste bauen, Phaser konfigurieren + js/config.js ALLE Balancing-Werte + js/content/texts.js Alle Texte (Durchsagen, Briefings, Credits …) + js/logic/ Reine Spiellogik ohne Phaser (per Vitest getestet) + js/scenes/ Boot, Menü, Disclaimer, Briefing, Spiel, HUD, Pause, Game Over … + js/entities/ Präsident, Gegner, Projektile, Geschütz, Kapsel + js/systems/ Orbital-Befehle, Effekte, Audio, Assets, Overlays, API-Client … + js/lib/phaser.min.js Phaser 3.90.0 (MIT) + assets/ Grafiken und Klänge (siehe docs/ASSETS.md) +tests/ pytest (Backend, Assets, Passenger), tests/js (Vitest), tests/e2e (Playwright) +docs/ Architektur, Game Design, Deployment, Assets, Testing +scripts/vendor-phaser.mjs kopiert Phaser aus node_modules nach app/static/js/lib +scripts/build_deploy_zip.py baut das Upload-Paket für cPanel (dist/glory_defense.zip) +``` + +## Konfiguration + +| Umgebungsvariable | Standard | Bedeutung | +|---|---|---| +| `SECRET_KEY` | automatisch (`instance/secret_key`) | signiert Run-Tokens, hasht IP-Adressen für das Rate-Limit | +| `GLORY_DB_PATH` | `instance/glory_defense.sqlite3` | SQLite-Datei; relative Pfade gelten ab Projektordner | +| `GLORY_RATE_LIMIT_MAX` | `5` | Highscore-Einreichungen pro Client … | +| `GLORY_RATE_LIMIT_WINDOW` | `600` | … innerhalb dieser Sekunden | +| `GLORY_TRUST_PROXY` | `0` | `1` nur hinter einem vertrauenswürdigen Reverse-Proxy | +| `GLORY_NAME_BLOCKLIST` | `instance/name_blocklist.txt` | optionale Sperrliste für Namen auf der Ehrentafel | + +Spielwerte (Leben, Schaden, Wellen, Abklingzeiten …) stehen zentral in +`app/static/js/config.js`. + +## Weitere Dokumentation + +- [docs/DEPLOYMENT_CPANEL.md](docs/DEPLOYMENT_CPANEL.md): Schritt-für-Schritt-Anleitung für cPanel +- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md): Aufbau von Backend und Frontend, Szenenfluss +- [docs/GAME_DESIGN.md](docs/GAME_DESIGN.md): Gegner, Waffen, Orbital-Befehle, Balancing +- [docs/ASSETS.md](docs/ASSETS.md): Quellen und Lizenzen aller Grafiken und Klänge +- [docs/TESTING.md](docs/TESTING.md): Tests ausführen und erweitern + +## Disclaimer + +Glory Defense ist **Satire und reine Fiktion**. Alle Figuren, Staaten, Organisationen +und Fraktionen sind frei erfunden. Ähnlichkeiten mit realen Personen, lebend oder +verstorben, sind nicht beabsichtigt und rein zufällig. Das Spiel vertritt keine +politische Position und richtet sich nicht gegen reale Parteien, Politikerinnen und +Politiker oder Länder. Die übertriebenen Durchsagen sind Gegenstand der Satire, nicht +ihre Botschaft. + +Grafiken und Klänge stammen aus eigenen Entwürfen (CC0) und von +[Kenney](https://kenney.nl) (CC0). Schriften sind Systemschriften und werden nicht +mitgeliefert. Phaser steht unter der MIT-Lizenz. Details in +[docs/ASSETS.md](docs/ASSETS.md). diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..a121836 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,89 @@ +"""Glory Defense – Flask-App-Factory. + +Die App ist bewusst monolithisch und zustandslos (Zustand nur in SQLite), damit sie +unter Phusion Passenger mit mehreren Prozessen und ohne Hintergrunddienste läuft. +""" + +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any + +from flask import Flask, Response, jsonify, request +from werkzeug.exceptions import HTTPException +from werkzeug.middleware.proxy_fix import ProxyFix + +from . import api, models, routes +from .config import INSTANCE_DIR, load_config + +#: Content-Security-Policy: Skripte nur vom eigenen Server (Phaser liegt lokal). +#: ``blob:``/``data:`` braucht Phaser, weil es geladene Bilder, SVGs und Audio als +#: Blob-URLs dekodiert und eingebaute Standardtexturen als Data-URLs mitbringt. +CONTENT_SECURITY_POLICY = "; ".join( + [ + "default-src 'self'", + "script-src 'self'", + "style-src 'self' 'unsafe-inline'", + "img-src 'self' data: blob:", + "media-src 'self' data: blob:", + "font-src 'self' data:", + "connect-src 'self' data: blob:", + "worker-src 'self' blob:", + "object-src 'none'", + "base-uri 'self'", + "form-action 'self'", + "frame-ancestors 'self'", + ] +) + + +def _apply_security_headers(response: Response) -> Response: + response.headers.setdefault("Content-Security-Policy", CONTENT_SECURITY_POLICY) + response.headers.setdefault("X-Content-Type-Options", "nosniff") + response.headers.setdefault("Referrer-Policy", "same-origin") + response.headers.setdefault("X-Frame-Options", "SAMEORIGIN") + return response + + +def _handle_http_error(exc: HTTPException) -> Response | HTTPException: + """API-Pfade bekommen Fehler als JSON, damit das Frontend sie einheitlich auswerten kann.""" + if request.path.startswith("/api/"): + body: dict[str, Any] = { + "error": (exc.name or "error").lower().replace(" ", "_"), + "message": exc.description or "", + } + response = jsonify(body) + response.status_code = exc.code or 500 + return response + return exc + + +def create_app(test_config: Mapping[str, Any] | None = None) -> Flask: + """Erzeugt und konfiguriert die Flask-App. + + Args: + test_config: Optionale Konfigurationswerte mit Vorrang vor den + Umgebungsvariablen (vor allem für Tests). + + Returns: + Die fertig konfigurierte Flask-Anwendung. + """ + app = Flask(__name__, instance_path=str(INSTANCE_DIR)) + app.config.from_mapping(load_config(test_config)) + + # Antworten in der Reihenfolge, in der der Code die Felder aufbaut (lesbarer). + app.json.sort_keys = False # type: ignore[attr-defined] + + if app.config["TRUST_PROXY"]: + # Nur hinter einem vertrauenswürdigen Proxy aktivieren, sonst könnten Clients + # ihre IP (und damit das Rate-Limit) per Header fälschen. Übernommen werden nur + # Client-IP und Protokoll: Host und Pfadpräfix aus Headern landeten sonst in den + # erzeugten URLs (z. B. X-Forwarded-Prefix: //fremde.domain). + app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1) # type: ignore[method-assign] + + models.init_app(app) + app.register_blueprint(routes.bp) + app.register_blueprint(api.bp) + app.after_request(_apply_security_headers) + app.register_error_handler(HTTPException, _handle_http_error) + return app diff --git a/app/api.py b/app/api.py new file mode 100644 index 0000000..55c253d --- /dev/null +++ b/app/api.py @@ -0,0 +1,168 @@ +"""JSON-API: Highscores lesen/einreichen und Run-Tokens ausgeben. + +Ablauf einer Einreichung: +1. Beim Spielstart holt das Frontend per ``POST /api/runs`` ein signiertes Run-Token. +2. Nach dem Game Over schickt es Name, Punkte, Welle, Spieldauer und das Token. +3. Der Server prüft Rate-Limit, Format, Token (Signatur, Alter, Einmaligkeit) und + Plausibilität, bevor er speichert. +""" + +from __future__ import annotations + +import hashlib +import hmac +import time +import uuid +from datetime import datetime, timezone + +from flask import Blueprint, Response, current_app, jsonify, request +from itsdangerous import BadSignature, SignatureExpired, URLSafeTimedSerializer + +from .config import ensure_secret_key +from .models import ( + consume_run_token, + get_db, + immediate_transaction, + insert_score, + rank_of, + register_submission_attempt, + top_scores, +) +from .validation import ( + PlausibilityRules, + SubmissionError, + check_plausibility, + is_name_blocked, + load_blocklist, + parse_submission, +) + +bp = Blueprint("api", __name__, url_prefix="/api") + +#: Salt trennt Run-Tokens von anderen Signaturen, die denselben SECRET_KEY nutzen könnten. +RUN_TOKEN_SALT = "glory-defense.run-token.v1" # noqa: S105 (Salt, kein Passwort) + + +def _now() -> float: + """Aktuelle Unix-Zeit; eigene Funktion, damit Tests die Uhr gezielt verstellen können.""" + return time.time() + + +def _serializer() -> URLSafeTimedSerializer: + return URLSafeTimedSerializer(ensure_secret_key(current_app.config), salt=RUN_TOKEN_SALT) + + +def _client_hash() -> str: + """HMAC der Client-IP: genug, um Clients zu unterscheiden, ohne IPs zu speichern.""" + address = request.remote_addr or "unknown" + key = ensure_secret_key(current_app.config).encode("utf-8") + return hmac.new(key, address.encode("utf-8"), hashlib.sha256).hexdigest() + + +def error_response(status: int, code: str, message: str, **extra: object) -> tuple[Response, int]: + """Einheitliches Fehlerformat: ``{"error": code, "message": text, ...}``.""" + return jsonify({"error": code, "message": message, **extra}), status + + +def _no_store(response: Response) -> Response: + # Highscores ändern sich laufend; Browser und Proxies sollen sie nicht zwischenspeichern. + response.headers["Cache-Control"] = "no-store" + return response + + +@bp.post("/runs") +def start_run() -> tuple[Response, int]: + """Gibt ein signiertes Run-Token für eine neue Spielrunde aus.""" + token = _serializer().dumps({"rid": uuid.uuid4().hex}) + return _no_store(jsonify({"run_token": token})), 201 + + +@bp.get("/highscores") +def list_highscores() -> Response: + """Liefert die Top-N-Highscores.""" + scores = top_scores(get_db(), current_app.config["HIGHSCORE_TOP_N"]) + return _no_store(jsonify({"highscores": scores})) + + +@bp.post("/highscores") +def submit_highscore() -> tuple[Response, int]: + """Nimmt einen neuen Highscore entgegen (Details siehe Moduldokumentation).""" + config = current_app.config + db = get_db() + now = _now() + + # Das Rate-Limit greift vor allem anderen, damit auch fehlerhafte Anfragen zählen. + allowed, retry_after = register_submission_attempt( + db, + _client_hash(), + now, + window_s=config["RATE_LIMIT_WINDOW_SECONDS"], + max_attempts=config["RATE_LIMIT_MAX_SUBMISSIONS"], + ) + if not allowed: + response, status = error_response( + 429, + "rate_limited", + "Zu viele Einreichungen. Bitte später erneut versuchen.", + retry_after=retry_after, + ) + response.headers["Retry-After"] = str(retry_after) + return response, status + + payload = request.get_json(silent=True) + if not isinstance(payload, dict): + return error_response(400, "invalid_json", "Erwartet wird ein JSON-Objekt.") + + rules = PlausibilityRules.from_config(config) + try: + submission = parse_submission(payload, rules) + except SubmissionError as exc: + return error_response(400, "validation_failed", "Ungültige Eingaben.", fields=exc.fields) + + # Optionale Sperrliste des Betreibers (z. B. Namen realer Personen, Beleidigungen). + if is_name_blocked(submission.name, load_blocklist(config["NAME_BLOCKLIST_PATH"])): + return error_response( + 400, + "validation_failed", + "Ungültige Eingaben.", + fields={"name": "Dieser Name ist nicht zulässig."}, + ) + + try: + token_data, issued_at = _serializer().loads( + submission.run_token, + max_age=config["RUN_TOKEN_MAX_AGE_SECONDS"], + return_timestamp=True, + ) + except SignatureExpired: + return error_response(422, "run_token_expired", "Das Run-Token ist abgelaufen.") + except BadSignature: + return error_response(422, "run_token_invalid", "Das Run-Token ist ungültig.") + + run_id = token_data.get("rid") if isinstance(token_data, dict) else None + if not isinstance(run_id, str): + return error_response(422, "run_token_invalid", "Das Run-Token ist ungültig.") + + elapsed_s = (datetime.now(timezone.utc) - issued_at).total_seconds() + reason = check_plausibility(submission, elapsed_s, rules) + if reason is not None: + return error_response(422, "implausible_score", reason) + + # Token einlösen und speichern gehören zusammen: Scheitert das Speichern, + # darf das Token nicht verbraucht sein. + with immediate_transaction(db): + if not consume_run_token(db, run_id, now, config["RUN_TOKEN_MAX_AGE_SECONDS"]): + return error_response( + 409, "run_token_used", "Für diese Runde wurde bereits ein Highscore gespeichert." + ) + score_id = insert_score( + db, submission.name, submission.score, submission.wave, submission.duration_s + ) + + body = { + "id": score_id, + "rank": rank_of(db, score_id), + "name": submission.name, + "highscores": top_scores(db, config["HIGHSCORE_TOP_N"]), + } + return _no_store(jsonify(body)), 201 diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..e3f934c --- /dev/null +++ b/app/config.py @@ -0,0 +1,177 @@ +"""Konfiguration der Anwendung. + +Alle Werte kommen aus Umgebungsvariablen, damit dieselbe Codebasis lokal (``.env``) +und auf cPanel (Umgebungsvariablen in „Setup Python App“) unverändert läuft. +""" + +from __future__ import annotations + +import logging +import os +import secrets +import time +from collections.abc import Mapping, MutableMapping +from pathlib import Path +from typing import Any + +#: Projektordner (enthält ``passenger_wsgi.py``). Alle relativen Pfade werden hieran +#: verankert, weil Passenger die App nicht zwingend aus diesem Ordner heraus startet. +PROJECT_ROOT: Path = Path(__file__).resolve().parent.parent +INSTANCE_DIR: Path = PROJECT_ROOT / "instance" +DEFAULT_DB_PATH: Path = INSTANCE_DIR / "glory_defense.sqlite3" +SECRET_KEY_FILE: Path = INSTANCE_DIR / "secret_key" +#: Optionale Sperrliste für Spielernamen (ein Begriff pro Zeile). Fehlt sie, ist nichts gesperrt. +DEFAULT_BLOCKLIST_PATH: Path = INSTANCE_DIR / "name_blocklist.txt" + +#: Maximale Größe eines Requests. Highscore-Einträge sind winzig; alles darüber ist Missbrauch. +MAX_CONTENT_LENGTH_BYTES = 16 * 1024 + +#: Grenzen für die Plausibilitätsprüfung eingereichter Punktestände. +#: Absichtlich großzügig: Die Spiellogik läuft im Browser, der Server kann deshalb nur +#: offensichtlich unmögliche Werte aussortieren, echtes Cheaten aber nicht verhindern. +#: Die Werte sind auf die Balancing-Werte in ``app/static/js/config.js`` abgestimmt +#: (Herleitung in ``docs/GAME_DESIGN.md``). +GAME_RULE_DEFAULTS: dict[str, int] = { + "HIGHSCORE_TOP_N": 10, + "SCORE_MAX": 50_000_000, + # Sockel, damit sehr kurze Runden mit einem Glückstreffer nicht abgelehnt werden. + "SCORE_FLAT_ALLOWANCE": 2_000, + # Obergrenze für den Punkte-Durchschnitt über die gesamte Runde (realistisch 15–120/s). + "SCORE_MAX_POINTS_PER_SECOND": 200, + "WAVE_MAX": 999, + # Jede abgeschlossene Welle kostet mindestens diese Zeit (Pause zwischen den Wellen). + "WAVE_MIN_SECONDS": 5, + "DURATION_MAX_SECONDS": 6 * 60 * 60, + # Spielraum für Uhren- und Netzwerkabweichungen beim Vergleich mit der Token-Zeit. + "DURATION_TOLERANCE_SECONDS": 30, + # Ein Run-Token muss innerhalb dieser Zeit eingelöst werden. + "RUN_TOKEN_MAX_AGE_SECONDS": 6 * 60 * 60 + 30 * 60, +} + +logger = logging.getLogger(__name__) + + +def resolve_project_path(value: str | os.PathLike[str]) -> Path: + """Löst ``value`` relativ zum Projektordner auf, absolute Pfade bleiben unverändert. + + Das aktuelle Arbeitsverzeichnis wird bewusst ignoriert: Unter Passenger ist es nicht + garantiert der Projektordner, und eine Datenbank „irgendwo“ wäre ein stiller Fehler. + """ + path = Path(value).expanduser() + return path if path.is_absolute() else PROJECT_ROOT / path + + +def env_int(name: str, default: int, minimum: int = 0) -> int: + """Liest eine ganzzahlige Umgebungsvariable mit Standardwert und Untergrenze. + + Raises: + ValueError: Wenn der Wert keine ganze Zahl ist oder unter ``minimum`` liegt. + Lieber beim Start laut scheitern als mit einer kaputten Konfiguration laufen. + """ + raw = os.environ.get(name, "").strip() + if not raw: + return default + try: + value = int(raw) + except ValueError as exc: + raise ValueError(f"Umgebungsvariable {name} muss eine ganze Zahl sein: {raw!r}") from exc + if value < minimum: + raise ValueError(f"Umgebungsvariable {name} muss mindestens {minimum} sein: {value}") + return value + + +def env_bool(name: str, default: bool) -> bool: + """Liest eine boolesche Umgebungsvariable (``1``, ``true``, ``yes``, ``on``, ``ja``).""" + raw = os.environ.get(name, "").strip().lower() + if not raw: + return default + return raw in {"1", "true", "yes", "on", "ja"} + + +def load_or_create_secret_key(path: Path = SECRET_KEY_FILE) -> str: + """Liefert einen dauerhaft gespeicherten Zufallsschlüssel und legt ihn bei Bedarf an. + + Warum eine Datei statt eines Zufallswerts pro Start: Passenger betreibt mehrere + Prozesse parallel. Ein Run-Token, das Prozess A signiert, muss Prozess B prüfen + können – dafür brauchen alle Prozesse denselben Schlüssel. + """ + existing = _read_secret(path) + if existing: + return existing + + path.parent.mkdir(parents=True, exist_ok=True) + key = secrets.token_hex(32) + try: + # O_EXCL macht das Anlegen atomar: Starten zwei Prozesse gleichzeitig, gewinnt einer. + fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600) + except FileExistsError: + return _wait_for_secret(path) + with os.fdopen(fd, "w", encoding="utf-8") as handle: + handle.write(key) + return key + + +def _read_secret(path: Path) -> str: + try: + return path.read_text(encoding="utf-8").strip() + except FileNotFoundError: + return "" + + +def _wait_for_secret(path: Path, attempts: int = 20, delay_s: float = 0.05) -> str: + """Wartet kurz, bis ein parallel startender Prozess den Schlüssel fertig geschrieben hat.""" + for _ in range(attempts): + key = _read_secret(path) + if key: + return key + time.sleep(delay_s) + raise RuntimeError(f"Schlüsseldatei {path} existiert, ist aber leer.") + + +def load_config(overrides: Mapping[str, Any] | None = None) -> dict[str, Any]: + """Baut die Flask-Konfiguration aus Umgebungsvariablen und optionalen Overrides. + + Args: + overrides: Werte mit Vorrang vor den Umgebungsvariablen (v. a. für Tests). + + Returns: + Ein Dictionary für ``app.config.from_mapping``. + """ + config: dict[str, Any] = { + "DATABASE_PATH": str( + resolve_project_path(os.environ.get("GLORY_DB_PATH") or DEFAULT_DB_PATH) + ), + "TRUST_PROXY": env_bool("GLORY_TRUST_PROXY", default=False), + "RATE_LIMIT_MAX_SUBMISSIONS": env_int("GLORY_RATE_LIMIT_MAX", 5, minimum=1), + "RATE_LIMIT_WINDOW_SECONDS": env_int("GLORY_RATE_LIMIT_WINDOW", 600, minimum=1), + "NAME_BLOCKLIST_PATH": str( + resolve_project_path(os.environ.get("GLORY_NAME_BLOCKLIST") or DEFAULT_BLOCKLIST_PATH) + ), + "MAX_CONTENT_LENGTH": MAX_CONTENT_LENGTH_BYTES, + # Ohne SECRET_KEY bleibt der Wert leer; ensure_secret_key() ergänzt ihn bei Bedarf. + "SECRET_KEY": os.environ.get("SECRET_KEY", "").strip() or None, + **GAME_RULE_DEFAULTS, + } + if overrides: + config.update(overrides) + return config + + +def ensure_secret_key(config: MutableMapping[str, Any]) -> str: + """Liefert den SECRET_KEY und legt ``instance/secret_key`` erst bei Bedarf an. + + Warum erst bei Bedarf: Befehle im cPanel-Terminal (z. B. ``flask … scores list``) + sehen die in cPanel gesetzten Umgebungsvariablen nicht. Sie brauchen den Schlüssel + aber auch nicht und sollen deshalb keine überflüssige Schlüsseldatei anlegen. + """ + key = config.get("SECRET_KEY") + if key: + return str(key) + key = load_or_create_secret_key(SECRET_KEY_FILE) + config["SECRET_KEY"] = key + logger.warning( + "SECRET_KEY ist nicht gesetzt – verwende den automatisch erzeugten Schlüssel aus %s. " + "Für den Produktivbetrieb bitte SECRET_KEY als Umgebungsvariable setzen.", + SECRET_KEY_FILE, + ) + return key diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..a16f8f2 --- /dev/null +++ b/app/models.py @@ -0,0 +1,296 @@ +"""SQLite-Zugriff: Schema, Highscores, Rate-Limit-Protokoll und verbrauchte Run-Tokens. + +SQLite reicht hier völlig aus und braucht auf Shared Hosting keinen separaten +Datenbankserver. Weil Passenger mehrere Prozesse parallel betreibt, liegt auch der +Zustand für Rate-Limiting und Einmal-Tokens in der Datenbank statt im Arbeitsspeicher. +""" + +from __future__ import annotations + +import math +import sqlite3 +import unicodedata +from collections.abc import Iterable, Iterator +from contextlib import contextmanager +from datetime import datetime, timezone +from pathlib import Path +from typing import Any + +import click +from flask import Flask, current_app, g +from flask.cli import AppGroup, with_appcontext + +SCHEMA_VERSION = 1 + +#: Wie lange ein Prozess auf eine gesperrte Datenbank wartet, bevor er aufgibt. +BUSY_TIMEOUT_SECONDS = 10.0 + +SCHEMA = """ +CREATE TABLE IF NOT EXISTS highscores ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + score INTEGER NOT NULL CHECK (score >= 0), + wave INTEGER NOT NULL CHECK (wave >= 1), + duration_s INTEGER NOT NULL CHECK (duration_s >= 0), + created_at TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_highscores_rank ON highscores (score DESC, id ASC); + +-- Ein Eintrag pro angenommenem Einreichungsversuch; client_hash ist ein HMAC der +-- IP-Adresse, damit keine IP-Adressen im Klartext gespeichert werden. +CREATE TABLE IF NOT EXISTS submission_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + client_hash TEXT NOT NULL, + created_at REAL NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_submission_log_client ON submission_log (client_hash, created_at); + +-- Bereits eingelöste Run-Tokens: jede Spielrunde darf nur einen Highscore erzeugen. +CREATE TABLE IF NOT EXISTS used_run_tokens ( + run_id TEXT PRIMARY KEY, + used_at REAL NOT NULL +); +""" + + +def connect(db_path: str | Path) -> sqlite3.Connection: + """Öffnet eine Verbindung im Autocommit-Modus; Transaktionen werden explizit gesteuert.""" + conn = sqlite3.connect(str(db_path), timeout=BUSY_TIMEOUT_SECONDS, isolation_level=None) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys = ON") + return conn + + +@contextmanager +def immediate_transaction(db: sqlite3.Connection) -> Iterator[sqlite3.Connection]: + """Transaktion, die die Schreibsperre sofort holt (``BEGIN IMMEDIATE``). + + So kann zwischen Lesen und Schreiben kein anderer Prozess dazwischenfunken; + bei einer Ausnahme wird alles zurückgerollt. + """ + db.execute("BEGIN IMMEDIATE") + try: + yield db + except BaseException: + db.execute("ROLLBACK") + raise + db.execute("COMMIT") + + +def init_db(db_path: str | Path) -> None: + """Legt Datenbankdatei, Elternordner und Tabellen an. Mehrfaches Ausführen ist harmlos.""" + path = Path(db_path) + path.parent.mkdir(parents=True, exist_ok=True) + conn = connect(path) + try: + conn.executescript(SCHEMA) + conn.execute(f"PRAGMA user_version = {SCHEMA_VERSION:d}") + finally: + conn.close() + + +def get_db() -> sqlite3.Connection: + """Liefert die Verbindung des aktuellen Requests (wird am Request-Ende geschlossen).""" + if "db" not in g: + g.db = connect(current_app.config["DATABASE_PATH"]) + return g.db + + +def close_db(_exc: BaseException | None = None) -> None: + """Schließt die Request-Verbindung, falls eine geöffnet wurde.""" + db = g.pop("db", None) + if db is not None: + db.close() + + +@click.command("init-db") +@with_appcontext +def init_db_command() -> None: + """Flask-CLI: ``flask init-db`` legt die Datenbank an (auch nachträglich).""" + init_db(current_app.config["DATABASE_PATH"]) + click.echo(f"Datenbank bereit: {current_app.config['DATABASE_PATH']}") + + +def init_app(app: Flask) -> None: + """Verdrahtet die Datenbank mit der App und stellt sicher, dass das Schema existiert.""" + init_db(app.config["DATABASE_PATH"]) + app.teardown_appcontext(close_db) + app.cli.add_command(init_db_command) + app.cli.add_command(scores_cli) + + +# --------------------------------------------------------------------------- Highscores + + +def top_scores(db: sqlite3.Connection, limit: int) -> list[dict[str, Any]]: + """Liefert die besten ``limit`` Einträge; bei Gleichstand gewinnt der ältere Eintrag.""" + rows = db.execute( + "SELECT name, score, wave, created_at FROM highscores ORDER BY score DESC, id ASC LIMIT ?", + (limit,), + ).fetchall() + return [ + { + "rank": rank, + "name": row["name"], + "score": row["score"], + "wave": row["wave"], + "created_at": row["created_at"], + } + for rank, row in enumerate(rows, start=1) + ] + + +def insert_score( + db: sqlite3.Connection, + name: str, + score: int, + wave: int, + duration_s: int, + now: datetime | None = None, +) -> int: + """Speichert einen Highscore und gibt dessen ID zurück.""" + created_at = (now or datetime.now(timezone.utc)).isoformat(timespec="seconds") + cursor = db.execute( + "INSERT INTO highscores (name, score, wave, duration_s, created_at) VALUES (?, ?, ?, ?, ?)", + (name, score, wave, duration_s, created_at), + ) + return int(cursor.lastrowid or 0) + + +def rank_of(db: sqlite3.Connection, score_id: int) -> int: + """Platzierung eines Eintrags nach derselben Sortierung wie :func:`top_scores`.""" + row = db.execute( + "SELECT 1 + COUNT(*) AS rank FROM highscores AS other, " + "(SELECT score, id FROM highscores WHERE id = ?) AS mine " + "WHERE other.score > mine.score OR (other.score = mine.score AND other.id < mine.id)", + (score_id,), + ).fetchone() + return int(row["rank"]) + + +# ------------------------------------------------------------------------- Moderation + + +def list_scores(db: sqlite3.Connection, limit: int) -> list[dict[str, Any]]: + """Einträge mit ID für die Moderation (gleiche Sortierung wie die Ehrentafel).""" + rows = db.execute( + "SELECT id, name, score, wave, duration_s, created_at FROM highscores " + "ORDER BY score DESC, id ASC LIMIT ?", + (limit,), + ).fetchall() + return [dict(row) for row in rows] + + +def delete_scores(db: sqlite3.Connection, score_ids: Iterable[int]) -> int: + """Löscht Einträge per ID und gibt die Anzahl gelöschter Einträge zurück.""" + ids = [int(score_id) for score_id in score_ids] + if not ids: + return 0 + placeholders = ", ".join("?" for _ in ids) + cursor = db.execute(f"DELETE FROM highscores WHERE id IN ({placeholders})", ids) # noqa: S608 – nur Platzhalter + return cursor.rowcount + + +def delete_scores_by_name(db: sqlite3.Connection, name: str) -> int: + """Löscht alle Einträge mit genau diesem Namen (ohne Rücksicht auf Groß-/Kleinschreibung). + + Verglichen wird in Python: SQLites ``COLLATE NOCASE`` beachtet nur ASCII, „Ü“ und „ü“ + wären dort verschieden. + """ + + def fold(text: str) -> str: + return unicodedata.normalize("NFKC", text).strip().casefold() + + target = fold(name) + rows = db.execute("SELECT id, name FROM highscores").fetchall() + return delete_scores(db, [row["id"] for row in rows if fold(row["name"]) == target]) + + +#: CLI-Gruppe ``flask scores …``. Kommandos einer AppGroup laufen automatisch im App-Kontext. +scores_cli = AppGroup("scores", help="Ehrentafel moderieren (auflisten, Einträge löschen).") + + +@scores_cli.command("list") +@click.option("--limit", default=50, show_default=True, type=click.IntRange(1, 100_000)) +def scores_list_command(limit: int) -> None: + """Zeigt Einträge mit ID, Punkten, Welle, Datum und Name.""" + rows = list_scores(get_db(), limit) + if not rows: + click.echo("Keine Einträge.") + return + click.echo(f"{'ID':>6} {'Punkte':>9} {'Welle':>5} {'Datum (UTC)':<25} Name") + for row in rows: + numbers = f"{row['id']:>6} {row['score']:>9} {row['wave']:>5}" + click.echo(f"{numbers} {row['created_at']:<25} {row['name']}") + + +@scores_cli.command("delete") +@click.argument("score_ids", nargs=-1, required=True, type=int) +def scores_delete_command(score_ids: tuple[int, ...]) -> None: + """Löscht Einträge anhand ihrer ID (siehe ``flask scores list``).""" + deleted = delete_scores(get_db(), score_ids) + click.echo(f"{deleted} Eintrag/Einträge gelöscht.") + + +@scores_cli.command("delete-name") +@click.argument("name") +def scores_delete_name_command(name: str) -> None: + """Löscht alle Einträge mit diesem Namen.""" + deleted = delete_scores_by_name(get_db(), name) + click.echo(f"{deleted} Eintrag/Einträge mit dem Namen {name!r} gelöscht.") + + +# ------------------------------------------------------------------------- Rate-Limit + + +def register_submission_attempt( + db: sqlite3.Connection, + client_hash: str, + now: float, + window_s: int, + max_attempts: int, +) -> tuple[bool, int]: + """Prüft das Rate-Limit (gleitendes Zeitfenster) und protokolliert den Versuch. + + Zählen und Eintragen passieren in einer ``BEGIN IMMEDIATE``-Transaktion, damit zwei + parallele Passenger-Prozesse das Limit nicht gemeinsam überschreiten können. + Abgelehnte Versuche werden nicht protokolliert, sonst würde ein blockierter Client + sein eigenes Zeitfenster endlos verlängern. + + Returns: + ``(erlaubt, retry_after_s)``; ``retry_after_s`` ist 0, wenn erlaubt. + """ + with immediate_transaction(db): + # Aufräumen im selben Zug hält die Tabelle klein, ganz ohne Cronjob. + db.execute("DELETE FROM submission_log WHERE created_at < ?", (now - window_s,)) + rows = db.execute( + "SELECT created_at FROM submission_log WHERE client_hash = ? ORDER BY created_at ASC", + (client_hash,), + ).fetchall() + if len(rows) >= max_attempts: + # Ein Platz wird frei, sobald der älteste Versuch aus dem Fenster fällt. + oldest = float(rows[0]["created_at"]) + return False, max(1, math.ceil(oldest + window_s - now)) + db.execute( + "INSERT INTO submission_log (client_hash, created_at) VALUES (?, ?)", + (client_hash, now), + ) + return True, 0 + + +# ------------------------------------------------------------------------- Run-Tokens + + +def consume_run_token(db: sqlite3.Connection, run_id: str, now: float, max_age_s: int) -> bool: + """Markiert ein Run-Token als eingelöst. + + Returns: + ``False``, wenn das Token schon einmal eingelöst wurde. + """ + # Abgelaufene Tokens scheitern ohnehin an der Signaturprüfung und können weg. + db.execute("DELETE FROM used_run_tokens WHERE used_at < ?", (now - max_age_s,)) + cursor = db.execute( + "INSERT OR IGNORE INTO used_run_tokens (run_id, used_at) VALUES (?, ?)", + (run_id, now), + ) + return cursor.rowcount == 1 diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..da9cf80 --- /dev/null +++ b/app/routes.py @@ -0,0 +1,28 @@ +"""HTML-Seiten und Health-Check.""" + +from __future__ import annotations + +from flask import Blueprint, Response, jsonify, render_template + +from .models import get_db + +bp = Blueprint("pages", __name__) + + +@bp.get("/") +def index() -> str: + """Spielseite: lädt Phaser und das Spiel als ES-Module.""" + return render_template("index.html") + + +@bp.get("/disclaimer") +def disclaimer() -> str: + """Disclaimer als eigenständige, auch ohne JavaScript lesbare Seite.""" + return render_template("disclaimer.html") + + +@bp.get("/healthz") +def healthz() -> Response: + """Kurzer Funktionstest für das Deployment (App startet, Datenbank erreichbar).""" + get_db().execute("SELECT 1").fetchone() + return jsonify({"status": "ok"}) diff --git a/app/static/assets/kenney/audio/License-ImpactSounds.txt b/app/static/assets/kenney/audio/License-ImpactSounds.txt new file mode 100644 index 0000000..4890fe5 --- /dev/null +++ b/app/static/assets/kenney/audio/License-ImpactSounds.txt @@ -0,0 +1,23 @@ + + + Impact Sounds (1.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 19-12-2019 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Request: http://request.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/app/static/assets/kenney/audio/License-InterfaceSounds.txt b/app/static/assets/kenney/audio/License-InterfaceSounds.txt new file mode 100644 index 0000000..1fc5acf --- /dev/null +++ b/app/static/assets/kenney/audio/License-InterfaceSounds.txt @@ -0,0 +1,22 @@ + + + Interface Sounds (1.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 11-02-2020 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/app/static/assets/kenney/audio/License-MusicJingles.txt b/app/static/assets/kenney/audio/License-MusicJingles.txt new file mode 100644 index 0000000..4c299c2 --- /dev/null +++ b/app/static/assets/kenney/audio/License-MusicJingles.txt @@ -0,0 +1,21 @@ + + + Music Jingles + + by Kenney Vleugels (Kenney.nl) + + ------------------------------ + + License (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + You may use these assets in personal and commercial projects. + Credit (Kenney or www.kenney.nl) would be nice but is not mandatory. + + ------------------------------ + + Donate: http://support.kenney.nl + Request: http://request.kenney.nl + + Follow on Twitter for updates: + @KenneyNL \ No newline at end of file diff --git a/app/static/assets/kenney/audio/License-SciFiSounds.txt b/app/static/assets/kenney/audio/License-SciFiSounds.txt new file mode 100644 index 0000000..7afc21f --- /dev/null +++ b/app/static/assets/kenney/audio/License-SciFiSounds.txt @@ -0,0 +1,22 @@ + + + Sci-Fi Sounds (1.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 11-10-2020 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/app/static/assets/kenney/audio/click_001.ogg b/app/static/assets/kenney/audio/click_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7ca77c7186126ce177640aad0c7ccc4c59bf4446 GIT binary patch literal 4876 zcmai230PBC)4q{4h%`X3K_lM

Pq@U{Hf%0a?t2h$I9gl!}3fY*7=UQiWm(2#OKm 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 R3}4fbJY>2i$P(fQ{TJe+&CUP- literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/confirmation_002.ogg b/app/static/assets/kenney/audio/confirmation_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e01396f1e0f5e247848bfceb8c6a05a780ef3a3 GIT binary patch literal 14169 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

L5x(d=3_Uw+Q2uQLqd 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 Xk9|oItyK~gH^GZYG3Uy7T4?_Z+lCBa literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/error_001.ogg b/app/static/assets/kenney/audio/error_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c146db9a36b6809c5d05e02df34039d52627a72f GIT binary patch literal 7373 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 CO(g*U literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/explosionCrunch_000.ogg b/app/static/assets/kenney/audio/explosionCrunch_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..019e53664abf859fc5529f95d0db23fa3ac1e42d GIT binary patch literal 28274 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�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

w#sU9yY4hKr&@m`AS>5^7t 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 W_WK}%wSF5&r2-q%z){FErvC>JQn@n# literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/explosionCrunch_002.ogg b/app/static/assets/kenney/audio/explosionCrunch_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9d40201688aa0dbce9252b993400a195ce663c7b GIT binary patch literal 47907 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 P=YEt|kxnInGyMMomv>W~ literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserLarge_000.ogg b/app/static/assets/kenney/audio/laserLarge_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1fe6edff924d9b87ad90a3a15c80de9bbd69da37 GIT binary patch literal 25566 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 S;ZXapp8MPF?h3qgXFCAnHQ<~8 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserLarge_001.ogg b/app/static/assets/kenney/audio/laserLarge_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5dfab449e241e67ab6774416bac8b90ea12e0c43 GIT binary patch literal 26220 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 NTcF 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserRetro_001.ogg b/app/static/assets/kenney/audio/laserRetro_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8eef44bbfd12ecd038e20d5dd003d1766b40ced0 GIT binary patch literal 12732 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 BjR*h$ literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserRetro_002.ogg b/app/static/assets/kenney/audio/laserRetro_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc15854f3e1746f41749884f35bd56c42ffee692 GIT binary patch literal 13130 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserSmall_000.ogg b/app/static/assets/kenney/audio/laserSmall_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..73ef94a9fdd4a0dc5e5fbc9b9786b349da581d68 GIT binary patch literal 7286 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserSmall_001.ogg b/app/static/assets/kenney/audio/laserSmall_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ffc89b9e7e2d816fd532e1a06f379a32ef1d4cef GIT binary patch literal 7448 zcmeG=cU05K*1u3gQ%XRpFCg8(GZ2s@wjCC8IMO$m$_4RQRBw_T-5|aObK=hYqi|=!z^L)Xxe3Yh-~Lq2 z@op@&6Ht(Xj|AyDMFt|nf_>fA86a(udb`kiyYzPHBQ>4EBZ7}aQmB-OC@n54G4PoY zTy0%k_u5k;A}Ddz0I=W5!NJne)n%{C;phl|WFRGi66q5~@kjc`A+3GFDK2plQ9;On z$iv}CS88-%Fj6x%HdZ%^+tr~)Mf(RI*7Z9at_9=Y*p`<0em58d2MeR|$S&H0Od{;+s|L8|QvQ9#1@&q}I3UZOql!I8RV@jsJ&`EEbqV)EK&LnYsw)y>O~v$3O+dAd zvgpgk5B`kb`nwXiYKI^kTCwY>VjqwOL1!e=;2?GHIMrbsh=MDTe_c+m+Y2~|a#28T z2o0{E>9Z~t8dz5LB7DE-1}8v3zc`O%Jz%{b#BO0NlvE-LMmkbl3p83Q^9t5A7&as~ z2Xv{`pWjuI|A0juvK3{qH+pfB1%fq|4*^VWsc=iToDZN2e#jE6oFsv{?hjatms=5_ zmy%te(bVd?vEHUxRQ^yn)PemQn2|D75ZWr_1$v+S3*QV1abbTp9~{t|&xCAuQ3CR0 zhJY_Zxk8z_J?f_|%o233R{8ey3@f|JGY1HA8tkZq^^+qZC{cXfihpm`O?ktL%d;5T z{hC+r=?$Q`P4(R&F>z=}}@z>3qG7K^F1SesCG(-?UtJDXsq#oq8Jpj4!P zrkQ};x|1a5MfPi50$%aG;#O4eODGM0SMR@5be2>Dby!cwMSm~Rm3S~F-2Hs?bW4)g zMD)z~$(ix=L)()7Y*>GI4g{Pgaos1gebdlAg=ZYig*FuYyXPE5^qf=dJEv;jpz81t zHMoj#dXE{FvUJ8cxJY{qOGl5$P+SbXMhqw;M9QNW%49ReqvfP~^QOaWxXsLX^mm@a zbrBV8#+*$S-`_o_L^I==QN|A2ELHa`^|;)?6jo(^@r%k*;Xip!5aUuF;}V^*M9rf9){<`v~JOf&qfffgm{unlG;yJ+?*CHxrv;76iBL zRP6FJeo8h;xzo#t+W^1@|7aP7gN zi*nGG9+;v7ucAFK@H}p@9f2GWut6zqU;?Fm7=x4Ai<7e482)E1V1#kz19fv5z-ZVN zHjLTi1-P{9TjDSvlKki8pYU=vfH{4~3x{#QxjOvkoc_DQe+quwgr4L<`}≶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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserSmall_002.ogg b/app/static/assets/kenney/audio/laserSmall_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2df384c4e28f0ff5515abc74c848c1613fbccb27 GIT binary patch literal 8973 zcmeHMcT`i$y5E3wL`vwOp?5V>1hIq?dXbQX5I`jq=}1*n1ZhGjB2Bu81W70Y0xAds z5{eWBq)SmjRIFG4MR*hNoO|ARcisEey6gS-W=$sF%zQK7p0CXOW^b#LCv6}`=y$@J zZV}42ga;UQGKBaA5Iq9vO^gQRzghgZnC~)J(MSH7=pz|Gt@h28F}|xCe@j=Gwx&`B z9C(jY?z^o5PQtxCh`3Dwa1;2xy@-8#_w7}KD_HsXdYlSy4RrMlQlyL84t~05jEN2A zkeREmuWP6gXwbK^us~U2Y!2D@1^c?dPrCZL1~>(|y1 z6BvBb1FmrT^y%F}bW$}iDA>irZ@06bk0Jx})?+E^>Ejq6HZU>598QaPl7fXG9tb)i zqsX1+W}-+=zpfCPm2OO@XnW(c(&K5u&WVVQKMJ_IivR>|gCZ2zlW)8-@$A<=DJ-8H zP^j%;sdW?1O0u5SW^el@=j>ZjTjJ&0uPDp5-HsXP6hazH#=y|@f*2x+6#HV z3---*z`?WVv52_v=&{kKk5eqk3IJ1WEej4sfMr5PS70X9u%2r1z5yAlB^7IajR7^3 z4aNcsQm~_Ki0f!b@MuVwT~>_!-7vemG4^9Ij>|Dl!m+>eO4!UYJ#Q`@&HxokYiGVx zERqr}dZAs!6dha62)WQz0%uQ^QcS&JQsU-W>5*ISURLkZQ=`&T!?no*JZ2mHX`n)n zoRa^M-Rv@5|9wWfcPT+gpvz8w@lJmk6k4V;K!tTv!(9-tDH5$h3s5%-RPPKt2(nR- zL3g@&-&gY;e;9#ob_hZu#A*KG-9Q^?)u8|l+rUGkffl1c6?BdK>vVC`U%)~n^W8E% zBiPhZoHo@G0j3qc&Zf_`B?&OZU7v&JJjwaer_G%+Ur2%F4z$)vT`>q=-n^! z64+AlQ8ukG`$Ur_jEJAe^}5II2&h$;ybpcs^tQjd4-(kTX-v2yKN236 z%tC}omPn@U47$vnR*2|QEZ&)vY-mb}I*JyNCkI7tt{e_Q(L9@8{713r%3EGsoJvx9 zq;R`;UylmCD1X?0V6o~Uk3JUyc(IBG@ZzMpR|SEU+Qwewx)FjhIUQ}PNZyJlU{ttE ziY|-DW{|{Y1w2x`38Lb!hWjM*m{(%pFZuCjace$VkO%gu+Nd4EVz9O$K6Y1wC-1~K zjs?$*hRuv79T$rIyJP(sIS>e%=*^f+Cnh2~^P(*E*tZP)N96d!I045_`l3F-kFr*`un}+^5C|R;bhXiR9MW(d!nzKJxQ^Gm+TRJYtN$G^TVXRZ8vK{Y zp@)c+cJfQ()NTKWoI-`<7h1{ECaE%ZsdAy2C*yM{*#&PXMI3*N9Cy;qEYi(5(n4Ia zLVTu2d=B+qk@us@#fE>I|BM`?02z=$Hyjc#rAQl^yqC1;<=Ix3^~59w_Vfk8Qz8(PkW}GftgBkzftH*vWd++F z8+2U+;_hS+w_p-CV*-&!PbNc<1&pDOpMEfb)H0xs3$F1yMkI(SCZoPQQCcyLD!>(C$30S?$D^)ovU?kHhTQQuL( z`Z&ttPtXa$LqSIYU^b?AEVTaN*Wf`une&&h4@7%19vq7HXj6Bh{_}^6fS?ElRwx4E ze}w$=nQj>KL6BCeiygoh#;L9hP=u>p0V@Qhx`yuj=hOV}TmL4IAwmIyE*0SgPl@+1 zCOg|9Q&l)m*g+OdXGD=O20Ak%{prNiWd&Ik)LmpD9%g9v6s%`Z-Fi+dlk8E{<*#Bk zWN^h5fS`CObwKhKEQFS@KmG#Ntw1XBUqyP7>rM<8ZK}P#nFD3QiYBIuq7$G{ZH*1B`2^ zRAItw)kO-a)VB?l$~_POP~#b{b}X~>T8#<>&9*Q=@D{cM-K8~bVitElK`_x8DJTy3 zLZXu?g3RU2r^j*K$z0D^(glrHQY3TeDamG_b&biz=zXTD6e7 z5?bJgXN!p~-v%uKwC9{o?A2b7(KAK7$_wO^Bntz0LxDNdF;03a0^npz)9x(LCQo(& ze0gc;1E7r?0FEHQQk;&~dz}{u@JBviVStcZ+9r8h?&ZU5s#^eRnWdYnKpv>uB()^8 zKpx;$&(z|rmYjo+e``Oq;J1zg9Dz0HijwW2+lWG?a)8?(4XetfHNLXg!d2vVwY3XV=Is%`-X9V7j`j7G320?frCS z-`$@f0*r~^`F%stOmzB9`E&gB*7A@0%l{=cM)0br!$HFRF-%Ci=p?mrnS6m{79r6Z zK8TGSSY0;`@meN5)znl#FHu`THY1Zjs?du=u#tlAKORP^}lv^_B!y^8#(oYNmCd4J^e=#q=I%tELHiC7~2@?diQ<6&i~3fo9di z1n2TPxf_Y8^tST45vg?az7CiTpmL)3b}S1!mm?MkX?$%fJ8e_}vls9MX_q8Q2LU(^ zyK7>S>Tr5sKQn|pqy-^mg>~gcu!2rE*oAgRY#QbsxI+Th>!5oW-LKHa!hyie;L-G( zSTWmXhc1AZz-A)Oe{@`rPDMWgBj_DKoGkh2)(8bU5;mp$*+EWEM{ka0+l0vADoRJH ze86|p(O_H*kgTOs2m;e=jQ|84f@jcq z>BMG9p;Mr`Rc>{VfgsSh)kGHrs=w#k6qJru+Ny%>mx;dnNh_(gTdGwaWHf^9Ge>U5 zEV!ZZuvXWO5Xuq*9+{X_=o^Z@Dl8r|VU?`Io4LYuADNiuN3tohP+}65$XRKbdOcZa zE}}9bC=p?#J&)1r6b4&%Bm^<>?&D{JAunF!g0zsvDU1*YCzr%S6cV{x@Vx}J;~H{Old&E)We=E$nYrpFVB7e_L%YiT`? zm7o3;EtXekgL#Vtav*3YGz+$`aY#z4DEsB>Pb&~RuZW}~LR*)2vs(vRfgodaL|mNv zE3E?u4m^Fdfz9y{{Ur+hSoDm2V=H3g zuwlEQx1qG5vH{-^-eCCh@$1W1Z(eQ)pO5u07&kkorO&v+H56BK_4}#VZKoC~E*#lU z%+*vyL==fMVg=p+6*a;^P?y@jVLi;luRNlXK7Wi$L$$&l^(NN|8&rtBqp#y>m`tTD zEDkZMlTdh_poLpK2ZWMZ{chl+>-0~rHJZYc$Q7hUA9ej&~f%<@{J^ni=}>n(REy|A}w# z@RTFpwGqF$<;UxX&c4Z7-gZB_*6Q@t_M6|tR)5_N_p`%2wYM4(w8nP5shfDey)h~( zN}9-e5hfQR)6vdN?BzD+)8dnc8#5;myq*%IBLxue-~0Gf)Z_Hc#ZcwA3JST@Vr07+ z6Yo<@b(Pz7oP~GQ0AohpZM$WYek|(3>GZUN_wrX7b5c|~_BZ;)V#@dAq+H|9KTykY zq8hJazsz88>h$Y9IdileKi@&ZV&&6`WGO0DflAd6QWDKCdi}J}vzA07R(nsq6_+=q z+SNK#4{n6O9wc1N5FE|Id(+~mV{Lu&U=S{zdha}if9&z&zJ|q|Vc1dO? z^H{|UcoSvIdl8O!{>cIc-M-4EVT4AwT6;Z z!^(~~stIRdjJ5FV4HG)9$WfR2@_{$!cnxYadsQ$BqB>%Q`0zlNBJ8o$|J8zk?r zvrAVk_B=HGQF2ZmsnhxaKHGIAN*YmMZvL)?NbK!x?@ew;BB@T)CR){msAfGLW1c{( zMU;o&xXvX+mP(e8vE^eYqBN8RJ*TRweEX;ZWwBBm$nA&reeN#mmHl92+Y%>LO2uK{ zvlMSU6~(p_t4c{%0vI7UOI1fi;f`-J`%f${A0{8UDpVOMfUPPTcGn=Fni|vgLcONR z0wU`_g)RtHE0M6M+M-egB@(WcL>1-Cwf#kH5tN;j^?S2{;5Dp=n~oD||oKBPEGQ!GpE3BG*L zm5sp07A<>zlpP|X%B)eCdD)6}n-4;F)Uqmm-iOvt%2wWAVPaaE^Qg>xKYXR(=l)+$ z-#j*T2>r~;GS@xipgLJ59lY%KgEEv4A-$eE73K5zaZ|+c$iysK94(8MWg_S-m%Yt< zdl^S5&9izxY_F8~AJHu~@$3M#(e=wSzP_o&xOgek3+B0otRWYV^oo7CkcJz(Lg@_4i zuBGioGuVl1l3%*-ObT3(pTeBZSTZ6D?6NL6_aJxs<5kNB$_J(S%cjbQiw-Vd*e_P_ z<)*I;1Q}Qx7{D@|3kf#%icAp?Ba+Y3QXec@Oz)B#>}bxUnYNXqMFo$^0KX#LXixI zS?gG=7`pkN{PYpKwZ`AHykkx7hjyvP84lxuh-tscGxOJ8H-*pcA2>29CJO=Z9>jC% zl#C(R+1|DEn)iahB=PE4}S17 ztXW>H8EjClp@+IN*ZTZcEz*B_I@pGubM28|oYhxrTwNCr{#I$Kd0a_86dO=-q3%P- zHP?LMlXAh2?{^8-_GkST?9Pj-6AgDEe z+~BAx*n2Rria4q@b9*G)qZ>1i61-mDa>H5+DB~~#O1O85MrjVRcdTA0^_1Q3t1Nb~ zSuYN1D!byh2U{&%T`DSIJ&zAx=^c5s(r~KWFyaVBLzz;C>-Mky`fKBhz|bt|X%RN< z^^4cP*jXHtj8pt$>b-<01M}z1BlM4z`b%#61Y^_ME5vqpZwxrybNYwQVQq8%V_TQ5-)BK`F7=OIQlt4d^)ap?nq2&Q@dH1WmjgBvFW-^ z+=SWvrwh^EtKjQTi9jPbyIAD}`K8?u2sfgeTPhtp@uFBDcr2}>f13KezHJ-yJf5Ai z`XF0EptpyU(-cXu&@(49GgA&%UWzTx^6VRg*sWDZ*NUGe&E3y(cs8Yo!&Dmzv=FIU z3wgIHj@!RmoH{)k7Lc(hrL$0?7TDM199VPs9!6DFZx-Jv{be-K(NFTh90LO@37!2qIzkjQQ>uf6q#r%vo=w z&1_Uxhe^~x?1QHmp<~$&6}u!o6UKiwTya!REBhvG;Db1Ke1FZNj^u4iYnJxfT2(s! z$%@Kiss{g{5LQbAtL9-Slfq$moqgU_l;k%hsn&;t#16x%iCHDrM`%=vC!TF&n9&ST zE?OGnfe+DGRBB$D7oB$e)$qflf36q%V^O#q{XSeT!A{Sl=e5VnB)g;ehvCJ;DtZ%P z!+kSFK9WQE*1xFt`rP~;zWIjioHa76QikR8IdP-s~`Nie4OE*i8?B#)`scYffRl0JAdAOpV zRXo~QfW%y0FtsAP!m@V~?vbS|=aG4&vDVg$V;Aibv*~^vM;jTbs@8b_-r}4+#=D+K z%W)dc*`7I49<@C)GnP=-N_FypXX47mibzy<0VX1#oVEuNg zMP}zQlIf38+)Y%~Wtoh~gKxTaX}``@(|;{_QA;~0g^-Gy2{<9xRGV|@+r)Qj#_|ql z`BjaVmu}8F4=SL})YDofE~;M?va<@Jw&-#~C>d!{-Q=qf+IeW;JZ0lqhm~PNfM4Hu z;>T-#x4#_lMNkAaYwS}nzn<7V7-YsWehwAg+s3Lw5uCmF5V}A&>n+P4EBD2^)!V*d zRyV|t<$wJgx=hn^dGWO`J?buo4jzs=7P+<#Lh!DsiFp zx>daDk)=f(3WNcIKpB1;rnV?0y#YVEmv?`Gb zPfU)Ko?*+pcBIEK)@YJo`tr89tzT=SUb>LJ$+w!>cgK7}tIvdnd6k5IjOutG*|y7Q zS-_nw=bSA8qj@ZBVsI{dhJzR3_w$~}KHB+E9y{yRpUwR?sR|Ko z_Cvxj=oo1&Tr=ckWy<#L&&XXHC!J5f;uwF@5*BYvsK;=(gPRFAH-ObD9lgEgV10GO zI$It4go@#+Iuv~a7RdFkIXW~*1y>|$lIDcBBMnJw+pE%2s{oNK^QGd(s3(|*i;6U4 z(4khX*b7HmojD>HFKDlAyck(~q{Y%Q|7jz^{)_TUVdyG( zzf<6;Q|YFOV<0-UVzOyj*)DS6TZ&SNlYH#(bmYVYJI=e-^J0wCaFrWjVvtG>9%^gT zvtZJwt|B`1k)#MwsvL$`pOo){V>_D0WG}x=Io$D_Ys3ADPBqaQLf(i&N#hXE3BR12 z9qSf1X1sCDwLM})6_Q}pvpsL)#d?n%yHZ%*jn~^Zh*CG;Jm{f_9B5#P!)_ODdA2bg z+O_}wuD24k+P}^n5ILuVV>;jgA4^C|x@}bXNq^ALkXdJ&VOc9TA4PwkFb_9$OzZwj z1S>Pdaq0BISA|fEeQ8A+JI1RxMq9q6^!dN9#08Bm^H? z4j(nQ9;%uc#}9i(kvvG-sg|fHPgtuUYF+=^$zfU#ZP(y6?6o~Y;ic>4mV3e%k2m#w zPvm?M?(pn~=F2uK-{a3V*5hdvermhdn!`S~eOw>5p9J(e{@ITY$D8WHTz~VL>3Hhg zIWs?Vjhiho!0+=Np^gvpCh}BZ7CDzwPn9O&`BY2++6I!y5NAhdYe9HHJT5 zexG1J^NVxR`}la<$4Q~i{s(7s-#4!>cfJ_e{jzPXllF@)G&w_c?E_w1XXEWRV@|R} zplI=K7HIP=#5PME5S<{=-$Ky8ph+X9zA(Jo>306{0yo!~lWx}ML)Ucnp18z(DRI0@ z;--$)UV!T931Bg3?1Yz}ANJui5%KQb(_^YnGc`r(Yl$?&@@#*L*rDa?m^It#d={{ky*<(vQj literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserSmall_003.ogg b/app/static/assets/kenney/audio/laserSmall_003.ogg new file mode 100644 index 0000000000000000000000000000000000000000..86eb4da626e13b581c9dfec981647519dde35d79 GIT binary patch literal 8179 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/laserSmall_004.ogg b/app/static/assets/kenney/audio/laserSmall_004.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e491fb874f7d07654af845ab01c23b368c6e95d6 GIT binary patch literal 8632 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/lowFrequency_explosion_001.ogg b/app/static/assets/kenney/audio/lowFrequency_explosion_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a59f17869064eaf4eae14c722c60f55cef3f2e4e GIT binary patch literal 9408 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/maximize_001.ogg b/app/static/assets/kenney/audio/maximize_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c0a359bd3f298731a4b29af5d2be4fb1e460aed2 GIT binary patch literal 12111 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/slime_000.ogg b/app/static/assets/kenney/audio/slime_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ede0ce7409b29b4a145109c003a145ad3c223c34 GIT binary patch literal 20870 zcmb@tcUV(R*Do9!AS$4u^rj+BK)Tc@7J3n-H|ZUumjF>gK&tdA0i}pE>7CGf?>$mO z3!w)HNzMlE=Xsy+{my&NKWAS%bIr_}Su^unWoEDJtzu#E26Peh&*f?KH{;VyL~?=g zf}4Yrv6b^#)rA*%e<_c1E}ds8FQ}aL{P%U%^8!#>%QIxW89?~|UZa=(a^eCSXj#3t z7Wb`?8&tM^W3&Sv&59B2GwfZuZ!C8d|jZ{JA1 zad5RaWwtQ0H*+#_F*9X0_GFeZvNL<*Y42jmZ0_V>$NbjW)xwII-QC@t$K@=`?d;-e zYURLV;$X*d;mSX=kbbUl0Ym~Y=2K*D{V?!V9R#8Pf!;mfAd5Da=B<)CaJlMhx|xl; zxsJQ}XeWHut@P2Z{H#0iSs(M+h&te(`^X1@IlIr7&U^usc3(7Zk>mS4+V2aZ-!J(G zKm)DO8VbL#@D?(ziQ4c&YZF-RTkWIl>(vK&DUC9<@3N$~X(QJ4*n!jLVD87{%Uw zMe=_M;Y{ox&{ID8R!90y01Y+nVJ9I?XUTDArEvg?GerK+*T-{x0T#mY%{?W~59h;t^jfWF!TNh?3AD1qFU zm}IuHs<(gn{i7B+1}S}wqVqtHFH^}jRafuF8M4I3p^U zvx~i?hrj#LS(4Y>C${msnd13%K0u2f2?1IhR<@GrTp%iIlUX*V!<8AMCeM-i*P;NS zGMj#VMnrRNBmoIdT^!kfRs5&mwjcE0WElL9yMKrN^(|K59^~hKBOs~%R$bH0PCMRp zy5h6`gezj)2QeOINEPtk73<%Y0|Jc3|J){Hj6?a_Q~Z>rul^PAzbwa*vOSW%GxC8# z@dKryN4>j(Dtm&1w_m;%RC;qqfAEg$@LjVv!urEPX2a@cqi$xC3_2v%i!#U z;OwAaWKcN!mpH30Nx!PT+jbRfRR3S^e_M`>(*xiJEa#=uga5Fc20r@dfHf6AQri2w zM#(_{P?wif|0w_vsNw5%g>yghT8(>DO=wh&Tm7x%|Jh;y>ZqX7upj_zEC@sc02gKhYcV1dQ&;Br z`3yNGN5V}ExV_7u*MPZ62l2H~8;3sYV15zGM?&Kt#7D&9H}H&v^>YkA2}|r(wH9ii z*vaf4BP~Z0^HohY69oDIA_jif(g(iYx$rav1p4&VIf#$sjtPYrNsbGJ+AnIqucBnP}QEE1s8Djv!Wk7C?IYv#*Dko+{hn=+yAh5=c z>DcgPjTv7*XO*8ZVrBwc4smd#`W{yd7r3qHUN_IS#bkB6!TkY<L>utWx&>-;zuFP!BI8_ z^mPG7%gme*1Ns6(0(k2H{D5|unPbKq=j~WCM|471{MF>;STo~{L->Fk&@M(NgfH%` zntTq>E~KbUO&;)jV?bS75-=_xu+XA5oj3AlZ~=8XHo(z`m<%{ky&8~v75j3+vgtE% z+PTV70!UpqzRnkr;!MF$66t(hnwZ52P=pLqHEAoBOhtKF){MKNfS#%GbEIdgsy$@Q zc&oz!0&N2DZZ=4>3!1Wmz7hkwR|X|;s0oMxU}&R%E)Sq=5(?-vP=}0B1D2fN3?%fx zegT|&0QBfhdH}eb!vQRSy7n^yGR5TYZgLd_;(QNmzQ13aI)92x1I+UxC0*wKvH2&ghoeu(SUnT~nU8K{HdBQ<^?a}!fFMt{VTYg5wVsdse@&^)N zp44aae4KurlD7C3NESGiT?f`r3|QB>Zpq7WoN2|GrkttTnehK9+5mGoD^iP}Q*HPH z{uWKHpH19`Z%pT$YSUBpPtismusEB1A!H0-+G9G-eOExtf=@sn7$$y;HOUQXy-R1| zy6`~)1d`=AKUf0Rbq4yGH2!tY_A68;+olWv@4?qFW+NJ*`sL7w}?HQ{x zet`0_{EGk#bUyewK~0*3_1}a{fB`V8zXV{Qf91}&fItK1^1K;)*EpL-lkwwyQksW< z?Q0&`{{Ge0`oX{Y-v|86Kb-zGi~sk<|LqW*CgGE+^lC=Nki2b?ko>bVu+#uE8RK95851QhpWk}dBs9@aO^p-qpnyLd zBa@crF1xE6QnaFDL!6!gc+fKiE2#7PDsPj&Ol|U86gl;bouh2RI8Z8C~S_ zfnBgql9kP5nQN8F)x|_yjnB zYc&@14E+jQ$Wq?@PJR(Ka5FiQC0>m$`u4Mk5!H~`cYzx3{ir^iZ)m_%4n+`vh;uka z%$PB%>aDz}brCX#AuY<%UE{Qi`sQ#xyaJ2%cPatY;=%V~|1 zM*`<}&?gY+(oO!`B$Q7-e!LEP@>KTgMG)z=>kQ2=pFZVb`O%Q}UhxUrH(?OySx^tf zm!MW=zI0l4&a6uxTCW6ngE|H#WNRuv@LbXxXw@f{CXuH2q(%Sq!qq2F<^$N~w*Bc+ z(%!sXKO5)lx%v-)!X)V4_r%1-)$JqD)tfXd9DJhBGwjK6xR6SCpNIzhMth>0>?z?DIJ!6xjA8{CA7F@v%7LT zLqW(*{_axTAM{<)!6kM&%#<^+wy2}udpQ$_fSWwiBYILM%QRFX5eq3#NI)4KUHva6 zJyS>zkg$V9Lu^@l@i^1W3}bgaT5A3Pn@HXdQSt6%gc|Hv))&n!9`C%uZ9Z?CEWtV( zcYXOzcl3&OYnDLZa<9BWW8(uWq<-1y%=VV1oF@d$DTU;WVuFnpqDi^NyyOw5!x49F z7M@RB293uy#{r2OdQI`4##QQ-AmGMLv50iV@a{We^ z_W_>9)xWhZ>mE$~0|hg)m^q)f2Xj=xFNXpb){Ei_iGIX$qa&*s5w|#*gUk(&FN}1! z8SL+GpW+*jnCfxOOyRBVeX(e0?KsrNrz2JP{;MF!Y+S2L-&OdaLj+U!G{*hg6J2{I z@GZ93a?q;vU?!x z^DIU&C*u)Zu`o&N!C`y_9TY$7pXidgl`LN0)o7wKRc8IG<4bw*U_IKt9x4rrnfc0g zd-b%rxNyWpqxRJM2Xd`>!(gZFK2nN(Ql}IhTI-BzZOI=i4!kCwo3hg4P`2q*SebZJ zd+P17krXec)<_0#o$0*O7xpVSrAlh+&m_Xq$NH8mKPYA*ZXI;gcxzcA95{D?Kr3;w zvT+n=)z%k}8jI=Ln`V;v3~LZpXf5nglitB%*%gYXb2zXlJ}SK!rGaG9T0=&4)a0Z9v5|y=L{Re~0PAT#`5gnU9NwhP z>FmJpSzc><2(J_IHZxF0%i%Q!XZiLDZ?uDF6AN#kgUSp7?hAL9ghT4BR@@{dHyohe zyC-9>Q>`#ly3>K}Ji079W45h@c=NZn3a9H|B;m_vVY`O=3FR*W^j7wZO)Ug9$XhbB zpN|4fj+~eY(Vt$N>$LaWO*^ndZ#HD~R)628vEQq) z?0|R}L%E99iWEgotE~37Cah>@#)mul<8lRe4n6 zi#KxdD!9wb+t0*Q&TTfVCtse&VLRs5(IgiL%SXGEA&-y;UFhnv2kMn+jyWmZGFu>L z^{8wlQK`63Fu72dg9X%m#VadMA;;DYtLh`xTXK2fi$X9-OV8c4g0V*;G6z%nxB>BU z#u}V{O_S@c3!(VFc*Sg-2j)32#}KbQNO&) zJmKUKRB7nkr7^@M(h^H#HR(<2wjlrl?f1N3`W;A0x^UVLU;c)g+xKJgbauoY_M(c~ zcN;NqDCXxQWder4%Y+}pk8Aw6=yEq!5aY!^YWrocd`r*5sK;;`mX?#FT=#^GTFH+( z!ds>V6T!OQ`|XSUrR$BP2h5bdG5y%%5;CbZSHkc9)?BOD@wZPl;fkNpsoe;%?tYoI zKS*>)tx%6ySx1B6Sezo0fyn-KF=A0+DLcD#0{rz=}aq9~RKdgeIaRX70ZM!~MRSvq3BL{&S7effxRjInM27 z>B=5>YP5c(iu^eYtmnA&u%#u>wWbJ?+FiK|K3xjjrzCqsCFNUX7^A<1m^txA8Yd5( zP)uZ*#;WSJl|1ygV!@fRzl$2KANZEC;MSZPTX+>*Ao;W8NI5?3;%85z-X;|X$zx-w zWcoi)Dt%#UtV+xT?HlmQW24J00|v*SejLu6_q4`)7x`lp@n{Tonhdi^Vyme|`_u%a zTXRxM3Si)2c}E9JEoo&)RQju$``Vfgdae_OJzk2Cmfxj3`Z`s1Xq`e`h|zK_3@L&5 zVR&*v9@V)$E9E4$OwC{o+T1tr%$BHMW)=uX5SCQi-B*YW7@?jr(I1M<2e_H+bT>rB zaJ5xZ!d16ZZE;`er;5KT*(HCP%qw=#`IMB=)G&J-51H;zI$(K2HIytVFlxkABGw=A zyf9sVm87=E4NlSe0vYfUTFOgb#poh63mM8m=5KmInLOdMuNbRqT&JIOugTi#c=K@@ zy5Gp(#588NgpIwM_fygJjk7^WNbNXe%NydeCgBpZO?@uoxg6>*@THQQ4`TuZUhF*7 z?4c0m%$VVKm%V>^e4I(UF3{q0bNXr7(ZtS*z7fKmJSD`{ji$;KvD3Gt;2`Q&kNGwH ztM~1Sl9g>Q*Fq>G8(#C1PfOkyl~?;wJ@?y%HQM5n5GP8vw>j6gwLc}j`SZ>2$=$~n z^J-7^uJfo?dKvoaYSy9rB6o8Q?_^1@8H#xEyqPuow$V;*GInUwe9}~!d@{CZTTxqI z59f5VG>Hz3jEW>`8toAjQdYlkZ!iSt8$?P#f za*j)eGc7-VcCWBNo*}Z2p>VI=@>5o59^r7SsBamSJX!6t0GB#_8?c!Do6(1lVKb&K z7dA1eY#=l_nY0@~L%62p0$FQT+v^;9o^s9HwH_KwYJTI`j_Cb!K&jhm;Rr4YMZ zLy|J);mI=>@)}AXg$$P1IfWm>s%C4Zhm%Dx6|h3^i^3H|a2?k9_6@7gQYiU%je^}7 zHHNgkdrpzcKAKn}^ds(wKoVp{pQGP!Jq2ghk zoesyKWa_({3ruXL<({V%%qvn%{64v}i{q~2*B}u2#IQrvYcFHiedccx#Fkb1##ha+ z=^KOcIylpPX`ZBDUlWo8<9*+)d+HFpFkVpK4&Sdr%ey8v2Z*}JQkok&HdG@+-&twB z+`RVmCVAuNUeSD-wZPl;7w;~f#Jz-LFSsXXJ}O_nV~eh^+7<8dPjUSE&W>AsrW<}G z?1q5OrFShIPc(|k=gEBuRU6Ie?|a*gJqge2v}aC=b|cHDA&oN~Gmd-e3&9gb(Z7Y? zD*c{T!|CY1BXLeL-dbdIxW)4`sPG*oY+2rgFlIfyUoHZa2`9DgkY3K80=-k45l&o&sGj z!IOd`0d$`dn>5!W@HN6g|ZsY+rRW`7{?|u*0fAcSGdU< z6Q%65Y~5)}E)41r7@P!~-q9#twhj@VVVKL<7j~*a{zCB7k=o7V8@Fu%(v5C)`TB+_ z>%%2bMgu8G^;@`e7(S@G<}oENI+YH|<{&of>w7Rd4daE)c(|cFoE;!GVx>@QqrWwY zKV+=Ag72Ep4u2SDXatcV&U5R{oAS00*;GjUy^=7Y-DZawLtL2Hy7$mGJ;fY1LKsbH zt>9Fsb6{i#Mqa}Ux$-dW#JUA=dpp}VMDU`n3YhTRVYbrC5_7Z)$%UFP%HLuOTyb_4#p|2& z?>HBdi6X40G@9V>5+;_P0tpZpD!^=@qC%f*!d_ahwjzs;?Q2%odfj5`SS(#rf$QzE z{i5bcqMFMiE%NtNOlnx9HFv;4Oq1SF_XAa7pRt|v%>_S0pOZ$X+x}w%T2ra@X8rQ3 z2sgyK+boSpOwXO_wH9xSM3&lMT*=HcB^e)~5Se(sLkGpgfoqasA#`Rrv3G^PYx_qO z%&2_^UC!?UsdiEaO^-j%hh^~CbGUU!sKD?8x@axrJIr7=F4LrDYOWu#Gt--mjx#Lm zKP*}#=S_MDQq^Q>!|#Z79M0X{Nb=Pm@yt&k=v*X|S$+TcIJ{6yF{yM^sf6bibGbd& zPJXT_X#aN?Mb&2m5V|{1-?x2#Y;^QFW_Xa7Akv5KWt}xqfhL#W;_Fhgm3%sI-8{a9 zsAK|UBhY^T5-7~JyzXBh=G!gCh&b~Td_H;$=zx@iV;oghlF zFMHqk3k1Zi%~6{Vvx3>oP3Q|^iIqs$Erw*`J7Q1E&<~yM+pmin?};9fwKTXPW;Pe< z8_*H6bM(Mvi|+pVM$WcmQkfQwosU2#2s_I>NVW8wv>wJrW)Ad%G3BCUG!<%xHuv;+ zmu3{aDM~{))`t_arZM71zv(N69Pi@dnZOar6%hh^up)`v(NDJ<6)yf0fB^opIJ?dQ z5NEGML@!O2Ken~9GBL8S(Y2vcF*i3eGd8idqoShHH#D>~bTl{9FfpaFG`9t6s7$QP zjLaQOfho_rytw3erICQB{YHjc!#Bzd9~@3Z;OU8zPTy?}i5swiD{2<(8A`a;*rJJM z*Xj-nQxsA*N!pA;;o%I@&6Q@q5Aq21b%V6~F6lG8)p5fyqE#bZAF$D3m}-dLB{B8Pt7HbUt*9W@ZEiDR`+3Rpug9zK_E1)+^`{xY zS2mK=@0!F(n2#Rlr)gFgZAHB7Ws2<7sAVG~yH~UG{TmbZJ#ZGBa-eUa={RCd9ugqjTNBj$`3dv}mTrrIG3BrDmsf z3(;pGe-2%auF#`=@%rIDD=lt)K7`?P1B5TOm)w19Yj-W=y{`|Of6*O;y^gw<(B9%!I1i}p=4nH1 zxK$sTv>U9yEK+-y5z0efn@Sc_XJ(u1^|A~uqKWYd~9hXD{sY3WLD z&SKAkQr$g%cr)s>x?o7JKgKstcVso{I20{%bJe*6-YnJZ8%RUM(tt97( z_qlNTJg>ui80mx?WIOww#j`geEM_na8=F7Hf2?WdRjYPtbm(4#%^Di*Dvy*ZSYNo_ z*mdV)so8uxvf^Y}4!_=y!fnOny#Fy?XiP|DU|&4cgx7AFC5MBqlj$O8O+6=Hj?KJt zk5|Caky(S8TBK)eJkl$BW#Wx!$P*qpMUgEGe1Gd@e^T-2E@)j-4?7gMLQSbk@-pL zMQ75qb{1)sw6dYtu(PLN+#^=^%IRuK*Y5K5sTC-9FCn3zRc77e!v7G42%Tuqm$|h^ z+`R%?cG!w&-BoZcXVbJ((e>M(FL^-ww9~w&PA)@f?qkR@!9Dr@QNkNvGIALiwD7@l z2{tiH+;*iGDKMejmp?2*7q|=RX>miCx|Kp#w~x`d(e+%Plbv;Z6>cy$BE&ywHeQ2U z4;-%atvgUe82ydx2t^;rRFI!?RH(TbV8C7{kHy!_=+DL)H5%J?o_ugbJO*YlimZ&DfnNl~C*Yc7@&VfG1$Im*~^wPJVYi2S+-tc-Jk2$nMP6?w} zL&BCp@smB&HHg{K#?G(C9lCrEOyi=6)VHUaT}R#Q9ddFgQF^Ym33xu>o3AjoUw|dp zM0-P8?;C%5ov1HNf2B50UXqB&h1_2NUwx{NldAiHpg-N*8qV~Fq7ip7y-qbQV;$&~ zz#Uoie(r+q;HPVnmz6+T?=^8qMzTU@#OssvdT*~kN)|dfcpG;;2V@Aod++pUCKIdG zQ}RcI>q$?f4BkLHU#aQ-)=pr|c#dSnyQ7lR3PJLz;3_?$;h9W@fQ{&@aR|=s!dgj|lEjN5YqmE+?_aL#?xn=6O<#V&#O-&#@bmWm7OEY?&wxm`8D`))5pf`zy4 zf@)`^U{BWz{Ge0OxWjp+&PF8D3H;D#!tzRh^W3tBVPUnKjf>`7cci*)`EcL>vWzOH z`S)bgbo9@Ct@!Qcn}3FUJgkqCEF43NDV@6Xx3=1&_HZjwGLMd0)t5Wf(ijlg#cgGG=Zj-6Wlo4b}Kb1b&_#A2IE_j#(COmv{-8GhP z=4<-G;DsMkH?)NV2mBrD2vFr{@m?nq+|L@~D0eMgyD)V}+>MRg$a&|2)n3jTN&)fG z7EU za#z|C3H70qzF>QwiaHiKeQ85K2cr>_*VNMa8^@{KUf7o}LV@%R+!0^j)vmJDHhkcF zJN(-JA&mMzL|6ZJ)ukPuoRBRY!~Qy_4!%B`hfZ~}8`BZ4uXNm_`b+a8`gk?Ge@lwN zE$N=L?S!bybBh|tZDxGay1F3qQ|onjXOGy)h&*w0e-~!*!1Cl{L9m#p0SZI#cd)Q@ z09|aUt=yx!@pj^)+?8FuS5HZp!mNicro^t{aox|3LJr-dBc`CkckibxKDRzF zk@>h5$s$(J!aO+%D-OK6_mz^lo55yHviXktL{oj)+pLu;6ce%8s&H3Y2`Hu|e%nG9l+qFWK~e0+r4aB=d|!oo zc}2;1^0dkD^fAiJp&EAJ)Q$QvTM%L-G?~$xU0bIh z-Lqp~BBDxBM9Uxv&^|-h7W4lhA__HsOhnch===8T6gtEsdlzSGpg?ILu z>zwt}vnl!b*9#hAKj7oWVPQNO-H`xSkhWukwm(YQUr-cqlHSNH~W!x_m7E`3mws#~Nzm0A(L zxn-co1KU6~d-^m*qx(2?vQP(9enyP`xzx&jynR(x zxQUNz#R-AFU^nV=^sEYfu+2^HvGOUgS9WVuk;X$}RFClLIX@{C75FYU^&4UPu;oPh@#G`REYF}1qqqQ9j7l($lx{k({C+L%drRz}Jjqz>W zqhK5dzl(F|J<|UH(ElgZEx&6i83aIC1jOk5G<_lR_kzgczA@FKm~@= z>tE5Y zi6u4ik>%t`rn(S1qxXJ0OmIdY98R3w?6;R6qJZVyP;>B^IT*q#4A)IX!Q9Zt_vXV@ ziuOKY4~;yO>*@s^bNP(hq~>RR$-O%7zgm~3T`Ip5eP3*GdakP?%MNM;zcKdFEy{nU zzYG4eFCr2Y+CWY87=M4cJa_3G`%(7rpc-qKzeOGoUAAY3trCJ~Zu%mohhIKK*nn}dO21)2x@(9k{XdgDV_qQpQIA2)9b%;inuyj>=7>{|Gat4xVuQZ?_sgj=_Ne*DQC z5S$je(9_{|@vCif$Oq}>1NXUW;ZpqqTwr}(u&D_62-)v(dY~`41X8)`p!6n#%#~^F zXgQy%_CA}s)#S%3c{81?MN}(lSDy_{8Vm~uK@A+s-w+e|N!~V3N8TKlsbNheR^gue z0{SQDAblQlI1f4iFOPtJe0eg*X<=q(V`XJ#YxT~=)|N`wz{uR%$jsc_+Q#&qu!)(O zwWYb0m8qqbnW@Eo13PP1+E=3;ln5q~cTm*hk%TXgWVPvW1LCUgSR-uunC#dRQS15B z3d;ya884k=enr>EVCY5T9kGX@Uy1Qd`kQrYR1Gzd%4(9ZN`qgXLQVwj*R~r(inGpr z;>sKNm_79V6}{e7>Bl@vH?Djv1fR4;=*`sPYHKn1(}elMX$Px07xGH*HcEdh^)dJ5 z2I3(f=@safdG8%3o(XCvYxQ|r_oOmd!Pv;oJLggjmi)sD~g4~p4MSh z>za$bKHG^D=z8WJv^T!Vavof5ZN6ns%nMGcdHW2T>%Ot}A*-yJSkP|iJqrWsH;Z`c z-tLY@=KyL9aB(9I6hHYTY%e?gjDz92PX_V$-QJDi;W8!zS0)I;PI5!blc4H5A++J> zEo+CArKMpRG&X8{Al|@kMu~o4Hn*}-H~laXx-1IQj!Go9Hx7b-yu;`$-o8Qlv@h~V zGD_T>+?UB$l1Vd{q_n|OzFq42=h}^Khr`XLo6q|_P1e@i3dVWXbWf7OJc*;aR+4M$ zMxHY`J$F&ftAQ^|;Gy%k4Z5@YE6p(9lnh45r+pZ1haEG-mO3tPKHkEw*5=LbLtp83 zp@Mm^-)lp#OKHS1M3(y<1+^4c;PV0V$^D#Iuf2jj9dFD&@E|(3&bw}Z3WJx`TI6_Z zk;6EjVGdg>TLxnu_T7iHjV}|=l4^|$Y7i{)=YMY8pNcuv1jN zYl@B_y07`-d!Nfo*NQqRUX z2BSsjUt-D0-u6~$mX?N6yv*x)bmgvxRzt=Y^p$e%uCJ!YHjy#_y|GpwtEV%B@v;DhVP1$;w)#ojb= zmWT*dQq~s{v|z*)uZHb*FyD8}i3&r@pFc)`Q!-v%X-L zX4;-swV{zE7F(dgNr#PY9ER?zyc*{5k?^X=fT$13VfWOe#I@eN5ICMK*YqtTa7&H& zgqc{Y)7RDpUo~>Kd*=UpBVt1)yIN`kr^XecWaZEcIXb}$L9}Kn*JX=~eZ^#<=14!c zmBppCPYq9gu;?e>q&24@2$*2AJhQ#>aEhKHYwGoTIvv!(%A0j}A5viulb?K?Gs%AM zHMhGJJr?<+VUp2tnj7>jyU|f>%IEXi6=KO0!y^yO(O6hbfBj}#dF7yWw#&BEG}LFc zg;~7jmHix_Fum2o%+#%99@HN7y>Y~kh-_`T!m_*0s2%If!7#%6laNye0}RbUlTgAI z6NBZ!l-@NFk&~acyL$w^O4$D}RPxtA|2$8Z~l-bS=uC zD^FrIM7qEqO>TR7yX6@TEr__&kFxMs?oCNDslB_{ee1;i9p6LXKf10jPo**t6SWR- z;GgaIz8~FTHK%Js1(4IQqkZ6M$Y=k^_Zs~yKa^U-`fL1^fh>Ksw1%hg-d~xEBw(-a?=k zCOXA|cZ|5NqT*6N7s98^__!D41op8-NhFL_Q~+PSjqT%25e`Gb(c~%^UWIK-Xb|pm0%RnFH-)x-AycMVRI}UONRX|VOxK)?R#mS2MfWnql0^i;wHXD9>dhl z(M6rRu4yL6PvJB5!13)?I8c^`--?+yy{wn5*K=7UQRMA z&}Q!RV588%2Rj#Es4RwfA~ue2atpkCWf$xb(yyr+aMh@^&Bnc|?DpI{5ocQHqfc*w zw^l3NyD3iSq$0}de6Pwl^ge4PDbv#yN!B8*ZEz7|e)<`UErg1X0XO|r>!ZG9a!x9(g{uG>G`doX_F{ms`W zq+)B=%0RCk;<&bCoyU-r3ovG;j4Evnk1IfssTc1b3Ckl5Hq{14xBuGyhuzWA6X zSLVI&XGj~$^x-$79q>W}|3K{!7A$d>0jR|}r24M`>^ zHi&2P;Mr2j5w)&4c!%xlQbH!*kO{#K4sNuQVF!P@6MatM-3*AkwALYN@FI_c^SDm( zGf3nCAZCMX5o1! zPRFISOYY+$j6-Vr^wT5oWU^AOO;Y#IHBs6z?_sanSSz%eX~Nzup@Wa>2hkuF>SZvi6v(P0)`R^&m0>*ycHf;V&Cfpo6P zw9;?;wK{7?v#$EBB$O58pS9l&JgSJ0_$aewp*lUJ9^4JNn1F~(bmI5)$7fpr7I9bD_=iI!t!LR%;vV5 zLVVl`JU6BhSt0(pgyWKr`LcSLgf4kM>F#_r;%;QM{!pQ?<)Z zJ4e`XSn|oK`7d+h7xzm$+z6Lj7s(EJ2&Spfz0AOV-&*W$_`za?dm`|G>V%|}FCRS} z4b3wj`~sh5k^>%XW&zU;n5{PT%UVm3&#DNv46NqKxI8P>IFP6)g0Trx|Na869Qq}g zAfK#_IU@LI(_Ktyp=Q0L^?sZ{;O>KByN>YYK6$mC7>9k))UO!Ap}PaTth`2?av((t zyG7XBEk|L{u1AJQ_crnJxyOPHNtZf4&Q<+THarnFYh9^<3@e4*@4hLvee#{O_AM24 zM{UDWxD2Savew^LJ^JYY=6>OD*-x(rgi&?LjLoj7W#T!h_o=Dm7$D|a4YrT9Bh?j{ z-mLF1ob~if*uGSj`{{AxdpNy$`pSA51EYPDhADK~mw7bn;?%z9s);cB-U@77Jg_J| zcD>G{rDusbwLe*`_u~7!+-qdES6zC{lhf<=2HL1fY%+H)nF(x%>`#F`{ak~9;m;owN*gqBb^|@ z6VrgqV^1Twozap&;$3#to)8}CEMfsUo#+MoB%x6U^O@K&`vRtk+sJ%#vU`xgtwOR_ z(}#%)8=6#mL7_FiwrcKjBDkx=xx5bgU*xmmtL2>U(bPng+4nHPCd^e#Lo&jsLhn?= z*1lx3gRYmh$de}#^)CrN536^IHI$dy2iMv{*XpHWd{A2rtXG>?*i&i<*b^yTV#zv1 z5B}5cEuE0W$D6?x`W+HcR}yIxUbX$)5D=tay9p5^($YQ+2dh-#6MghQ>*ly@KVN8j z-F3ZYY&GY?$VjOOmvH|wtAMq4ATFJ$s1%3;v_pB1a|z;zWCXT0Q@^0x4zhR2WE}jJ zy_xpvIDX_CAA^d6;&8^YW>L(&A|tzGPvzfSt}{YoaBXZb${XjtuB;Eotm&Jo$exP+DR=~!;c*Zx^tehzPqB~-8D6NUy*&a)P(Hu!NZd*lMTb^u~1q~ zmFl6L*1(&a!*TGE->T&EO9 z?SCI(UixEj%VT}(6BZlc^?QjJgEMfKBp^_!j@p}togepzMWzo7#&yK>t%bI)d)Hqx z`9m}{ldM8F3zpEeZYs(IbCrd^(Tl1AJLeCr6HLmC_b)u_BNzt#%sx%y^={QP-5$99 z7?k(ZZSBs3oA)TP@Ilnkt<4+T+&&PG8feu{JAAYvUxLS=dhb5EWQ+;1{Ji|<1q;Xg z0cbwv67VT_cL|yKeVh4D0x|FVI*sQxWI!pU zKl#lCUWxS(?x!AYz@#{(L?Xzx&|v)0Z7>9eJ6a^h)a0)XlM@huSq21#4JjsravH7+ zcJF=0j?Fiw|8xklH}|UeTqiP5xvJAP>k9i-SC`*g2k+kN?Omp|6nVUOgx0P38;!Vp zPvgI$5ohnTOA+TKa9CSe+1nZ$Tj{A==v&#FQW+bXYXL7j7+PD~TAP{JSX$Uv0Fek= zYu%O>%Z=~dml=^q5e^b~h*eEHFLC{5W}teq`vb>Ki<(z!gRCib&8I$d~3v^yKI{}KJbIw(>n|u zd&QQ(cNY}2TJyxyxKsVY-8J{zISiyLL=y`Ki_M`?mpmtzAN5b&GHBr+XWX6Tyzwb- z;h8~j#fnYaYYIbcL*H@O!JV6VwiXI)&mb|Bb`>b8bs44h`uqBsc9hCjcvZUlF8f~f z;6*kH0=7qKXY})EzOD_n^aU{s=96?WBvVm|my%ps?p+MYo-7bAIB^4%jIq#%v*3f( zuLxv&Lk*Gp!^1TZkSBk+$BAo;KXINK9ZRL&w0j|dv#}wYG-HT$`gMyF4}z!i?CaJT zo##52Gg<`OR(K*KP)P&@ByUAMBa^Sm6$FAGzUJoSJ%}HQK;_PPu6i%lFSZSOx{A*2 zD9jt8W04}@)5G3c;h6@qJ$L6W)MSzS{rT?Mx7NE&!fQ@c*VYzaa{cPf!acEC7O|j%U8m2uUC@dFe(K2%J6co?U765!iY#5H(A~z!#re}#aO|EQtha5 zL|C4ra0JYAZo4RmR_FnPGR2^FL#MsR;oj3;21x7IZT0B`b_u@X@>{bt*z6B#k>01OcU=3~5j#?O# z>9Mme*H$0c&*XN4$-U*l7QbE-w(#E?d3O0yLT=f-n#mWu0(uc037^*-yyG#rqmdpV zc8@=%;q;|MZqSm)m_|c*O}^x}xl`!m!T4_GBgyJW}Vl_-gFo z6lzLSB)VJSdXJ)d40CUr`wm=Qm|mabm9qX~#Nvl?PqLltr4 z#5Ln=zIe@e;2|1#cgO3yc-cyVJ9TTZVod|Z%SoxY_6`NL;;WueGdzI~N|J_?_CB&j z;PxI9Qg=j2B3LAn&}i8L)NFd+O%U*P#bZIGJ9^tU37ZbzB1Gok_4Sf&u-T1M91!D^ z6bHLPN}iMj@E+|R=1Jwmjr(hOEgr0_V1-#&h^=z-!bzNiz3$5}i5rxyzPI6~-M&-n zk|99IM9t(`pk~z2Sl-*GU04_QlK5=Z3Yf||D&QD}E$cK^3o7?B0CeA*s@ zAl{l#$FWQ_Q_Hx`mb3NbOggIj>8f8?;l84~)@@(h@j9pZ8_Z)oY%F$QDaS%1#ejA0 zq_INyVXiF4eNgRymfP*D`rk)Jgu|%r>6%@U+1*wYZylLlIYUT9om+PyaC94es_Z`I zIm`_&jeG^unzQ=lT&yIK?xQ2E>M#~?RPi2Bd^XTKzSSEGDRS*!SNDBj8f z)wApKKL}{{)O2a+^xh|tqKMaRyFE0E{hl2~J3H+$OU_=5zMer+jY5(0{GtM5L#bRg$Y&II(8k+V56bxX~$#z*Y8MKvt5GF{DDYJm2O<^-8yuTc%V@2tm0s1&PdHoJ5;&5A<^*0 z<-nc|3sRP(A*g&ZxN=IP`RZNFnSH4oKXvMF^6xwU1=7;VmHmM(*rxQw#ZUJkBnX?0 zY#bf3slWV$%$p0xc`ls`ZwgvvBXM=}!D6?+4q(F`n;ls*4m(Loc$(&PH+9EFcQ5i} z?QkR86FjoJtJYeoUN2c4x+|5vo4ucz4FVB{FYzC>o5VV397<9Vo!ShW7#iC^X+Y(l zG20R;Xg+PU$zt%$wtP^{&mm&*y2+N%wvAwdT7+-o%VMd=AUZw zy(4SknDsl&p#Kl4Ah1K-yJ1hXVKU4nFBSeV9@rh=z-f{#&S#Zhsi890~MUSi#s)`Tc`S$%zQr6kg@2oOQ&+lTBZX0(ltsE=7U8Tl5vDyfMqn>;9!oQ%P2}M)OgVrCw;EFYAPSiK{R6%VQT9L2!(dc zx{RHHTPt*OeUEqvWU>MA$w^IalLtqRVg&A7YQfTdh&E>0)(!_rIr>P6a)F(e2?wEw8s#A3s|$hkxpzJSjvsT=?bh(uO7|Pr06`v zjs;f6XDP_mY7Uns59Nh3Er(+KP;s{kq(FQF<2-YIh zTdP06BGf2D_wOY-l@7U$pH%je7iK<#P{(W8`hLJJ%PxS9zg9=8&^A`aCZ(yKkk9iB z$=f3|Bm?spCXcCiUoIi$78}+F1#*%CVh??777N3Bz!s2&=3ER-OsY}M{VG?PPoWK3Zl0hN&_GE*M!SkA(YFNm2D})+* zC$E=j>uC8)MN@mm(utw2$}f?SYMspho`Zlb$sz6#`OQ11^`6@rps(tn?9DVAI3v2V zyEt=4rnf#1Z)rxI<7jU-0PLh1fW-&SWRT(AupwAQRS>FVah7#}(H|}}KmOnhG9?}B zxIS8Y-U~S8uswZ)J5EN(l99Xx%Rs^+?yhk z?PkvU;$+3-U7=`HL@X^5DCamKDo_)fqFgfF(&dP*pBs5R!R42GH@iPIv2=e9@2;y{ zJga}o>^fu&H|_c?%|dv#fWm0Ot@`zj3CfExp`v*wy{x6elmr)TWH~ ze9f!!{xmknmQqGfV*xGLH5NP@%%kUHauj`kO+|0q1E?y#yekyHz% zgu(g3E`VNUp5FQrE?#K?J1fg>Qfq=rd#^x<-={Il+yggc0yxh9MlrXIViDDR4qjS= zZ(HtVT`KuEGJoTA;f_}R!Gv6$r6m;5bVVznHKNg$)K_e#vefC=5+RS3;EF7_W%IMj zgD=r*Ydq}QZG@pir9$;8so~vIn&>lG4*iorc@9dwa>%-%j z=B@(Tqb(P=dj9tI+2^3Gq_h$*2Sz#yE&)qFk1uo{$e2(FAY7!{R);CAx+GFo#Cs2_ zXqzUDqRPkw%XHr9#-cgAuShzXUAWrOcL=3U=ydwC$-*QU>Z0}<0N=_UT9#P}| z%_4vxyWcCxO=H^mb1WU5XbruamNUx$-fzjg=!0Tl*wMpHI%+e}G_LkL)TB81Tn64*?ZMrc-zJ_jme>>C;VlvsI5UU+4*7#I6+Iu|yB? z^2b8H#TG7NGoj01L}>nM4Cc{2oP*KTifiMLOdnHwQkL%dki4Voz|94WCmiWfXcF3V z*>&y8vG${li$G~qMdHPg;JeRe_6qu&!622xphULgN0y`=mJ;pIx;={*1SGJ8mZPXX z^G1n;1hGd==rQocW-R)d0*V62@f_^?XG2(^{2~I``>KP`Hu2Pq*A+O&h(@tLxUMRb R>C&&Q%2HZ^knuc6?mv)S8Q=f_ literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/slime_001.ogg b/app/static/assets/kenney/audio/slime_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c7efa956a51d721a16da4d9f648e382df63d36b5 GIT binary patch literal 159177 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�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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/particles/glow.png b/app/static/assets/kenney/particles/glow.png new file mode 100644 index 0000000000000000000000000000000000000000..6da5eaba47d8c47ad046270a31180fa3ffd83a80 GIT binary patch literal 16354 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 E01-W~qyPW_ literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/particles/muzzle.png b/app/static/assets/kenney/particles/muzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..eba8f498b526fdef6eb2ca924851ddced1ff4826 GIT binary patch literal 11976 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

o1&^Z?_qs0seCT_q_eR$HboZyPq@;qvt?}c> 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/particles/spark.png b/app/static/assets/kenney/particles/spark.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9556d75d6e9e47b4837024662dbfe224e48b12 GIT binary patch literal 9834 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 S+e|jq1gy<%%qmRK(f<#UI0gU! literal 0 HcmV?d00001 diff --git a/app/static/assets/sprites/blechsoldat.svg b/app/static/assets/sprites/blechsoldat.svg new file mode 100644 index 0000000..9b325cd --- /dev/null +++ b/app/static/assets/sprites/blechsoldat.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/static/assets/sprites/brutmutter.svg b/app/static/assets/sprites/brutmutter.svg new file mode 100644 index 0000000..0b88356 --- /dev/null +++ b/app/static/assets/sprites/brutmutter.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/emblem.svg b/app/static/assets/sprites/emblem.svg new file mode 100644 index 0000000..1af62a6 --- /dev/null +++ b/app/static/assets/sprites/emblem.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/krabbler.svg b/app/static/assets/sprites/krabbler.svg new file mode 100644 index 0000000..222c0fb --- /dev/null +++ b/app/static/assets/sprites/krabbler.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/nieter.svg b/app/static/assets/sprites/nieter.svg new file mode 100644 index 0000000..96f5733 --- /dev/null +++ b/app/static/assets/sprites/nieter.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/president.svg b/app/static/assets/sprites/president.svg new file mode 100644 index 0000000..046c88b --- /dev/null +++ b/app/static/assets/sprites/president.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/sprungkralle.svg b/app/static/assets/sprites/sprungkralle.svg new file mode 100644 index 0000000..3855feb --- /dev/null +++ b/app/static/assets/sprites/sprungkralle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/static/assets/sprites/supply-pod.svg b/app/static/assets/sprites/supply-pod.svg new file mode 100644 index 0000000..5fe62db --- /dev/null +++ b/app/static/assets/sprites/supply-pod.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/static/assets/sprites/turret.svg b/app/static/assets/sprites/turret.svg new file mode 100644 index 0000000..bb741a0 --- /dev/null +++ b/app/static/assets/sprites/turret.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/static/assets/sprites/walzmeister.svg b/app/static/assets/sprites/walzmeister.svg new file mode 100644 index 0000000..40a8e8b --- /dev/null +++ b/app/static/assets/sprites/walzmeister.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/static/css/site.css b/app/static/css/site.css new file mode 100644 index 0000000..1407aa3 --- /dev/null +++ b/app/static/css/site.css @@ -0,0 +1,231 @@ +/* + * Glory Defense – Seiten- und Overlay-Styles. + * Das Spiel selbst zeichnet Phaser ins Canvas; hier liegen nur Seitenrahmen, + * der Disclaimer und die HTML-Overlays (Dialoge, Namenseingabe). + */ + +:root { + --gd-navy: #0d1321; + --gd-navy-2: #1b2438; + --gd-crimson: #c1121f; + --gd-gold: #f2c14e; + --gd-cream: #f4ecd8; + --gd-muted: #a9b1c4; + /* Nur Systemschriften: nichts wird mitgeliefert, keine Lizenzfragen. */ + --gd-font: Impact, Haettenschweiler, "Arial Narrow Bold", "Arial Black", sans-serif; + --gd-font-body: "Segoe UI", system-ui, -apple-system, sans-serif; +} + +* { box-sizing: border-box; } + +html, body { + margin: 0; + height: 100%; + background: var(--gd-navy); + color: var(--gd-cream); + font-family: var(--gd-font-body); +} + +a { color: var(--gd-gold); } + +/* ------------------------------------------------------------------ Spielseite */ + +.game-page { overflow: hidden; } + +#game-shell { + position: relative; + width: 100vw; + height: 100vh; + height: 100dvh; +} + +#game { + position: absolute; + inset: 0; +} + +/* Canvas nicht auswählbar/verschiebbar, sonst stört das beim schnellen Klicken. */ +#game canvas { + display: block; + user-select: none; + -webkit-user-select: none; + touch-action: none; +} + +.boot-message { + position: absolute; + inset: auto 0 45% 0; + margin: 0; + text-align: center; + font-family: var(--gd-font); + letter-spacing: 0.08em; + color: var(--gd-gold); +} + +.boot-message--error { color: #ff8a8a; } + +/* ------------------------------------------------------------------ Overlays */ + +#overlay-root { + position: absolute; + inset: 0; + pointer-events: none; +} + +.overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 16px; + background: rgba(8, 11, 20, 0.72); + pointer-events: auto; +} + +.overlay__panel { + width: min(720px, 100%); + max-height: 100%; + overflow-y: auto; + padding: 28px 32px; + background: var(--gd-navy-2); + border: 3px solid var(--gd-gold); + box-shadow: 0 0 0 6px var(--gd-crimson), 0 18px 48px rgba(0, 0, 0, 0.6); +} + +.overlay__actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 24px; +} + +/* ------------------------------------------------------------------ Disclaimer */ + +.disclaimer__title { + margin: 0 0 12px; + font-family: var(--gd-font); + font-size: 1.6rem; + letter-spacing: 0.06em; + color: var(--gd-gold); + text-transform: uppercase; +} + +.disclaimer__lead { font-size: 1.15rem; } + +.disclaimer__list { + margin: 0; + padding-left: 1.2em; + line-height: 1.55; +} + +.disclaimer__list li + li { margin-top: 8px; } + +/* ------------------------------------------------------------------ Formulare */ + +.button { + display: inline-block; + padding: 10px 22px; + border: 2px solid var(--gd-gold); + background: var(--gd-crimson); + color: var(--gd-cream); + font: 700 1rem var(--gd-font-body); + letter-spacing: 0.06em; + text-transform: uppercase; + text-decoration: none; + cursor: pointer; +} + +.button:hover, .button:focus-visible { + background: var(--gd-gold); + color: var(--gd-navy); + outline: none; +} + +.button--secondary { background: transparent; } + +.field { + display: flex; + flex-direction: column; + gap: 6px; + margin-top: 16px; +} + +.field__label { + font-weight: 700; + letter-spacing: 0.03em; + color: var(--gd-gold); +} + +.field__input { + padding: 10px 12px; + border: 2px solid var(--gd-muted); + background: var(--gd-navy); + color: var(--gd-cream); + font-size: 1.1rem; +} + +.field__input:focus { border-color: var(--gd-gold); outline: none; } + +.field__hint { color: var(--gd-muted); font-size: 0.9rem; } +.field__error { color: #ff8a8a; min-height: 1.2em; } + +/* ------------------------------------------------------------------ Game Over */ + +.stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 10px; + margin: 18px 0 8px; +} + +.stats__row { + padding: 10px 12px; + background: var(--gd-navy); + border-left: 4px solid var(--gd-crimson); +} + +.stats dt { color: var(--gd-muted); font-size: 0.85rem; } +.stats dd { margin: 4px 0 0; font: 600 1.35rem var(--gd-font); color: var(--gd-gold); } + +.highscore-list { + margin: 16px 0 0; + padding: 0; + list-style: none; +} + +.highscore-list li { + display: grid; + grid-template-columns: 3em 1fr auto 4em; + gap: 12px; + padding: 6px 10px; + border-bottom: 1px solid rgba(169, 177, 196, 0.2); +} + +.highscore-list__score, .highscore-list__wave { text-align: right; font-variant-numeric: tabular-nums; } +.highscore-list__own { background: rgba(242, 193, 78, 0.18); color: var(--gd-gold); font-weight: 600; } + +/* ------------------------------------------------------------------ Eigenständige Seiten */ + +.page { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 16px; +} + +.page__panel { + width: min(760px, 100%); + padding: 32px; + background: var(--gd-navy-2); + border: 3px solid var(--gd-gold); + box-shadow: 0 0 0 6px var(--gd-crimson); +} + +.page__actions { margin-top: 28px; } + +@media (max-width: 600px) { + .overlay__panel, .page__panel { padding: 20px 18px; } + .disclaimer__title { font-size: 1.25rem; } +} diff --git a/app/static/favicon.svg b/app/static/favicon.svg new file mode 100644 index 0000000..4441496 --- /dev/null +++ b/app/static/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/static/js/config.js b/app/static/js/config.js new file mode 100644 index 0000000..57a012a --- /dev/null +++ b/app/static/js/config.js @@ -0,0 +1,449 @@ +/** + * Zentrale Spielkonfiguration: alle Balancing-Werte an einem Ort. + * + * Keine Magic Numbers im restlichen Code – wer das Spiel ausbalancieren will, + * ändert nur diese Datei. Einheiten: Pixel, Pixel pro Sekunde, Millisekunden. + * Die Werte sind in docs/GAME_DESIGN.md erläutert. + * + * Achtung: Die Punkte-Obergrenze im Backend (app/config.py, GAME_RULE_DEFAULTS) + * ist auf diese Werte abgestimmt. Wer Punkte stark erhöht, muss sie dort anpassen. + */ + +/** Darstellung und Spielwelt. */ +export const GAME = Object.freeze({ + width: 1280, + height: 720, + backgroundColor: '#11151f', + /** Die Arena ist größer als der Bildschirm; die Kamera folgt dem Präsidenten. */ + world: Object.freeze({ width: 2400, height: 1600 }), + /** Gegner erscheinen so weit außerhalb des sichtbaren Randes der Arena. */ + spawnMargin: 40, + cameraLerp: 0.12, + /** Tiefe (Zeichenreihenfolge) der Ebenen. */ + depth: Object.freeze({ + ground: 0, + markers: 5, + pickups: 8, + enemies: 10, + player: 20, + projectiles: 25, + effects: 30, + hud: 100, + }), +}); + +/** Präsident Maximilian Valor. */ +export const PLAYER = Object.freeze({ + maxHp: 100, + speed: 240, + radius: 18, + /** Kurze Unverwundbarkeit nach einem Treffer, damit ein Schwarm nicht in einem Frame tötet. */ + hitInvulnerabilityMs: 500, + /** Heilung nach jeder überstandenen Welle – belohnt Fortschritt ohne Nachschub. */ + waveClearHeal: 15, + dodge: Object.freeze({ + speed: 640, + durationMs: 320, + cooldownMs: 1500, + }), + /** Waffen in Slot-Reihenfolge (Tasten 1–3). */ + weaponSlots: Object.freeze(['carbine', 'shotgun', 'pistol']), +}); + +/** + * Waffen. `reserveMax: null` bedeutet unbegrenzte Reserve (Dienstpistole als + * Rückfalloption, damit der Spieler ohne Munition nie wehrlos ist). + */ +export const WEAPONS = Object.freeze({ + carbine: Object.freeze({ + id: 'carbine', + name: 'Karabiner »Zuversicht«', + shortName: 'Karabiner', + magazineSize: 30, + reserveStart: 180, + reserveMax: 270, + fireIntervalMs: 110, + reloadMs: 1500, + damage: 14, + pellets: 1, + spreadDeg: 3, + bulletSpeed: 900, + rangePx: 820, + automatic: true, + }), + shotgun: Object.freeze({ + id: 'shotgun', + name: 'Schrotflinte »Überzeugungskraft«', + shortName: 'Schrotflinte', + magazineSize: 6, + reserveStart: 24, + reserveMax: 48, + fireIntervalMs: 650, + reloadMs: 1900, + damage: 11, + pellets: 8, + spreadDeg: 24, + bulletSpeed: 820, + rangePx: 420, + automatic: false, + }), + pistol: Object.freeze({ + id: 'pistol', + name: 'Dienstpistole »Anstand«', + shortName: 'Pistole', + magazineSize: 12, + reserveStart: null, + reserveMax: null, + fireIntervalMs: 260, + reloadMs: 1100, + damage: 16, + pellets: 1, + spreadDeg: 2, + bulletSpeed: 860, + rangePx: 700, + automatic: false, + }), +}); + +/** Faktionen (für Farben, Texte und Wellenzusammensetzung). */ +export const FACTIONS = Object.freeze({ + swarm: Object.freeze({ id: 'swarm', name: 'Die Schwärmer' }), + legion: Object.freeze({ id: 'legion', name: 'Die Blechlegion' }), +}); + +/** + * Gegnertypen. `cost` ist der Preis im Wellenbudget, `behavior` wählt die KI. + * Verhalten: + * - swarm: umzingeln (jeder Krabbler hat einen eigenen Anflugwinkel), nah dran direkt angreifen + * - leaper: verfolgen, dann mit Vorwarnung einen Sprungangriff ausführen + * - brood: langsam verfolgen und dabei Krabbler ausbrüten + * - kite: Abstand halten, seitlich ausweichen, aus der Distanz schießen + * - flank: seitlich versetzt zum Spieler positionieren (Flanke), Salven schießen + * - siege: großer Abstand, Fächersalven und Mörser mit Bodenmarkierung + */ +export const ENEMY_TYPES = Object.freeze({ + krabbler: Object.freeze({ + id: 'krabbler', + name: 'Krabbler', + faction: 'swarm', + tier: 'small', + behavior: 'swarm', + hp: 20, + speed: 175, + radius: 12, + contactDamage: 6, + contactCooldownMs: 700, + points: 10, + cost: 1, + groupSize: Object.freeze({ min: 4, max: 8 }), + /** Abstand, ab dem der Krabbler den Umzingelungspunkt verlässt und direkt angreift. */ + engageRange: 170, + encircleRadius: 130, + }), + sprungkralle: Object.freeze({ + id: 'sprungkralle', + name: 'Sprungkralle', + faction: 'swarm', + tier: 'medium', + behavior: 'leaper', + hp: 60, + speed: 125, + radius: 17, + contactDamage: 14, + contactCooldownMs: 800, + points: 30, + cost: 3, + groupSize: Object.freeze({ min: 1, max: 3 }), + leap: Object.freeze({ + triggerRange: 260, + windupMs: 450, + speed: 560, + durationMs: 380, + cooldownMs: 2400, + }), + }), + brutmutter: Object.freeze({ + id: 'brutmutter', + name: 'Brutmutter', + faction: 'swarm', + tier: 'elite', + behavior: 'brood', + hp: 450, + speed: 58, + radius: 34, + contactDamage: 28, + contactCooldownMs: 1000, + points: 250, + cost: 15, + groupSize: Object.freeze({ min: 1, max: 1 }), + brood: Object.freeze({ + intervalMs: 5000, + spawnCount: 3, + /** Obergrenze lebender Nachkommen, damit eine ignorierte Brutmutter nicht eskaliert. */ + maxChildren: 6, + childType: 'krabbler', + }), + }), + nieter: Object.freeze({ + id: 'nieter', + name: 'Nieter-Drohne', + faction: 'legion', + tier: 'small', + behavior: 'kite', + hp: 30, + speed: 95, + radius: 13, + contactDamage: 5, + contactCooldownMs: 800, + points: 20, + cost: 2, + groupSize: Object.freeze({ min: 2, max: 3 }), + range: Object.freeze({ min: 220, max: 340 }), + attack: Object.freeze({ + cooldownMs: 1500, + burst: 1, + burstIntervalMs: 0, + count: 1, + spreadDeg: 0, + damage: 7, + speed: 330, + /** Nur feuern, wenn der Spieler näher als das ist (etwas mehr als range.max). */ + maxDistance: 480, + }), + }), + blechsoldat: Object.freeze({ + id: 'blechsoldat', + name: 'Blechsoldat', + faction: 'legion', + tier: 'medium', + behavior: 'flank', + hp: 90, + speed: 78, + radius: 18, + contactDamage: 10, + contactCooldownMs: 900, + points: 50, + cost: 4, + groupSize: Object.freeze({ min: 1, max: 3 }), + range: Object.freeze({ min: 200, max: 380 }), + /** Winkelversatz der Flankenposition relativ zur Linie Spieler→Gegner. */ + flankAngleDeg: 70, + flankDistance: 290, + attack: Object.freeze({ + cooldownMs: 2300, + burst: 3, + burstIntervalMs: 140, + count: 1, + spreadDeg: 4, + damage: 8, + speed: 400, + maxDistance: 520, + }), + }), + walzmeister: Object.freeze({ + id: 'walzmeister', + name: 'Walzmeister', + faction: 'legion', + tier: 'elite', + behavior: 'siege', + hp: 700, + speed: 44, + radius: 36, + contactDamage: 25, + contactCooldownMs: 1000, + points: 400, + cost: 18, + groupSize: Object.freeze({ min: 1, max: 1 }), + range: Object.freeze({ min: 260, max: 460 }), + attack: Object.freeze({ + cooldownMs: 2700, + burst: 1, + burstIntervalMs: 0, + count: 7, + spreadDeg: 50, + damage: 10, + speed: 290, + maxDistance: 640, + }), + mortar: Object.freeze({ + cooldownMs: 5200, + delayMs: 1400, + radius: 90, + damage: 26, + maxDistance: 700, + }), + }), +}); + +/** Allgemeine Steuerungswerte der Gegner-KI. */ +export const AI = Object.freeze({ + /** Abstand, unter dem sich Gegner gegenseitig wegschieben (verhindert Klumpen). */ + separationRadius: 34, + separationWeight: 1.4, + /** Richtungswechsel beim seitlichen Ausweichen (Strafen) in diesem Zeitfenster. */ + strafeSwitchMs: Object.freeze({ min: 1400, max: 3200 }), + /** Wie stark die Bewegung pro Frame zur Wunschrichtung nachgeführt wird (0..1). */ + steeringResponsiveness: 0.18, +}); + +/** Wellen-Generator (siehe logic/waves.js). */ +export const WAVES = Object.freeze({ + /** Budget(n) = firstBudget + growth * (n - 1) ^ exponent */ + firstBudget: 8, + budgetGrowth: 5, + budgetExponent: 1.15, + /** Wellen 1–2 nur Schwärmer, 3–4 nur Blechlegion, danach gemischt. */ + legionFromWave: 3, + mixedFromWave: 5, + /** Jede n-te Welle bringt Elite-Gegner. */ + eliteEvery: 5, + maxElitesPerWave: 4, + /** Anteil des Restbudgets, der in mittlere Gegner fließt – steigt mit der Welle. */ + mediumShareBase: 0.1, + mediumSharePerWave: 0.04, + mediumShareMax: 0.5, + /** Ab dieser Welle werden Gegner zäher und schneller. */ + scalingFromWave: 6, + hpScalePerWave: 0.07, + speedScalePerWave: 0.012, + speedScaleMax: 1.3, + /** Zeitlicher Abstand zwischen zwei Spawn-Gruppen. */ + groupDelayMs: Object.freeze({ min: 1300, max: 3000 }), + /** Spätere Wellen spawnen schneller, aber nie schneller als dieser Faktor. */ + groupDelayMinFactor: 0.45, + groupDelayFactorPerWave: 0.035, + /** Solange so viele Gegner leben, wartet der Spawner. */ + maxAliveEnemies: 60, + intermissionMs: 8000, + firstWaveDelayMs: 1500, +}); + +/** Punkte und Serien-Multiplikator (siehe logic/scoring.js). */ +export const SCORING = Object.freeze({ + /** Abschüsse innerhalb dieses Fensters setzen die Serie fort. */ + streakWindowMs: 3000, + /** Alle `stepKills` Abschüsse steigt der Multiplikator um `stepValue`. */ + stepKills: 5, + stepValue: 0.5, + maxMultiplier: 4, + /** Treffer am Präsidenten beenden die Serie. */ + damageBreaksStreak: true, + waveBonusPerWave: 100, +}); + +/** + * Orbital-Befehle: Taste `holdKey` gedrückt halten, dann die Richtungsfolge mit + * Pfeiltasten oder WASD eingeben. Ziel ist die Mausposition (auf maxTargetRange begrenzt). + * Keine Folge darf Anfang einer anderen sein (wird in den Tests geprüft). Die Codes sind + * eigene Erfindungen; jeder beginnt mit einer anderen Richtung, damit man sich nach + * dem ersten Tastendruck nicht mehr vertippen kann. + */ +export const ORBITAL = Object.freeze({ + holdKey: 'Q', + maxTargetRange: 560, + commands: Object.freeze([ + Object.freeze({ + id: 'strike', + name: 'Orbitalschlag »Morgenröte«', + shortName: 'Orbitalschlag', + sequence: Object.freeze(['up', 'right', 'down', 'down']), + cooldownMs: 30000, + delayMs: 2500, + radius: 150, + damage: 260, + /** Auch der Präsident steht nicht über der Physik. */ + playerDamage: 40, + }), + Object.freeze({ + id: 'supply', + name: 'Nachschubkapsel »Fürsorgepaket«', + shortName: 'Nachschub', + sequence: Object.freeze(['left', 'left', 'down', 'right']), + cooldownMs: 45000, + delayMs: 3000, + radius: 70, + damage: 120, + playerDamage: 20, + heal: 50, + pickupRadius: 46, + lifetimeMs: 30000, + }), + Object.freeze({ + id: 'turret', + name: 'Geschütz »Wachsamer Nachbar«', + shortName: 'Geschütz', + sequence: Object.freeze(['right', 'left', 'right', 'up', 'up']), + cooldownMs: 60000, + delayMs: 3000, + radius: 60, + damage: 80, + playerDamage: 15, + durationMs: 25000, + fireIntervalMs: 150, + range: 480, + bulletDamage: 12, + bulletSpeed: 950, + }), + ]), +}); + +/** Darstellung von Kombinationspfeilen im HUD. */ +export const DIRECTION_SYMBOLS = Object.freeze({ up: '↑', down: '↓', left: '←', right: '→' }); + +/** Farben (Platzhaltergrafiken, HUD, Effekte). */ +export const COLORS = Object.freeze({ + navy: 0x0d1321, + crimson: 0xc1121f, + gold: 0xf2c14e, + cream: 0xf4ecd8, + muted: 0xa9b1c4, + ground: 0x2a2f24, + groundAlt: 0x31372a, + player: 0xf4ecd8, + playerCape: 0xc1121f, + swarm: 0x8fbf3a, + swarmDark: 0x4f6d1e, + legion: 0x9aa4b5, + legionDark: 0x535c6b, + playerBullet: 0xffe28a, + enemyBullet: 0xff5a3c, + turretBullet: 0x9be7ff, + strike: 0xff7b00, + supply: 0x4fd1c5, + turret: 0x9be7ff, + mortar: 0xff3d3d, + hpBar: 0x5ad469, + hpBarLow: 0xe0453a, +}); + +/** Standardlautstärken (0..1) und Ton-Parameter. */ +export const AUDIO = Object.freeze({ + defaultVolumes: Object.freeze({ master: 0.8, music: 0.5, sfx: 0.8 }), + /** Mindestabstand zwischen gleichen Effekten, damit Dauerfeuer nicht übersteuert. */ + sfxMinIntervalMs: 45, +}); + +/** Schlüssel für localStorage (versioniert, damit Formatänderungen alte Daten nicht brechen). */ +export const STORAGE_KEYS = Object.freeze({ + disclaimerAccepted: 'gloryDefense.disclaimerAccepted.v1', + volumes: 'gloryDefense.volumes.v1', + lastName: 'gloryDefense.lastName.v1', +}); + +/** Grenzen, die mit dem Backend übereinstimmen müssen (app/validation.py). */ +export const HIGHSCORE = Object.freeze({ + nameMaxLength: 16, + requestTimeoutMs: 8000, +}); + +/** Effekte und Rückmeldung. */ +export const FX = Object.freeze({ + screenShake: Object.freeze({ + hit: Object.freeze({ durationMs: 120, intensity: 0.004 }), + explosion: Object.freeze({ durationMs: 350, intensity: 0.012 }), + }), + hitFlashMs: 80, + damageNumberMs: 600, + announcementMs: 3800, + deathDelayMs: 1600, +}); diff --git a/app/static/js/content/texts.js b/app/static/js/content/texts.js new file mode 100644 index 0000000..9a31c4c --- /dev/null +++ b/app/static/js/content/texts.js @@ -0,0 +1,227 @@ +/** + * Alle Spieltexte an einem Ort (Deutsch). + * + * Tonfall: überzeichnete Propaganda einer frei erfundenen Regierung. Der Spott gilt + * Militarismus und Propaganda im Allgemeinen – keine realen Personen, Parteien, + * Länder oder Zitate. Namen und Begriffe sind bewusst eigenständig und stammen + * aus keinem anderen Spiel oder Film. + * @module content/texts + */ + +export const TITLE = 'GLORY DEFENSE'; +export const TAGLINE = 'Für Freiheit und Frieden!'; +export const PRESIDENT = 'Präsident Maximilian Valor'; + +export const MENU = Object.freeze({ + start: 'Mission starten', + highscores: 'Ehrentafel', + controls: 'Steuerung', + disclaimer: 'Disclaimer', + credits: 'Credits', + footer: 'Satire · Reine Fiktion · Alle Figuren sind frei erfunden', + hint: '↑ ↓ oder Maus zum Wählen · Enter zum Bestätigen', + touchNotice: 'Hinweis: Glory Defense wird mit Tastatur und Maus gespielt.', +}); + +export const DISCLAIMER = Object.freeze({ + accept: 'Verstanden – zum Hauptmenü', + close: 'Schließen', + openPage: 'Als eigene Seite öffnen', + missingTemplate: + 'Glory Defense ist Satire und reine Fiktion. Alle Figuren und Organisationen sind frei erfunden. ' + + 'Ähnlichkeiten mit realen Personen sind nicht beabsichtigt. Das Spiel vertritt keine politische Position.', +}); + +/** + * Missionsbriefings; eines wird zufällig gewählt. + * @type {readonly {title: string, lines: readonly string[]}[]} + */ +export const BRIEFINGS = Object.freeze([ + Object.freeze({ + title: 'EINSATZBEFEHL NR. 7-G · STRENG ÖFFENTLICH', + lines: Object.freeze([ + 'Präsident Maximilian Valor, Hüter des ewigen Friedens!', + 'Außerirdische Aggressoren bedrohen die Vereinigte Erde. Der Hohe Rat hat einstimmig beschlossen, dass Sie den Frieden persönlich verteidigen – mit allen Mitteln, die der Frieden erfordert.', + 'Feindaufklärung: Die Schwärmer sind schnell, zahlreich und haben schlechte Manieren. Die Blechlegion ist langsam, gründlich und schießt aus der Ferne.', + 'Ziel: Halten Sie so viele Angriffswellen wie möglich stand.', + 'Das Ministerium für Zuversicht versichert: Die Lage ist unter Kontrolle. Sie war nie außer Kontrolle. Es gibt keine Lage.', + ]), + }), + Object.freeze({ + title: 'LAGEBESPRECHUNG · SIEG BEREITS BESCHLOSSEN', + lines: Object.freeze([ + 'Herr Präsident, die Feinde des Friedens sind gelandet.', + 'Die Orbitalflotte steht bereit. Sie trifft stets präzise – wo sie einschlägt, war per Definition das Ziel.', + 'Halten Sie Q gedrückt und geben Sie die Befehlscodes ein. Der Rest ist Geschichte. Genauer: Geschichtsschreibung.', + 'Ziel: Überleben. Nebenziel: Überleben mit Stil.', + 'Für Freiheit und Frieden! Und für die Einschaltquote.', + ]), + }), + Object.freeze({ + title: 'TAGESBEFEHL · NICHT ZUR DISKUSSION', + lines: Object.freeze([ + 'Bürgerinnen und Bürger schauen zu. Der Präsident kämpft an vorderster Front, denn die Front ist, wo der Präsident ist.', + 'Die Schwärmer greifen in Rudeln an und umzingeln. Die Blechlegion hält Abstand und flankiert. Beide lehnen den Frieden ab. Wir bieten ihn trotzdem an – mit Nachdruck.', + 'Ziel: Jede Welle abwehren. Munition knapp? Fürsorgepaket anfordern.', + 'Das Ministerium für Zuversicht erinnert: Zweifel sind ab sofort meldepflichtig.', + ]), + }), +]); + +export const BRIEFING_CONTINUE = 'Leertaste oder Klick: Einsatz beginnen · Esc: zurück'; + +/** Propaganda-Durchsagen zwischen den Wellen. */ +export const PROPAGANDA = Object.freeze([ + 'Bürgerinnen und Bürger! Jede abgewehrte Welle bringt uns dem ewigen Frieden näher. Die nächste auch.', + 'Das Ministerium für Zuversicht meldet: Verluste sind statistisch nicht existent.', + 'Frieden ist die kürzeste Pause zwischen zwei Siegen.', + 'Erinnerung: Zweifel sind ab sofort meldepflichtig.', + 'Der Präsident kämpft persönlich. Die Front ist, wo der Präsident ist.', + 'Unsere Orbitalflotte trifft stets präzise. Wo sie trifft, war immer das Ziel.', + 'Heute ist ein historischer Tag. Wie jeder Tag seit Beginn der Durchsagen.', + 'Die Rationen werden um 20 % erhöht. Zuvor wurden sie um 40 % gesenkt. Ein Gewinn für alle!', + 'Zuversicht ist Bürgerpflicht. Wer nicht zuversichtlich ist, wird es bald sein.', + 'Wer Frieden will, muss ihn verteidigen. Wer ihn verteidigt, muss kämpfen. Wer kämpft, will Frieden. Logisch.', + 'Das Wetter: heiter bis wolkig, mit vereinzelten Orbitalschlägen.', + 'Die Schwärmer sind zahlreich. Wir sind zahlreicher – in unseren Herzen.', + 'Kritik an der Kriegsführung schwächt die Moral. Moral ist kriegswichtig. Bitte weiterklatschen.', + 'Fürsorgepakete sind ein Geschenk des Präsidenten. Bitte nicht darunter stehen.', + 'Neue Umfrage: 100 % der Befragten sind zufrieden. Befragt wurde das Ministerium.', + 'Der Feind hat keine Chance. Das wurde gestern beschlossen.', +]); + +export const WAVE = Object.freeze({ + incoming: (n) => `WELLE ${n}`, + preparing: 'VORBEREITUNG', + factionLine: Object.freeze({ + swarm: 'Die Schwärmer greifen an!', + legion: 'Die Blechlegion rückt vor!', + mixed: 'Schwärmer und Blechlegion – gemeinsam gegen den Frieden!', + }), + cleared: (n) => `Welle ${n} abgewehrt!`, + bonus: (points) => `Wellenbonus +${points}`, + heal: (hp) => `Das Ministerium für Gesundheit spendiert ${hp} Lebenspunkte.`, + nextIn: (seconds) => `Nächste Welle in ${seconds}`, + remaining: (count) => `Feinde: ${count}`, + elite: Object.freeze({ + brutmutter: 'ACHTUNG: Eine Brutmutter wurde gesichtet!', + walzmeister: 'ACHTUNG: Ein Walzmeister rollt heran!', + }), +}); + +export const ORBITAL_TEXT = Object.freeze({ + holdHint: 'Q halten + Pfeiltasten/WASD', + panelTitle: 'ORBITAL-BEFEHLE · Q HALTEN', + requested: (name) => `${name} angefordert – Einschlag steht bevor!`, + notReady: (name, seconds) => `${name} lädt noch (${seconds} s)`, + invalid: 'Befehlscode ungültig', + selfHit: 'Kollateralschaden am Präsidenten – im Bericht als Heldentum vermerkt.', + supplyPickup: (heal) => `Fürsorgepaket erhalten: +${heal} Leben, Munition aufgefüllt.`, + turretOnline: 'Geschütz »Wachsamer Nachbar« ist einsatzbereit.', +}); + +export const PLAYER_TEXT = Object.freeze({ + reloading: 'Nachladen …', + empty: 'Leer', + lowAmmo: (code) => `Munition knapp! Nachschub anfordern: Q + ${code}`, + outOfAmmo: 'Keine Munition – Dienstpistole gezogen.', + dodgeReady: 'Rolle', +}); + +export const GAME_OVER = Object.freeze({ + title: 'DER PRÄSIDENT IST GEFALLEN', + subtitles: Object.freeze([ + 'Das Ministerium für Zuversicht meldet: planmäßiger Rückzug in die Unsterblichkeit.', + 'Ein Denkmal wurde bereits in Auftrag gegeben. Es war schon vorher in Auftrag gegeben.', + 'Offizielle Sprachregelung: Der Präsident ruht sich kurz aus. Sehr gründlich.', + 'Die Nachrichten melden einen triumphalen Sieg. Details folgen nie.', + ]), + stats: Object.freeze({ + score: 'Punkte', + wave: 'Erreichte Welle', + kills: 'Abschüsse', + bestStreak: 'Längste Serie', + duration: 'Einsatzdauer', + }), + nameLabel: 'Name für die Ehrentafel', + nameHint: 'Höchstens 16 Zeichen. Wird öffentlich angezeigt.', + submit: 'Eintragen', + skip: 'Nicht eintragen', + retry: 'Erneut verteidigen', + menu: 'Hauptmenü', + submitting: 'Übermittle an das Archiv …', + saved: (rank) => `Eingetragen auf Platz ${rank}. Die Geschichtsbücher sind informiert.`, + offline: 'Das Archiv ist nicht erreichbar. Der Punktestand wird mündlich überliefert.', + noToken: 'Diese Runde konnte nicht beim Archiv angemeldet werden – ein Eintrag ist leider nicht möglich.', +}); + +export const HIGHSCORES = Object.freeze({ + title: 'EHRENTAFEL DER VERTEIDIGER', + loading: 'Lade Ehrentafel …', + empty: 'Noch keine Einträge. Die Geschichte wartet auf Sie.', + error: 'Die Ehrentafel ist gerade nicht erreichbar.', + columns: Object.freeze({ rank: 'Rang', name: 'Name', score: 'Punkte', wave: 'Welle' }), + back: 'Zurück (Esc)', +}); + +export const PAUSE = Object.freeze({ + title: 'EINSATZ PAUSIERT', + subtitle: 'Der Feind wartet höflich.', + resume: 'Weiter (Esc)', + quit: 'Mission abbrechen', + volumes: Object.freeze({ master: 'Gesamtlautstärke', music: 'Musik', sfx: 'Effekte' }), + confirmQuit: 'Mission wirklich abbrechen? Der Punktestand verfällt.', +}); + +export const CONTROLS = Object.freeze({ + title: 'STEUERUNG', + rows: Object.freeze([ + ['W A S D', 'Bewegen (8 Richtungen)'], + ['Maus', 'Zielen'], + ['Linksklick', 'Schießen (gedrückt halten beim Karabiner)'], + ['R', 'Nachladen'], + ['1 · 2 · 3 / Mausrad', 'Waffe wechseln'], + ['Leertaste', 'Ausweichrolle (kurz unverwundbar)'], + ['Q halten + Pfeile/WASD', 'Orbital-Befehl eingeben (Ziel: Mauszeiger)'], + ['Esc', 'Pause und Lautstärke'], + ]), + orbitalTitle: 'ORBITAL-BEFEHLE', + back: 'Zurück (Esc)', +}); + +export const CREDITS = Object.freeze({ + title: 'CREDITS', + sections: Object.freeze([ + Object.freeze({ + heading: 'Spiel', + lines: Object.freeze(['Glory Defense – ein satirischer 2D-Shooter', 'Idee, Code und Figuren: frei erfunden für dieses Projekt']), + }), + Object.freeze({ + heading: 'Technik', + lines: Object.freeze(['Phaser 3 – © Phaser Studio Inc., MIT-Lizenz', 'Flask – © Pallets, BSD-3-Clause-Lizenz']), + }), + Object.freeze({ + heading: 'Grafik und Ton', + lines: Object.freeze([ + 'Figuren, Emblem, Geschütz und Kapsel: eigene Vektorgrafiken (CC0)', + 'Bodenkacheln aus „Top-down Shooter“ und Effekte aus „Particle Pack“ – Kenney (kenney.nl), CC0', + 'Schriften: Systemschriften des Betriebssystems (nicht mitgeliefert)', + 'Klänge aus „Sci-Fi Sounds“, „Impact Sounds“, „Interface Sounds“, „Music Jingles“ – Kenney (kenney.nl), CC0', + 'Marschmusik: eigene Komposition, im Browser synthetisch erzeugt (CC0)', + ]), + }), + Object.freeze({ + heading: 'Hinweis', + lines: Object.freeze([ + 'Satire und reine Fiktion. Alle Figuren und Organisationen sind frei erfunden.', + 'Keine Verbindung zu realen Personen, Parteien, Ländern oder anderen Spielen.', + ]), + }), + ]), + back: 'Zurück (Esc)', +}); + +export const ERRORS = Object.freeze({ + phaserMissing: 'Die Spiel-Engine konnte nicht geladen werden. Bitte Seite neu laden.', + generic: 'Ein unerwarteter Fehler ist aufgetreten. Bitte Seite neu laden.', +}); diff --git a/app/static/js/entities/Deployables.js b/app/static/js/entities/Deployables.js new file mode 100644 index 0000000..035083c --- /dev/null +++ b/app/static/js/entities/Deployables.js @@ -0,0 +1,106 @@ +/** + * Abwurfobjekte der Orbital-Befehle: Verteidigungsgeschütz und Nachschubkapsel. + * @module entities/Deployables + */ + +import { GAME } from '../config.js'; +import { angleTo, distance } from '../logic/math.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; + +/** Letzte Sekunden, in denen ein auslaufendes Objekt blinkt. */ +const EXPIRY_WARNING_MS = 3000; + +/** + * Geschütz »Wachsamer Nachbar«: zielt automatisch auf den nächsten Gegner in Reichweite. + */ +export class Turret extends Phaser.GameObjects.Sprite { + /** + * @param {Phaser.Scene} scene + * @param {number} x + * @param {number} y + * @param {{durationMs: number, fireIntervalMs: number, range: number, bulletDamage: number, bulletSpeed: number}} cfg + * @param {number} now + */ + constructor(scene, x, y, cfg, now) { + super(scene, x, y, TEXTURE_KEYS.turret); + scene.add.existing(this); + this.setDepth(GAME.depth.pickups); + this.cfg = cfg; + this.expiresAt = now + cfg.durationMs; + this.nextShotAt = now; + } + + /** + * @param {number} now + * @param {Iterable} enemies + * @param {(x: number, y: number, angle: number) => void} fire + * @returns {boolean} false, wenn die Einsatzzeit abgelaufen ist. + */ + step(now, enemies, fire) { + if (now >= this.expiresAt) return false; + let target = null; + let best = this.cfg.range; + for (const enemy of enemies) { + if (!enemy.alive) continue; + const d = distance(this, enemy); + if (d < best) { + best = d; + target = enemy; + } + } + if (target) { + const angle = angleTo(this, target); + this.setRotation(angle); + if (now >= this.nextShotAt) { + this.nextShotAt = now + this.cfg.fireIntervalMs; + fire(this.x + Math.cos(angle) * 24, this.y + Math.sin(angle) * 24, angle); + } + } + // Kurz vor Ablauf blinken, damit der Spieler nicht überrascht wird. + const left = this.expiresAt - now; + this.setAlpha(left < EXPIRY_WARNING_MS && Math.floor(now / 150) % 2 === 0 ? 0.4 : 1); + return true; + } +} + +/** + * Nachschubkapsel »Fürsorgepaket«: Beim Berühren gibt es Leben und Munition. + */ +export class SupplyPod extends Phaser.Physics.Arcade.Sprite { + /** + * @param {Phaser.Scene} scene + * @param {number} x + * @param {number} y + * @param {{lifetimeMs: number, pickupRadius: number, heal: number}} cfg + * @param {number} now + */ + constructor(scene, x, y, cfg, now) { + super(scene, x, y, TEXTURE_KEYS.supplyPod); + scene.add.existing(this); + scene.physics.add.existing(this); + this.setDepth(GAME.depth.pickups); + this.cfg = cfg; + this.expiresAt = now + cfg.lifetimeMs; + this.collected = false; + } + + /** Nach dem Einfügen in die Gruppe: runden Aufnahmebereich setzen. */ + initBody() { + const r = this.cfg.pickupRadius; + this.body.setCircle(r, this.width / 2 - r, this.height / 2 - r); + // Liegt fest am Boden: kein Wegschieben durch Physik. + this.body.setImmovable(true); + this.body.moves = false; + } + + /** + * @param {number} now + * @returns {boolean} false, wenn die Kapsel abgelaufen ist. + */ + tick(now) { + const left = this.expiresAt - now; + if (left <= 0) return false; + this.setAlpha(left < EXPIRY_WARNING_MS && Math.floor(now / 150) % 2 === 0 ? 0.4 : 1); + return true; + } +} diff --git a/app/static/js/entities/Enemy.js b/app/static/js/entities/Enemy.js new file mode 100644 index 0000000..e268023 --- /dev/null +++ b/app/static/js/entities/Enemy.js @@ -0,0 +1,250 @@ +/** + * Gegner beider Fraktionen. Das Verhalten kommt aus `config.ENEMY_TYPES[type].behavior`, + * die Entscheidungen trifft die Phaser-freie Logik in `logic/enemyAi.js`. Diese + * Klasse setzt sie nur in Physik, Drehung und Grafik um. + * @module entities/Enemy + */ + +import { AI, ENEMY_TYPES, GAME, PLAYER } from '../config.js'; +import { + attackStep, + broodStep, + createBrain, + flankVelocity, + kiteVelocity, + leaperStep, + swarmVelocity, + updateStrafe, + volleyAngles, +} from '../logic/enemyAi.js'; +import { angleTo, degToRad, distance, scale } from '../logic/math.js'; +import { combine, seek, separation, steerTowards } from '../logic/steering.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; + +/** Frisch gespawnte Gegner schießen nicht sofort (Fairness). */ +const FIRST_ATTACK_DELAY_MS = 1100; +/** Unter dieser Geschwindigkeit bleibt die Blickrichtung stehen (verhindert Zittern). */ +const MIN_TURN_SPEED = 12; +/** Farbe der Vorwarnung vor dem Sprungangriff. */ +const TELEGRAPH_TINT = 0xff5040; +/** Verhalten, die im Nahkampf angreifen. */ +const MELEE_BEHAVIORS = new Set(['swarm', 'leaper', 'brood']); +/** Stärke der Leerlauf-Animationen (Anteil der Größe). */ +const ANIMATION = Object.freeze({ periodMs: 90, swarmWobble: 0.09, broodPulse: 0.04, hoverBob: 0.04 }); + +/** + * @typedef {Object} EnemyContext + * @property {{x: number, y: number}} player + * @property {Phaser.GameObjects.GameObject[]} neighbors + * @property {() => number} rng + * @property {(x: number, y: number, angle: number, speed: number, damage: number) => void} fireBullet + * @property {(enemy: Enemy, count: number) => void} spawnChildren + * @property {(x: number, y: number, mortar: object) => void} scheduleMortar + */ + +let nextEnemyId = 1; + +export class Enemy extends Phaser.Physics.Arcade.Sprite { + /** + * @param {Phaser.Scene} scene + * @param {number} x + * @param {number} y + * @param {string} typeId Schlüssel aus ENEMY_TYPES. + * @param {{now: number, rng: () => number, hpMultiplier?: number, speedMultiplier?: number, parent?: Enemy|null}} options + */ + constructor(scene, x, y, typeId, options) { + super(scene, x, y, TEXTURE_KEYS.enemy(typeId)); + this.id = nextEnemyId; + nextEnemyId += 1; + this.type = ENEMY_TYPES[typeId]; + /** Wellen-Multiplikatoren; ausgebrütete Krabbler erben sie von der Brutmutter. */ + this.multipliers = { hp: options.hpMultiplier ?? 1, speed: options.speedMultiplier ?? 1 }; + this.maxHp = Math.round(this.type.hp * this.multipliers.hp); + this.hp = this.maxHp; + this.speed = this.type.speed * this.multipliers.speed; + this.brain = createBrain(options.rng, options.now, { firstAttackDelayMs: FIRST_ATTACK_DELAY_MS }); + this.alive = true; + this.lastContactAt = -Infinity; + this.leaping = false; + this.telegraphing = false; + /** @type {Enemy|null} Brutmutter, von der dieser Krabbler stammt. */ + this.parentEnemy = options.parent ?? null; + this.childCount = 0; + + scene.add.existing(this); + scene.physics.add.existing(this); + this.setDepth(GAME.depth.enemies); + } + + /** Physik-Körper einrichten – erst nach dem Einfügen in die Physik-Gruppe aufrufen. */ + initBody() { + const r = this.type.radius; + this.body.setCircle(r, this.width / 2 - r, this.height / 2 - r); + this.setCollideWorldBounds(true); + } + + /** @returns {boolean} */ + get isElite() { + return this.type.tier === 'elite'; + } + + /** + * Ein KI-Schritt: Wunschgeschwindigkeit bestimmen, Angriffe auslösen. + * @param {number} now Spielzeit in ms. + * @param {EnemyContext} ctx + */ + step(now, ctx) { + if (!this.alive) return; + const { player } = ctx; + const type = this.type; + let desired; + let responsiveness = AI.steeringResponsiveness; + let faceTarget = false; + + switch (type.behavior) { + case 'swarm': + desired = swarmVelocity(this.brain, this, player, this.speed, type); + break; + case 'leaper': { + const result = leaperStep(this.brain, this, player, now, this.speed, type.leap); + desired = result.velocity; + this.leaping = result.leaping; + if (result.leaping || result.telegraph) responsiveness = 1; + this.setTelegraph(result.telegraph); + break; + } + case 'brood': { + desired = seek(this, player, this.speed); + const hatch = broodStep(this.brain, now, this.childCount, type.brood); + if (hatch > 0) ctx.spawnChildren(this, hatch); + break; + } + case 'kite': + updateStrafe(this.brain, now, AI.strafeSwitchMs, ctx.rng); + desired = kiteVelocity(this.brain, this, player, this.speed, type.range); + faceTarget = true; + this.tryAttack(now, ctx); + break; + case 'flank': + desired = flankVelocity(this.brain, this, player, this.speed, type); + faceTarget = true; + this.tryAttack(now, ctx); + break; + case 'siege': + updateStrafe(this.brain, now, AI.strafeSwitchMs, ctx.rng); + desired = kiteVelocity(this.brain, this, player, this.speed, type.range); + faceTarget = true; + this.tryAttack(now, ctx); + this.tryMortar(now, ctx); + break; + default: + desired = seek(this, player, this.speed); + } + + // Nahkämpfer bleiben am Präsidenten „kleben“, statt sich auf seinen Mittelpunkt zu + // drängen – sonst stapeln sie sich unlesbar übereinander. + if (MELEE_BEHAVIORS.has(type.behavior) && !this.leaping) { + if (distance(this, player) < PLAYER.radius + type.radius) desired = { x: 0, y: 0 }; + } + + // Abstand zu Nachbarn – außer im Sprung, der soll geradlinig bleiben. + if (!this.leaping) { + const push = separation(this, ctx.neighbors, AI.separationRadius + type.radius); + desired = combine( + [ + { vector: desired, weight: 1 }, + { vector: scale(push, this.speed), weight: AI.separationWeight }, + ], + this.speed, + ); + } + + const velocity = steerTowards(this.body.velocity, desired, responsiveness); + this.setVelocity(velocity.x, velocity.y); + + if (faceTarget) { + this.setRotation(angleTo(this, player)); + } else if (Math.hypot(velocity.x, velocity.y) > MIN_TURN_SPEED) { + this.setRotation(Math.atan2(velocity.y, velocity.x)); + } + this.animate(now); + } + + /** + * Kleine Lebenszeichen ohne Spritesheet: Insekten wackeln beim Laufen, die Brutmutter + * pulsiert, Drohnen schweben. Die ID verschiebt die Phase, damit nicht alle im Takt wippen. + * @param {number} now + */ + animate(now) { + if (this.telegraphing) return; + const phase = now / ANIMATION.periodMs + this.id; + if (this.type.behavior === 'brood') { + this.setScale(1 + ANIMATION.broodPulse * Math.sin(phase * 0.35)); + } else if (this.type.faction === 'swarm') { + const moving = Math.hypot(this.body.velocity.x, this.body.velocity.y) > MIN_TURN_SPEED; + this.setScale(1, moving ? 1 + ANIMATION.swarmWobble * Math.sin(phase * 2.2) : 1); + } else if (this.type.behavior === 'kite') { + this.setScale(1 + ANIMATION.hoverBob * Math.sin(phase)); + } + } + + /** + * Schießt gemäß Takt des Gegnertyps. + * @param {number} now + * @param {EnemyContext} ctx + */ + tryAttack(now, ctx) { + const attack = this.type.attack; + if (!attackStep(this.brain.attack, now, distance(this, ctx.player), attack)) return; + let base = angleTo(this, ctx.player); + // Einzelschüsse streuen leicht, Fächersalven sind bereits breit. + if (attack.count === 1 && attack.spreadDeg > 0) { + base += (ctx.rng() - 0.5) * degToRad(attack.spreadDeg); + } + const reach = this.type.radius + 6; + for (const angle of volleyAngles(base, attack.count, attack.spreadDeg)) { + ctx.fireBullet(this.x + Math.cos(angle) * reach, this.y + Math.sin(angle) * reach, angle, attack.speed, attack.damage); + } + } + + /** + * Walzmeister: Mörser auf die aktuelle Spielerposition (mit Bodenmarkierung). + * @param {number} now + * @param {EnemyContext} ctx + */ + tryMortar(now, ctx) { + const mortar = this.type.mortar; + if (!mortar) return; + if (attackStep(this.brain.mortar, now, distance(this, ctx.player), mortar)) { + ctx.scheduleMortar(ctx.player.x, ctx.player.y, mortar); + } + } + + /** @param {boolean} active */ + setTelegraph(active) { + if (active === this.telegraphing) return; + this.telegraphing = active; + if (active) { + this.setTint(TELEGRAPH_TINT); + this.setScale(1.15); + } else { + this.clearTint(); + this.setScale(1); + } + } + + /** + * @param {number} amount + * @returns {boolean} true, wenn der Gegner dadurch stirbt. + */ + takeDamage(amount) { + if (!this.alive) return false; + this.hp -= amount; + if (this.hp <= 0) { + this.hp = 0; + this.alive = false; + return true; + } + return false; + } +} diff --git a/app/static/js/entities/Player.js b/app/static/js/entities/Player.js new file mode 100644 index 0000000..09bb2d9 --- /dev/null +++ b/app/static/js/entities/Player.js @@ -0,0 +1,180 @@ +/** + * Präsident Maximilian Valor – die Spielfigur. + * + * Die Figur ist frei erfunden: Raumrüstung mit geschlossenem Helm (kein Gesicht, + * keine Frisur) und Umhang in den Farben der fiktiven Vereinigten Erde. + * @module entities/Player + */ + +import { GAME, PLAYER, WEAPONS } from '../config.js'; +import { fromAngle, scale } from '../logic/math.js'; +import { isNearlyZero } from '../logic/steering.js'; +import { WeaponState } from '../logic/weapon.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; + +export class Player extends Phaser.Physics.Arcade.Sprite { + /** + * @param {Phaser.Scene} scene + * @param {number} x + * @param {number} y + */ + constructor(scene, x, y) { + super(scene, x, y, TEXTURE_KEYS.player); + scene.add.existing(this); + scene.physics.add.existing(this); + this.setDepth(GAME.depth.player); + this.setCollideWorldBounds(true); + const r = PLAYER.radius; + this.body.setCircle(r, this.width / 2 - r, this.height / 2 - r); + + this.maxHp = PLAYER.maxHp; + this.hp = PLAYER.maxHp; + this.alive = true; + this.weapons = PLAYER.weaponSlots.map((id) => new WeaponState(WEAPONS[id])); + this.weaponIndex = 0; + this.aimAngle = 0; + this.dodgeUntil = 0; + this.dodgeReadyAt = 0; + this.dodgeDirection = { x: 1, y: 0 }; + this.hitInvulnerableUntil = 0; + } + + /** @returns {WeaponState} */ + get weapon() { + return this.weapons[this.weaponIndex]; + } + + /** @param {number} now @returns {boolean} */ + isDodging(now) { + return now < this.dodgeUntil; + } + + /** + * Während der Rolle und kurz nach einem Treffer nimmt der Präsident keinen Schaden. + * @param {number} now + * @returns {boolean} + */ + isInvulnerable(now) { + return !this.alive || this.isDodging(now) || now < this.hitInvulnerableUntil; + } + + /** + * @param {number} now + * @returns {number} Bereitschaft der Rolle, 0..1 (1 = bereit). + */ + dodgeReadiness(now) { + if (now >= this.dodgeReadyAt) return 1; + return 1 - (this.dodgeReadyAt - now) / PLAYER.dodge.cooldownMs; + } + + /** + * Startet eine Ausweichrolle in Bewegungsrichtung (ohne Bewegung: in Blickrichtung). + * @param {number} now + * @param {{x: number, y: number}} moveDirection Normalisiert. + * @returns {boolean} true, wenn die Rolle ausgelöst wurde. + */ + tryDodge(now, moveDirection) { + if (!this.alive || now < this.dodgeReadyAt) return false; + this.dodgeDirection = isNearlyZero(moveDirection) ? fromAngle(this.aimAngle) : moveDirection; + this.dodgeUntil = now + PLAYER.dodge.durationMs; + this.dodgeReadyAt = now + PLAYER.dodge.cooldownMs; + return true; + } + + /** + * Bewegung für diesen Frame. + * @param {number} now + * @param {{x: number, y: number}} moveDirection Normalisiert. + * @param {boolean} blocked true, solange ein Orbital-Befehl eingegeben wird. + */ + move(now, moveDirection, blocked) { + if (!this.alive) { + this.setVelocity(0, 0); + return; + } + if (this.isDodging(now)) { + const v = scale(this.dodgeDirection, PLAYER.dodge.speed); + this.setVelocity(v.x, v.y); + this.setAlpha(0.55); + return; + } + this.setAlpha(1); + const v = blocked ? { x: 0, y: 0 } : scale(moveDirection, PLAYER.speed); + this.setVelocity(v.x, v.y); + } + + /** + * Richtet die Figur auf einen Punkt in Weltkoordinaten aus. + * @param {number} x + * @param {number} y + */ + aimAt(x, y) { + this.aimAngle = Math.atan2(y - this.y, x - this.x); + this.setRotation(this.aimAngle); + } + + /** @returns {{x: number, y: number}} Position der Waffenmündung. */ + muzzlePosition() { + const reach = PLAYER.radius + 8; + return { + x: this.x + Math.cos(this.aimAngle) * reach, + y: this.y + Math.sin(this.aimAngle) * reach, + }; + } + + /** + * @param {number} index + * @returns {boolean} true, wenn gewechselt wurde. + */ + switchWeapon(index) { + if (index === this.weaponIndex || !this.weapons[index]) return false; + // Nachladen bricht beim Wechsel ab – sonst könnte man durch Wechseln „heimlich“ laden. + this.weapon.cancelReload(); + this.weaponIndex = index; + return true; + } + + /** + * @param {1|-1} step + * @returns {boolean} + */ + cycleWeapon(step) { + const count = this.weapons.length; + return this.switchWeapon((this.weaponIndex + step + count) % count); + } + + /** + * Fügt Schaden zu, sofern der Präsident nicht gerade unverwundbar ist. + * @param {number} amount + * @param {number} now + * @returns {number} Tatsächlich erlittener Schaden. + */ + takeDamage(amount, now) { + if (this.isInvulnerable(now) || amount <= 0) return 0; + const dealt = Math.min(this.hp, amount); + this.hp -= dealt; + this.hitInvulnerableUntil = now + PLAYER.hitInvulnerabilityMs; + if (this.hp <= 0) { + this.alive = false; + this.setVelocity(0, 0); + } + return dealt; + } + + /** @param {number} amount @returns {number} Tatsächlich geheilte Punkte. */ + heal(amount) { + const before = this.hp; + this.hp = Math.min(this.maxHp, this.hp + amount); + return this.hp - before; + } + + /** Füllt die Reserve aller Waffen auf (Nachschubkapsel). */ + refillAmmo() { + for (const weapon of this.weapons) weapon.refill(); + } + + /** @param {number} now @returns {boolean} true, wenn die aktive Waffe fertig nachgeladen hat. */ + updateWeapons(now) { + return this.weapon.update(now); + } +} diff --git a/app/static/js/entities/ProjectilePool.js b/app/static/js/entities/ProjectilePool.js new file mode 100644 index 0000000..5d2af6c --- /dev/null +++ b/app/static/js/entities/ProjectilePool.js @@ -0,0 +1,78 @@ +/** + * Wiederverwendbare Projektile (Object Pooling). + * + * Bei Dauerfeuer entstehen Hunderte Projektile pro Minute. Statt sie jedes Mal neu + * zu erzeugen und zu zerstören (Garbage-Collector-Ruckler), werden deaktivierte + * Projektile wiederverwendet. + * @module entities/ProjectilePool + */ + +export class ProjectilePool { + /** + * @param {Phaser.Scene} scene + * @param {string} textureKey + * @param {number} maxSize Obergrenze gleichzeitig fliegender Projektile. + * @param {number} depth + */ + constructor(scene, textureKey, maxSize, depth) { + this.scene = scene; + this.textureKey = textureKey; + this.depth = depth; + this.group = scene.physics.add.group({ + classType: Phaser.Physics.Arcade.Image, + maxSize, + allowGravity: false, + }); + } + + /** + * Feuert ein Projektil ab. + * @param {number} x + * @param {number} y + * @param {number} angle Bogenmaß. + * @param {number} speed px/s + * @param {number} damage + * @param {number} range Maximale Flugstrecke in px. + * @param {string} [textureKey] Abweichende Textur (z. B. Geschütz). + * @returns {Phaser.Physics.Arcade.Image|null} null, wenn der Pool erschöpft ist. + */ + fire(x, y, angle, speed, damage, range, textureKey) { + const projectile = this.group.get(x, y, textureKey ?? this.textureKey); + if (!projectile) return null; + projectile.enableBody(true, x, y, true, true); + projectile.setTexture(textureKey ?? this.textureKey); + projectile.setDepth(this.depth); + projectile.setRotation(angle); + this.scene.physics.velocityFromRotation(angle, speed, projectile.body.velocity); + projectile.damage = damage; + projectile.spawnX = x; + projectile.spawnY = y; + projectile.maxTravelSq = range * range; + return projectile; + } + + /** + * Deaktiviert Projektile, die ihre Reichweite überschritten oder die Welt verlassen haben. + * @param {Phaser.Geom.Rectangle} bounds + */ + update(bounds) { + for (const projectile of this.group.getChildren()) { + if (!projectile.active) continue; + const dx = projectile.x - projectile.spawnX; + const dy = projectile.y - projectile.spawnY; + if (dx * dx + dy * dy > projectile.maxTravelSq || !bounds.contains(projectile.x, projectile.y)) { + this.kill(projectile); + } + } + } + + /** @param {Phaser.Physics.Arcade.Image} projectile */ + kill(projectile) { + projectile.disableBody(true, true); + } + + /** @returns {number} Aktive Projektile. */ + get activeCount() { + return this.group.countActive(true); + } +} diff --git a/app/static/js/lib/PHASER_LICENSE.md b/app/static/js/lib/PHASER_LICENSE.md new file mode 100644 index 0000000..48792fe --- /dev/null +++ b/app/static/js/lib/PHASER_LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2024 Richard Davey, Phaser Studio Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app/static/js/lib/phaser.min.js b/app/static/js/lib/phaser.min.js new file mode 100644 index 0000000..eae4548 --- /dev/null +++ b/app/static/js/lib/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 n(t,e,i){this.fn=t,this.context=e,this.once=i||!1}function r(t,e,s,r,o){if("function"!=typeof s)throw new TypeError("The listener must be a function");var a=new n(s,r||t,o),h=i?i+e:e;return t._events[h]?t._events[h].fn?t._events[h]=[t._events[h],a]:t._events[h].push(a):(t._events[h]=a,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new s:delete t._events[e]}function a(){this._events=new s,this._eventsCount=0}Object.create&&(s.prototype=Object.create(null),(new s).__proto__||(i=!1)),a.prototype.eventNames=function(){var t,s,n=[];if(0===this._eventsCount)return n;for(s in t=this._events)e.call(t,s)&&n.push(i?s.slice(1):s);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},a.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 n=0,r=s.length,o=new Array(r);n{var s=i(38829);t.exports=function(t,e,i,n){for(var r=t[0],o=1;o{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"angle",e,i,n,r)}},60757:t=>{t.exports=function(t,e,i){for(var s=0;s{t.exports=function(t,e,i){void 0===i&&(i=0);for(var s=i;s{t.exports=function(t,e,i){void 0===i&&(i=0);for(var s=t.length-1;s>=i;s--){var n=t[s],r=!0;for(var o in e)n[o]!==e[o]&&(r=!1);if(r)return n}return null}},94420:(t,e,i)=>{var s=i(11879),n=i(60461),r=i(95540),o=i(29747),a=new(i(41481))({sys:{queueDepthSort:o,events:{once:o}}},0,0,1,1).setOrigin(0,0);t.exports=function(t,e){void 0===e&&(e={});var i=e.hasOwnProperty("width"),o=e.hasOwnProperty("height"),h=r(e,"width",-1),l=r(e,"height",-1),u=r(e,"cellWidth",1),c=r(e,"cellHeight",u),d=r(e,"position",n.TOP_LEFT),f=r(e,"x",0),p=r(e,"y",0),v=0,g=0,m=h*u,y=l*c;a.setPosition(f,p),a.setSize(u,c);for(var x=0;x{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"alpha",e,i,n,r)}},67285:(t,e,i)=>{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"x",e,i,n,r)}},9074:(t,e,i)=>{var s=i(66979);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"x",e,n,o,a),s(t,"y",i,r,o,a)}},75222:(t,e,i)=>{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"y",e,i,n,r)}},22983:t=>{t.exports=function(t,e,i,s){void 0===i&&(i=0),void 0===s&&(s=6.28);for(var n=i,r=(s-i)/t.length,o=e.x,a=e.y,h=e.radius,l=0;l{t.exports=function(t,e,i,s){void 0===i&&(i=0),void 0===s&&(s=6.28);for(var n=i,r=(s-i)/t.length,o=e.width/2,a=e.height/2,h=0;h{var s=i(15258),n=i(26708);t.exports=function(t,e,i){var r;r=i?n(e,i,t.length):s(e,t.length);for(var o=0;o{var s=i(14649),n=i(86003),r=i(49498);t.exports=function(t,e,i){void 0===i&&(i=0);var o=s(e,!1,t.length);i>0?n(o,i):i<0&&r(o,Math.abs(i));for(var a=0;a{var s=i(84993);t.exports=function(t,e,i){var n=s({x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},i),r=s({x1:e.x2,y1:e.y2,x2:e.x3,y2:e.y3},i),o=s({x1:e.x3,y1:e.y3,x2:e.x1,y2:e.y1},i);n.pop(),r.pop(),o.pop();for(var a=(n=n.concat(r,o)).length/t.length,h=0,l=0;l{t.exports=function(t,e,i){for(var s=0;s{t.exports=function(t,e,i,s,n,r){var o;void 0===s&&(s=0),void 0===n&&(n=0),void 0===r&&(r=1);var a=0,h=t.length;if(1===r)for(o=n;o=0;o--)t[o][e]+=i+a*s,a++;return t}},43967:t=>{t.exports=function(t,e,i,s,n,r){var o;void 0===s&&(s=0),void 0===n&&(n=0),void 0===r&&(r=1);var a=0,h=t.length;if(1===r)for(o=n;o=0;o--)t[o][e]=i+a*s,a++;return t}},88926:(t,e,i)=>{var s=i(28176);t.exports=function(t,e){for(var i=0;i{var s=i(24820);t.exports=function(t,e){for(var i=0;i{var s=i(65822);t.exports=function(t,e){for(var i=0;i{var s=i(26597);t.exports=function(t,e){for(var i=0;i{var s=i(90260);t.exports=function(t,e){for(var i=0;i{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"rotation",e,i,n,r)}},91051:(t,e,i)=>{var s=i(1163),n=i(20339);t.exports=function(t,e,i){for(var r=e.x,o=e.y,a=0;a{var s=i(1163);t.exports=function(t,e,i,n){var r=e.x,o=e.y;if(0===n)return t;for(var a=0;a{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"scaleX",e,i,n,r)}},94868:(t,e,i)=>{var s=i(66979);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"scaleX",e,n,o,a),s(t,"scaleY",i,r,o,a)}},95532:(t,e,i)=>{var s=i(66979);t.exports=function(t,e,i,n,r){return s(t,"scaleY",e,i,n,r)}},8689:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"alpha",e,i,n,r)}},2645:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n){return s(t,"blendMode",e,0,i,n)}},32372:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"depth",e,i,n,r)}},85373:t=>{t.exports=function(t,e,i){for(var s=0;s{var s=i(43967);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"originX",e,n,o,a),s(t,"originY",i,r,o,a),t.forEach((function(t){t.updateDisplayOrigin()})),t}},79939:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"rotation",e,i,n,r)}},2699:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"scaleX",e,n,o,a),s(t,"scaleY",i,r,o,a)}},98739:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"scaleX",e,i,n,r)}},98476:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"scaleY",e,i,n,r)}},6207:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"scrollFactorX",e,n,o,a),s(t,"scrollFactorY",i,r,o,a)}},6607:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"scrollFactorX",e,i,n,r)}},72248:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"scrollFactorY",e,i,n,r)}},14036:t=>{t.exports=function(t,e,i,s,n){for(var r=0;r{var s=i(43967);t.exports=function(t,e,i,n){return s(t,"visible",e,0,i,n)}},77597:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"x",e,i,n,r)}},83194:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r,o,a){return null==i&&(i=e),s(t,"x",e,n,o,a),s(t,"y",i,r,o,a)}},67678:(t,e,i)=>{var s=i(43967);t.exports=function(t,e,i,n,r){return s(t,"y",e,i,n,r)}},35850:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r){var o,a;void 0===n&&(n=0),void 0===r&&(r=new s);var h=t.length;if(1===h)o=t[0].x,a=t[0].y,t[0].x=e,t[0].y=i;else{var l=1,u=0;0===n&&(u=h-1,l=h-2),o=t[u].x,a=t[u].y,t[u].x=e,t[u].y=i;for(var c=0;c=h||-1===l)){var d=t[l],f=d.x,p=d.y;d.x=o,d.y=a,o=f,a=p,0===n?l--:l++}}return r.x=o,r.y=a,r}},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,n,r){void 0===r&&(r=!1);var o,a=Math.abs(n-i)/t.length;if(r)for(o=0;o{var s=i(54261);t.exports=function(t,e,i,n,r){void 0===r&&(r=!1);var o,a=Math.abs(n-i)/t.length;if(r)for(o=0;o{t.exports=function(t,e,i,s,n){if(void 0===n&&(n=!1),0===t.length)return t;if(1===t.length)return n?t[0][e]+=(s+i)/2:t[0][e]=(s+i)/2,t;var r,o=Math.abs(s-i)/(t.length-1);if(n)for(r=0;r{t.exports=function(t){for(var e=0;e{var s=i(15994);t.exports=function(t,e,i){void 0===i&&(i=0);for(var n=0;n{t.exports={AlignTo:i(11517),Angle:i(80318),Call:i(60757),GetFirst:i(69927),GetLast:i(32265),GridAlign:i(94420),IncAlpha:i(41721),IncX:i(67285),IncXY:i(9074),IncY:i(75222),PlaceOnCircle:i(22983),PlaceOnEllipse:i(95253),PlaceOnLine:i(88505),PlaceOnRectangle:i(41346),PlaceOnTriangle:i(11575),PlayAnimation:i(29953),PropertyValueInc:i(66979),PropertyValueSet:i(43967),RandomCircle:i(88926),RandomEllipse:i(33286),RandomLine:i(96e3),RandomRectangle:i(28789),RandomTriangle:i(97154),Rotate:i(20510),RotateAround:i(91051),RotateAroundDistance:i(76332),ScaleX:i(61619),ScaleXY:i(94868),ScaleY:i(95532),SetAlpha:i(8689),SetBlendMode:i(2645),SetDepth:i(32372),SetHitArea:i(85373),SetOrigin:i(81583),SetRotation:i(79939),SetScale:i(2699),SetScaleX:i(98739),SetScaleY:i(98476),SetScrollFactor:i(6207),SetScrollFactorX:i(6607),SetScrollFactorY:i(72248),SetTint:i(14036),SetVisible:i(50159),SetX:i(77597),SetXY:i(83194),SetY:i(67678),ShiftPosition:i(35850),Shuffle:i(8628),SmootherStep:i(21910),SmoothStep:i(21837),Spread:i(62054),ToggleVisible:i(79815),WrapInRectangle:i(39665)}},42099:(t,e,i)=>{var s=i(45319),n=i(83419),r=i(74943),o=i(81957),a=i(41138),h=i(35154),l=i(90126),u=new n({initialize:function(t,e,i){this.manager=t,this.key=e,this.type="frame",this.frames=this.getFrames(t.textureManager,h(i,"frames",[]),h(i,"defaultTextureKey",null),h(i,"sortFrames",!0)),this.frameRate=h(i,"frameRate",null),this.duration=h(i,"duration",null),this.msPerFrame,this.skipMissedFrames=h(i,"skipMissedFrames",!0),this.delay=h(i,"delay",0),this.repeat=h(i,"repeat",0),this.repeatDelay=h(i,"repeatDelay",0),this.yoyo=h(i,"yoyo",!1),this.showBeforeDelay=h(i,"showBeforeDelay",!1),this.showOnStart=h(i,"showOnStart",!1),this.hideOnComplete=h(i,"hideOnComplete",!1),this.randomFrame=h(i,"randomFrame",!1),this.paused=!1,this.calculateDuration(this,this.getTotalFrames(),this.duration,this.frameRate),this.manager.on&&(this.manager.on(r.PAUSE_ALL,this.pause,this),this.manager.on(r.RESUME_ALL,this.resume,this))},getTotalFrames:function(){return this.frames.length},calculateDuration:function(t,e,i,s){null===i&&null===s?(t.frameRate=24,t.duration=24/e*1e3):i&&null===s?(t.duration=i,t.frameRate=e/(i/1e3)):(t.frameRate=s,t.duration=e/s*1e3),t.msPerFrame=1e3/t.frameRate},addFrame:function(t){return this.addFrameAt(this.frames.length,t)},addFrameAt:function(t,e){var i=this.getFrames(this.manager.textureManager,e);if(i.length>0){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),n=this.frames.slice(t);this.frames=s.concat(i,n)}this.updateFrameSequence()}return this},checkFrame:function(t){return t>=0&&t0){r.isLast=!0,r.nextFrame=c[0],c[0].prevFrame=r;var y=1/(c.length-1);for(o=0;o0?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(r.PAUSE_ALL,this.pause,this),this.manager.off(r.RESUME_ALL,this.resume,this)),this.manager.remove(this.key);for(var t=0;t{var s=new(i(83419))({initialize:function(t,e,i,s,n){void 0===n&&(n=!1),this.textureKey=t,this.textureFrame=e,this.index=i,this.frame=s,this.isFirst=!1,this.isLast=!1,this.prevFrame=null,this.nextFrame=null,this.duration=0,this.progress=0,this.isKeyFrame=n},toJSON:function(){return{key:this.textureKey,frame:this.textureFrame,duration:this.duration,keyframe:this.isKeyFrame}},destroy:function(){this.frame=void 0}});t.exports=s},60848:(t,e,i)=>{var s=i(42099),n=i(83419),r=i(90330),o=i(50792),a=i(74943),h=i(8443),l=i(95540),u=i(35154),c=i(36383),d=i(20283),f=i(41836),p=new n({Extends:o,initialize:function(t){o.call(this),this.game=t,this.textureManager=null,this.globalTimeScale=1,this.anims=new r,this.mixes=new r,this.paused=!1,this.name="AnimationManager",t.events.once(h.BOOT,this.boot,this)},boot:function(){this.textureManager=this.game.textures,this.game.events.once(h.DESTROY,this.destroy,this)},addMix:function(t,e,i){var s=this.anims,n=this.mixes,r="string"==typeof t?t:t.key,o="string"==typeof e?e:e.key;if(s.has(r)&&s.has(o)){var a=n.get(r);a||(a={}),a[o]=i,n.set(r,a)}return this},removeMix:function(t,e){var i=this.mixes,s="string"==typeof t?t:t.key,n=i.get(s);if(n)if(e){var r="string"==typeof e?e:e.key;n.hasOwnProperty(r)&&delete n[r]}else e||i.delete(s);return this},getMix:function(t,e){var i=this.mixes,s="string"==typeof t?t:t.key,n="string"==typeof e?e:e.key,r=i.get(s);return r&&r.hasOwnProperty(n)?r[n]:0},add:function(t,e){return this.anims.has(t)?(console.warn("Animation key exists: "+t),this):(e.key=t,this.anims.set(t,e),this.emit(a.ADD_ANIMATION,t,e),this)},exists:function(t){return this.anims.has(t)},createFromAseprite:function(t,e,i){var s=[],n=this.game.cache.json.get(t);if(!n)return console.warn("No Aseprite data found for: "+t),s;var r=this,o=u(n,"meta",null),a=u(n,"frames",null);o&&a&&u(o,"frameTags",[]).forEach((function(n){var o=[],h=l(n,"name",null),u=l(n,"from",0),d=l(n,"to",0),f=l(n,"direction","forward");if(h&&(!e||e&&e.indexOf(h)>-1)){for(var p=0,v=u;v<=d;v++){var g=v.toString(),m=a[g];if(m){var y=l(m,"duration",c.MAX_SAFE_INTEGER);o.push({key:t,frame:g,duration:y}),p+=y}}"reverse"===f&&(o=o.reverse());var x,T={key:h,frames:o,duration:p,yoyo:"pingpong"===f};i?i.anims&&(x=i.anims.create(T)):x=r.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(a.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;s{var s=i(42099),n=i(30976),r=i(83419),o=i(90330),a=i(74943),h=i(95540),l=new r({initialize:function(t){this.parent=t,this.animationManager=t.scene.sys.anims,this.animationManager.on(a.REMOVE_ANIMATION,this.globalRemove,this),this.textureManager=this.animationManager.textureManager,this.anims=null,this.isPlaying=!1,this.hasStarted=!1,this.currentAnim=null,this.currentFrame=null,this.nextAnim=null,this.nextAnimsQueue=[],this.timeScale=1,this.frameRate=0,this.duration=0,this.msPerFrame=0,this.skipMissedFrames=!0,this.randomFrame=!1,this.delay=0,this.repeat=0,this.repeatDelay=0,this.yoyo=!1,this.showBeforeDelay=!1,this.showOnStart=!1,this.hideOnComplete=!1,this.forward=!0,this.inReverse=!1,this.accumulator=0,this.nextTick=0,this.delayCounter=0,this.repeatCounter=0,this.pendingRepeat=!1,this._paused=!1,this._wasPlaying=!1,this._pendingStop=0,this._pendingStopValue},chain:function(t){var e=this.parent;if(void 0===t)return this.nextAnimsQueue.length=0,this.nextAnim=null,e;Array.isArray(t)||(t=[t]);for(var i=0;ir&&(l=0),this.randomFrame&&(l=n(0,r-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,n="string"==typeof t?t:t.key;if(e&&this.isPlaying&&i.key===n)return s;if(i&&this.isPlaying){var r=this.animationManager.getMix(i.key,t);if(r>0)return this.playAfterDelay(t,r)}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(a.ANIMATION_START)},handleRepeat:function(){this.pendingRepeat=!1,this.emitEvents(a.ANIMATION_REPEAT)},handleStop:function(){this._pendingStop=0,this.isPlaying=!1,this.emitEvents(a.ANIMATION_STOP)},handleComplete:function(){this._pendingStop=0,this.isPlaying=!1,this.hideOnComplete&&this.parent.setVisible(!1),this.emitEvents(a.ANIMATION_COMPLETE,a.ANIMATION_COMPLETE_KEY)},emitEvents:function(t,e){var i=this.currentAnim;if(i){var s=this.currentFrame,n=this.parent,r=s.textureFrame;n.emit(t,i,s,n,r),e&&n.emit(e+i.key,i,s,n,r)}},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(a.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(a.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 o),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(a.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),n=i(90330),r=i(50792),o=i(24736),a=new s({initialize:function(){this.entries=new n,this.events=new r},add:function(t,e){return this.entries.set(t,e),this.events.emit(o.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(o.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=a},24047:(t,e,i)=>{var s=i(2161),n=i(83419),r=i(8443),o=new n({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.obj=new s,this.tilemap=new s,this.xml=new s,this.custom={},this.game.events.once(r.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","obj","tilemap","xml"],e=0;e{t.exports="add"},59261:t=>{t.exports="remove"},24736:(t,e,i)=>{t.exports={ADD:i(51464),REMOVE:i(59261)}},83388:(t,e,i)=>{t.exports={BaseCache:i(2161),CacheManager:i(24047),Events:i(24736)}},71911:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(39506),o=i(50792),a=i(19715),h=i(87841),l=i(61340),u=i(80333),c=i(26099),d=new s({Extends:o,Mixins:[n.AlphaSingle,n.Visible],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),o.call(this),this.scene,this.sceneManager,this.scaleManager,this.cameraManager,this.id=0,this.name="",this.roundPixels=!1,this.useBounds=!1,this.worldView=new h,this.dirty=!0,this._x=t,this._y=e,this._width=i,this._height=s,this._bounds=new h,this._scrollX=0,this._scrollY=0,this._zoomX=1,this._zoomY=1,this._rotation=0,this.matrix=new l,this.transparent=!0,this.backgroundColor=u("rgba(0,0,0,0)"),this.disableCull=!1,this.culledObjects=[],this.midPoint=new c(i/2,s/2),this.originX=.5,this.originY=.5,this._customViewport=!1,this.mask=null,this._maskCamera=null,this.renderList=[],this.isSceneCamera=!0,this.renderRoundPixels=!0},addToRenderList:function(t){this.renderList.push(t)},setOrigin:function(t,e){return void 0===t&&(t=.5),void 0===e&&(e=t),this.originX=t,this.originY=e,this},getScroll:function(t,e,i){void 0===i&&(i=new c);var s=.5*this.width,n=.5*this.height;return i.x=t-s,i.y=e-n,this.useBounds&&(i.x=this.clampX(i.x),i.y=this.clampY(i.y)),i},centerOnX:function(t){var e=.5*this.width;return this.midPoint.x=t,this.scrollX=t-e,this.useBounds&&(this.scrollX=this.clampX(this.scrollX)),this},centerOnY:function(t){var e=.5*this.height;return this.midPoint.y=t,this.scrollY=t-e,this.useBounds&&(this.scrollY=this.clampY(this.scrollY)),this},centerOn:function(t,e){return this.centerOnX(t),this.centerOnY(e),this},centerToBounds:function(){if(this.useBounds){var t=this._bounds,e=.5*this.width,i=.5*this.height;this.midPoint.set(t.centerX,t.centerY),this.scrollX=t.centerX-e,this.scrollY=t.centerY-i}return this},centerToSize:function(){return this.scrollX=.5*this.width,this.scrollY=.5*this.height,this},cull:function(t){if(this.disableCull)return t;var e=this.matrix.matrix,i=e[0],s=e[1],n=e[2],r=e[3],o=i*r-s*n;if(!o)return t;var a=e[4],h=e[5],l=this.scrollX,u=this.scrollY,c=this.width,d=this.height,f=this.y,p=f+d,v=this.x,g=v+c,m=this.culledObjects,y=t.length;o=1/o,m.length=0;for(var x=0;xv&&S*i+E*n+af&&S*s+E*r+hn&&(t=n),t},clampY:function(t){var e=this._bounds,i=this.displayHeight,s=e.y+(i-this.height)/2,n=Math.max(s,s+e.height-i);return tn&&(t=n),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=u(t),this.transparent=0===this.backgroundColor.alpha,this},setBounds:function(t,e,i,s,n){return void 0===n&&(n=!1),this._bounds.setTo(t,e,i,s),this.dirty=!0,this.useBounds=!0,n?this.centerToBounds():(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},getBounds:function(t){void 0===t&&(t=new h);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.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=d},38058:(t,e,i)=>{var s=i(71911),n=i(67502),r=i(45319),o=i(83419),a=i(31401),h=i(20052),l=i(19715),u=i(28915),c=i(87841),d=i(26099),f=new o({Extends:s,Mixins:[a.PostPipeline],initialize:function(t,e,i,n){s.call(this,t,e,i,n),this.initPostPipeline(),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 d(1,1),this.followOffset=new d,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 c(0,0,t,e),this._follow){var i=this.width/2,s=this.height/2,r=this._follow.x-this.followOffset.x,o=this._follow.y-this.followOffset.y;this.midPoint.set(r,o),this.scrollX=r-i,this.scrollY=o-s}n(this.deadzone,this.midPoint.x,this.midPoint.y)}return this},fadeIn:function(t,e,i,s,n,r){return this.fadeEffect.start(!1,t,e,i,s,!0,n,r)},fadeOut:function(t,e,i,s,n,r){return this.fadeEffect.start(!0,t,e,i,s,!0,n,r)},fadeFrom:function(t,e,i,s,n,r,o){return this.fadeEffect.start(!1,t,e,i,s,n,r,o)},fade:function(t,e,i,s,n,r,o){return this.fadeEffect.start(!0,t,e,i,s,n,r,o)},flash:function(t,e,i,s,n,r,o){return this.flashEffect.start(t,e,i,s,n,r,o)},shake:function(t,e,i,s,n){return this.shakeEffect.start(t,e,i,s,n)},pan:function(t,e,i,s,n,r,o){return this.panEffect.start(t,e,i,s,n,r,o)},rotateTo:function(t,e,i,s,n,r,o){return this.rotateToEffect.start(t,e,i,s,n,r,o)},zoomTo:function(t,e,i,s,n,r){return this.zoomEffect.start(t,e,i,s,n,r)},preRender:function(){this.renderList.length=0;var t=this.width,e=this.height,i=.5*t,s=.5*e,r=this.zoomX,o=this.zoomY,a=this.matrix;this.renderRoundPixels=this.roundPixels&&Number.isInteger(r)&&Number.isInteger(o);var h=t*this.originX,c=e*this.originY,d=this._follow,f=this.deadzone,p=this.scrollX,v=this.scrollY;f&&n(f,this.midPoint.x,this.midPoint.y);var g=!1;if(d&&!this.panEffect.isRunning){var m=this.lerp,y=d.x-this.followOffset.x,x=d.y-this.followOffset.y;f?(yf.right&&(p=u(p,p+(y-f.right),m.x)),xf.bottom&&(v=u(v,v+(x-f.bottom),m.y))):(p=u(p,y-h,m.x),v=u(v,x-c,m.y)),g=!0}this.roundPixels&&(p=Math.floor(p),v=Math.floor(v)),this.useBounds&&(p=this.clampX(p),v=this.clampY(v)),this.scrollX=p,this.scrollY=v;var T=p+i,w=v+s;this.midPoint.set(T,w);var b=Math.floor(t/r+.5),S=Math.floor(e/o+.5),E=Math.floor(T-b/2+.5),A=Math.floor(w-S/2+.5);this.worldView.setTo(E,A,b,S),a.applyITRS(Math.floor(this.x+h+.5),Math.floor(this.y+c+.5),this.rotation,r,o),a.translate(-h,-c),this.shakeEffect.preRender(),g&&this.emit(l.FOLLOW_UPDATE,this,d)},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,n,o){void 0===e&&(e=!1),void 0===i&&(i=1),void 0===s&&(s=i),void 0===n&&(n=0),void 0===o&&(o=n),this._follow=t,this.roundPixels=e,i=r(i,0,1),s=r(s,0,1),this.lerp.set(i,s),this.followOffset.set(n,o);var a=this.width/2,h=this.height/2,l=t.x-n,u=t.y-o;return this.midPoint.set(l,u),this.scrollX=l-a,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(),s.prototype.destroy.call(this),this._follow=null,this.deadzone=null}});t.exports=f},32743:(t,e,i)=>{var s=i(38058),n=i(83419),r=i(95540),o=i(37277),a=i(37303),h=i(97480),l=i(44594),u=new n({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,n,r,o){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===n&&(n=this.scene.sys.scale.height),void 0===r&&(r=!1),void 0===o&&(o="");var a=new s(t,e,i,n);return a.setName(o),a.setScene(this.scene),a.setRoundPixels(this.roundPixels),a.id=this.getNextID(),this.cameras.push(a),r&&(this.main=a),a},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,n=0;n0){r.preRender();var o=this.getVisibleChildren(e.getChildren(),r);t.render(i,o,r)}}},getVisibleChildren:function(t,e){return t.filter((function(t){return t.willRender(e)}))},resetAll:function(){for(var t=0;t{var s=i(45319),n=i(83419),r=i(19715),o=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.isComplete=!1,this.direction=!0,this.duration=0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,s,n,o,a,h){if(void 0===t&&(t=!0),void 0===e&&(e=1e3),void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=0),void 0===o&&(o=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene),!o&&this.isRunning)return this.camera;this.isRunning=!0,this.isComplete=!1,this.duration=e,this.direction=t,this.progress=0,this.red=i,this.green=s,this.blue=n,this.alpha=t?Number.MIN_VALUE:1,this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h;var l=t?r.FADE_OUT_START:r.FADE_IN_START;return this.camera.emit(l,this.camera,this,e,i,s,n),this.camera},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=s(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed{var s=i(45319),n=i(83419),r=i(19715),o=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.red=0,this.green=0,this.blue=0,this.alpha=1,this.progress=0,this._elapsed=0,this._alpha,this._onUpdate,this._onUpdateScope},start:function(t,e,i,s,n,o,a){return void 0===t&&(t=250),void 0===e&&(e=255),void 0===i&&(i=255),void 0===s&&(s=255),void 0===n&&(n=!1),void 0===o&&(o=null),void 0===a&&(a=this.camera.scene),!n&&this.isRunning||(this.isRunning=!0,this.duration=t,this.progress=0,this.red=e,this.green=i,this.blue=s,this._alpha=this.alpha,this._elapsed=0,this._onUpdate=o,this._onUpdateScope=a,this.camera.emit(r.FLASH_START,this.camera,this,t,e,i,s)),this.camera},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=s(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed{var s=i(45319),n=i(83419),r=i(62640),o=i(19715),a=i(26099),h=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=new a,this.current=new a,this.destination=new a,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,s,n,a,h){void 0===i&&(i=1e3),void 0===s&&(s=r.Linear),void 0===n&&(n=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene);var l=this.camera;return!n&&this.isRunning||(this.isRunning=!0,this.duration=i,this.progress=0,this.source.set(l.scrollX,l.scrollY),this.destination.set(t,e),l.getScroll(t,e,this.current),"string"==typeof s&&r.hasOwnProperty(s)?this.ease=r[s]:"function"==typeof s&&(this.ease=s),this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h,this.camera.emit(o.PAN_START,this.camera,this,i,t,e)),l},update:function(t,e){if(this.isRunning){this._elapsed+=e;var i=s(this._elapsed/this.duration,0,1);this.progress=i;var n=this.camera;if(this._elapsed{var s=i(45319),n=i(83419),r=i(19715),o=i(62640),a=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=0,this.current=0,this.destination=0,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope,this.clockwise=!0,this.shortestPath=!1},start:function(t,e,i,s,n,a,h){void 0===i&&(i=1e3),void 0===s&&(s=o.Linear),void 0===n&&(n=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene),void 0===e&&(e=!1),this.shortestPath=e;var l=t;t<0?(l=-1*t,this.clockwise=!1):this.clockwise=!0;var u=360*Math.PI/180;l-=Math.floor(l/u)*u;var c=this.camera;if(!n&&this.isRunning)return c;if(this.isRunning=!0,this.duration=i,this.progress=0,this.source=c.rotation,this.destination=l,"string"==typeof s&&o.hasOwnProperty(s)?this.ease=o[s]:"function"==typeof s&&(this.ease=s),this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h,this.shortestPath){var d=0,f=0;(d=this.destination>this.source?Math.abs(this.destination-this.source):Math.abs(this.destination+u)-this.source)<(f=this.source>this.destination?Math.abs(this.source-this.destination):Math.abs(this.source+u)-this.destination)?this.clockwise=!0:d>f&&(this.clockwise=!1)}return this.camera.emit(r.ROTATE_START,this.camera,this,i,l),c},update:function(t,e){if(this.isRunning){this._elapsed+=e;var i=s(this._elapsed/this.duration,0,1);this.progress=i;var n=this.camera;if(this._elapsed=l?Math.abs(h-l):Math.abs(h+a)-l;var u=0;u=this.clockwise?n.rotation+o*r:n.rotation-o*r,n.rotation=u,this._onUpdate&&this._onUpdate.call(this._onUpdateScope,n,i,u)}else n.rotation=this.destination,this._onUpdate&&this._onUpdate.call(this._onUpdateScope,n,i,this.destination),this.effectComplete()}},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(r.ROTATE_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null,this.source=null,this.destination=null}});t.exports=a},30330:(t,e,i)=>{var s=i(45319),n=i(83419),r=i(19715),o=i(26099),a=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.intensity=new o,this.progress=0,this._elapsed=0,this._offsetX=0,this._offsetY=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,s,n){return void 0===t&&(t=100),void 0===e&&(e=.05),void 0===i&&(i=!1),void 0===s&&(s=null),void 0===n&&(n=this.camera.scene),!i&&this.isRunning||(this.isRunning=!0,this.duration=t,this.progress=0,"number"==typeof e?this.intensity.set(e):this.intensity.set(e.x,e.y),this._elapsed=0,this._offsetX=0,this._offsetY=0,this._onUpdate=s,this._onUpdateScope=n,this.camera.emit(r.SHAKE_START,this.camera,this,t,e)),this.camera},preRender:function(){this.isRunning&&this.camera.matrix.translate(this._offsetX,this._offsetY)},update:function(t,e){if(this.isRunning)if(this._elapsed+=e,this.progress=s(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed{var s=i(45319),n=i(83419),r=i(62640),o=i(19715),a=new n({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=1,this.destination=1,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,s,n,a){void 0===e&&(e=1e3),void 0===i&&(i=r.Linear),void 0===s&&(s=!1),void 0===n&&(n=null),void 0===a&&(a=this.camera.scene);var h=this.camera;return!s&&this.isRunning||(this.isRunning=!0,this.duration=e,this.progress=0,this.source=h.zoom,this.destination=t,"string"==typeof i&&r.hasOwnProperty(i)?this.ease=r[i]:"function"==typeof i&&(this.ease=i),this._elapsed=0,this._onUpdate=n,this._onUpdateScope=a,this.camera.emit(o.ZOOM_START,this.camera,this,e,t)),h},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=s(this._elapsed/this.duration,0,1),this._elapsed{t.exports={Fade:i(5020),Flash:i(10662),Pan:i(20359),Shake:i(30330),RotateTo:i(34208),Zoom:i(45641)}},16438:t=>{t.exports="cameradestroy"},32726:t=>{t.exports="camerafadeincomplete"},87807:t=>{t.exports="camerafadeinstart"},45917:t=>{t.exports="camerafadeoutcomplete"},95666:t=>{t.exports="camerafadeoutstart"},47056:t=>{t.exports="cameraflashcomplete"},91261:t=>{t.exports="cameraflashstart"},45047:t=>{t.exports="followupdate"},81927:t=>{t.exports="camerapancomplete"},74264:t=>{t.exports="camerapanstart"},54419:t=>{t.exports="postrender"},79330:t=>{t.exports="prerender"},93183:t=>{t.exports="camerarotatecomplete"},80112:t=>{t.exports="camerarotatestart"},62252:t=>{t.exports="camerashakecomplete"},86017:t=>{t.exports="camerashakestart"},539:t=>{t.exports="camerazoomcomplete"},51892:t=>{t.exports="camerazoomstart"},19715:(t,e,i)=>{t.exports={DESTROY:i(16438),FADE_IN_COMPLETE:i(32726),FADE_IN_START:i(87807),FADE_OUT_COMPLETE:i(45917),FADE_OUT_START:i(95666),FLASH_COMPLETE:i(47056),FLASH_START:i(91261),FOLLOW_UPDATE:i(45047),PAN_COMPLETE:i(81927),PAN_START:i(74264),POST_RENDER:i(54419),PRE_RENDER:i(79330),ROTATE_COMPLETE:i(93183),ROTATE_START:i(80112),SHAKE_COMPLETE:i(62252),SHAKE_START:i(86017),ZOOM_COMPLETE:i(539),ZOOM_START:i(51892)}},87969:(t,e,i)=>{t.exports={Camera:i(38058),BaseCamera:i(71911),CameraManager:i(32743),Effects:i(20052),Events:i(19715)}},63091:(t,e,i)=>{var s=i(83419),n=i(35154),r=new s({initialize:function(t){this.camera=n(t,"camera",null),this.left=n(t,"left",null),this.right=n(t,"right",null),this.up=n(t,"up",null),this.down=n(t,"down",null),this.zoomIn=n(t,"zoomIn",null),this.zoomOut=n(t,"zoomOut",null),this.zoomSpeed=n(t,"zoomSpeed",.01),this.minZoom=n(t,"minZoom",.001),this.maxZoom=n(t,"maxZoom",1e3),this.speedX=0,this.speedY=0;var e=n(t,"speed",null);"number"==typeof e?(this.speedX=e,this.speedY=e):(this.speedX=n(t,"speed.x",0),this.speedY=n(t,"speed.y",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.up&&this.up.isDown?e.scrollY-=this.speedY*t|0:this.down&&this.down.isDown&&(e.scrollY+=this.speedY*t|0),this.left&&this.left.isDown?e.scrollX-=this.speedX*t|0:this.right&&this.right.isDown&&(e.scrollX+=this.speedX*t|0),this.zoomIn&&this.zoomIn.isDown?(e.zoom-=this.zoomSpeed,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=r},58818:(t,e,i)=>{var s=i(83419),n=i(35154),r=new s({initialize:function(t){this.camera=n(t,"camera",null),this.left=n(t,"left",null),this.right=n(t,"right",null),this.up=n(t,"up",null),this.down=n(t,"down",null),this.zoomIn=n(t,"zoomIn",null),this.zoomOut=n(t,"zoomOut",null),this.zoomSpeed=n(t,"zoomSpeed",.01),this.minZoom=n(t,"minZoom",.001),this.maxZoom=n(t,"maxZoom",1e3),this.accelX=0,this.accelY=0;var e=n(t,"acceleration",null);"number"==typeof e?(this.accelX=e,this.accelY=e):(this.accelX=n(t,"acceleration.x",0),this.accelY=n(t,"acceleration.y",0)),this.dragX=0,this.dragY=0;var i=n(t,"drag",null);"number"==typeof i?(this.dragX=i,this.dragY=i):(this.dragX=n(t,"drag.x",0),this.dragY=n(t,"drag.y",0)),this.maxSpeedX=0,this.maxSpeedY=0;var s=n(t,"maxSpeed",null);"number"==typeof s?(this.maxSpeedX=s,this.maxSpeedY=s):(this.maxSpeedX=n(t,"maxSpeed.x",0),this.maxSpeedY=n(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=r},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:"3.90.0",LOG_VERSION:"v390",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),n=i(8054),r=i(42363),o=i(82264),a=i(95540),h=i(35154),l=i(41212),u=i(29747),c=i(75508),d=i(36060),f=i(80333),p=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",n.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()]),c.RND=new c.RandomDataGenerator(this.seed),this.gameTitle=h(t,"title",""),this.gameURL=h(t,"url","https://phaser.io/"+n.LOG_VERSION),this.gameVersion=h(t,"version",""),this.autoFocus=h(t,"autoFocus",!0),this.stableSort=h(t,"stableSort",-1),-1===this.stableSort&&(this.stableSort=o.browser.es2019?1:0),o.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",o.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",["#ff0000","#ffff00","#00ff00","#00ffff","#000000"]),""===this.gameTitle&&this.hidePhaser&&(this.hideBanner=!0),this.fps=h(t,"fps",null),this.disablePreFX=h(t,"disablePreFX",!1),this.disablePostFX=h(t,"disablePostFX",!1);var i=h(t,"render",null);this.pipeline=h(i,"pipeline",null,t),this.autoMobilePipeline=h(i,"autoMobilePipeline",!0,t),this.defaultPipeline=h(i,"defaultPipeline",d.MULTI_PIPELINE,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.pixelArt=h(i,"pixelArt",1!==this.zoom,t),this.pixelArt&&(this.antialias=!1,this.antialiasGL=!1,this.roundPixels=!0),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.failIfMajorPerformanceCaveat=h(i,"failIfMajorPerformanceCaveat",!1,t),this.powerPreference=h(i,"powerPreference","default",t),this.batchSize=h(i,"batchSize",4096,t),this.maxTextures=h(i,"maxTextures",-1,t),this.maxLights=h(i,"maxLights",10,t);var s=h(t,"backgroundColor",0);this.backgroundColor=f(s),this.transparent&&(this.backgroundColor=f(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",o.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.glowFXQuality=h(t,"fx.glow.quality",.1),this.glowFXDistance=h(t,"fx.glow.distance",10),this.installGlobalPlugins=[],this.installScenePlugins=[];var p=h(t,"plugins",null),v=r.DefaultScene;p&&(Array.isArray(p)?this.defaultPlugins=p:l(p)&&(this.installGlobalPlugins=a(p,"global",[]),this.installScenePlugins=a(p,"scene",[]),Array.isArray(p.default)?v=p.default:Array.isArray(p.defaultMerge)&&(v=v.concat(p.defaultMerge)))),this.defaultPlugins=v;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=n.WEBGL:window.FORCE_CANVAS&&(this.renderType=n.CANVAS))}});t.exports=p},86054:(t,e,i)=>{var s=i(20623),n=i(27919),r=i(8054),o=i(89357);t.exports=function(t){var e=t.config;if((e.customEnvironment||e.canvas)&&e.renderType===r.AUTO)throw new Error("Must set explicit renderType in custom environment");if(!e.customEnvironment&&!e.canvas&&e.renderType!==r.HEADLESS)if(e.renderType===r.AUTO&&(e.renderType=o.webGL?r.WEBGL:r.CANVAS),e.renderType===r.WEBGL){if(!o.webGL)throw new Error("Cannot create WebGL context, aborting.")}else{if(e.renderType!==r.CANVAS)throw new Error("Unknown value for renderer type: "+e.renderType);if(!o.canvas)throw new Error("Cannot create Canvas context, aborting.")}e.antialias||n.disableSmoothing();var a,h,l=t.scale.baseSize,u=l.width,c=l.height;(e.canvas?(t.canvas=e.canvas,t.canvas.width=u,t.canvas.height=c):t.canvas=n.create(t,u,c,e.renderType),e.canvasStyle&&(t.canvas.style=e.canvasStyle),e.antialias||s.setCrisp(t.canvas),e.renderType!==r.HEADLESS)&&(a=i(68627),h=i(74797),e.renderType===r.WEBGL?t.renderer=new h(t):(t.renderer=new a(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 n,r=e.audio,o=t.device.audio;if(n=o.webAudio&&!r.disableWebAudio?"Web Audio":r.noAudio||!o.webAudio&&!o.audioData?"No Audio":"HTML5 Audio",t.device.browser.ie)window.console&&console.log("Phaser v"+s.VERSION+" / https://phaser.io");else{var a,h="",l=[h];if(Array.isArray(e.bannerBackgroundColor))e.bannerBackgroundColor.forEach((function(t){h=h.concat("%c "),l.push("background: "+t),a=t})),l[l.length-1]="color: "+e.bannerTextColor+"; background: "+a;else h=h.concat("%c "),l.push("color: "+e.bannerTextColor+"; background: "+e.bannerBackgroundColor);l.push("background: transparent"),e.gameTitle&&(h=h.concat(e.gameTitle),e.gameVersion&&(h=h.concat(" v"+e.gameVersion)),e.hidePhaser||(h=h.concat(" / ")));e.hidePhaser||(h=h.concat("Phaser v"+s.VERSION+" ("+i+" | "+n+")")),h=h.concat(" %c "+e.gameURL),l[0]=h,console.log.apply(console,l)}}}},50127:(t,e,i)=>{var s=i(40366),n=i(60848),r=i(24047),o=i(27919),a=i(83419),h=i(69547),l=i(83719),u=i(86054),c=i(45893),d=i(96391),f=i(82264),p=i(57264),v=i(50792),g=i(8443),m=i(7003),y=i(37277),x=i(77332),T=i(76531),w=i(60903),b=i(69442),S=i(17130),E=i(65898),A=i(51085),C=i(14747),_=new a({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 v,this.anims=new n(this),this.textures=new S(this),this.cache=new r(this),this.registry=new c(this,new v),this.input=new m(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=C.create(this),this.loop=new E(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),d(this),s(this.canvas,this.config.parent),this.textures.once(b.READY,this.texturesReady,this),this.events.emit(g.BOOT)):console.warn("Aborting. Core Plugins missing.")},texturesReady:function(){this.events.emit(g.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)),A(this);var t=this.events;t.on(g.HIDDEN,this.onHidden,this),t.on(g.VISIBLE,this.onVisible,this),t.on(g.BLUR,this.onBlur,this),t.on(g.FOCUS,this.onFocus,this)},step:function(t,e){if(this.pendingDestroy)return this.runDestroy();if(!this.isPaused){var i=this.events;i.emit(g.PRE_STEP,t,e),i.emit(g.STEP,t,e),this.scene.update(t,e),i.emit(g.POST_STEP,t,e);var s=this.renderer;s.preRender(),i.emit(g.PRE_RENDER,s,t,e),this.scene.render(s),s.postRender(),i.emit(g.POST_RENDER,s,t,e)}},headlessStep:function(t,e){if(this.pendingDestroy)return this.runDestroy();if(!this.isPaused){var i=this.events;i.emit(g.PRE_STEP,t,e),i.emit(g.STEP,t,e),this.scene.update(t,e),i.emit(g.POST_STEP,t,e),this.scene.isProcessing=!1,i.emit(g.PRE_RENDER,null,t,e),i.emit(g.POST_RENDER,null,t,e)}},onHidden:function(){this.loop.pause(),this.events.emit(g.PAUSE)},pause:function(){var t=this.isPaused;this.isPaused=!0,t||this.events.emit(g.PAUSE)},onVisible:function(){this.loop.resume(),this.events.emit(g.RESUME,this.loop.pauseDuration)},resume:function(){var t=this.isPaused;this.isPaused=!1,t&&this.events.emit(g.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(g.DESTROY),this.events.removeAllListeners(),this.renderer&&this.renderer.destroy(),this.removeCanvas&&this.canvas&&(o.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),n=i(35154),r=i(29747),o=i(43092),a=new s({initialize:function(t,e){this.game=t,this.raf=new o,this.started=!1,this.running=!1,this.minFps=n(e,"min",5),this.targetFps=n(e,"target",60),this.fpsLimit=n(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=r,this.forceSetTimeOut=n(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=n(e,"deltaHistory",10),this.panicMax=n(e,"panicMax",120),this.rawDelta=0,this.now=0,this.smoothStep=n(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 n=0,r=0;r=this.nextFpsUpdate&&this.updateFPS(t),this.framesThisSecond++,this.delta>=this._limitRate&&(this.callback(t,this.delta),this.delta=0),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=a},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)}},99584:(t,e,i)=>{var s=i(5290),n=i(27919),r=i(35154);t.exports=function(t){var e=r(t,"data",[]),i=r(t,"canvas",null),o=r(t,"palette",s),a=r(t,"pixelWidth",1),h=r(t,"pixelHeight",a),l=r(t,"resizeCanvas",!0),u=r(t,"clearCanvas",!0),c=r(t,"preRender",null),d=r(t,"postRender",null),f=Math.floor(Math.abs(e[0].length*a)),p=Math.floor(Math.abs(e.length*h));i||(i=n.create2D(this,f,p),l=!1,u=!1),l&&(i.width=f,i.height=p);var v=i.getContext("2d",{willReadFrequently:!0});u&&v.clearRect(0,0,f,p),c&&c(i,v);for(var g=0;g{t.exports={GenerateTexture:i(99584),Palettes:i(57763)}},5290:t=>{t.exports={0:"#000",1:"#9D9D9D",2:"#FFF",3:"#BE2633",4:"#E06F8B",5:"#493C2B",6:"#A46422",7:"#EB8931",8:"#F7E26B",9:"#2F484E",A:"#44891A",B:"#A3CE27",C:"#1B2632",D:"#005784",E:"#31A2F2",F:"#B2DCEF"}},23816:t=>{t.exports={0:"#000",1:"#fff",2:"#8b4131",3:"#7bbdc5",4:"#8b41ac",5:"#6aac41",6:"#3931a4",7:"#d5de73",8:"#945a20",9:"#5a4100",A:"#bd736a",B:"#525252",C:"#838383",D:"#acee8b",E:"#7b73de",F:"#acacac"}},9866:t=>{t.exports={0:"#000",1:"#2234d1",2:"#0c7e45",3:"#44aacc",4:"#8a3622",5:"#5c2e78",6:"#aa5c3d",7:"#b5b5b5",8:"#5e606e",9:"#4c81fb",A:"#6cd947",B:"#7be2f9",C:"#eb8a60",D:"#e23d69",E:"#ffd93f",F:"#fff"}},77552:t=>{t.exports={0:"#000",1:"#191028",2:"#46af45",3:"#a1d685",4:"#453e78",5:"#7664fe",6:"#833129",7:"#9ec2e8",8:"#dc534b",9:"#e18d79",A:"#d6b97b",B:"#e9d8a1",C:"#216c4b",D:"#d365c8",E:"#afaab9",F:"#f5f4eb"}},92259:t=>{t.exports={0:"#000",1:"#191028",2:"#46af45",3:"#a1d685",4:"#453e78",5:"#7664fe",6:"#833129",7:"#9ec2e8",8:"#dc534b",9:"#e18d79",A:"#d6b97b",B:"#e9d8a1",C:"#216c4b",D:"#d365c8",E:"#afaab9",F:"#fff"}},57763:(t,e,i)=>{t.exports={ARNE16:i(5290),C64:i(23816),CGA:i(9866),JMP:i(77552),MSX:i(92259)}},46728:(t,e,i)=>{var s=i(83419),n=i(36316),r=i(80021),o=i(26099),a=new s({Extends:r,initialize:function(t,e,i,s){r.call(this,"CubicBezierCurve"),Array.isArray(t)&&(s=new o(t[6],t[7]),i=new o(t[4],t[5]),e=new o(t[2],t[3]),t=new o(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 o),t.copy(this.p0)},getResolution:function(t){return t},getPoint:function(t,e){void 0===e&&(e=new o);var i=this.p0,s=this.p1,r=this.p2,a=this.p3;return e.set(n(t,i.x,s.x,r.x,a.x),n(t,i.y,s.y,r.y,a.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;s{var s=i(83419),n=i(19217),r=i(87841),o=i(26099),a=new s({initialize:function(t){this.type=t,this.defaultDivisions=5,this.arcLengthDivisions=100,this.cacheArcLengths=[],this.needsUpdate=!0,this.active=!0,this._tmpVec2A=new o,this._tmpVec2B=new o},draw:function(t,e){return void 0===e&&(e=32),t.strokePoints(this.getPoints(e))},getBounds:function(t,e){t||(t=new r),void 0===e&&(e=16);var i=this.getLength();e>i&&(e=i/2);var s=Math.max(1,Math.round(i/e));return n(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 o),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),n=0;i.push(0);for(var r=1;r<=t;r++)n+=(e=this.getPoint(r/t,this._tmpVec2B)).distance(s),i.push(n),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 o),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 n=this.getUtoTmapping(s/t,null,t);i.push(this.getPoint(n))}return i},getStartPoint:function(t){return void 0===t&&(t=new o),this.getPointAt(0,t)},getTangent:function(t,e){void 0===e&&(e=new o);var i=1e-4,s=t-i,n=t+i;return s<0&&(s=0),n>1&&(n=1),this.getPoint(s,this._tmpVec2A),this.getPoint(n,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,n=this.getLengths(i),r=0,o=n.length;s=e?Math.min(e,n[o-1]):t*n[o-1];for(var a,h=0,l=o-1;h<=l;)if((a=n[r=Math.floor(h+(l-h)/2)]-s)<0)h=r+1;else{if(!(a>0)){l=r;break}l=r-1}if(n[r=l]===s)return r/(o-1);var u=n[r];return(r+(s-u)/(n[r+1]-u))/(o-1)},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()}});t.exports=a},73825:(t,e,i)=>{var s=i(83419),n=i(80021),r=i(39506),o=i(35154),a=i(43396),h=i(26099),l=new s({Extends:n,initialize:function(t,e,i,s,a,l,u,c){if("object"==typeof t){var d=t;t=o(d,"x",0),e=o(d,"y",0),i=o(d,"xRadius",0),s=o(d,"yRadius",i),a=o(d,"startAngle",0),l=o(d,"endAngle",360),u=o(d,"clockwise",!1),c=o(d,"rotation",0)}else void 0===s&&(s=i),void 0===a&&(a=0),void 0===l&&(l=360),void 0===u&&(u=!1),void 0===c&&(c=0);n.call(this,"EllipseCurve"),this.p0=new h(t,e),this._xRadius=i,this._yRadius=s,this._startAngle=r(a),this._endAngle=r(l),this._clockwise=u,this._rotation=r(c)},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,n=Math.abs(s)i;)s-=i;s{var s=i(83419),n=i(80021),r=i(19217),o=i(87841),a=i(26099),h=new s({Extends:n,initialize:function(t,e){n.call(this,"LineCurve"),Array.isArray(t)&&(e=new a(t[2],t[3]),t=new a(t[0],t[1])),this.p0=t,this.p1=e,this.arcLengthDivisions=1},getBounds:function(t){return void 0===t&&(t=new o),r([this.p0,this.p1],t)},getStartPoint:function(t){return void 0===t&&(t=new a),t.copy(this.p0)},getResolution:function(t){return void 0===t&&(t=1),t},getPoint:function(t,e){return void 0===e&&(e=new a),1===t?e.copy(this.p1):(e.copy(this.p1).subtract(this.p0).scale(t).add(this.p0),e)},getPointAt:function(t,e){return this.getPoint(t,e)},getTangent:function(t,e){return void 0===e&&(e=new a),e.copy(this.p1).subtract(this.p0).normalize(),e},getUtoTmapping:function(t,e,i){var s;if(e){var n=this.getLengths(i),r=n[n.length-1];s=Math.min(e,r)/r}else s=t;return s},draw:function(t){return t.lineBetween(this.p0.x,this.p0.y,this.p1.x,this.p1.y),t},toJSON:function(){return{type:this.type,points:[this.p0.x,this.p0.y,this.p1.x,this.p1.y]}}});h.fromJSON=function(t){var e=t.points,i=new a(e[0],e[1]),s=new a(e[2],e[3]);return new h(i,s)},t.exports=h},14744:(t,e,i)=>{var s=i(83419),n=i(80021),r=i(32112),o=i(26099),a=new s({Extends:n,initialize:function(t,e,i){n.call(this,"QuadraticBezierCurve"),Array.isArray(t)&&(i=new o(t[4],t[5]),e=new o(t[2],t[3]),t=new o(t[0],t[1])),this.p0=t,this.p1=e,this.p2=i},getStartPoint:function(t){return void 0===t&&(t=new o),t.copy(this.p0)},getResolution:function(t){return t},getPoint:function(t,e){void 0===e&&(e=new o);var i=this.p0,s=this.p1,n=this.p2;return e.set(r(t,i.x,s.x,n.x),r(t,i.y,s.y,n.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;s{var s=i(87842),n=i(83419),r=i(80021),o=i(26099),a=new n({Extends:r,initialize:function(t){void 0===t&&(t=[]),r.call(this,"SplineCurve"),this.points=[],this.addPoints(t)},addPoints:function(t){for(var e=0;ei.length-2?i.length-1:r+1],c=i[r>i.length-3?i.length-1:r+2];return e.set(s(a,h.x,l.x,u.x,c.x),s(a,h.y,l.y,u.y,c.y))},toJSON:function(){for(var t=[],e=0;e{t.exports={Path:i(46669),MoveTo:i(68618),CubicBezier:i(46728),Curve:i(80021),Ellipse:i(73825),Line:i(33951),QuadraticBezier:i(14744),Spline:i(42534)}},68618:(t,e,i)=>{var s=i(83419),n=i(26099),r=new s({initialize:function(t,e){this.active=!1,this.p0=new n(t,e)},getPoint:function(t,e){return void 0===e&&(e=new n),e.copy(this.p0)},getPointAt:function(t,e){return this.getPoint(t,e)},getResolution:function(){return 1},getLength:function(){return 0},toJSON:function(){return{type:"MoveTo",points:[this.p0.x,this.p0.y]}}});t.exports=r},46669:(t,e,i)=>{var s=i(83419),n=i(46728),r=i(73825),o=i(39429),a=i(33951),h=i(68618),l=i(14744),u=i(87841),c=i(42534),d=i(26099),f=i(36383),p=new s({initialize:function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.name="",this.defaultDivisions=12,this.curves=[],this.cacheLengths=[],this.autoClose=!1,this.startPoint=new d,this._tmpVec2A=new d,this._tmpVec2B=new d,"object"==typeof t?this.fromJSON(t):this.startPoint.set(t,e)},add:function(t){return this.curves.push(t),this},circleTo:function(t,e,i){return void 0===e&&(e=!1),this.ellipseTo(t,t,0,360,e,i)},closePath:function(){var t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);return t.equals(e)||this.curves.push(new a(e,t)),this},cubicBezierTo:function(t,e,i,s,r,o){var a,h,l,u=this.getEndPoint();return t instanceof d?(a=t,h=e,l=i):(a=new d(i,s),h=new d(r,o),l=new d(t,e)),this.add(new n(u,a,h,l))},quadraticBezierTo:function(t,e,i,s){var n,r,o=this.getEndPoint();return t instanceof d?(n=t,r=e):(n=new d(i,s),r=new d(t,e)),this.add(new l(o,n,r))},draw:function(t,e){for(var i=0;i=e)return this.curves[s];s++}return null},getEndPoint:function(t){return void 0===t&&(t=new d),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 d);for(var i=t*this.getLength(),s=this.getCurveLengths(),n=0;n=i){var r=s[n]-i,o=this.curves[n],a=o.getLength(),h=0===a?0:1-r/a;return o.getPointAt(h,e)}n++}return null},getPoints:function(t,e){t||e||(t=this.defaultDivisions);for(var i,s=[],n=0;n1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s},getRandomPoint:function(t){return void 0===t&&(t=new d),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 d),t.copy(this.startPoint)},getTangent:function(t,e){void 0===e&&(e=new d);for(var i=t*this.getLength(),s=this.getCurveLengths(),n=0;n=i){var r=s[n]-i,o=this.curves[n],a=o.getLength(),h=0===a?0:1-r/a;return o.getTangentAt(h,e)}n++}return null},lineTo:function(t,e){t instanceof d?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 a([i.x,i.y,this._tmpVec2B.x,this._tmpVec2B.y]))},splineTo:function(t){return t.unshift(this.getEndPoint()),this.add(new c(t))},moveTo:function(t,e){return t instanceof d?this.add(new h(t.x,t.y)):this.add(new h(t,e))},toJSON:function(){for(var t=[],e=0;e{var s=i(83419),n=i(24882),r=new s({initialize:function(t,e){this.parent=t,this.events=e,e||(this.events=t.events?t.events:t),this.list={},this.values={},this._frozen=!1,!t.hasOwnProperty("sys")&&this.events&&this.events.once(n.DESTROY,this.destroy,this)},get:function(t){var e=this.list;if(Array.isArray(t)){for(var i=[],s=0;s{var s=i(83419),n=i(45893),r=i(37277),o=i(44594),a=new s({Extends:n,initialize:function(t){n.call(this,t,t.sys.events),this.scene=t,this.systems=t.sys,t.sys.events.once(o.BOOT,this.boot,this),t.sys.events.on(o.START,this.start,this)},boot:function(){this.events=this.systems.events,this.events.once(o.DESTROY,this.destroy,this)},start:function(){this.events.once(o.SHUTDOWN,this.shutdown,this)},shutdown:function(){this.systems.events.off(o.SHUTDOWN,this.shutdown,this)},destroy:function(){n.prototype.destroy.call(this),this.events.off(o.START,this.start,this),this.scene=null,this.systems=null}});r.register("DataManagerPlugin",a,"data"),t.exports=a},10700:t=>{t.exports="changedata"},93608:t=>{t.exports="changedata-"},60883:t=>{t.exports="destroy"},69780:t=>{t.exports="removedata"},22166:t=>{t.exports="setdata"},24882:(t,e,i)=>{t.exports={CHANGE_DATA:i(10700),CHANGE_DATA_KEY:i(93608),DESTROY:i(60883),REMOVE_DATA:i(69780),SET_DATA:i(22166)}},44965:(t,e,i)=>{t.exports={DataManager:i(45893),DataManagerPlugin:i(63646),Events:i(24882)}},7098:(t,e,i)=>{var s=i(84148),n={flac:!1,aac:!1,audioData:!1,dolby:!1,m4a:!1,mp3:!1,ogg:!1,opus:!1,wav:!1,webAudio:!1,webm:!1};t.exports=function(){if("function"==typeof importScripts)return n;n.audioData=!!window.Audio,n.webAudio=!(!window.AudioContext&&!window.webkitAudioContext);var t=document.createElement("audio"),e=!!t.canPlayType;try{if(e){var i=function(e,i){var s=t.canPlayType("audio/"+e).replace(/^no$/,"");return i?Boolean(s||t.canPlayType("audio/"+i).replace(/^no$/,"")):Boolean(s)};if(n.ogg=i('ogg; codecs="vorbis"'),n.opus=i('ogg; codecs="opus"',"opus"),n.mp3=i("mpeg"),n.wav=i("wav"),n.m4a=i("x-m4a"),n.aac=i("aac"),n.flac=i("flac","x-flac"),n.webm=i('webm; codecs="vorbis"'),""!==t.canPlayType('audio/mp4; codecs="ec-3"'))if(s.edge)n.dolby=!0;else if(s.safari&&s.safariVersion>=9&&/Mac OS X (\d+)_(\d+)/.test(navigator.userAgent)){var r=parseInt(RegExp.$1,10),o=parseInt(RegExp.$2,10);(10===r&&o>=11||r>10)&&(n.dolby=!0)}}}catch(t){}return n}()},84148:(t,e,i)=>{var s,n=i(25892),r={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)?(r.edge=!0,r.es2019=!0):/OPR/.test(s)?(r.opera=!0,r.es2019=!0):/Chrome\/(\d+)/.test(s)&&!n.windowsPhone?(r.chrome=!0,r.chromeVersion=parseInt(RegExp.$1,10),r.es2019=r.chromeVersion>69):/Firefox\D+(\d+)/.test(s)?(r.firefox=!0,r.firefoxVersion=parseInt(RegExp.$1,10),r.es2019=r.firefoxVersion>10):/AppleWebKit\/(?!.*CriOS)/.test(s)&&n.iOS?(r.mobileSafari=!0,r.es2019=!0):/MSIE (\d+\.\d+);/.test(s)?(r.ie=!0,r.ieVersion=parseInt(RegExp.$1,10)):/Version\/(\d+\.\d+(\.\d+)?) Safari/.test(s)&&!n.windowsPhone?(r.safari=!0,r.safariVersion=parseInt(RegExp.$1,10),r.es2019=r.safariVersion>10):/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/.test(s)&&(r.ie=!0,r.trident=!0,r.tridentVersion=parseInt(RegExp.$1,10),r.ieVersion=parseInt(RegExp.$3,10)),/Silk/.test(s)&&(r.silk=!0),r)},89289:(t,e,i)=>{var s,n,r,o=i(27919),a={supportInverseAlpha:!1,supportNewBlendModes:!1};t.exports=("function"!=typeof importScripts&&void 0!==document&&(a.supportNewBlendModes=(s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/",n="AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==",(r=new Image).onload=function(){var t=new Image;t.onload=function(){var e=o.create2D(t,6).getContext("2d",{willReadFrequently:!0});if(e.globalCompositeOperation="multiply",e.drawImage(r,0,0),e.drawImage(t,2,0),!e.getImageData(2,0,1,1))return!1;var i=e.getImageData(2,0,1,1).data;o.remove(t),a.supportNewBlendModes=255===i[0]&&0===i[1]&&0===i[2]},t.src=s+"/wCKxvRF"+n},r.src=s+"AP804Oa6"+n,!1),a.supportInverseAlpha=function(){var t=o.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 o.remove(this),s}()),a)},89357:(t,e,i)=>{var s=i(25892),n=i(84148),r=i(27919),o={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 o;o.canvas=!!window.CanvasRenderingContext2D;try{o.localStorage=!!localStorage.getItem}catch(t){o.localStorage=!1}o.file=!!(window.File&&window.FileReader&&window.FileList&&window.Blob),o.fileSystem=!!window.requestFileSystem;var t,e,i,a=!1;return o.webGL=function(){if(window.WebGLRenderingContext)try{var t=r.createWebGL(this),e=t.getContext("webgl")||t.getContext("experimental-webgl"),i=r.create2D(this),s=i.getContext("2d",{willReadFrequently:!0}).createImageData(1,1);return a=s.data instanceof Uint8ClampedArray,r.remove(t),r.remove(i),!!e}catch(t){return!1}return!1}(),o.worker=!!window.Worker,o.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,o.getUserMedia=o.getUserMedia&&!!navigator.getUserMedia&&!!window.URL,n.firefox&&n.firefoxVersion<21&&(o.getUserMedia=!1),!s.iOS&&(n.ie||n.firefox||n.chrome)&&(o.canvasBitBltShift=!0),(n.safari||n.mobileSafari)&&(o.canvasBitBltShift=!1),navigator.vibrate=navigator.vibrate||navigator.webkitVibrate||navigator.mozVibrate||navigator.msVibrate,navigator.vibrate&&(o.vibration=!0),"undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint32Array&&(o.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)),o.support32bit="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof Int32Array&&null!==o.littleEndian&&a,o}()},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",n=["request"+i,"request"+s,"webkitRequest"+i,"webkitRequest"+s,"msRequest"+i,"msRequest"+s,"mozRequest"+s,"mozRequest"+i];for(t=0;t{var s=i(84148),n={gamepads:!1,mspointer:!1,touch:!1,wheelEvent:null};t.exports=("function"==typeof importScripts||(("ontouchstart"in document.documentElement||navigator.maxTouchPoints&&navigator.maxTouchPoints>=1)&&(n.touch=!0),(navigator.msPointerEnabled||navigator.pointerEnabled)&&(n.mspointer=!0),navigator.getGamepads&&(n.gamepads=!0),"onwheel"in window||s.ie&&"WheelEvent"in window?n.wheelEvent="wheel":"onmousewheel"in window?n.wheelEvent="mousewheel":s.firefox&&"MouseScrollEvent"in window&&(n.wheelEvent="DOMMouseScroll")),n)},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),n={h264:!1,hls:!1,mp4:!1,m4v:!1,ogg:!1,vp9:!1,webm:!1,hasRequestVideoFrame:!1};t.exports=function(){if("function"==typeof importScripts)return n;var t=document.createElement("video"),e=!!t.canPlayType,i=/^no$/;try{e&&(t.canPlayType('video/ogg; codecs="theora"').replace(i,"")&&(n.ogg=!0),t.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(i,"")&&(n.h264=!0,n.mp4=!0),t.canPlayType("video/x-m4v").replace(i,"")&&(n.m4v=!0),t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(i,"")&&(n.webm=!0),t.canPlayType('video/webm; codecs="vp9"').replace(i,"")&&(n.vp9=!0),t.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(i,"")&&(n.hls=!0))}catch(t){}return t.parentNode&&t.parentNode.removeChild(t),n.getVideoURL=function(t){Array.isArray(t)||(t=[t]);for(var e=0;e{t.exports={os:i(25892),browser:i(84148),features:i(89357),input:i(31784),audio:i(7098),video:i(43267),fullscreen:i(91639),canvasFeatures:i(89289)}},89422:(t,e,i)=>{var s=i(83419),n=new Float32Array(20),r=new s({initialize:function(){this._matrix=new Float32Array(20),this.alpha=1,this._dirty=!0,this._data=new Float32Array(20),this.reset()},set:function(t){return this._matrix.set(t),this._dirty=!0,this},reset:function(){var t=this._matrix;return t.fill(0),t[0]=1,t[6]=1,t[12]=1,t[18]=1,this.alpha=1,this._dirty=!0,this},getData:function(){var t=this._data;return this._dirty&&(t.set(this._matrix),t[4]/=255,t[9]/=255,t[14]/=255,t[19]/=255,this._dirty=!1),t},brightness:function(t,e){void 0===t&&(t=0),void 0===e&&(e=!1);var i=t;return this.multiply([i,0,0,0,0,0,i,0,0,0,0,0,i,0,0,0,0,0,1,0],e)},saturate:function(t,e){void 0===t&&(t=0),void 0===e&&(e=!1);var i=2*t/3+1,s=-.5*(i-1);return this.multiply([i,s,s,0,0,s,i,s,0,0,s,s,i,0,0,0,0,0,1,0],e)},desaturate:function(t){return void 0===t&&(t=!1),this.saturate(-1,t)},hue:function(t,e){void 0===t&&(t=0),void 0===e&&(e=!1),t=t/180*Math.PI;var i=Math.cos(t),s=Math.sin(t),n=.213,r=.715,o=.072;return this.multiply([n+.787*i+s*-n,r+i*-r+s*-r,o+i*-o+.928*s,0,0,n+i*-n+.143*s,r+i*(1-r)+.14*s,o+i*-o+-.283*s,0,0,n+i*-n+-.787*s,r+i*-r+s*r,o+.928*i+s*o,0,0,0,0,0,1,0],e)},grayscale:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=!1),this.saturate(-t,e)},blackWhite:function(t){return void 0===t&&(t=!1),this.multiply(r.BLACK_WHITE,t)},contrast:function(t,e){void 0===t&&(t=0),void 0===e&&(e=!1);var i=t+1,s=-.5*(i-1);return this.multiply([i,0,0,0,s,0,i,0,0,s,0,0,i,0,s,0,0,0,1,0],e)},negative:function(t){return void 0===t&&(t=!1),this.multiply(r.NEGATIVE,t)},desaturateLuminance:function(t){return void 0===t&&(t=!1),this.multiply(r.DESATURATE_LUMINANCE,t)},sepia:function(t){return void 0===t&&(t=!1),this.multiply(r.SEPIA,t)},night:function(t,e){return void 0===t&&(t=.1),void 0===e&&(e=!1),this.multiply([-2*t,-t,0,0,0,-t,0,t,0,0,0,t,2*t,0,0,0,0,0,1,0],e)},lsd:function(t){return void 0===t&&(t=!1),this.multiply(r.LSD,t)},brown:function(t){return void 0===t&&(t=!1),this.multiply(r.BROWN,t)},vintagePinhole:function(t){return void 0===t&&(t=!1),this.multiply(r.VINTAGE,t)},kodachrome:function(t){return void 0===t&&(t=!1),this.multiply(r.KODACHROME,t)},technicolor:function(t){return void 0===t&&(t=!1),this.multiply(r.TECHNICOLOR,t)},polaroid:function(t){return void 0===t&&(t=!1),this.multiply(r.POLAROID,t)},shiftToBGR:function(t){return void 0===t&&(t=!1),this.multiply(r.SHIFT_BGR,t)},multiply:function(t,e){void 0===e&&(e=!1),e||this.reset();var i=this._matrix,s=n;return s.set(i),i.set([s[0]*t[0]+s[1]*t[5]+s[2]*t[10]+s[3]*t[15],s[0]*t[1]+s[1]*t[6]+s[2]*t[11]+s[3]*t[16],s[0]*t[2]+s[1]*t[7]+s[2]*t[12]+s[3]*t[17],s[0]*t[3]+s[1]*t[8]+s[2]*t[13]+s[3]*t[18],s[0]*t[4]+s[1]*t[9]+s[2]*t[14]+s[3]*t[19]+s[4],s[5]*t[0]+s[6]*t[5]+s[7]*t[10]+s[8]*t[15],s[5]*t[1]+s[6]*t[6]+s[7]*t[11]+s[8]*t[16],s[5]*t[2]+s[6]*t[7]+s[7]*t[12]+s[8]*t[17],s[5]*t[3]+s[6]*t[8]+s[7]*t[13]+s[8]*t[18],s[5]*t[4]+s[6]*t[9]+s[7]*t[14]+s[8]*t[19]+s[9],s[10]*t[0]+s[11]*t[5]+s[12]*t[10]+s[13]*t[15],s[10]*t[1]+s[11]*t[6]+s[12]*t[11]+s[13]*t[16],s[10]*t[2]+s[11]*t[7]+s[12]*t[12]+s[13]*t[17],s[10]*t[3]+s[11]*t[8]+s[12]*t[13]+s[13]*t[18],s[10]*t[4]+s[11]*t[9]+s[12]*t[14]+s[13]*t[19]+s[14],s[15]*t[0]+s[16]*t[5]+s[17]*t[10]+s[18]*t[15],s[15]*t[1]+s[16]*t[6]+s[17]*t[11]+s[18]*t[16],s[15]*t[2]+s[16]*t[7]+s[17]*t[12]+s[18]*t[17],s[15]*t[3]+s[16]*t[8]+s[17]*t[13]+s[18]*t[18],s[15]*t[4]+s[16]*t[9]+s[17]*t[14]+s[18]*t[19]+s[19]]),this._dirty=!0,this}});r.BLACK_WHITE=[.3,.6,.1,0,0,.3,.6,.1,0,0,.3,.6,.1,0,0,0,0,0,1,0],r.NEGATIVE=[-1,0,0,1,0,0,-1,0,1,0,0,0,-1,1,0,0,0,0,1,0],r.DESATURATE_LUMINANCE=[.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0],r.SEPIA=[.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0],r.LSD=[2,-.4,.5,0,0,-.5,2,-.4,0,0,-.4,-.5,3,0,0,0,0,0,1,0],r.BROWN=[.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0],r.VINTAGE=[.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0],r.KODACHROME=[1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0],r.TECHNICOLOR=[1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0],r.POLAROID=[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0],r.SHIFT_BGR=[0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0],t.exports=r},51767:(t,e,i)=>{var s=i(83419),n=i(29747),r=new s({initialize:function(t,e,i){this._rgb=[0,0,0],this.onChangeCallback=n,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=r},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),n=i(35893),r=i(86327),o=i(88417);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),r(t,s(e)+a),t}},46768:(t,e,i)=>{var s=i(62235),n=i(26541),r=i(86327),o=i(385);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)-i),r(t,s(e)+a),t}},35827:(t,e,i)=>{var s=i(62235),n=i(54380),r=i(86327),o=i(40136);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),r(t,s(e)+a),t}},46871:(t,e,i)=>{var s=i(66786),n=i(35893),r=i(7702);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),s(t,n(e)+i,r(e)+o),t}},5198:(t,e,i)=>{var s=i(7702),n=i(26541),r=i(20786),o=i(385);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)-i),r(t,s(e)+a),t}},11879:(t,e,i)=>{var s=i(60461),n=[];n[s.BOTTOM_CENTER]=i(54312),n[s.BOTTOM_LEFT]=i(46768),n[s.BOTTOM_RIGHT]=i(35827),n[s.CENTER]=i(46871),n[s.LEFT_CENTER]=i(5198),n[s.RIGHT_CENTER]=i(80503),n[s.TOP_CENTER]=i(89698),n[s.TOP_LEFT]=i(922),n[s.TOP_RIGHT]=i(21373),n[s.LEFT_BOTTOM]=n[s.BOTTOM_LEFT],n[s.LEFT_TOP]=n[s.TOP_LEFT],n[s.RIGHT_BOTTOM]=n[s.BOTTOM_RIGHT],n[s.RIGHT_TOP]=n[s.TOP_RIGHT];t.exports=function(t,e,i,s,r){return n[i](t,e,s,r)}},80503:(t,e,i)=>{var s=i(7702),n=i(54380),r=i(20786),o=i(40136);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),r(t,s(e)+a),t}},89698:(t,e,i)=>{var s=i(35893),n=i(17717),r=i(88417),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,s(e)+i),o(t,n(e)-a),t}},922:(t,e,i)=>{var s=i(26541),n=i(17717),r=i(385),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,s(e)-i),o(t,n(e)-a),t}},21373:(t,e,i)=>{var s=i(54380),n=i(17717),r=i(40136),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,s(e)+i),o(t,n(e)-a),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),n=i(79291),r={In:i(91660),To:i(16694)};r=n(!1,r,s),t.exports=r},21578:(t,e,i)=>{var s=i(62235),n=i(35893),r=i(88417),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,n(e)+i),o(t,s(e)+a),t}},10210:(t,e,i)=>{var s=i(62235),n=i(26541),r=i(385),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,n(e)-i),o(t,s(e)+a),t}},82341:(t,e,i)=>{var s=i(62235),n=i(54380),r=i(40136),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,n(e)+i),o(t,s(e)+a),t}},87958:(t,e,i)=>{var s=i(62235),n=i(26541),r=i(86327),o=i(40136);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)-i),r(t,s(e)+a),t}},40080:(t,e,i)=>{var s=i(7702),n=i(26541),r=i(20786),o=i(40136);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)-i),r(t,s(e)+a),t}},88466:(t,e,i)=>{var s=i(26541),n=i(17717),r=i(40136),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,s(e)-i),o(t,n(e)-a),t}},38829:(t,e,i)=>{var s=i(60461),n=[];n[s.BOTTOM_CENTER]=i(21578),n[s.BOTTOM_LEFT]=i(10210),n[s.BOTTOM_RIGHT]=i(82341),n[s.LEFT_BOTTOM]=i(87958),n[s.LEFT_CENTER]=i(40080),n[s.LEFT_TOP]=i(88466),n[s.RIGHT_BOTTOM]=i(19211),n[s.RIGHT_CENTER]=i(34609),n[s.RIGHT_TOP]=i(48741),n[s.TOP_CENTER]=i(49440),n[s.TOP_LEFT]=i(81288),n[s.TOP_RIGHT]=i(61323);t.exports=function(t,e,i,s,r){return n[i](t,e,s,r)}},19211:(t,e,i)=>{var s=i(62235),n=i(54380),r=i(86327),o=i(385);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),r(t,s(e)+a),t}},34609:(t,e,i)=>{var s=i(7702),n=i(54380),r=i(20786),o=i(385);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),r(t,s(e)+a),t}},48741:(t,e,i)=>{var s=i(54380),n=i(17717),r=i(385),o=i(66737);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),r(t,s(e)+i),o(t,n(e)-a),t}},49440:(t,e,i)=>{var s=i(35893),n=i(17717),r=i(86327),o=i(88417);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,s(e)+i),r(t,n(e)-a),t}},81288:(t,e,i)=>{var s=i(26541),n=i(17717),r=i(86327),o=i(385);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,s(e)-i),r(t,n(e)-a),t}},61323:(t,e,i)=>{var s=i(54380),n=i(17717),r=i(86327),o=i(40136);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,s(e)+i),r(t,n(e)-a),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),n=i(20786);t.exports=function(t,e,i){return s(t,e),n(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),n=i(26541),r=i(54380),o=i(17717),a=i(87841);t.exports=function(t,e){void 0===e&&(e=new a);var i=n(t),h=o(t);return e.x=i,e.y=h,e.width=r(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,n,r,o=i(8054),a=i(68703),h=[],l=!1;t.exports=(r=function(){var t=0;return h.forEach((function(e){e.parent&&t++})),t},{create2D:function(t,e,i){return s(t,e,i,o.CANVAS)},create:s=function(t,e,i,s,r){var u;void 0===e&&(e=1),void 0===i&&(i=1),void 0===s&&(s=o.CANVAS),void 0===r&&(r=!1);var c=n(s);return null===c?(c={parent:t,canvas:document.createElement("canvas"),type:s},s===o.CANVAS&&h.push(c),u=c.canvas):(c.parent=t,u=c.canvas),r&&(c.parent=u),u.width=e,u.height=i,l&&s===o.CANVAS&&a.disable(u.getContext("2d",{willReadFrequently:!1})),u},createWebGL:function(t,e,i){return s(t,e,i,o.WEBGL)},disableSmoothing:function(){l=!0},enableSmoothing:function(){l=!1},first:n=function(t){if(void 0===t&&(t=o.CANVAS),t===o.WEBGL)return null;for(var e=0;e{var e,i="";t.exports={disable:function(t){return""===i&&(i=e(t)),i&&(t[i]=!1),t},enable:function(t){return""===i&&(i=e(t)),i&&(t[i]=!0),t},getPrefix:e=function(t){for(var e=["i","webkitI","msI","mozI","oI"],i=0;i{t.exports=function(t,e){return void 0===e&&(e="none"),t.style.msTouchAction=e,t.style["ms-touch-action"]=e,t.style["touch-action"]=e,t}},91610:t=>{t.exports=function(t,e){void 0===e&&(e="none");return["-webkit-","-khtml-","-moz-","-ms-",""].forEach((function(i){t.style[i+"user-select"]=e})),t.style["-webkit-touch-callout"]=e,t.style["-webkit-tap-highlight-color"]="rgba(0, 0, 0, 0)",t}},26253:(t,e,i)=>{t.exports={CanvasInterpolation:i(20623),CanvasPool:i(27919),Smoothing:i(68703),TouchAction:i(65208),UserSelect:i(91610)}},40987:(t,e,i)=>{var s=i(83419),n=i(37589),r=i(1e3),o=i(7537),a=i(87837),h=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=255),this.r=0,this.g=0,this.b=0,this.a=255,this._h=0,this._s=0,this._v=0,this._locked=!1,this.gl=[0,0,0,1],this._color=0,this._color32=0,this._rgba="",this.setTo(t,e,i,s)},transparent:function(){return this._locked=!0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this._locked=!1,this.update(!0)},setTo:function(t,e,i,s,n){return void 0===s&&(s=255),void 0===n&&(n=!0),this._locked=!0,this.red=t,this.green=e,this.blue=i,this.alpha=s,this._locked=!1,this.update(n)},setGLTo:function(t,e,i,s){return void 0===s&&(s=1),this._locked=!0,this.redGL=t,this.greenGL=e,this.blueGL=i,this.alphaGL=s,this._locked=!1,this.update(!0)},setFromRGB:function(t){return this._locked=!0,this.red=t.r,this.green=t.g,this.blue=t.b,t.hasOwnProperty("a")&&(this.alpha=t.a),this._locked=!1,this.update(!0)},setFromHSV:function(t,e,i){return o(t,e,i,this)},update:function(t){if(void 0===t&&(t=!1),this._locked)return this;var e=this.r,i=this.g,s=this.b,o=this.a;return this._color=n(e,i,s),this._color32=r(e,i,s,o),this._rgba="rgba("+e+","+i+","+s+","+o/255+")",t&&a(e,i,s,this),this},updateHSV:function(){var t=this.r,e=this.g,i=this.b;return a(t,e,i,this),this},clone:function(){return new h(this.r,this.g,this.b,this.a)},gray:function(t){return this.setTo(t,t,t)},random:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t)),s=Math.floor(t+Math.random()*(e-t)),n=Math.floor(t+Math.random()*(e-t));return this.setTo(i,s,n)},randomGray:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t));return this.setTo(i,i,i)},saturate:function(t){return this.s+=t/100,this},desaturate:function(t){return this.s-=t/100,this},lighten:function(t){return this.v+=t/100,this},darken:function(t){return this.v-=t/100,this},brighten:function(t){var e=this.r,i=this.g,s=this.b;return e=Math.max(0,Math.min(255,e-Math.round(-t/100*255))),i=Math.max(0,Math.min(255,i-Math.round(-t/100*255))),s=Math.max(0,Math.min(255,s-Math.round(-t/100*255))),this.setTo(e,i,s)},color:{get:function(){return this._color}},color32:{get:function(){return this._color32}},rgba:{get:function(){return this._rgba}},redGL:{get:function(){return this.gl[0]},set:function(t){this.gl[0]=Math.min(Math.abs(t),1),this.r=Math.floor(255*this.gl[0]),this.update(!0)}},greenGL:{get:function(){return this.gl[1]},set:function(t){this.gl[1]=Math.min(Math.abs(t),1),this.g=Math.floor(255*this.gl[1]),this.update(!0)}},blueGL:{get:function(){return this.gl[2]},set:function(t){this.gl[2]=Math.min(Math.abs(t),1),this.b=Math.floor(255*this.gl[2]),this.update(!0)}},alphaGL:{get:function(){return this.gl[3]},set:function(t){this.gl[3]=Math.min(Math.abs(t),1),this.a=Math.floor(255*this.gl[3]),this.update()}},red:{get:function(){return this.r},set:function(t){t=Math.floor(Math.abs(t)),this.r=Math.min(t,255),this.gl[0]=t/255,this.update(!0)}},green:{get:function(){return this.g},set:function(t){t=Math.floor(Math.abs(t)),this.g=Math.min(t,255),this.gl[1]=t/255,this.update(!0)}},blue:{get:function(){return this.b},set:function(t){t=Math.floor(Math.abs(t)),this.b=Math.min(t,255),this.gl[2]=t/255,this.update(!0)}},alpha:{get:function(){return this.a},set:function(t){t=Math.floor(Math.abs(t)),this.a=Math.min(t,255),this.gl[3]=t/255,this.update()}},h:{get:function(){return this._h},set:function(t){this._h=t,o(t,this._s,this._v,this)}},s:{get:function(){return this._s},set:function(t){this._s=t,o(this._h,t,this._v,this)}},v:{get:function(){return this._v},set:function(t){this._v=t,o(this._h,this._s,t,this)}}});t.exports=h},92728:(t,e,i)=>{var s=i(37589);t.exports=function(t){void 0===t&&(t=1024);var e,i=[],n=255,r=255,o=0,a=0;for(e=0;e<=n;e++)i.push({r:r,g:e,b:a,color:s(r,e,a)});for(o=255,e=n;e>=0;e--)i.push({r:e,g:o,b:a,color:s(e,o,a)});for(r=0,e=0;e<=n;e++,o--)i.push({r:r,g:o,b:e,color:s(r,o,e)});for(o=0,a=255,e=0;e<=n;e++,a--,r++)i.push({r:r,g:o,b:a,color:s(r,o,a)});if(1024===t)return i;var h=[],l=0,u=1024/t;for(e=0;e{t.exports=function(t){var e={r:t>>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),n=i(89528);t.exports=function(t,e,i){var r=i,o=i,a=i;if(0!==e){var h=i<.5?i*(1+e):i+e-i*e,l=2*i-h;r=n(l,h,t+1/3),o=n(l,h,t),a=n(l,h,t-1/3)}return(new s).setGLTo(r,o,a,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=[],n=0;n<=359;n++)i.push(s(n/359,t,e));return i}},7537:(t,e,i)=>{var s=i(37589);function n(t,e,i,s){var n=(t+6*e)%6,r=Math.min(n,4-n,1);return Math.round(255*(s-s*i*Math.max(0,r)))}t.exports=function(t,e,i,r){void 0===e&&(e=1),void 0===i&&(i=1);var o=n(5,t,e,i),a=n(3,t,e,i),h=n(1,t,e,i);return r?r.setTo?r.setTo(o,a,h,r.alpha,!0):(r.r=o,r.g=a,r.b=h,r.color=s(o,a,h),r):{r:o,g:a,b:h,color:s(o,a,h)}}},70238:(t,e,i)=>{var s=i(40987);t.exports=function(t){var 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 n=parseInt(i[1],16),r=parseInt(i[2],16),o=parseInt(i[3],16);e.setTo(n,r,o)}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),n=i(90664);t.exports=function(t){var e=n(t);return new s(e.r,e.g,e.b,e.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),n=i(37589),r=function(t,e,i,r,o,a,h,l){void 0===h&&(h=100),void 0===l&&(l=0);var u=l/h,c=s(t,r,u),d=s(e,o,u),f=s(i,a,u);return{r:c,g:d,b:f,a:255,color:n(c,d,f)}};t.exports={RGBWithRGB:r,ColorWithRGB:function(t,e,i,s,n,o){return void 0===n&&(n=100),void 0===o&&(o=0),r(t.r,t.g,t.b,e,i,s,n,o)},ColorWithColor:function(t,e,i,s){return void 0===i&&(i=100),void 0===s&&(s=0),r(t.r,t.g,t.b,e.r,e.g,e.b,i,s)}}},68957:(t,e,i)=>{var s=i(40987);t.exports=function(t){return new s(t.r,t.g,t.b,t.a)}},87388:(t,e,i)=>{var s=i(40987);t.exports=function(t){var e=new s,i=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?))?\s*\)$/.exec(t.toLowerCase());if(i){var n=parseInt(i[1],10),r=parseInt(i[2],10),o=parseInt(i[3],10),a=void 0!==i[4]?parseFloat(i[4]):1;e.setTo(n,r,o,255*a)}return e}},87837:t=>{t.exports=function(t,e,i,s){void 0===s&&(s={h:0,s:0,v:0}),t/=255,e/=255,i/=255;var n=Math.min(t,e,i),r=Math.max(t,e,i),o=r-n,a=0,h=0===r?0:o/r,l=r;return r!==n&&(r===t?a=(e-i)/o+(e{var s=i(62957);t.exports=function(t,e,i,n,r){return void 0===n&&(n=255),void 0===r&&(r="#"),"#"===r?"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1,7):"0x"+s(n)+s(t)+s(e)+s(i)}},85386:(t,e,i)=>{var s=i(30976),n=i(40987);t.exports=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=255),new n(s(t,e),s(t,e),s(t,e))}},80333:(t,e,i)=>{var s=i(70238),n=i(30100),r=i(68957),o=i(87388);t.exports=function(t){switch(typeof t){case"string":return"rgb"===t.substr(0,3).toLowerCase()?o(t):s(t);case"number":return n(t);case"object":return r(t)}}},3956:(t,e,i)=>{var s=i(40987);s.ColorSpectrum=i(92728),s.ColorToRGBA=i(91588),s.ComponentToHex=i(62957),s.GetColor=i(37589),s.GetColor32=i(1e3),s.HexStringToColor=i(70238),s.HSLToColor=i(62183),s.HSVColorWheel=i(27939),s.HSVToRGB=i(7537),s.HueToComponent=i(89528),s.IntegerToColor=i(30100),s.IntegerToRGB=i(90664),s.Interpolate=i(13699),s.ObjectToColor=i(68957),s.RandomRGB=i(85386),s.RGBStringToColor=i(87388),s.RGBToHSV=i(87837),s.RGBToString=i(75723),s.ValueToColor=i(80333),t.exports=s},27460:(t,e,i)=>{t.exports={Align:i(71926),BaseShader:i(73894),Bounds:i(58724),Canvas:i(26253),Color:i(3956),ColorMatrix:i(89422),Masks:i(69781),RGB:i(51767)}},6858:(t,e,i)=>{var s=i(83419),n=i(39429),r=new s({initialize:function(t,e,i,s,n,r){e||(e=t.sys.make.image({x:i,y:s,key:n,frame:r,add:!1})),this.bitmapMask=e,this.invertAlpha=!1,this.isStencil=!1},setBitmap:function(t){this.bitmapMask=t},preRenderWebGL:function(t,e,i){t.pipelines.BITMAPMASK_PIPELINE.beginMask(this,e,i)},postRenderWebGL:function(t,e,i){t.pipelines.BITMAPMASK_PIPELINE.endMask(this,e,i)},preRenderCanvas:function(){},postRenderCanvas:function(){},destroy:function(){this.bitmapMask=null}});n.register("bitmapMask",(function(t,e,i,s,n){return new r(this.scene,t,e,i,s,n)})),t.exports=r},80661:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e){this.geometryMask=e,this.invertAlpha=!1,this.isStencil=!0,this.level=0},setShape:function(t){return this.geometryMask=t,this},setInvertAlpha:function(t){return void 0===t&&(t=!0),this.invertAlpha=t,this},preRenderWebGL:function(t,e,i){var s=t.gl;t.flush(),0===t.maskStack.length&&(s.enable(s.STENCIL_TEST),s.clear(s.STENCIL_BUFFER_BIT),t.maskCount=0),t.currentCameraMask.mask!==this&&(t.currentMask.mask=this),t.maskStack.push({mask:this,camera:i}),this.applyStencil(t,i,!0),t.maskCount++},applyStencil:function(t,e,i){var s=t.gl,n=this.geometryMask,r=t.maskCount,o=255;s.colorMask(!1,!1,!1,!1),i?(s.stencilFunc(s.EQUAL,r,o),s.stencilOp(s.KEEP,s.KEEP,s.INCR),r++):(s.stencilFunc(s.EQUAL,r+1,o),s.stencilOp(s.KEEP,s.KEEP,s.DECR)),this.level=r,n.renderWebGL(t,n,e),t.flush(),s.colorMask(!0,!0,!0,!0),s.stencilOp(s.KEEP,s.KEEP,s.KEEP),this.invertAlpha?s.stencilFunc(s.NOTEQUAL,r,o):s.stencilFunc(s.EQUAL,r,o)},postRenderWebGL:function(t){var e=t.gl;t.maskStack.pop(),t.maskCount--,t.flush();var i=t.currentMask;if(0===t.maskStack.length)i.mask=null,e.disable(e.STENCIL_TEST);else{var s=t.maskStack[t.maskStack.length-1];s.mask.applyStencil(t,s.camera,!1),t.currentCameraMask.mask!==s.mask?(i.mask=s.mask,i.camera=s.camera):i.mask=null}},preRenderCanvas:function(t,e,i){var s=this.geometryMask;t.currentContext.save(),s.renderCanvas(t,s,i,null,null,!0),t.currentContext.clip()},postRenderCanvas:function(t){t.currentContext.restore()},destroy:function(){this.geometryMask=null}});t.exports=s},69781:(t,e,i)=>{t.exports={BitmapMask:i(6858),GeometryMask:i(80661)}},73894:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i,s){e&&""!==e||(e=["precision mediump float;","uniform vec2 resolution;","varying vec2 fragCoord;","void main () {"," vec2 uv = fragCoord / resolution.xy;"," gl_FragColor = vec4(uv.xyx, 1.0);","}"].join("\n")),i&&""!==i||(i=["precision mediump float;","uniform mat4 uProjectionMatrix;","uniform mat4 uViewMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","varying vec2 fragCoord;","varying vec2 outTexCoord;","void main () {"," gl_Position = uProjectionMatrix * uViewMatrix * vec4(inPosition, 1.0, 1.0);"," fragCoord = vec2(inPosition.x, uResolution.y - inPosition.y);"," outTexCoord = vec2(inPosition.x / uResolution.x, fragCoord.y / uResolution.y);","}"].join("\n")),void 0===s&&(s=null),this.key=t,this.fragmentSrc=e,this.vertexSrc=i,this.uniforms=s}});t.exports=s},40366:t=>{t.exports=function(t,e){var i;if(e)"string"==typeof e?i=document.getElementById(e):"object"==typeof e&&1===e.nodeType&&(i=e);else if(t.parentElement||null===e)return t;return i||(i=document.body),i.appendChild(t),t}},83719:(t,e,i)=>{var s=i(40366);t.exports=function(t){var e=t.config;if(e.parent&&e.domCreateContainer){var i=document.createElement("div");i.style.cssText=["display: block;","width: "+t.scale.width+"px;","height: "+t.scale.height+"px;","padding: 0; margin: 0;","position: absolute;","overflow: hidden;","pointer-events: "+e.domPointerEvents+";","transform: scale(1);","transform-origin: left top;"].join(" "),t.domContainer=i,s(i,e.parent)}}},57264:(t,e,i)=>{var s=i(25892);t.exports=function(t){if("complete"!==document.readyState&&"interactive"!==document.readyState){var e=function(){document.removeEventListener("deviceready",e,!0),document.removeEventListener("DOMContentLoaded",e,!0),window.removeEventListener("load",e,!0),t()};document.body?s.cordova?document.addEventListener("deviceready",e,!1):(document.addEventListener("DOMContentLoaded",e,!0),window.addEventListener("load",e,!0)):window.setTimeout(e,20)}else t()}},57811:t=>{t.exports=function(t){if(!t)return window.innerHeight;var e=Math.abs(window.orientation),i={w:0,h:0},s=document.createElement("div");return s.setAttribute("style","position: fixed; height: 100vh; width: 0; top: 0"),document.documentElement.appendChild(s),i.w=90===e?s.offsetHeight:window.innerWidth,i.h=90===e?window.innerWidth:s.offsetHeight,document.documentElement.removeChild(s),s=null,90!==Math.abs(window.orientation)?i.h:i.w}},45818:(t,e,i)=>{var s=i(13560);t.exports=function(t,e){var i=window.screen,n=!!i&&(i.orientation||i.mozOrientation||i.msOrientation);return n&&"string"==typeof n.type?n.type:"string"==typeof n?n:"number"==typeof window.orientation?0===window.orientation||180===window.orientation?s.ORIENTATION.PORTRAIT:s.ORIENTATION.LANDSCAPE:window.matchMedia?window.matchMedia("(orientation: portrait)").matches?s.ORIENTATION.PORTRAIT:window.matchMedia("(orientation: landscape)").matches?s.ORIENTATION.LANDSCAPE:void 0:e>t?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),n=i(29747),r=new s({initialize:function(){this.isRunning=!1,this.callback=n,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=n}});t.exports=r},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),n=i(50792),r=i(37277),o=new s({Extends:n,initialize:function(){n.call(this)},shutdown:function(){this.removeAllListeners()},destroy:function(){this.removeAllListeners()}});r.register("EventEmitter",o,"events"),t.exports=o},93055:(t,e,i)=>{t.exports={EventEmitter:i(47565)}},20122:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e){void 0===e&&(e=1),n.call(this,r.BARREL,t),this.amount=e}});t.exports=o},32251:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h){void 0===i&&(i=1),void 0===s&&(s=1),void 0===o&&(o=1),void 0===a&&(a=1),void 0===h&&(h=4),n.call(this,r.BLOOM,t),this.steps=h,this.offsetX=i,this.offsetY=s,this.blurStrength=o,this.strength=a,this.glcolor=[1,1,1],null!=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}}});t.exports=o},9047:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h){void 0===e&&(e=0),void 0===i&&(i=2),void 0===s&&(s=2),void 0===o&&(o=1),void 0===h&&(h=4),n.call(this,r.BLUR,t),this.quality=e,this.x=i,this.y=s,this.steps=h,this.strength=o,this.glcolor=[1,1,1],null!=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}}});t.exports=o},27885:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h,l){void 0===e&&(e=.5),void 0===i&&(i=1),void 0===s&&(s=.2),void 0===o&&(o=!1),void 0===a&&(a=1),void 0===h&&(h=1),void 0===l&&(l=1),n.call(this,r.BOKEH,t),this.radius=e,this.amount=i,this.contrast=s,this.isTiltShift=o,this.strength=l,this.blurX=a,this.blurY=h}});t.exports=o},12578:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a){void 0===e&&(e=8),void 0===o&&(o=1),void 0===a&&(a=.005),n.call(this,r.CIRCLE,t),this.scale=o,this.feather=a,this.thickness=e,this.glcolor=[1,.2,.7],this.glcolor2=[1,0,0,.4],null!=i&&(this.color=i),null!=s&&(this.backgroundColor=s)},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}},backgroundColor:{get:function(){var t=this.glcolor2;return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)},set:function(t){var e=this.glcolor2;e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255}},backgroundAlpha:{get:function(){return this.glcolor2[3]},set:function(t){this.glcolor2[3]=t}}});t.exports=o},15802:(t,e,i)=>{var s=i(83419),n=i(89422),r=i(14811),o=new s({Extends:n,initialize:function(t){n.call(this),this.type=r.COLOR_MATRIX,this.gameObject=t,this.active=!0},destroy:function(){this.gameObject=null,this._matrix=null,this._data=null}});t.exports=o},72898:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e){this.type=t,this.gameObject=e,this.active=!0},setActive:function(t){return this.active=t,this},destroy:function(){this.gameObject=null,this.active=!1}});t.exports=s},44553:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s){void 0===e&&(e="__WHITE"),void 0===i&&(i=.005),void 0===s&&(s=.005),n.call(this,r.DISPLACEMENT,t),this.x=i,this.y=s,this.glTexture,this.setTexture(e)},setTexture:function(t){var e=this.gameObject.scene.sys.textures.getFrame(t);return e&&(this.glTexture=e.glTexture),this}});t.exports=o},68531:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o){void 0===i&&(i=4),void 0===s&&(s=0),void 0===o&&(o=!1),n.call(this,r.GLOW,t),this.outerStrength=i,this.innerStrength=s,this.knockout=o,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}}});t.exports=o},37102:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h,l,u){void 0===s&&(s=.2),void 0===o&&(o=0),void 0===a&&(a=0),void 0===h&&(h=0),void 0===l&&(l=1),void 0===u&&(u=0),n.call(this,r.GRADIENT,t),this.alpha=s,this.size=u,this.fromX=o,this.fromY=a,this.toX=h,this.toY=l,this.glcolor1=[255,0,0],this.glcolor2=[0,255,0],null!=e&&(this.color1=e),null!=i&&(this.color2=i)},color1:{get:function(){var t=this.glcolor1;return(t[0]<<16)+(t[1]<<8)+(0|t[2])},set:function(t){var e=this.glcolor1;e[0]=t>>16&255,e[1]=t>>8&255,e[2]=255&t}},color2:{get:function(){var t=this.glcolor2;return(t[0]<<16)+(t[1]<<8)+(0|t[2])},set:function(t){var e=this.glcolor2;e[0]=t>>16&255,e[1]=t>>8&255,e[2]=255&t}}});t.exports=o},86886:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e){void 0===e&&(e=1),n.call(this,r.PIXELATE,t),this.amount=e}});t.exports=o},92322:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h,l){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=.1),void 0===o&&(o=1),void 0===h&&(h=6),void 0===l&&(l=1),n.call(this,r.SHADOW,t),this.x=e,this.y=i,this.decay=s,this.power=o,this.glcolor=[0,0,0,1],this.samples=h,this.intensity=l,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}}});t.exports=o},39563:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o){void 0===e&&(e=.5),void 0===i&&(i=.5),void 0===s&&(s=3),void 0===o&&(o=!1),n.call(this,r.SHINE,t),this.speed=e,this.lineWidth=i,this.gradient=s,this.reveal=o}});t.exports=o},56448:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o){void 0===e&&(e=.5),void 0===i&&(i=.5),void 0===s&&(s=.5),void 0===o&&(o=.5),n.call(this,r.VIGNETTE,t),this.x=e,this.y=i,this.radius=s,this.strength=o}});t.exports=o},38433:(t,e,i)=>{var s=i(83419),n=i(72898),r=i(14811),o=new s({Extends:n,initialize:function(t,e,i,s,o){void 0===e&&(e=.1),void 0===i&&(i=0),void 0===s&&(s=0),void 0===o&&(o=!1),n.call(this,r.WIPE,t),this.progress=0,this.wipeWidth=e,this.direction=i,this.axis=s,this.reveal=o}});t.exports=o},14811:t=>{t.exports={GLOW:4,SHADOW:5,PIXELATE:6,VIGNETTE:7,SHINE:8,BLUR:9,GRADIENT:12,BLOOM:13,COLOR_MATRIX:14,CIRCLE:15,BARREL:16,DISPLACEMENT:17,WIPE:18,BOKEH:19}},66064:(t,e,i)=>{var s=i(79291),n=i(14811),r={Barrel:i(20122),Controller:i(72898),Bloom:i(32251),Blur:i(9047),Bokeh:i(27885),Circle:i(12578),ColorMatrix:i(15802),Displacement:i(44553),Glow:i(68531),Gradient:i(37102),Pixelate:i(86886),Shadow:i(92322),Shine:i(39563),Vignette:i(56448),Wipe:i(38433)};r=s(!1,r,n),t.exports=r},25305:(t,e,i)=>{var s=i(10312),n=i(23568);t.exports=function(t,e,i){e.x=n(i,"x",0),e.y=n(i,"y",0),e.depth=n(i,"depth",0),e.flipX=n(i,"flipX",!1),e.flipY=n(i,"flipY",!1);var r=n(i,"scale",null);"number"==typeof r?e.setScale(r):null!==r&&(e.scaleX=n(r,"x",1),e.scaleY=n(r,"y",1));var o=n(i,"scrollFactor",null);"number"==typeof o?e.setScrollFactor(o):null!==o&&(e.scrollFactorX=n(o,"x",1),e.scrollFactorY=n(o,"y",1)),e.rotation=n(i,"rotation",0);var a=n(i,"angle",null);null!==a&&(e.angle=a),e.alpha=n(i,"alpha",1);var h=n(i,"origin",null);if("number"==typeof h)e.setOrigin(h);else if(null!==h){var l=n(h,"x",.5),u=n(h,"y",.5);e.setOrigin(l,u)}return e.blendMode=n(i,"blendMode",s.NORMAL),e.visible=n(i,"visible",!0),n(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 n=t.anims,r=s(i,"key",void 0);if(r){var o=s(i,"startFrame",void 0),a=s(i,"delay",0),h=s(i,"repeat",0),l=s(i,"repeatDelay",0),u=s(i,"yoyo",!1),c=s(i,"play",!1),d=s(i,"delayedPlay",0),f={key:r,delay:a,repeat:h,repeatDelay:l,yoyo:u,startFrame:o};c?n.play(f):d>0?n.playAfterDelay(f,d):n.load(f)}}return t}},8050:(t,e,i)=>{var s=i(83419),n=i(73162),r=i(37277),o=i(51708),a=i(44594),h=i(19186),l=new s({Extends:n,initialize:function(t){n.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(a.BOOT,this.boot,this),this.events.on(a.START,this.start,this)},boot:function(){this.events.once(a.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(o.ADDED_TO_SCENE,t,this.scene),this.events.emit(a.ADDED_TO_SCENE,t,this.scene))},removeChildCallback:function(t){this.queueDepthSort(),t.displayList=null,t.emit(o.REMOVED_FROM_SCENE,t,this.scene),this.events.emit(a.REMOVED_FROM_SCENE,t,this.scene)},start:function(){this.events.once(a.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(a.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(a.START,this.start,this),this.scene=null,this.systems=null,this.events=null}});r.register("DisplayList",l,"displayList"),t.exports=l},95643:(t,e,i)=>{var s=i(83419),n=i(53774),r=i(45893),o=i(50792),a=i(51708),h=i(44594),l=new s({Extends:o,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.input=null,this.body=null,this.ignoreDestroy=!1,this.on(a.ADDED_TO_SCENE,this.addedToScene,this),this.on(a.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 r(this)),this},setData:function(t,e){return this.data||(this.data=new r(this)),this.data.set(t,e),this},incData:function(t,e){return this.data||(this.data=new r(this)),this.data.inc(t,e),this},toggleData:function(t){return this.data||(this.data=new r(this)),this.data.toggle(t),this},getData:function(t){return this.data||(this.data=new r(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))||l.RENDER_MASK!==this.renderFlags||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 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(a.ADDED_TO_SCENE,this,this.scene),t.events.emit(h.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(a.REMOVED_FROM_SCENE,this,this.scene),t.events.emit(h.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.preDestroy&&this.preDestroy.call(this),this.emit(a.DESTROY,this,t),this.removeAllListeners(),this.postPipelines&&this.resetPostPipeline(!0),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.preFX&&(this.preFX.destroy(),this.preFX=void 0),this.postFX&&(this.postFX.destroy(),this.postFX=void 0),this.active=!1,this.visible=!1,this.scene=void 0,this.parentContainer=void 0)}});l.RENDER_MASK=15,t.exports=l},44603:(t,e,i)=>{var s=i(83419),n=i(37277),r=i(44594),o=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.events=t.sys.events,this.displayList,this.updateList,this.events.once(r.BOOT,this.boot,this),this.events.on(r.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.events.once(r.DESTROY,this.destroy,this)},start:function(){this.events.once(r.SHUTDOWN,this.shutdown,this)},shutdown:function(){this.events.off(r.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(r.START,this.start,this),this.scene=null,this.systems=null,this.events=null,this.displayList=null,this.updateList=null}});o.register=function(t,e){o.prototype.hasOwnProperty(t)||(o.prototype[t]=e)},o.remove=function(t){o.prototype.hasOwnProperty(t)&&delete o.prototype[t]},n.register("GameObjectCreator",o,"make"),t.exports=o},39429:(t,e,i)=>{var s=i(83419),n=i(37277),r=i(44594),o=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.events=t.sys.events,this.displayList,this.updateList,this.events.once(r.BOOT,this.boot,this),this.events.on(r.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.events.once(r.DESTROY,this.destroy,this)},start:function(){this.events.once(r.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(r.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(r.START,this.start,this),this.scene=null,this.systems=null,this.events=null,this.displayList=null,this.updateList=null}});o.register=function(t,e){o.prototype.hasOwnProperty(t)||(o.prototype[t]=e)},o.remove=function(t){o.prototype.hasOwnProperty(t)&&delete o.prototype[t]},n.register("GameObjectFactory",o,"add"),t.exports=o},91296:(t,e,i)=>{var s=i(61340),n=new s,r=new s,o=new s,a={camera:n,sprite:r,calc:o};t.exports=function(t,e,i){var s=n,h=r,l=o;return h.applyITRS(t.x,t.y,t.rotation,t.scaleX,t.scaleY),s.copyFrom(e.matrix),i?(s.multiplyWithOffset(i,-e.scrollX*t.scrollFactorX,-e.scrollY*t.scrollFactorY),h.e=t.x,h.f=t.y):(h.e-=e.scrollX*t.scrollFactorX,h.f-=e.scrollY*t.scrollFactorY),s.multiply(h,l),a}},45027:(t,e,i)=>{var s=i(83419),n=i(25774),r=i(37277),o=i(44594),a=new s({Extends:n,initialize:function(t){n.call(this),this.checkQueue=!0,this.scene=t,this.systems=t.sys,t.sys.events.once(o.BOOT,this.boot,this),t.sys.events.on(o.START,this.start,this)},boot:function(){this.systems.events.once(o.DESTROY,this.destroy,this)},start:function(){var t=this.systems.events;t.on(o.PRE_UPDATE,this.update,this),t.on(o.UPDATE,this.sceneUpdate,this),t.once(o.SHUTDOWN,this.shutdown,this)},sceneUpdate:function(t,e){for(var i=this._active,s=i.length,n=0;n{t.exports=function(t,e,i,s,n,r,o,a,h,l,u,c,d,f,p){var v=i.x-e.displayOriginX+n,g=i.y-e.displayOriginY+r,m=v+i.w,y=g+i.h,x=o.a,T=o.b,w=o.c,b=o.d,S=o.e,E=o.f,A=v*x+g*w+S,C=v*T+g*b+E,_=v*x+y*w+S,M=v*T+y*b+E,P=m*x+y*w+S,R=m*T+y*b+E,L=m*x+g*w+S,O=m*T+g*b+E;a&&(A=Math.round(A),C=Math.round(C),_=Math.round(_),M=Math.round(M),P=Math.round(P),R=Math.round(R),L=Math.round(L),O=Math.round(O)),t.batchQuad(e,A,C,_,M,P,R,L,O,s.u0,s.v0,s.u1,s.v1,h,l,u,c,d,f,p)}},53048:t=>{t.exports=function(t,e,i,s){if(void 0===i&&(i=!1),void 0===s)return s={local:{x:0,y:0,width:0,height:0},global:{x:0,y:0,width:0,height:0},lines:{shortest:0,longest:0,lengths:null,height:0},wrappedText:"",words:[],characters:[],scaleX:0,scaleY:0};var n,r,o,a=t.text,h=a.length,l=t.maxWidth,u=t.wordWrapCharCode,c=Number.MAX_VALUE,d=Number.MAX_VALUE,f=0,p=0,v=t.fontData.chars,g=t.fontData.lineHeight,m=t.letterSpacing,y=t.lineSpacing,x=0,T=0,w=0,b=null,S=t._align,E=0,A=0,C=t.fontSize/t.fontData.size,_=C*t.scaleX,M=C*t.scaleY,P=null,R=0,L=[],O=Number.MAX_VALUE,F=0,D=0,I=0,k=[],B=[],N=null,U=function(t,e){for(var i=0,s=0;s0){o=a.split("\n");var X=[];for(n=0;nE&&(c=E),d>A&&(d=A);var q=E+b.xAdvance,K=A+g;fF&&(F=I),IF&&(F=I),I0)for(var J=0;J{var s=i(21859);t.exports=function(t,e,i,n,r,o,a){var h=t.sys.textures.get(i),l=h.get(n),u=t.sys.cache.xml.get(r);if(l&&u){var c=s(u,l,o,a,h);return t.sys.cache.bitmapFont.add(e,{data:c,texture:i,frame:n,fromAtlas:!0}),!0}return!1}},6925:(t,e,i)=>{var s=i(35154);t.exports=function(t,e){var i=e.width,n=e.height,r=Math.floor(i/2),o=Math.floor(n/2),a=s(e,"chars","");if(""!==a){var h=s(e,"image",""),l=t.sys.textures.getFrame(h),u=l.cutX,c=l.cutY,d=l.source.width,f=l.source.height,p=s(e,"offset.x",0),v=s(e,"offset.y",0),g=s(e,"spacing.x",0),m=s(e,"spacing.y",0),y=s(e,"lineSpacing",0),x=s(e,"charsPerRow",null);null===x&&(x=d/i)>a.length&&(x=a.length);for(var T=p,w=v,b={retroFont:!0,font:h,size:i,lineHeight:n+y,chars:{}},S=0,E=0;E{function e(t,e){return parseInt(t.getAttribute(e),10)}t.exports=function(t,i,s,n,r){void 0===s&&(s=0),void 0===n&&(n=0);var o=i.cutX,a=i.cutY,h=i.source.width,l=i.source.height,u=i.sourceIndex,c={},d=t.getElementsByTagName("info")[0],f=t.getElementsByTagName("common")[0];c.font=d.getAttribute("face"),c.size=e(d,"size"),c.lineHeight=e(f,"lineHeight")+n,c.chars={};var p=t.getElementsByTagName("char"),v=void 0!==i&&i.trimmed;if(v)var g=i.height,m=i.width;for(var y=0;y{var s=i(87662),n=i(79291),r={Parse:i(6925)};r=n(!1,r,s),t.exports=r},87662:t=>{t.exports={TEXT_SET1:" !\"#$%&'()*+,-./0123456789:;<=>?@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),n=i(83419),r=i(12310),o=new n({Extends:s,Mixins:[r],initialize:function(t,e,i,n,r,o,a){s.call(this,t,e,i,n,r,o,a),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=o},86741:(t,e,i)=>{var s=i(20926);t.exports=function(t,e,i,n){var r=e._text,o=r.length,a=t.currentContext;if(0!==o&&s(t,a,e,i,n)){i.addToRenderList(e);var h=e.fromAtlas?e.frame:e.texture.frames.__BASE,l=e.displayCallback,u=e.callbackData,c=e.fontData.chars,d=e.fontData.lineHeight,f=e._letterSpacing,p=0,v=0,g=0,m=null,y=0,x=0,T=0,w=0,b=0,S=0,E=null,A=0,C=e.frame.source.image,_=h.cutX,M=h.cutY,P=0,R=0,L=e._fontSize/e.fontData.size,O=e._align,F=0,D=0;e.getTextBounds(!1);var I=e._bounds.lines;1===O?D=(I.longest-I.lengths[0])/2:2===O&&(D=I.longest-I.lengths[0]),a.translate(-e.displayOriginX,-e.displayOriginY);var k=i.roundPixels;e.cropWidth>0&&e.cropHeight>0&&(a.beginPath(),a.rect(0,0,e.cropWidth,e.cropHeight),a.clip());for(var B=0;B{var s=i(2638),n=i(25305),r=i(44603),o=i(23568);r.register("dynamicBitmapText",(function(t,e){void 0===t&&(t={});var i=o(t,"font",""),r=o(t,"text",""),a=o(t,"size",!1),h=new s(this.scene,0,0,i,r,a);return void 0!==e&&(t.add=e),n(this.scene,h,t),h}))},72566:(t,e,i)=>{var s=i(2638);i(39429).register("dynamicBitmapText",(function(t,e,i,n,r){return this.displayList.add(new s(this.scene,t,e,i,n,r))}))},12310:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(73482),r=i(86741),t.exports={renderWebGL:n,renderCanvas:r}},73482:(t,e,i)=>{var s=i(91296),n=i(61340),r=i(70554),o=new n;t.exports=function(t,e,i,n){var a=e.text,h=a.length;if(0!==h){i.addToRenderList(e);var l=t.pipelines.set(e.pipeline,e),u=s(e,i,n);t.pipelines.preBatch(e);var c=u.sprite,d=u.calc,f=o,p=e.cropWidth>0||e.cropHeight>0;p&&(l.flush(),t.pushScissor(d.tx,d.ty,e.cropWidth*d.scaleX,e.cropHeight*d.scaleY));var v,g,m=e.frame.glTexture,y=e.tintFill,x=r.getTintAppendFloatAlpha(e.tintTopLeft,i.alpha*e._alphaTL),T=r.getTintAppendFloatAlpha(e.tintTopRight,i.alpha*e._alphaTR),w=r.getTintAppendFloatAlpha(e.tintBottomLeft,i.alpha*e._alphaBL),b=r.getTintAppendFloatAlpha(e.tintBottomRight,i.alpha*e._alphaBR),S=l.setGameObject(e),E=0,A=0,C=0,_=0,M=e.letterSpacing,P=0,R=0,L=e.scrollX,O=e.scrollY,F=e.fontData,D=F.chars,I=F.lineHeight,k=e.fontSize/F.size,B=0,N=e._align,U=0,X=0,Y=e.getTextBounds(!1);e.maxWidth>0&&(h=(a=Y.wrappedText).length);var z=e._bounds.lines;1===N?X=(z.longest-z.lengths[0])/2:2===N&&(X=z.longest-z.lengths[0]);for(var G=i.roundPixels,V=e.displayCallback,W=e.callbackData,H=0;H{var s=i(83419),n=i(45319),r=i(31401),o=i(95643),a=i(53048),h=i(61327),l=i(21859),u=i(87841),c=i(18658),d=new s({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.PostPipeline,r.ScrollFactor,r.Texture,r.Tint,r.Transform,r.Visible,c],initialize:function(t,e,i,s,n,r,h){void 0===n&&(n=""),void 0===h&&(h=0),o.call(this,t,"BitmapText"),this.font=s;var l=this.scene.sys.cache.bitmapFont.get(s);if(!l)throw new Error("Invalid BitmapText key: "+s);this.fontData=l.data,this._text="",this._fontSize=r||this.fontData.size,this._letterSpacing=0,this._lineSpacing=0,this._align=h,this._bounds=a(),this._dirty=!0,this._maxWidth=0,this.wordWrapCharCode=32,this.charColors=[],this.dropShadowX=0,this.dropShadowY=0,this.dropShadowColor=0,this.dropShadowAlpha=.5,this.fromAtlas=l.fromAtlas,this.setTexture(l.texture,l.frame),this.setPosition(e,i),this.setOrigin(0,0),this.initPipeline(),this.initPostPipeline(),this.setText(n)},setLeftAlign:function(){return this._align=d.ALIGN_LEFT,this._dirty=!0,this},setCenterAlign:function(){return this._align=d.ALIGN_CENTER,this._dirty=!0,this},setRightAlign:function(){return this._align=d.ALIGN_RIGHT,this._dirty=!0,this},setFontSize:function(t){return this._fontSize=t,this._dirty=!0,this},setLetterSpacing:function(t){return void 0===t&&(t=0),this._letterSpacing=t,this._dirty=!0,this},setLineSpacing:function(t){return void 0===t&&(t=0),this.lineSpacing=t,this},setText:function(t){return t||0===t||(t=""),Array.isArray(t)&&(t=t.join("\n")),t!==this.text&&(this._text=t.toString(),this._dirty=!0,this.updateDisplayOrigin()),this},setDropShadow:function(t,e,i,s){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=.5),this.dropShadowX=t,this.dropShadowY=e,this.dropShadowColor=i,this.dropShadowAlpha=s,this},setCharacterTint:function(t,e,i,s,r,o,a){void 0===t&&(t=0),void 0===e&&(e=1),void 0===i&&(i=!1),void 0===s&&(s=-1),void 0===r&&(r=s,o=s,a=s);var h=this.text.length;-1===e&&(e=h),t<0&&(t=h+t),t=n(t,0,h-1);for(var l=n(t+e,t,h),u=this.charColors,c=t;c{var s=i(20926);t.exports=function(t,e,i,n){var r=e._text,o=r.length,a=t.currentContext;if(0!==o&&s(t,a,e,i,n)){i.addToRenderList(e);var h=e.fromAtlas?e.frame:e.texture.frames.__BASE,l=e.fontData.chars,u=e.fontData.lineHeight,c=e._letterSpacing,d=e._lineSpacing,f=0,p=0,v=0,g=null,m=0,y=0,x=0,T=0,w=0,b=0,S=null,E=0,A=h.source.image,C=h.cutX,_=h.cutY,M=e._fontSize/e.fontData.size,P=e._align,R=0,L=0,O=e.getTextBounds(!1);e.maxWidth>0&&(o=(r=O.wrappedText).length);var F=e._bounds.lines;1===P?L=(F.longest-F.lengths[0])/2:2===P&&(L=F.longest-F.lengths[0]),a.translate(-e.displayOriginX,-e.displayOriginY);for(var D=i.roundPixels,I=0;I{var s=i(22186),n=i(25305),r=i(44603),o=i(23568),a=i(35154);r.register("bitmapText",(function(t,e){void 0===t&&(t={});var i=a(t,"font",""),r=o(t,"text",""),h=o(t,"size",!1),l=a(t,"align",0),u=new s(this.scene,0,0,i,r,h,l);return void 0!==e&&(t.add=e),n(this.scene,u,t),u}))},34914:(t,e,i)=>{var s=i(22186);i(39429).register("bitmapText",(function(t,e,i,n,r,o){return this.displayList.add(new s(this.scene,t,e,i,n,r,o))}))},18658:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(33590),r=i(37289),t.exports={renderWebGL:n,renderCanvas:r}},33590:(t,e,i)=>{var s=i(3217),n=i(91296),r=i(70554);t.exports=function(t,e,i,o){if(0!==e._text.length){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline,e),h=n(e,i,o).calc;t.pipelines.preBatch(e);var l,u,c,d=i.roundPixels,f=i.alpha,p=e.charColors,v=e.tintFill,g=r.getTintAppendFloatAlpha,m=g(e.tintTopLeft,f*e._alphaTL),y=g(e.tintTopRight,f*e._alphaTR),x=g(e.tintBottomLeft,f*e._alphaBL),T=g(e.tintBottomRight,f*e._alphaBR),w=e.frame.glTexture,b=a.setGameObject(e),S=e.getTextBounds(!1).characters,E=e.dropShadowX,A=e.dropShadowY;if(0!==E||0!==A){var C=e.dropShadowColor,_=e.dropShadowAlpha,M=g(C,f*_*e._alphaTL),P=g(C,f*_*e._alphaTR),R=g(C,f*_*e._alphaBL),L=g(C,f*_*e._alphaBR);for(l=0;l{var s=i(48011),n=i(46590),r=i(83419),o=i(31401),a=i(4327),h=i(95643),l=i(73162),u=new r({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.Depth,o.Mask,o.Pipeline,o.PostPipeline,o.ScrollFactor,o.Size,o.Texture,o.Transform,o.Visible,s],initialize:function(t,e,i,s,n){h.call(this,t,"Blitter"),this.setTexture(s,n),this.setPosition(e,i),this.initPipeline(),this.initPostPipeline(),this.children=new l,this.renderList=[],this.dirty=!1},create:function(t,e,i,s,r){void 0===s&&(s=!0),void 0===r&&(r=this.children.length),void 0===i?i=this.frame:i instanceof a||(i=this.texture.get(i));var o=new n(this,t,e,i,s);return this.children.addAt(o,r,!1),this.dirty=!0,o},createFromCallback:function(t,e,i,s){for(var n=this.createMultiple(e,i,s),r=0;r0},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=u},72396:t=>{t.exports=function(t,e,i,s){var n=e.getRenderList();if(0!==n.length){var r=t.currentContext,o=i.alpha*e.alpha;if(0!==o){i.addToRenderList(e),r.globalCompositeOperation=t.blendModes[e.blendMode],r.imageSmoothingEnabled=!e.frame.source.scaleMode;var a=e.x-i.scrollX*e.scrollFactorX,h=e.y-i.scrollY*e.scrollFactorY;r.save(),s&&s.copyToContext(r);for(var l=i.roundPixels,u=0;u0&&p.height>0&&(r.save(),r.translate(c.x+a,c.y+h),r.scale(m,y),r.drawImage(f.source.image,p.x,p.y,p.width,p.height,v,g,p.width,p.height),r.restore())):(l&&(v=Math.round(v),g=Math.round(g)),p.width>0&&p.height>0&&r.drawImage(f.source.image,p.x,p.y,p.width,p.height,v+c.x+a,g+c.y+h,p.width,p.height)))}r.restore()}}}},9403:(t,e,i)=>{var s=i(6107),n=i(25305),r=i(44603),o=i(23568);r.register("blitter",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),r=o(t,"frame",null),a=new s(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),n(this.scene,a,t),a}))},12709:(t,e,i)=>{var s=i(6107);i(39429).register("blitter",(function(t,e,i,n){return this.displayList.add(new s(this.scene,t,e,i,n))}))},48011:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(99485),r=i(72396),t.exports={renderWebGL:n,renderCanvas:r}},99485:(t,e,i)=>{var s=i(61340),n=i(70554),r=new s;t.exports=function(t,e,i,s){var o=e.getRenderList(),a=i.alpha*e.alpha;if(0!==o.length&&0!==a){i.addToRenderList(e);var h=t.pipelines.set(this.pipeline,e),l=i.scrollX*e.scrollFactorX,u=i.scrollY*e.scrollFactorY,c=r.copyFrom(i.matrix);s&&(c.multiplyWithOffset(s,-l,-u),l=0,u=0);var d=e.x-l,f=e.y-u,p=-1,v=i.roundPixels;t.pipelines.preBatch(e);for(var g=0;g{var s=i(83419),n=i(4327),r=new s({initialize:function(t,e,i,s,n){this.parent=t,this.x=e,this.y=i,this.frame=s,this.data={},this.tint=16777215,this._visible=n,this._alpha=1,this.flipX=!1,this.flipY=!1,this.hasTransformComponent=!0},setFrame:function(t){return void 0===t?this.frame=this.parent.frame:t instanceof n&&t.texture===this.parent.texture?this.frame=t:this.frame=this.parent.texture.get(t),this},resetFlip:function(){return this.flipX=!1,this.flipY=!1,this},reset:function(t,e,i){return this.x=t,this.y=e,this.flipX=!1,this.flipY=!1,this._alpha=1,this._visible=!0,this.parent.dirty=!0,i&&this.setFrame(i),this},setPosition:function(t,e){return this.x=t,this.y=e,this},setFlipX:function(t){return this.flipX=t,this},setFlipY:function(t){return this.flipY=t,this},setFlip:function(t,e){return this.flipX=t,this.flipY=e,this},setVisible:function(t){return this.visible=t,this},setAlpha:function(t){return this.alpha=t,this},setTint:function(t){return this.tint=t,this},destroy:function(){this.parent.dirty=!0,this.parent.children.remove(this),this.parent=void 0,this.frame=void 0,this.data=void 0},visible:{get:function(){return this._visible},set:function(t){this.parent.dirty|=this._visible!==t,this._visible=t}},alpha:{get:function(){return this._alpha},set:function(t){this.parent.dirty|=this._alpha>0!=t>0,this._alpha=t}}});t.exports=r},16005:(t,e,i)=>{var s=i(45319),n={_alpha:1,_alphaTL:1,_alphaTR:1,_alphaBL:1,_alphaBR:1,clearAlpha:function(){return this.setAlpha(1)},setAlpha:function(t,e,i,n){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(n,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=n},88509:(t,e,i)=>{var s=i(45319),n={_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=n},90065:(t,e,i)=>{var s=i(10312),n={_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=n},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 n=t;this.frame.setCropUVs(this._crop,n.x,n.y,n.width,n.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),n={_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=n},47059:(t,e,i)=>{var s=i(83419),n=i(66064),r=i(19133),o=new s({initialize:function(t,e){this.gameObject=t,this.isPost=e,this.enabled=!1,this.list=[],this.padding=0},setPadding:function(t){return void 0===t&&(t=0),this.padding=t,this.gameObject},onFXCopy:function(){},onFX:function(){},enable:function(t){if(!this.isPost){var e=this.gameObject.scene.sys.renderer;e&&e.pipelines?(this.gameObject.pipeline=e.pipelines.FX_PIPELINE,void 0!==t&&(this.padding=t),this.enabled=!0):this.enabled=!1}},clear:function(){if(this.isPost)this.gameObject.resetPostPipeline(!0);else{for(var t=this.list,e=0;e{t.exports={flipX:!1,flipY:!1,toggleFlipX:function(){return this.flipX=!this.flipX,this},toggleFlipY:function(){return this.flipY=!this.flipY,this},setFlipX:function(t){return this.flipX=t,this},setFlipY:function(t){return this.flipY=t,this},setFlip:function(t,e){return this.flipX=t,this.flipY=e,this},resetFlip:function(){return this.flipX=!1,this.flipY=!1,this}}},8004:(t,e,i)=>{var s=i(87841),n=i(11520),r=i(26099),o={prepareBoundsOutput:function(t,e){(void 0===e&&(e=!1),0!==this.rotation&&n(t,this.x,this.y,this.rotation),e&&this.parentContainer)&&this.parentContainer.getBoundsTransformMatrix().transformPoint(t.x,t.y,t);return t},getCenter:function(t,e){return void 0===t&&(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,this.prepareBoundsOutput(t,e)},getTopLeft:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getTopCenter:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getTopRight:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getLeftCenter:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,this.prepareBoundsOutput(t,e)},getRightCenter:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,this.prepareBoundsOutput(t,e)},getBottomLeft:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBottomCenter:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBottomRight:function(t,e){return t||(t=new r),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBounds:function(t){var e,i,n,r,o,a,h,l;if(void 0===t&&(t=new s),this.parentContainer){var u=this.parentContainer.getBoundsTransformMatrix();this.getTopLeft(t),u.transformPoint(t.x,t.y,t),e=t.x,i=t.y,this.getTopRight(t),u.transformPoint(t.x,t.y,t),n=t.x,r=t.y,this.getBottomLeft(t),u.transformPoint(t.x,t.y,t),o=t.x,a=t.y,this.getBottomRight(t),u.transformPoint(t.x,t.y,t),h=t.x,l=t.y}else this.getTopLeft(t),e=t.x,i=t.y,this.getTopRight(t),n=t.x,r=t.y,this.getBottomLeft(t),o=t.x,a=t.y,this.getBottomRight(t),h=t.x,l=t.y;return t.x=Math.min(e,n,o,h),t.y=Math.min(i,r,a,l),t.width=Math.max(e,n,o,h)-t.x,t.height=Math.max(i,r,a,l)-t.y,t}};t.exports=o},8573:(t,e,i)=>{var s=i(6858),n=i(80661),r={mask:null,setMask:function(t){return this.mask=t,this},clearMask:function(t){return void 0===t&&(t=!1),t&&this.mask&&this.mask.destroy(),this.mask=null,this},createBitmapMask:function(t,e,i,n,r){return void 0===t&&(this.texture||this.shader||this.geom)&&(t=this),new s(this.scene,t,e,i,n,r)},createGeometryMask:function(t){return void 0!==t||"Graphics"!==this.type&&!this.geom||(t=this),new n(this.scene,t)}};t.exports=r},27387:t=>{var e={_originComponent:!0,originX:.5,originY:.5,_displayOriginX:0,_displayOriginY:0,displayOriginX:{get:function(){return this._displayOriginX},set:function(t){this._displayOriginX=t,this.originX=t/this.width}},displayOriginY:{get:function(){return this._displayOriginY},set:function(t){this._displayOriginY=t,this.originY=t/this.height}},setOrigin:function(t,e){return void 0===t&&(t=.5),void 0===e&&(e=t),this.originX=t,this.originY=e,this.updateDisplayOrigin()},setOriginFromFrame:function(){return this.frame&&this.frame.customPivot?(this.originX=this.frame.pivotX,this.originY=this.frame.pivotY,this.updateDisplayOrigin()):this.setOrigin()},setDisplayOrigin:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.displayOriginX=t,this.displayOriginY=e,this},updateDisplayOrigin:function(){return this._displayOriginX=this.originX*this.width,this._displayOriginY=this.originY*this.height,this}};t.exports=e},37640:(t,e,i)=>{var s=i(39506),n=i(57355),r=i(35154),o=i(86353),a=i(26099),h={path:null,rotateToPath:!1,pathRotationOffset:0,pathOffset:null,pathVector:null,pathDelta:null,pathTween:null,pathConfig:null,_prevDirection:o.PLAYING_FORWARD,setPath:function(t,e){void 0===e&&(e=this.pathConfig);var i=this.pathTween;return i&&i.isPlaying()&&i.stop(),this.path=t,e&&this.startFollow(e),this},setRotateToPath:function(t,e){return void 0===e&&(e=0),this.rotateToPath=t,this.pathRotationOffset=e,this},isFollowing:function(){var t=this.pathTween;return t&&t.isPlaying()},startFollow:function(t,e){void 0===t&&(t={}),void 0===e&&(e=0);var i=this.pathTween;i&&i.isPlaying()&&i.stop(),"number"==typeof t&&(t={duration:t}),t.from=r(t,"from",0),t.to=r(t,"to",1);var h=n(t,"positionOnPath",!1);this.rotateToPath=n(t,"rotateToPath",!1),this.pathRotationOffset=r(t,"rotationOffset",0);var l=r(t,"startAt",e);if(l&&(t.onStart=function(t){var e=t.data[0];e.progress=l,e.elapsed=e.duration*l;var i=e.ease(e.progress);e.current=e.start+(e.end-e.start)*i,e.setTargetValue()}),this.pathOffset||(this.pathOffset=new a(this.x,this.y)),this.pathVector||(this.pathVector=new a),this.pathDelta||(this.pathDelta=new a),this.pathDelta.reset(),t.persist=!0,this.pathTween=this.scene.sys.tweens.addCounter(t),this.path.getStartPoint(this.pathOffset),h&&(this.x=this.pathOffset.x,this.y=this.pathOffset.y),this.pathOffset.x=this.x-this.pathOffset.x,this.pathOffset.y=this.y-this.pathOffset.y,this._prevDirection=o.PLAYING_FORWARD,this.rotateToPath){var u=this.path.getPoint(.1);this.rotation=Math.atan2(u.y-this.y,u.x-this.x)+s(this.pathRotationOffset)}return this.pathConfig=t,this},pauseFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.pause(),this},resumeFollow:function(){var t=this.pathTween;return t&&t.isPaused()&&t.resume(),this},stopFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.stop(),this},pathUpdate:function(){var t=this.pathTween;if(t&&t.data){var e=t.data[0],i=this.pathDelta,n=this.pathVector;if(i.copy(n).negate(),e.state===o.COMPLETE)return this.path.getPoint(e.end,n),i.add(n),n.add(this.pathOffset),void this.setPosition(n.x,n.y);if(e.state!==o.PLAYING_FORWARD&&e.state!==o.PLAYING_BACKWARD)return;this.path.getPoint(t.getValue(),n),i.add(n),n.add(this.pathOffset);var r=this.x,a=this.y;this.setPosition(n.x,n.y);var h=this.x-r,l=this.y-a;if(0===h&&0===l)return;if(e.state!==this._prevDirection)return void(this._prevDirection=e.state);this.rotateToPath&&(this.rotation=Math.atan2(l,h)+s(this.pathRotationOffset))}}};t.exports=h},72699:(t,e,i)=>{var s=i(62644),n={defaultPipeline:null,pipeline:null,pipelineData:null,initPipeline:function(t){this.pipelineData={};var e=this.scene.sys.renderer;if(!e)return!1;var i=e.pipelines;if(i){void 0===t&&(t=i.default);var s=i.get(t);if(s)return this.defaultPipeline=s,this.pipeline=s,!0}return!1},setPipeline:function(t,e,i){var n=this.scene.sys.renderer;if(!n)return this;var r=n.pipelines;if(r){var o=r.get(t);o&&(this.pipeline=o),e&&(this.pipelineData=i?s(e):e)}return this},setPipelineData:function(t,e){var i=this.pipelineData;return void 0===e?delete i[t]:i[t]=e,this},resetPipeline:function(t){return void 0===t&&(t=!1),this.pipeline=this.defaultPipeline,t&&(this.pipelineData={}),null!==this.pipeline},getPipelineName:function(){return null===this.pipeline?null:this.pipeline.name}};t.exports=n},17581:(t,e,i)=>{var s=i(62644),n=i(47059),r=i(19133),o={hasPostPipeline:!1,postPipelines:null,postPipelineData:null,preFX:null,postFX:null,initPostPipeline:function(t){this.postPipelines=[],this.postPipelineData={},this.postFX=new n(this,!0),t&&(this.preFX=new n(this,!1))},setPostPipeline:function(t,e,i){var n=this.scene.sys.renderer;if(!n)return this;var r=n.pipelines;if(r){Array.isArray(t)||(t=[t]);for(var o=0;o0,this},setPostPipelineData:function(t,e){var i=this.postPipelineData;return void 0===e?delete i[t]:i[t]=e,this},getPostPipeline:function(t){for(var e="string"==typeof t,i=this.postPipelines,s=[],n=0;n=0;s--){var n=i[s];(e&&n.name===t||!e&&n===t)&&(n.destroy(),r(i,s))}return this.hasPostPipeline=this.postPipelines.length>0,this},clearFX:function(){return this.preFX&&this.preFX.clear(),this.postFX&&this.postFX.clear(),this}};t.exports=o},80227:t=>{var e={scrollFactorX:1,scrollFactorY:1,setScrollFactor:function(t,e){return void 0===e&&(e=t),this.scrollFactorX=t,this.scrollFactorY=e,this}};t.exports=e},16736:t=>{var e={_sizeComponent:!0,width:0,height:0,displayWidth:{get:function(){return Math.abs(this.scaleX*this.frame.realWidth)},set:function(t){this.scaleX=t/this.frame.realWidth}},displayHeight:{get:function(){return Math.abs(this.scaleY*this.frame.realHeight)},set:function(t){this.scaleY=t/this.frame.realHeight}},setSizeToFrame:function(t){t||(t=this.frame),this.width=t.realWidth,this.height=t.realHeight;var e=this.input;return e&&!e.customHitArea&&(e.hitArea.width=this.width,e.hitArea.height=this.height),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}};t.exports=e},37726:(t,e,i)=>{var s=i(4327),n={texture:null,frame:null,isCropped:!1,setTexture:function(t,e,i,s){return this.texture=this.scene.sys.textures.get(t),this.setFrame(e,i,s)},setFrame:function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!0),t instanceof s?(this.texture=this.scene.sys.textures.get(t.texture.key),this.frame=t):this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this._sizeComponent&&e&&this.setSizeToFrame(),this._originComponent&&i&&(this.frame.customPivot?this.setOrigin(this.frame.pivotX,this.frame.pivotY):this.updateDisplayOrigin()),this}};t.exports=n},79812:(t,e,i)=>{var s=i(4327),n={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 n=t;this.frame.setCropUVs(this._crop,n.x,n.y,n.width,n.height,this.flipX,this.flipY)}this.isCropped=!0}return this},setTexture:function(t,e){return this.texture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!0),t instanceof s?(this.texture=this.scene.sys.textures.get(t.texture.key),this.frame=t):this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this._sizeComponent&&e&&this.setSizeToFrame(),this._originComponent&&i&&(this.frame.customPivot?this.setOrigin(this.frame.pivotX,this.frame.pivotY):this.updateDisplayOrigin()),this.isCropped&&this.frame.updateCropUVs(this._crop,this.flipX,this.flipY),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=n},27472:t=>{var e={tintTopLeft:16777215,tintTopRight:16777215,tintBottomLeft:16777215,tintBottomRight:16777215,tintFill:!1,clearTint:function(){return this.setTint(16777215),this},setTint:function(t,e,i,s){return void 0===t&&(t=16777215),void 0===e&&(e=t,i=t,s=t),this.tintTopLeft=t,this.tintTopRight=e,this.tintBottomLeft=i,this.tintBottomRight=s,this.tintFill=!1,this},setTintFill:function(t,e,i,s){return this.setTint(t,e,i,s),this.tintFill=!0,this},tint:{get:function(){return this.tintTopLeft},set:function(t){this.setTint(t,t,t,t)}},isTinted:{get:function(){var t=16777215;return this.tintFill||this.tintTopLeft!==t||this.tintTopRight!==t||this.tintBottomLeft!==t||this.tintBottomRight!==t}}};t.exports=e},53774:t=>{t.exports=function(t){var e={name:t.name,type:t.type,x:t.x,y:t.y,depth:t.depth,scale:{x:t.scaleX,y:t.scaleY},origin:{x:t.originX,y:t.originY},flipX:t.flipX,flipY:t.flipY,rotation:t.rotation,alpha:t.alpha,visible:t.visible,blendMode:t.blendMode,textureKey:"",frameKey:"",data:{}};return t.texture&&(e.textureKey=t.texture.key,e.frameKey=t.frame.name),e}},16901:(t,e,i)=>{var s=i(36383),n=i(61340),r=i(85955),o=i(86554),a=i(30954),h=i(26099),l={hasTransformComponent:!0,_scaleX:1,_scaleY:1,_rotation:0,x:0,y:0,z:0,w:0,scale:{get:function(){return(this._scaleX+this._scaleY)/2},set:function(t){this._scaleX=t,this._scaleY=t,0===t?this.renderFlags&=-5:this.renderFlags|=4}},scaleX:{get:function(){return this._scaleX},set:function(t){this._scaleX=t,0===t?this.renderFlags&=-5:0!==this._scaleY&&(this.renderFlags|=4)}},scaleY:{get:function(){return this._scaleY},set:function(t){this._scaleY=t,0===t?this.renderFlags&=-5:0!==this._scaleX&&(this.renderFlags|=4)}},angle:{get:function(){return a(this._rotation*s.RAD_TO_DEG)},set:function(t){this.rotation=a(t)*s.DEG_TO_RAD}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=o(t)}},setPosition:function(t,e,i,s){return void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=0),void 0===s&&(s=0),this.x=t,this.y=e,this.z=i,this.w=s,this},copyPosition:function(t){return void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.z&&(this.z=t.z),void 0!==t.w&&(this.w=t.w),this},setRandomPosition:function(t,e,i,s){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),this.x=t+Math.random()*i,this.y=e+Math.random()*s,this},setRotation:function(t){return void 0===t&&(t=0),this.rotation=t,this},setAngle:function(t){return void 0===t&&(t=0),this.angle=t,this},setScale:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.scaleX=t,this.scaleY=e,this},setX:function(t){return void 0===t&&(t=0),this.x=t,this},setY:function(t){return void 0===t&&(t=0),this.y=t,this},setZ:function(t){return void 0===t&&(t=0),this.z=t,this},setW:function(t){return void 0===t&&(t=0),this.w=t,this},getLocalTransformMatrix:function(t){return void 0===t&&(t=new n),t.applyITRS(this.x,this.y,this._rotation,this._scaleX,this._scaleY)},getWorldTransformMatrix:function(t,e){void 0===t&&(t=new n);var i=this.parentContainer;if(!i)return this.getLocalTransformMatrix(t);var s=!1;for(e||(e=new n,s=!0),t.applyITRS(this.x,this.y,this._rotation,this._scaleX,this._scaleY);i;)e.applyITRS(i.x,i.y,i._rotation,i._scaleX,i._scaleY),e.multiply(t,t),i=i.parentContainer;return s&&e.destroy(),t},getLocalPoint:function(t,e,i,s){i||(i=new h),s||(s=this.scene.sys.cameras.main);var n=s.scrollX,o=s.scrollY,a=t+n*this.scrollFactorX-n,l=e+o*this.scrollFactorY-o;return this.parentContainer?this.getWorldTransformMatrix().applyInverse(a,l,i):r(a,l,this.x,this.y,this.rotation,this.scaleX,this.scaleY,i),this._originComponent&&(i.x+=this._displayOriginX,i.y+=this._displayOriginY),i},getWorldPoint:function(t,e,i){if(void 0===t&&(t=new h),!this.parentContainer)return t.x=this.x,t.y=this.y,t;var s=this.getWorldTransformMatrix(e,i);return t.x=s.tx,t.y=s.ty,t},getParentRotation:function(){for(var t=0,e=this.parentContainer;e;)t+=e.rotation,e=e.parentContainer;return t}};t.exports=l},61340:(t,e,i)=>{var s=i(83419),n=i(36383),r=i(26099),o=new s({initialize:function(t,e,i,s,n,r){void 0===t&&(t=1),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=1),void 0===n&&(n=0),void 0===r&&(r=0),this.matrix=new Float32Array([t,e,i,s,n,r,0,0,1]),this.decomposedMatrix={translateX:0,translateY:0,scaleX:1,scaleY:1,rotation:0},this.quad=new Float32Array(8)},a:{get:function(){return this.matrix[0]},set:function(t){this.matrix[0]=t}},b:{get:function(){return this.matrix[1]},set:function(t){this.matrix[1]=t}},c:{get:function(){return this.matrix[2]},set:function(t){this.matrix[2]=t}},d:{get:function(){return this.matrix[3]},set:function(t){this.matrix[3]=t}},e:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},f:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},tx:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},ty:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},rotation:{get:function(){return Math.acos(this.a/this.scaleX)*(Math.atan(-this.c/this.a)<0?-1:1)}},rotationNormalized:{get:function(){var t=this.matrix,e=t[0],i=t[1],s=t[2],r=t[3];return e||i?i>0?Math.acos(e/this.scaleX):-Math.acos(e/this.scaleX):s||r?n.TAU-(r>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,n=s[0],r=s[1],o=s[2],a=s[3];return s[0]=n*i+o*e,s[1]=r*i+a*e,s[2]=n*-e+o*i,s[3]=r*-e+a*i,this},multiply:function(t,e){var i=this.matrix,s=t.matrix,n=i[0],r=i[1],o=i[2],a=i[3],h=i[4],l=i[5],u=s[0],c=s[1],d=s[2],f=s[3],p=s[4],v=s[5],g=void 0===e?i:e.matrix;return g[0]=u*n+c*o,g[1]=u*r+c*a,g[2]=d*n+f*o,g[3]=d*r+f*a,g[4]=p*n+v*o+h,g[5]=p*r+v*a+l,g},multiplyWithOffset:function(t,e,i){var s=this.matrix,n=t.matrix,r=s[0],o=s[1],a=s[2],h=s[3],l=e*r+i*a+s[4],u=e*o+i*h+s[5],c=n[0],d=n[1],f=n[2],p=n[3],v=n[4],g=n[5];return s[0]=c*r+d*a,s[1]=c*o+d*h,s[2]=f*r+p*a,s[3]=f*o+p*h,s[4]=v*r+g*a+l,s[5]=v*o+g*h+u,this},transform:function(t,e,i,s,n,r){var o=this.matrix,a=o[0],h=o[1],l=o[2],u=o[3],c=o[4],d=o[5];return o[0]=t*a+e*l,o[1]=t*h+e*u,o[2]=i*a+s*l,o[3]=i*h+s*u,o[4]=n*a+r*l+c,o[5]=n*h+r*u+d,this},transformPoint:function(t,e,i){void 0===i&&(i={x:0,y:0});var s=this.matrix,n=s[0],r=s[1],o=s[2],a=s[3],h=s[4],l=s[5];return i.x=t*n+e*o+h,i.y=t*r+e*a+l,i},invert:function(){var t=this.matrix,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=e*n-i*s;return t[0]=n/a,t[1]=-i/a,t[2]=-s/a,t[3]=e/a,t[4]=(s*o-n*r)/a,t[5]=-(e*o-i*r)/a,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},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,n,r){var o=this.matrix;return o[0]=t,o[1]=e,o[2]=i,o[3]=s,o[4]=n,o[5]=r,this},decomposeMatrix:function(){var t=this.decomposedMatrix,e=this.matrix,i=e[0],s=e[1],n=e[2],r=e[3],o=i*r-s*n;if(t.translateX=e[4],t.translateY=e[5],i||s){var a=Math.sqrt(i*i+s*s);t.rotation=s>0?Math.acos(i/a):-Math.acos(i/a),t.scaleX=a,t.scaleY=o/a}else if(n||r){var h=Math.sqrt(n*n+r*r);t.rotation=.5*Math.PI-(r>0?Math.acos(-n/h):-Math.acos(n/h)),t.scaleX=o/h,t.scaleY=h}else t.rotation=0,t.scaleX=0,t.scaleY=0;return t},applyITRS:function(t,e,i,s,n){var r=this.matrix,o=Math.sin(i),a=Math.cos(i);return r[4]=t,r[5]=e,r[0]=a*s,r[1]=o*s,r[2]=-o*n,r[3]=a*n,this},applyInverse:function(t,e,i){void 0===i&&(i=new r);var s=this.matrix,n=s[0],o=s[1],a=s[2],h=s[3],l=s[4],u=s[5],c=1/(n*h+a*-o);return i.x=h*c*t+-a*c*e+(u*a-l*h)*c,i.y=n*c*e+-o*c*t+(-u*n+l*o)*c,i},setQuad:function(t,e,i,s,n,r){void 0===n&&(n=!1),void 0===r&&(r=this.quad);var o=this.matrix,a=o[0],h=o[1],l=o[2],u=o[3],c=o[4],d=o[5],f=t*a+e*l+c,p=t*h+e*u+d,v=t*a+s*l+c,g=t*h+s*u+d,m=i*a+s*l+c,y=i*h+s*u+d,x=i*a+e*l+c,T=i*h+e*u+d;if(n){var w=Math.floor(f+.5),b=Math.floor(p+.5),S=w-f,E=b-p;r[0]=w,r[1]=b,r[2]=v+S,r[3]=g+E,r[4]=m+S,r[5]=y+E,r[6]=x+S,r[7]=T+E}else r[0]=f,r[1]=p,r[2]=v,r[3]=g,r[4]=m,r[5]=y,r[6]=x,r[7]=T;return 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=o},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),Flip:i(54434),FX:i(47059),GetBounds:i(8004),Mask:i(8573),Origin:i(27387),PathFollower:i(37640),Pipeline:i(72699),PostPipeline:i(17581),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),n=i(10312),r=i(83419),o=i(31401),a=i(51708),h=i(95643),l=i(87841),u=i(29959),c=i(36899),d=i(26099),f=new o.TransformMatrix,p=new r({Extends:h,Mixins:[o.AlphaSingle,o.BlendMode,o.ComputedSize,o.Depth,o.Mask,o.PostPipeline,o.Transform,o.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 o.TransformMatrix,this._sortKey="",this._sysEvents=t.sys.events,this.scrollFactorX=1,this.scrollFactorY=1,this.initPostPipeline(),this.setPosition(e,i),this.setBlendMode(n.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,n=!1;t.setEmpty();for(var r=0;r-1},setAll:function(t,e,i,n){return s.SetAll(this.list,t,e,i,n),this},each:function(t,e){var i,s=[null],n=this.list.slice(),r=n.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 n=e.list;if(0!==n.length){var r=e.localTransform;s?(r.loadIdentity(),r.multiply(s),r.translate(e.x,e.y),r.rotate(e.rotation),r.scale(e.scaleX,e.scaleY)):r.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var o=-1!==e.blendMode;o||t.setBlendMode(0);var a=e._alpha,h=e.scrollFactorX,l=e.scrollFactorY;e.mask&&e.mask.preRenderCanvas(t,null,i);for(var u=0;u{var s=i(25305),n=i(31559),r=i(44603),o=i(23568),a=i(95540);r.register("container",(function(t,e){void 0===t&&(t={});var i=o(t,"x",0),r=o(t,"y",0),h=a(t,"children",null),l=new n(this.scene,i,r,h);return void 0!==e&&(t.add=e),s(this.scene,l,t),l}))},24961:(t,e,i)=>{var s=i(31559);i(39429).register("container",(function(t,e,i){return this.displayList.add(new s(this.scene,t,e,i))}))},29959:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(72249),r=i(53584),t.exports={renderWebGL:n,renderCanvas:r}},72249:t=>{t.exports=function(t,e,i,s){i.addToRenderList(e);var n=e.list,r=n.length;if(0!==r){var o=e.localTransform;s?(o.loadIdentity(),o.multiply(s),o.translate(e.x,e.y),o.rotate(e.rotation),o.scale(e.scaleX,e.scaleY)):o.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),t.pipelines.preBatch(e);var a=-1!==e.blendMode;a||t.setBlendMode(0);for(var h=e.alpha,l=e.scrollFactorX,u=e.scrollFactorY,c=0;c{t.exports=["normal","multiply","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"]},3069:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(441),o=i(95643),a=i(41212),h=i(35846),l=i(44594),u=i(61369),c=new s({Extends:o,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Origin,n.ScrollFactor,n.Transform,n.Visible,r],initialize:function(t,e,i,s,n,r){if(o.call(this,t,"DOMElement"),this.parent=t.sys.game.domContainer,!this.parent)throw new Error("No DOM Container set in game config");this.cache=t.sys.cache.html,this.node,this.transformOnly=!1,this.skewX=0,this.skewY=0,this.rotate3d=new u,this.rotate3dAngle="deg",this.pointerEvents="auto",this.width=0,this.height=0,this.displayWidth=0,this.displayHeight=0,this.handler=this.dispatchNativeEvent.bind(this),this.setPosition(e,i),"string"==typeof s?"#"===s[0]?this.setElement(s.substr(1),n,r):this.createElement(s,n,r):s&&this.setElement(s,n,r),t.sys.events.on(l.SLEEP,this.handleSceneEvent,this),t.sys.events.on(l.WAKE,this.handleSceneEvent,this),t.sys.events.on(l.PRE_RENDER,this.preRender,this)},handleSceneEvent:function(t){var e=this.node,i=e.style;e&&(i.display=t.settings.visible?"block":"none")},setSkew:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.skewX=t,this.skewY=e,this},setPerspective:function(t){return this.parent.style.perspective=t+"px",this},perspective:{get:function(){return parseFloat(this.parent.style.perspective)},set:function(t){this.parent.style.perspective=t+"px"}},addListener:function(t){if(this.node){t=t.split(" ");for(var e=0;e{var s=i(47407),n=i(95643),r=i(61340),o=new r,a=new r,h=new r;t.exports=function(t,e,i,r){if(e.node){var l=e.node.style,u=e.scene.sys.settings;if(!l||!u.visible||n.RENDER_MASK!==e.renderFlags||0!==e.cameraFilter&&e.cameraFilter&i.id||e.parentContainer&&!e.parentContainer.willRender())l.display="none";else{var c=e.parentContainer,d=i.alpha*e.alpha;c&&(d*=c.alpha);var f=o,p=a,v=h,g=0,m=0,y="0%",x="0%";r?(g=e.width*e.scaleX*e.originX,m=e.height*e.scaleY*e.originY,p.applyITRS(e.x-g,e.y-m,e.rotation,e.scaleX,e.scaleY),f.copyFrom(i.matrix),f.multiplyWithOffset(r,-i.scrollX*e.scrollFactorX,-i.scrollY*e.scrollFactorY),p.e=e.x-g,p.f=e.y-m,f.multiply(p,v)):(g=e.width*e.originX,m=e.height*e.originY,p.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),f.copyFrom(i.matrix),y=100*e.originX+"%",x=100*e.originY+"%",p.e-=i.scrollX*e.scrollFactorX,p.f-=i.scrollY*e.scrollFactorY,f.multiply(p,v),v.e-=g,v.f-=m),e.transformOnly||(l.display="block",l.opacity=d,l.zIndex=e._depth,l.pointerEvents=e.pointerEvents,l.mixBlendMode=s[e._blendMode]),l.transform=v.getCSSMatrix()+" skew("+e.skewX+"rad, "+e.skewY+"rad) rotate3d("+e.rotate3d.x+","+e.rotate3d.y+","+e.rotate3d.z+","+e.rotate3d.w+e.rotate3dAngle+")",l.transformOrigin=y+" "+x}}}},2611:(t,e,i)=>{var s=i(3069);i(39429).register("dom",(function(t,e,i,n,r){var o=new s(this.scene,t,e,i,n,r);return this.displayList.add(o),o}))},441:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(49381),r=i(49381),t.exports={renderWebGL:n,renderCanvas:r}},62980:t=>{t.exports="addedtoscene"},41337:t=>{t.exports="destroy"},44947:t=>{t.exports="removedfromscene"},49358:t=>{t.exports="complete"},35163:t=>{t.exports="created"},97249:t=>{t.exports="error"},19483:t=>{t.exports="locked"},56059:t=>{t.exports="loop"},26772:t=>{t.exports="metadata"},64437:t=>{t.exports="playing"},83411:t=>{t.exports="play"},75780:t=>{t.exports="seeked"},67799:t=>{t.exports="seeking"},63500:t=>{t.exports="stalled"},55541:t=>{t.exports="stop"},53208:t=>{t.exports="textureready"},4992:t=>{t.exports="unlocked"},12:t=>{t.exports="unsupported"},51708:(t,e,i)=>{t.exports={ADDED_TO_SCENE:i(62980),DESTROY:i(41337),REMOVED_FROM_SCENE:i(44947),VIDEO_COMPLETE:i(49358),VIDEO_CREATED:i(35163),VIDEO_ERROR:i(97249),VIDEO_LOCKED:i(19483),VIDEO_LOOP:i(56059),VIDEO_METADATA:i(26772),VIDEO_PLAY:i(83411),VIDEO_PLAYING:i(64437),VIDEO_SEEKED:i(75780),VIDEO_SEEKING:i(67799),VIDEO_STALLED:i(63500),VIDEO_STOP:i(55541),VIDEO_TEXTURE:i(53208),VIDEO_UNLOCKED:i(4992),VIDEO_UNSUPPORTED:i(12)}},42421:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(95643),o=i(64993),a=new s({Extends:r,Mixins:[n.Alpha,n.BlendMode,n.Depth,n.Flip,n.Origin,n.ScrollFactor,n.Size,n.Texture,n.Tint,n.Transform,n.Visible,o],initialize:function(t){r.call(this,t,"Extern")},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},preUpdate:function(){},render:function(){}});t.exports=a},70217:()=>{},56315:(t,e,i)=>{var s=i(42421);i(39429).register("extern",(function(){var t=new s(this.scene);return this.displayList.add(t),t}))},64993:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(80287),r=i(70217),t.exports={renderWebGL:n,renderCanvas:r}},80287:(t,e,i)=>{var s=i(91296);t.exports=function(t,e,i,n){t.pipelines.clear();var r=s(e,i,n).calc;e.render.call(e,t,i,r),t.pipelines.rebind()}},85592:t=>{t.exports={ARC:0,BEGIN_PATH:1,CLOSE_PATH:2,FILL_RECT:3,LINE_TO:4,MOVE_TO:5,LINE_STYLE:6,FILL_STYLE:7,FILL_PATH:8,STROKE_PATH:9,FILL_TRIANGLE:10,STROKE_TRIANGLE:11,SAVE:14,RESTORE:15,TRANSLATE:16,SCALE:17,ROTATE:18,GRADIENT_FILL_STYLE:21,GRADIENT_LINE_STYLE:22}},43831:(t,e,i)=>{var s=i(71911),n=i(83419),r=i(85592),o=i(31401),a=i(8497),h=i(95643),l=i(95540),u=i(35154),c=i(36383),d=i(84503),f=new n({Extends:h,Mixins:[o.AlphaSingle,o.BlendMode,o.Depth,o.Mask,o.Pipeline,o.PostPipeline,o.Transform,o.Visible,o.ScrollFactor,d],initialize:function(t,e){var i=u(e,"x",0),s=u(e,"y",0);h.call(this,t,"Graphics"),this.setPosition(i,s),this.initPipeline(),this.initPostPipeline(),this.displayOriginX=0,this.displayOriginY=0,this.commandBuffer=[],this.defaultFillColor=-1,this.defaultFillAlpha=1,this.defaultStrokeWidth=1,this.defaultStrokeColor=-1,this.defaultStrokeAlpha=1,this._lineWidth=1,this.lineStyle(1,0,0),this.fillStyle(0,0),this.setDefaultStyles(e)},setDefaultStyles:function(t){return u(t,"lineStyle",null)&&(this.defaultStrokeWidth=u(t,"lineStyle.width",1),this.defaultStrokeColor=u(t,"lineStyle.color",16777215),this.defaultStrokeAlpha=u(t,"lineStyle.alpha",1),this.lineStyle(this.defaultStrokeWidth,this.defaultStrokeColor,this.defaultStrokeAlpha)),u(t,"fillStyle",null)&&(this.defaultFillColor=u(t,"fillStyle.color",16777215),this.defaultFillAlpha=u(t,"fillStyle.alpha",1),this.fillStyle(this.defaultFillColor,this.defaultFillAlpha)),this},lineStyle:function(t,e,i){return void 0===i&&(i=1),this.commandBuffer.push(r.LINE_STYLE,t,e,i),this._lineWidth=t,this},fillStyle:function(t,e){return void 0===e&&(e=1),this.commandBuffer.push(r.FILL_STYLE,t,e),this},fillGradientStyle:function(t,e,i,s,n,o,a,h){return void 0===n&&(n=1),void 0===o&&(o=n),void 0===a&&(a=n),void 0===h&&(h=n),this.commandBuffer.push(r.GRADIENT_FILL_STYLE,n,o,a,h,t,e,i,s),this},lineGradientStyle:function(t,e,i,s,n,o){return void 0===o&&(o=1),this.commandBuffer.push(r.GRADIENT_LINE_STYLE,t,o,e,i,s,n),this},beginPath:function(){return this.commandBuffer.push(r.BEGIN_PATH),this},closePath:function(){return this.commandBuffer.push(r.CLOSE_PATH),this},fillPath:function(){return this.commandBuffer.push(r.FILL_PATH),this},fill:function(){return this.commandBuffer.push(r.FILL_PATH),this},strokePath:function(){return this.commandBuffer.push(r.STROKE_PATH),this},stroke:function(){return this.commandBuffer.push(r.STROKE_PATH),this},fillCircleShape:function(t){return this.fillCircle(t.x,t.y,t.radius)},strokeCircleShape:function(t){return this.strokeCircle(t.x,t.y,t.radius)},fillCircle:function(t,e,i){return this.beginPath(),this.arc(t,e,i,0,c.PI2),this.fillPath(),this},strokeCircle:function(t,e,i){return this.beginPath(),this.arc(t,e,i,0,c.PI2),this.strokePath(),this},fillRectShape:function(t){return this.fillRect(t.x,t.y,t.width,t.height)},strokeRectShape:function(t){return this.strokeRect(t.x,t.y,t.width,t.height)},fillRect:function(t,e,i,s){return this.commandBuffer.push(r.FILL_RECT,t,e,i,s),this},strokeRect:function(t,e,i,s){var n=this._lineWidth/2,r=t-n,o=t+n;return this.beginPath(),this.moveTo(t,e),this.lineTo(t,e+s),this.strokePath(),this.beginPath(),this.moveTo(t+i,e),this.lineTo(t+i,e+s),this.strokePath(),this.beginPath(),this.moveTo(r,e),this.lineTo(o+i,e),this.strokePath(),this.beginPath(),this.moveTo(r,e+s),this.lineTo(o+i,e+s),this.strokePath(),this},fillRoundedRect:function(t,e,i,s,n){void 0===n&&(n=20);var r=n,o=n,a=n,h=n;"number"!=typeof n&&(r=l(n,"tl",20),o=l(n,"tr",20),a=l(n,"bl",20),h=l(n,"br",20));var u=r>=0,d=o>=0,f=a>=0,p=h>=0;return r=Math.abs(r),o=Math.abs(o),a=Math.abs(a),h=Math.abs(h),this.beginPath(),this.moveTo(t+r,e),this.lineTo(t+i-o,e),d?this.arc(t+i-o,e+o,o,-c.TAU,0):this.arc(t+i,e,o,Math.PI,c.TAU,!0),this.lineTo(t+i,e+s-h),p?this.arc(t+i-h,e+s-h,h,0,c.TAU):this.arc(t+i,e+s,h,-c.TAU,Math.PI,!0),this.lineTo(t+a,e+s),f?this.arc(t+a,e+s-a,a,c.TAU,Math.PI):this.arc(t,e+s,a,0,-c.TAU,!0),this.lineTo(t,e+r),u?this.arc(t+r,e+r,r,-Math.PI,-c.TAU):this.arc(t,e,r,c.TAU,0,!0),this.fillPath(),this},strokeRoundedRect:function(t,e,i,s,n){void 0===n&&(n=20);var r=n,o=n,a=n,h=n,u=Math.min(i,s)/2;"number"!=typeof n&&(r=l(n,"tl",20),o=l(n,"tr",20),a=l(n,"bl",20),h=l(n,"br",20));var d=r>=0,f=o>=0,p=a>=0,v=h>=0;return r=Math.min(Math.abs(r),u),o=Math.min(Math.abs(o),u),a=Math.min(Math.abs(a),u),h=Math.min(Math.abs(h),u),this.beginPath(),this.moveTo(t+r,e),this.lineTo(t+i-o,e),this.moveTo(t+i-o,e),f?this.arc(t+i-o,e+o,o,-c.TAU,0):this.arc(t+i,e,o,Math.PI,c.TAU,!0),this.lineTo(t+i,e+s-h),this.moveTo(t+i,e+s-h),v?this.arc(t+i-h,e+s-h,h,0,c.TAU):this.arc(t+i,e+s,h,-c.TAU,Math.PI,!0),this.lineTo(t+a,e+s),this.moveTo(t+a,e+s),p?this.arc(t+a,e+s-a,a,c.TAU,Math.PI):this.arc(t,e+s,a,0,-c.TAU,!0),this.lineTo(t,e+r),this.moveTo(t,e+r),d?this.arc(t+r,e+r,r,-Math.PI,-c.TAU):this.arc(t,e,r,c.TAU,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(r.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,n,o){return this.commandBuffer.push(r.FILL_TRIANGLE,t,e,i,s,n,o),this},strokeTriangle:function(t,e,i,s,n,o){return this.commandBuffer.push(r.STROKE_TRIANGLE,t,e,i,s,n,o),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(r.LINE_TO,t,e),this},moveTo:function(t,e){return this.commandBuffer.push(r.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 n=1;n-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,n,r=this.scene.sys,o=r.game.renderer;void 0===e&&(e=r.scale.width),void 0===i&&(i=r.scale.height),f.TargetCamera.setScene(this.scene),f.TargetCamera.setViewport(0,0,e,i),f.TargetCamera.scrollX=this.x,f.TargetCamera.scrollY=this.y;var a={willReadFrequently:!0};if("string"==typeof t)if(r.textures.exists(t)){var h=(s=r.textures.get(t)).getSourceImage();h instanceof HTMLCanvasElement&&(n=h.getContext("2d",a))}else n=(s=r.textures.createCanvas(t,e,i)).getSourceImage().getContext("2d",a);else t instanceof HTMLCanvasElement&&(n=t.getContext("2d",a));return n&&(this.renderCanvas(o,this,f.TargetCamera,null,n,!1),s&&s.refresh()),this},preDestroy:function(){this.commandBuffer=[]}});f.TargetCamera=new s,t.exports=f},32768:(t,e,i)=>{var s=i(85592),n=i(20926);t.exports=function(t,e,i,r,o,a){var h=e.commandBuffer,l=h.length,u=o||t.currentContext;if(0!==l&&n(t,u,e,i,r)){i.addToRenderList(e);var c=1,d=1,f=0,p=0,v=1,g=0,m=0,y=0;u.beginPath();for(var x=0;x>>16,m=(65280&f)>>>8,y=255&f,u.strokeStyle="rgba("+g+","+m+","+y+","+c+")",u.lineWidth=v,x+=3;break;case s.FILL_STYLE:p=h[x+1],d=h[x+2],g=(16711680&p)>>>16,m=(65280&p)>>>8,y=255&p,u.fillStyle="rgba("+g+","+m+","+y+","+d+")",x+=2;break;case s.BEGIN_PATH:u.beginPath();break;case s.CLOSE_PATH:u.closePath();break;case s.FILL_PATH:a||u.fill();break;case s.STROKE_PATH:a||u.stroke();break;case s.FILL_RECT:a?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(),a||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(),a||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),n=i(43831);s.register("graphics",(function(t,e){void 0===t&&(t={}),void 0!==e&&(t.add=e);var i=new n(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),n=s,r=s;n=i(77545),r=i(32768),r=i(32768),t.exports={renderWebGL:n,renderCanvas:r}},77545:(t,e,i)=>{var s=i(85592),n=i(91296),r=i(61340),o=i(70554),a=function(t,e,i){this.x=t,this.y=e,this.width=i},h=function(t,e,i){this.points=[],this.pointsLength=1,this.points[0]=new a(t,e,i)},l=[],u=new r;t.exports=function(t,e,i,r){if(0!==e.commandBuffer.length){i.addToRenderList(e);var c=t.pipelines.set(e.pipeline,e);t.pipelines.preBatch(e);for(var d=n(e,i,r).calc,f=u.loadIdentity(),p=e.commandBuffer,v=i.alpha*e.alpha,g=1,m=c.fillTint,y=c.strokeTint,x=0,T=0,w=0,b=2*Math.PI,S=[],E=0,A=!0,C=null,_=o.getTintAppendFloatAlpha,M=0;M0&&(Y=Y%b-b):Y>b?Y=b:Y<0&&(Y=b+Y%b),null===C&&(C=new h(B+Math.cos(X)*U,N+Math.sin(X)*U,g),S.push(C),k+=.01);k<1+G;)w=Y*k+X,x=B+Math.cos(w)*U,T=N+Math.sin(w)*U,C.points.push(new a(x,T,g)),k+=.01;w=Y+X,x=B+Math.cos(w)*U,T=N+Math.sin(w)*U,C.points.push(new a(x,T,g));break;case s.FILL_RECT:c.batchFillRect(p[++M],p[++M],p[++M],p[++M],f,d);break;case s.FILL_TRIANGLE:c.batchFillTriangle(p[++M],p[++M],p[++M],p[++M],p[++M],p[++M],f,d);break;case s.STROKE_TRIANGLE:c.batchStrokeTriangle(p[++M],p[++M],p[++M],p[++M],p[++M],p[++M],g,f,d);break;case s.LINE_TO:null!==C?C.points.push(new a(p[++M],p[++M],g)):(C=new h(p[++M],p[++M],g),S.push(C));break;case s.MOVE_TO:C=new h(p[++M],p[++M],g),S.push(C);break;case s.SAVE:l.push(f.copyToArray());break;case s.RESTORE:f.copyFromArray(l.pop());break;case s.TRANSLATE:B=p[++M],N=p[++M],f.translate(B,N);break;case s.SCALE:B=p[++M],N=p[++M],f.scale(B,N);break;case s.ROTATE:f.rotate(p[++M])}t.pipelines.postBatch(e)}}},26479:(t,e,i)=>{var s=i(61061),n=i(83419),r=i(51708),o=i(50792),a=i(46710),h=i(95540),l=i(35154),u=i(97022),c=i(41212),d=i(88492),f=i(35072),p=i(68287),v=new n({Extends:o,initialize:function(t,e,i){o.call(this),i?e&&!Array.isArray(e)&&(e=[e]):Array.isArray(e)?c(e[0])&&(i=e,e=null):c(e)&&(i=e,e=null),this.scene=t,this.children=new f,this.isParent=!0,this.type="Group",this.classType=h(i,"classType",p),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(r.ADDED_TO_SCENE,this.addedToScene,this),this.on(r.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,n,r){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===n&&(n=!0),void 0===r&&(r=!0),this.isFull())return null;var o=new this.classType(this.scene,t,e,i,s);return o.addToDisplayList(this.scene.sys.displayList),o.addToUpdateList(),o.visible=n,o.setActive(r),this.add(o),o},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=d[u]).active===i){if(++c===e)break}else l=null;return l?("number"==typeof n&&(l.x=n),"number"==typeof r&&(l.y=r),l):s?this.create(n,r,o,a,h):null},get:function(t,e,i,s,n){return this.getFirst(!1,!0,t,e,i,s,n)},getFirstAlive:function(t,e,i,s,n,r){return this.getFirst(!0,t,e,i,s,n,r)},getFirstDead:function(t,e,i,s,n,r){return this.getFirst(!1,t,e,i,s,n,r)},playAnimation:function(t,e){return s.PlayAnimation(this.children.entries,t,e),this},isFull:function(){return-1!==this.maxSize&&this.children.size>=this.maxSize},countActive:function(t){void 0===t&&(t=!0);for(var e=0,i=0;i{var s=i(44603),n=i(26479);s.register("group",(function(t){return new n(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(83419),n=i(31401),r=i(95643),o=i(59819),a=new s({Extends:r,Mixins:[n.Alpha,n.BlendMode,n.Depth,n.Flip,n.GetBounds,n.Mask,n.Origin,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Size,n.TextureCrop,n.Tint,n.Transform,n.Visible,o],initialize:function(t,e,i,s,n){r.call(this,t,"Image"),this._crop=this.resetCropObject(),this.setTexture(s,n),this.setPosition(e,i),this.setSizeToFrame(),this.setOriginFromFrame(),this.initPipeline(),this.initPostPipeline(!0)}});t.exports=a},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),n=i(44603),r=i(23568),o=i(88571);n.register("image",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"frame",null),a=new o(this.scene,0,0,i,n);return void 0!==e&&(t.add=e),s(this.scene,a,t),a}))},2117:(t,e,i)=>{var s=i(88571);i(39429).register("image",(function(t,e,i,n){return this.displayList.add(new s(this.scene,t,e,i,n))}))},59819:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(99517),r=i(40652),t.exports={renderWebGL:n,renderCanvas:r}},99517:t=>{t.exports=function(t,e,i,s){i.addToRenderList(e),this.pipeline.batchSprite(e,i,s)}},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),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),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),StaticBitmapText:i(57336),Text:i(71259),TileSprite:i(14167),Zone:i(95261),Video:i(11511)}};s.Shader=i(20071),s.Mesh=i(4703),s.NineSlice=i(28103),s.PointLight=i(80321),s.Plane=i(33663),s.Factories.Shader=i(74177),s.Factories.Mesh=i(9225),s.Factories.NineSlice=i(47521),s.Factories.PointLight=i(71255),s.Factories.Plane=i(30985),s.Creators.Shader=i(54935),s.Creators.Mesh=i(20527),s.Creators.NineSlice=i(28279),s.Creators.PointLight=i(39829),s.Creators.Plane=i(56015),s.Light=i(41432),s.LightsManager=i(61356),s.LightsPlugin=i(88992),t.exports=s},93595:(t,e,i)=>{var s=i(10312),n=i(83419),r=i(31401),o=i(53774),a=i(45893),h=i(50792),l=i(51708),u=i(73162),c=i(33963),d=i(44594),f=i(19186),p=new n({Extends:u,Mixins:[r.AlphaSingle,r.BlendMode,r.Depth,r.Mask,r.PostPipeline,r.Visible,h,c],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.initPostPipeline(),this.clearAlpha(),this.setBlendMode(s.SKIP_CHECK),e&&this.add(e),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(){return this},disableInteractive:function(){return this},removeInteractive:function(){return this},addedToScene:function(){},removedFromScene:function(){},update:function(){},toJSON:function(){return o(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(d.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(d.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(d.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(d.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.resetPostPipeline(!0),this.displayList&&(this.displayList.remove(this,!0,!1),this.displayList.queueDepthSort()),this.data&&(this.data.destroy(),this.data=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 n=-1!==e.blendMode;n||t.setBlendMode(0);var r=e._alpha;e.mask&&e.mask.preRenderCanvas(t,null,i);for(var o=0;o{var s=i(25305),n=i(93595),r=i(44603),o=i(23568);r.register("layer",(function(t,e){void 0===t&&(t={});var i=o(t,"children",null),r=new n(this.scene,i);return void 0!==e&&(t.add=e),s(this.scene,r,t),r}))},20005:(t,e,i)=>{var s=i(93595);i(39429).register("layer",(function(t){return this.displayList.add(new s(this.scene,t))}))},33963:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(15869),r=i(2956),t.exports={renderWebGL:n,renderCanvas:r}},15869:t=>{t.exports=function(t,e,i){var s=e.list,n=s.length;if(0!==n){e.depthSort(),t.pipelines.preBatch(e);var r=-1!==e.blendMode;r||t.setBlendMode(0);for(var o=e.alpha,a=0;a{var s=i(96503),n=i(83419),r=i(31401),o=i(51767),a=i(70554),h=new n({Extends:s,Mixins:[r.Origin,r.ScrollFactor,r.Visible],initialize:function(t,e,i,n,r,a,h){s.call(this,t,e,i),this.color=new o(n,r,a),this.intensity=h,this.renderFlags=15,this.cameraFilter=0,this.setScrollFactor(1,1),this.setOrigin(),this.setDisplayOrigin(i)},displayWidth:{get:function(){return this.diameter},set:function(t){this.diameter=t}},displayHeight:{get:function(){return this.diameter},set:function(t){this.diameter=t}},width:{get:function(){return this.diameter},set:function(t){this.diameter=t}},height:{get:function(){return this.diameter},set:function(t){this.diameter=t}},willRender:function(t){return!(h.RENDER_MASK!==this.renderFlags||0!==this.cameraFilter&&this.cameraFilter&t.id)},setColor:function(t){var e=a.getFloatsFromUintRGB(t);return this.color.set(e[0],e[1],e[2]),this},setIntensity:function(t){return this.intensity=t,this},setRadius:function(t){return this.radius=t,this}});h.RENDER_MASK=15,t.exports=h},61356:(t,e,i)=>{var s=i(81491),n=i(83419),r=i(20339),o=i(41432),a=i(80321),h=i(51767),l=i(19133),u=i(19186),c=i(70554),d=new n({initialize:function(){this.lights=[],this.ambientColor=new h(.1,.1,.1),this.active=!1,this.maxLights=-1,this.visibleLights=0},addPointLight:function(t,e,i,s,n,r){return this.systems.displayList.add(new a(this.scene,t,e,i,s,n,r))},enable:function(){return-1===this.maxLights&&(this.maxLights=this.systems.renderer.config.maxLights),this.active=!0,this},disable:function(){return this.active=!1,this},getLights:function(t){for(var e=this.lights,i=t.worldView,n=[],o=0;othis.maxLights&&(u(n,this.sortByDistance),n=n.slice(0,this.maxLights)),this.visibleLights=n.length,n},sortByDistance:function(t,e){return t.distance>=e.distance},setAmbientColor:function(t){var e=c.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,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=128),void 0===s&&(s=16777215),void 0===n&&(n=1);var r=c.getFloatsFromUintRGB(s),a=new o(t,e,i,r[0],r[1],r[2],n);return this.lights.push(a),a},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=d},88992:(t,e,i)=>{var s=i(83419),n=i(61356),r=i(37277),o=i(44594),a=new s({Extends:n,initialize:function(t){this.scene=t,this.systems=t.sys,t.sys.settings.isBooted||t.sys.events.once(o.BOOT,this.boot,this),n.call(this)},boot:function(){var t=this.systems.events;t.on(o.SHUTDOWN,this.shutdown,this),t.on(o.DESTROY,this.destroy,this)},destroy:function(){this.shutdown(),this.scene=void 0,this.systems=void 0}});r.register("LightsPlugin",a,"lights"),t.exports=a},4703:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(39506),o=i(83997),a=i(95643),h=i(34684),l=i(92515),u=i(91296),c=i(37867),d=i(29807),f=i(43396),p=i(19186),v=i(25836),g=i(39318),m=new s({Extends:a,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Mask,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Size,n.Texture,n.Transform,n.Visible,d],initialize:function(t,e,i,s,n,r,o,h,l,u,d,f){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s="__WHITE"),a.call(this,t,"Mesh"),this.faces=[],this.vertices=[],this.tintFill=!1,this.debugCallback=null,this.debugGraphic=null,this.hideCCW=!0,this.modelPosition=new v,this.modelScale=new v(1,1,1),this.modelRotation=new v,this.dirtyCache=[0,0,0,0,0,0,0,0,0,0,0,0],this.transformMatrix=new c,this.viewPosition=new v,this.viewMatrix=new c,this.projectionMatrix=new c,this.totalRendered=0,this.totalFrame=0,this.ignoreDirtyCache=!1,this.fov,this.displayOriginX=0,this.displayOriginY=0;var p=t.sys.renderer;this.setPosition(e,i),this.setTexture(s,n),this.setSize(p.width,p.height),this.initPipeline(),this.initPostPipeline(),this.setPerspective(p.width,p.height),r&&this.addVertices(r,o,h,l,u,d,f)},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},panX:function(t){return this.viewPosition.addScale(v.LEFT,t),this.dirtyCache[10]=1,this},panY:function(t){return this.viewPosition.y+=v.DOWN.y*t,this.dirtyCache[10]=1,this},panZ:function(t){return this.viewPosition.z+=t,this.dirtyCache[10]=1,this},setPerspective:function(t,e,i,s,n){return void 0===i&&(i=45),void 0===s&&(s=.01),void 0===n&&(n=1e3),this.fov=i,this.projectionMatrix.perspective(r(i),t/e,s,n),this.dirtyCache[10]=1,this.dirtyCache[11]=0,this},setOrtho:function(t,e,i,s){return void 0===t&&(t=this.scene.sys.renderer.getAspectRatio()),void 0===e&&(e=1),void 0===i&&(i=-1e3),void 0===s&&(s=1e3),this.fov=0,this.projectionMatrix.ortho(-t,t,-e,e,i,s),this.dirtyCache[10]=1,this.dirtyCache[11]=1,this},clear:function(){return this.faces.forEach((function(t){t.destroy()})),this.faces=[],this.vertices=[],this},addVerticesFromObj:function(t,e,i,s,n,r,o,a,l){var u,c=this.scene.sys.cache.obj.get(t);return c&&(u=h(c,this,e,i,s,n,r,o,a,l)),u&&0!==u.verts.length||console.warn("Mesh.addVerticesFromObj data empty:",t),this},sortByDepth:function(t,e){return t.depth-e.depth},depthSort:function(){return p(this.faces,this.sortByDepth),this},addVertex:function(t,e,i,s,n,r,o){var a=new g(t,e,i,s,n,r,o);return this.vertices.push(a),a},addFace:function(t,e,i){var s=new o(t,e,i);return this.faces.push(s),this.dirtyCache[9]=-1,s},addVertices:function(t,e,i,s,n,r,o){var a=l(t,e,i,s,n,r,o);return a?(this.faces=this.faces.concat(a.faces),this.vertices=this.vertices.concat(a.vertices)):console.warn("Mesh.addVertices data empty or invalid"),this.dirtyCache[9]=-1,this},getFaceCount:function(){return this.faces.length},getVertexCount:function(){return this.vertices.length},getFace:function(t){return this.faces[t]},hasFaceAt:function(t,e,i){void 0===i&&(i=this.scene.sys.cameras.main);for(var s=u(this,i).calc,n=this.faces,r=0;r{t.exports=function(){}},20527:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(35154),a=i(4703);n.register("mesh",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"frame",null),h=o(t,"vertices",[]),l=o(t,"uvs",[]),u=o(t,"indicies",[]),c=o(t,"containsZ",!1),d=o(t,"normals",[]),f=o(t,"colors",16777215),p=o(t,"alphas",1),v=new a(this.scene,0,0,i,n,h,l,u,c,d,f,p);return void 0!==e&&(t.add=e),s(this.scene,v,t),v}))},9225:(t,e,i)=>{var s=i(4703);i(39429).register("mesh",(function(t,e,i,n,r,o,a,h,l,u,c){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a,h,l,u,c))}))},29807:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(48833),r=i(36488),t.exports={renderWebGL:n,renderCanvas:r}},48833:(t,e,i)=>{var s=i(91296);t.exports=function(t,e,i,n){var r=e.faces,o=r.length;if(0!==o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline,e),h=s(e,i,n).calc;t.pipelines.preBatch(e);for(var l=a.setGameObject(e),u=a.vertexViewF32,c=a.vertexViewU32,d=a.vertexCount*a.currentShader.vertexComponentCount-1,f=e.tintFill,p=[],v=e.debugCallback,g=h.a,m=h.b,y=h.c,x=h.d,T=h.e,w=h.f,b=e.viewPosition.z,S=e.hideCCW,E=i.roundPixels,A=i.alpha*e.alpha,C=0,_=0;_{var s=i(83419),n=i(31401),r=i(95643),o=i(78023),a=i(39318),h=new s({Extends:r,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.GetBounds,n.Mask,n.Origin,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Texture,n.Transform,n.Visible,o],initialize:function(t,e,i,s,n,o,h,l,u,c,d){r.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.tint=16777215,this.tintFill=!1;var f=t.textures.getFrame(s,n);this.is3Slice=!c&&!d,f&&f.scale9&&(this.is3Slice=f.is3Slice);for(var p=this.is3Slice?18:54,v=0;v{var s=i(25305),n=i(44603),r=i(23568),o=i(35154),a=i(28103);n.register("nineslice",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"frame",null),h=o(t,"width",256),l=o(t,"height",256),u=o(t,"leftWidth",10),c=o(t,"rightWidth",10),d=o(t,"topHeight",0),f=o(t,"bottomHeight",0),p=new a(this.scene,0,0,i,n,h,l,u,c,d,f);return void 0!==e&&(t.add=e),s(this.scene,p,t),p}))},47521:(t,e,i)=>{var s=i(28103);i(39429).register("nineslice",(function(t,e,i,n,r,o,a,h,l,u){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a,h,l,u))}))},78023:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(52230),t.exports={renderWebGL:n,renderCanvas:r}},52230:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){var o=e.vertices,a=o.length;if(0!==a){i.addToRenderList(e);var h=t.pipelines.set(e.pipeline,e),l=s(e,i,r,!1).calc;t.pipelines.preBatch(e);var u=h.setGameObject(e),c=h.vertexViewF32,d=h.vertexViewU32,f=h.vertexCount*h.currentShader.vertexComponentCount-1,p=i.roundPixels,v=e.tintFill,g=i.alpha*e.alpha,m=n.getTintAppendFloatAlpha(e.tint,g),y=h.vertexAvailable(),x=-1;y{var s=i(83419),n=i(44777),r=i(37589),o=i(6113),a=i(91389),h=i(90664),l=new s({Extends:n,initialize:function(t){n.call(this,t,null,!1),this.active=!1,this.easeName="Linear",this.r=[],this.g=[],this.b=[]},getMethod:function(){return null===this.propertyValue?0:9},setMethods:function(){var t=this.propertyValue,e=t,i=this.defaultEmit,s=this.defaultUpdate;if(9===this.method){this.start=t[0],this.ease=o("Linear"),this.interpolation=a("linear"),i=this.easedValueEmit,s=this.easeValueUpdate,e=t[0],this.active=!0,this.r.length=0,this.g.length=0,this.b.length=0;for(var n=0;n{var s=i(30976),n=i(45319),r=i(83419),o=i(99472),a=i(6113),h=i(95540),l=i(91389),u=i(77720),c=i(15994),d=new r({initialize:function(t,e,i){void 0===i&&(i=!1),this.propertyKey=t,this.propertyValue=e,this.defaultValue=e,this.steps=0,this.counter=0,this.yoyo=!1,this.direction=0,this.start=0,this.current=0,this.end=0,this.ease=null,this.interpolation=null,this.emitOnly=i,this.onEmit=this.defaultEmit,this.onUpdate=this.defaultUpdate,this.active=!0,this.method=0,this._onEmit,this._onUpdate},loadConfig:function(t,e){void 0===t&&(t={}),e&&(this.propertyKey=e),this.propertyValue=h(t,this.propertyKey,this.defaultValue),this.method=this.getMethod(),this.setMethods(),this.emitOnly&&(this.onUpdate=this.defaultUpdate)},toJSON:function(){return JSON.stringify(this.propertyValue)},onChange:function(t){var e;switch(this.method){case 1:case 3:case 8:e=t;break;case 2:this.propertyValue.indexOf(t)>=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=n(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 n=this.has(t,"ease")?t.ease:"Linear";this.ease=a(n,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 r=t.random;Array.isArray(r)&&(this.start=r[0],this.end=r[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 o=this.has(t,"ease")?t.ease:"Linear";this.ease=a(o,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 n=this._onUpdate(t,e,i,s);return this.current=n,n},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=o(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=c(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,n=t.data[e],r=this.ease(i);return s=this.interpolation?this.interpolation(this.start,r):(n.max-n.min)*r+n.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=d},24502:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(20286),o=new s({Extends:r,initialize:function(t,e,i,s,o){if("object"==typeof t){var a=t;t=n(a,"x",0),e=n(a,"y",0),i=n(a,"power",0),s=n(a,"epsilon",100),o=n(a,"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===o&&(o=50);r.call(this,t,e,!0),this._gravity=o,this._power=i*o,this._epsilon=s*s},update:function(t,e){var i=this.x-t.x,s=this.y-t.y,n=i*i+s*s;if(0!==n){var r=Math.sqrt(n);n{var s=i(9674),n=i(45319),r=i(83419),o=i(39506),a=i(87841),h=i(11520),l=i(26099),u=new r({initialize:function(t){this.emitter=t,this.texture=null,this.frame=null,this.x=0,this.y=0,this.worldPosition=new l,this.velocityX=0,this.velocityY=0,this.accelerationX=0,this.accelerationY=0,this.maxVelocityX=1e4,this.maxVelocityY=1e4,this.bounce=0,this.scaleX=1,this.scaleY=1,this.alpha=1,this.angle=0,this.rotation=0,this.tint=16777215,this.life=1e3,this.lifeCurrent=1e3,this.delayCurrent=0,this.holdCurrent=0,this.lifeT=0,this.data={tint:{min:16777215,max:16777215},alpha:{min:1,max:1},rotate:{min:0,max:0},scaleX:{min:1,max:1},scaleY:{min:1,max:1},x:{min:0,max:0},y:{min:0,max:0},accelerationX:{min:0,max:0},accelerationY:{min:0,max:0},maxVelocityX:{min:0,max:0},maxVelocityY:{min:0,max:0},moveToX:{min:0,max:0},moveToY:{min:0,max:0},bounce:{min:0,max:0}},this.isCropped=!1,this.scene=t.scene,this.anims=null,this.emitter.anims.length>0&&(this.anims=new s(this)),this.bounds=new a},emit:function(t,e,i,s,n,r){return this.emitter.emit(t,e,i,s,n,r)},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,n=i.getAnim();if(n?this.anims.play(n):(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=o(this.angle),i.worldMatrix.transformPoint(this.x,this.y,this.worldPosition),0===this.delayCurrent&&i.getDeathZone(this))return this.lifeCurrent=0,!1;var r=s.speedX.onEmit(this,"speedX"),a=s.speedY.active?s.speedY.onEmit(this,"speedY"):r;if(i.radial){var h=o(s.angle.onEmit(this,"angle"));this.velocityX=Math.cos(h)*Math.abs(r),this.velocityY=Math.sin(h)*Math.abs(a)}else if(i.moveTo){var l=s.moveToX.onEmit(this,"moveToX"),u=s.moveToY.onEmit(this,"moveToY"),c=this.life/1e3;this.velocityX=(l-this.x)/c,this.velocityY=(u-this.y)/c}else this.velocityX=r,this.velocityY=a;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,r=s.ops,a=1-this.lifeCurrent/this.life;if(this.lifeT=a,this.x=r.x.onUpdate(this,"x",a,this.x),this.y=r.y.onUpdate(this,"y",a,this.y),s.moveTo){var h=r.moveToX.onUpdate(this,"moveToX",a,s.moveToX),l=r.moveToY.onUpdate(this,"moveToY",a,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,a),this.scaleX=r.scaleX.onUpdate(this,"scaleX",a,this.scaleX),r.scaleY.active?this.scaleY=r.scaleY.onUpdate(this,"scaleY",a,this.scaleY):this.scaleY=this.scaleX,this.angle=r.rotate.onUpdate(this,"rotate",a,this.angle),this.rotation=o(this.angle),s.getDeathZone(this)?(this.lifeCurrent=0,!0):(this.alpha=n(r.alpha.onUpdate(this,"alpha",a,this.alpha),0,1),r.color.active?this.tint=r.color.onUpdate(this,"color",a,this.tint):this.tint=r.tint.onUpdate(this,"tint",a,this.tint),this.lifeCurrent-=t,this.lifeCurrent<=0&&this.holdCurrent<=0)},computeVelocity:function(t,e,i,s,r){var o=t.ops,a=this.velocityX,h=this.velocityY,l=o.accelerationX.onUpdate(this,"accelerationX",r,this.accelerationX),u=o.accelerationY.onUpdate(this,"accelerationY",r,this.accelerationY),c=o.maxVelocityX.onUpdate(this,"maxVelocityX",r,this.maxVelocityX),d=o.maxVelocityY.onUpdate(this,"maxVelocityY",r,this.maxVelocityY);this.bounce=o.bounce.onUpdate(this,"bounce",r,this.bounce),a+=t.gravityX*i+l*i,h+=t.gravityY*i+u*i,a=n(a,-c,c),h=n(h,-d,d),this.velocityX=a,this.velocityY=h,this.x+=a*i,this.y+=h*i,t.worldMatrix.transformPoint(this.x,this.y,this.worldPosition);for(var f=0;f{var s=i(83419),n=i(20286),r=i(87841),o=new s({Extends:n,initialize:function(t,e,i,s,o,a,h,l){void 0===o&&(o=!0),void 0===a&&(a=!0),void 0===h&&(h=!0),void 0===l&&(l=!0),n.call(this,t,e,!0),this.bounds=new r(t,e,i,s),this.collideLeft=o,this.collideRight=a,this.collideTop=h,this.collideBottom=l},update:function(t){var e=this.bounds,i=-t.bounce,s=t.worldPosition;s.xe.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=o},31600:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(53774),o=i(43459),a=i(26388),h=i(19909),l=i(76472),u=i(44777),c=i(20696),d=i(95643),f=i(95540),p=i(26546),v=i(24502),g=i(69036),m=i(1985),y=i(97022),x=i(86091),T=i(73162),w=i(20074),b=i(269),S=i(56480),E=i(69601),A=i(68875),C=i(87841),_=i(59996),M=i(72905),P=i(90668),R=i(19186),L=i(61340),O=i(26099),F=i(15994),D=["active","advance","blendMode","colorEase","deathCallback","deathCallbackScope","duration","emitCallback","emitCallbackScope","follow","frequency","gravityX","gravityY","maxAliveParticles","maxParticles","name","emitting","particleBringToTop","particleClass","radial","sortCallback","sortOrderAsc","sortProperty","stopAfter","tintFill","timeScale","trackVisible","visible"],I=["accelerationX","accelerationY","alpha","angle","bounce","color","delay","hold","lifespan","maxVelocityX","maxVelocityY","moveToX","moveToY","quantity","rotate","scaleX","scaleY","speedX","speedY","tint","x","y"],k=new s({Extends:d,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Mask,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Texture,n.Transform,n.Visible,P],initialize:function(t,e,i,s,n){d.call(this,t,"ParticleEmitter"),this.particleClass=S,this.config=null,this.ops={accelerationX:new u("accelerationX",0),accelerationY:new u("accelerationY",0),alpha:new u("alpha",1),angle:new u("angle",{min:0,max:360},!0),bounce:new u("bounce",0),color:new l("color"),delay:new u("delay",0,!0),hold:new u("hold",0,!0),lifespan:new u("lifespan",1e3,!0),maxVelocityX:new u("maxVelocityX",1e4),maxVelocityY:new u("maxVelocityY",1e4),moveToX:new u("moveToX",0),moveToY:new u("moveToY",0),quantity:new u("quantity",1,!0),rotate:new u("rotate",0),scaleX:new u("scaleX",1),scaleY:new u("scaleY",1),speedX:new u("speedX",0,!0),speedY:new u("speedY",0,!0),tint:new u("tint",16777215),x:new u("x",0),y:new u("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 O,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 L,this.sortProperty="",this.sortOrderAsc=!0,this.sortCallback=this.depthSortCallback,this.processors=new T(this),this.tintFill=!1,this.initPipeline(),this.initPostPipeline(),this.setPosition(e,i),this.setTexture(s),n&&this.setConfig(n)},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=F(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 n=t;(t=f(n,"anims",null))&&(this.anims=this.anims.concat(t));var r=f(n,"cycle",!1);this.randomAnim=!r,this.animQuantity=f(n,"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,n,r,o,a){if("object"==typeof t){var h=t;t=h.x,e=h.y,i=y(h,"w")?h.w:h.width,s=y(h,"h")?h.h:h.height}return this.addParticleProcessor(new E(t,e,i,s,n,r,o,a))},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 v(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,n=0;n0&&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 R(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,n=this.stopAfter,r=this.follow?this.follow.x+this.followOffset.x:e,o=this.follow?this.follow.y+this.followOffset.y:i,a=0;a0&&(this.stopCounter++,this.stopCounter>=n))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(o=h-1;o>=0;o--){var f=a[o];n.splice(f.index,1),r.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===n.length&&(this.completeFlag=0,this.emit(c.COMPLETE,this))},overlap:function(t){for(var e=this.getWorldTransformMatrix(),i=this.alive,s=i.length,n=[],r=0;r0){var u=0;for(this.skipping=!0;u0&&x(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;t{var s=i(59996),n=i(61340),r=new n,o=new n,a=new n,h=new n;t.exports=function(t,e,i,n){var l=r,u=o,c=a,d=h;n?(d.loadIdentity(),d.multiply(n),d.translate(e.x,e.y),d.rotate(e.rotation),d.scale(e.scaleX,e.scaleY)):d.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var f=t.currentContext,p=i.roundPixels,v=i.alpha,g=e.alpha,m=e.alive,y=m.length,x=e.viewBounds;if(e.visible&&0!==y&&(!x||s(x,i.worldView))){e.sortCallback&&e.depthSort(),i.addToRenderList(e);var T=e.scrollFactorX,w=e.scrollFactorY;f.save(),f.globalCompositeOperation=t.blendModes[e.blendMode];for(var b=0;b0&&C.height>0){var _=-A.halfWidth,M=-A.halfHeight;f.globalAlpha=E,f.save(),u.setToContext(f),p&&(_=Math.round(_),M=Math.round(M)),f.imageSmoothingEnabled=!A.source.scaleMode,f.drawImage(A.source.image,C.x,C.y,C.width,C.height,_,M,C.width,C.height),f.restore()}}}f.restore()}}},92730:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(95540),a=i(31600);n.register("particles",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=o(t,"config",null),h=new a(this.scene,0,0,i);return void 0!==e&&(t.add=e),s(this.scene,h,t),n&&h.setConfig(n),h}))},676:(t,e,i)=>{var s=i(39429),n=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 n(this.scene,t,e,i,s))}))},90668:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(21188),r=i(9871),t.exports={renderWebGL:n,renderCanvas:r}},21188:(t,e,i)=>{var s=i(59996),n=i(61340),r=i(70554),o=new n,a=new n,h=new n,l=new n;t.exports=function(t,e,i,n){var u=t.pipelines.set(e.pipeline),c=o,d=a,f=h,p=l;n?(p.loadIdentity(),p.multiply(n),p.translate(e.x,e.y),p.rotate(e.rotation),p.scale(e.scaleX,e.scaleY)):p.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var v=r.getTintAppendFloatAlpha,g=i.alpha,m=e.alpha;t.pipelines.preBatch(e);var y=e.alive,x=y.length,T=e.viewBounds;if(0!==x&&(!T||s(T,i.worldView))){e.sortCallback&&e.depthSort(),i.addToRenderList(e),c.copyFrom(i.matrix),c.multiplyWithOffset(p,-i.scrollX*e.scrollFactorX,-i.scrollY*e.scrollFactorY),t.setBlendMode(e.blendMode),e.mask&&(e.mask.preRenderWebGL(t,e,i),t.pipelines.set(e.pipeline));for(var w,b,S=e.tintFill,E=0;E{var s=new(i(83419))({initialize:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=!0),this.emitter,this.x=t,this.y=e,this.active=i},update:function(){},destroy:function(){this.emitter=null}});t.exports=s},9774:t=>{t.exports="complete"},812:t=>{t.exports="deathzone"},30522:t=>{t.exports="explode"},96695:t=>{t.exports="start"},18677:t=>{t.exports="stop"},20696:(t,e,i)=>{t.exports={COMPLETE:i(9774),DEATH_ZONE:i(812),EXPLODE:i(30522),START:i(96695),STOP:i(18677)}},18404:(t,e,i)=>{t.exports={EmitterColorOp:i(76472),EmitterOp:i(44777),Events:i(20696),GravityWell:i(24502),Particle:i(56480),ParticleBounds:i(69601),ParticleEmitter:i(31600),ParticleProcessor:i(20286),Zones:i(21024)}},26388:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e){this.source=t,this.killOnEnter=e},willKill:function(t){var e=t.worldPosition,i=this.source.contains(e.x,e.y);return i&&this.killOnEnter||!i&&!this.killOnEnter}});t.exports=s},19909:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i,s,n,r){void 0===s&&(s=!1),void 0===n&&(n=!0),void 0===r&&(r=-1),this.source=t,this.points=[],this.quantity=e,this.stepRate=i,this.yoyo=s,this.counter=-1,this.seamless=n,this._length=0,this._direction=0,this.total=r,this.updateSource()},updateSource:function(){if(this.points=this.source.getPoints(this.quantity,this.stepRate),this.seamless){var t=this.points[0],e=this.points[this.points.length-1];t.x===e.x&&t.y===e.y&&this.points.pop()}var i=this._length;return this._length=this.points.length,this._lengththis._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),n=i(26099),r=new s({initialize:function(t){this.source=t,this._tempVec=new n,this.total=-1},getPoint:function(t){var e=this._tempVec;this.source.getRandomPoint(e),t.x=e.x,t.y=e.y}});t.exports=r},21024:(t,e,i)=>{t.exports={DeathZone:i(26388),EdgeZone:i(19909),RandomZone:i(68875)}},1159:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(68287),o=new s({Extends:r,Mixins:[n.PathFollower],initialize:function(t,e,i,s,n,o){r.call(this,t,i,s,n,o),this.path=e},preUpdate:function(t,e){this.anims.update(t,e),this.pathUpdate(t)}});t.exports=o},90145:(t,e,i)=>{var s=i(39429),n=i(1159);s.register("follower",(function(t,e,i,s,r){var o=new n(this.scene,t,e,i,s,r);return this.displayList.add(o),this.updateList.add(o),o}))},33663:(t,e,i)=>{var s=i(9674),n=i(83419),r=i(48803),o=i(90664),a=i(4703),h=i(45650),l=new n({Extends:a,initialize:function(t,e,i,n,r,o,h,l){n||(n="__DEFAULT"),a.call(this,t,e,i,n,r),this.type="Plane",this.anims=new s(this),this.gridWidth,this.gridHeight,this.isTiled,this._checkerboard=null,this.hideCCW=!1,this.setGridSize(o,h,l),this.setSizeToFrame(!1),this.setViewHeight()},originX:{get:function(){return.5}},originY:{get:function(){return.5}},setGridSize:function(t,e,i){void 0===t&&(t=8),void 0===e&&(e=8),void 0===i&&(i=!1);var s=!1;return i&&(s=!0),this.gridWidth=t,this.gridHeight=e,this.isTiled=i,this.clear(),r({mesh:this,widthSegments:t,heightSegments:e,isOrtho:!1,tile:i,flipY:s}),this},setSizeToFrame:function(t){void 0===t&&(t=!0);var e=this.frame;if(this.setPerspective(this.width/e.width,this.height/e.height),this._checkerboard&&this._checkerboard!==this.texture&&this.removeCheckerboard(),!t)return this;var i,s,n=this.gridWidth,r=this.gridHeight,o=this.vertices,a=e.u0,h=e.u1,l=e.v0,u=e.v1,c=0;if(this.isTiled)for(l=e.v1,u=e.v0,s=0;s7&&c>7?l.push(r.r,r.g,r.b,i):l.push(a.r,a.g,a.b,s);var d=this.scene.sys.textures.addUint8Array(h(),new Uint8Array(l),16,16);return this.removeCheckerboard(),this.setTexture(d),this.setSizeToFrame(),this.setViewHeight(n),this},removeCheckerboard:function(){this._checkerboard&&(this._checkerboard.destroy(),this._checkerboard=null)},play:function(t,e){return this.anims.play(t,e)},playReverse:function(t,e){return this.anims.playReverse(t,e)},playAfterDelay:function(t,e){return this.anims.playAfterDelay(t,e)},playAfterRepeat:function(t,e){return this.anims.playAfterRepeat(t,e)},stop:function(){return this.anims.stop()},stopAfterDelay:function(t){return this.anims.stopAfterDelay(t)},stopAfterRepeat:function(t){return this.anims.stopAfterRepeat(t)},stopOnFrame:function(t){return this.anims.stopOnFrame(t)},preUpdate:function(t,e){a.prototype.preUpdate.call(this,t,e),this.anims.update(t,e)},preDestroy:function(){this.clear(),this.removeCheckerboard(),this.anims.destroy(),this.anims=void 0,this.debugCallback=null,this.debugGraphic=null}});t.exports=l},56015:(t,e,i)=>{var s=i(25305),n=i(13059),r=i(44603),o=i(23568),a=i(35154),h=i(33663);r.register("plane",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),r=o(t,"frame",null),l=a(t,"width",8),u=a(t,"height",8),c=a(t,"tile",!1),d=new h(this.scene,0,0,i,r,l,u,c);void 0!==e&&(t.add=e);var f=a(t,"checkerboard",null);if(f){var p=a(f,"color1",16777215),v=a(f,"color2",255),g=a(f,"alpha1",255),m=a(f,"alpha2",255),y=a(f,"height",128);d.createCheckerboard(p,v,g,m,y)}return s(this.scene,d,t),n(d,t),d}))},30985:(t,e,i)=>{var s=i(33663);i(39429).register("plane",(function(t,e,i,n,r,o,a){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a))}))},80321:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(95643),o=i(30100),a=i(36060),h=i(67277),l=new s({Extends:r,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Mask,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Transform,n.Visible,h],initialize:function(t,e,i,s,n,h,l){void 0===s&&(s=16777215),void 0===n&&(n=128),void 0===h&&(h=1),void 0===l&&(l=.1),r.call(this,t,"PointLight"),this.initPipeline(a.POINTLIGHT_PIPELINE),this.initPostPipeline(),this.setPosition(e,i),this.color=o(s),this.intensity=h,this.attenuation=l,this.width=2*n,this.height=2*n,this._radius=n},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),n=i(44603),r=i(23568),o=i(80321);n.register("pointlight",(function(t,e){void 0===t&&(t={});var i=r(t,"color",16777215),n=r(t,"radius",128),a=r(t,"intensity",1),h=r(t,"attenuation",.1),l=new o(this.scene,0,0,i,n,a,h);return void 0!==e&&(t.add=e),s(this.scene,l,t),l}))},71255:(t,e,i)=>{var s=i(39429),n=i(80321);s.register("pointlight",(function(t,e,i,s,r,o){return this.displayList.add(new n(this.scene,t,e,i,s,r,o))}))},67277:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(57787),t.exports={renderWebGL:n,renderCanvas:r}},57787:(t,e,i)=>{var s=i(91296);t.exports=function(t,e,i,n){i.addToRenderList(e);var r=t.pipelines.set(e.pipeline),o=s(e,i,n).calc,a=e.width,h=e.height,l=-e._radius,u=-e._radius,c=l+a,d=u+h,f=o.getX(0,0),p=o.getY(0,0),v=o.getX(l,u),g=o.getY(l,u),m=o.getX(l,d),y=o.getY(l,d),x=o.getX(c,d),T=o.getY(c,d),w=o.getX(c,u),b=o.getY(c,u);t.pipelines.preBatch(e),r.batchPointLight(e,i,v,g,m,y,x,T,w,b,f,p),t.pipelines.postBatch(e)}},591:(t,e,i)=>{var s=i(83419),n=i(81320),r=i(88571),o=new s({Extends:r,initialize:function(t,e,i,s,o,a){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=32),void 0===o&&(o=32),void 0===a&&(a=!0);var h=new n(t.sys.textures,"",s,o,a);r.call(this,t,e,i,h),this.type="RenderTexture",this.camera=this.texture.camera,this._saved=!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},fill:function(t,e,i,s,n,r){return this.texture.fill(t,e,i,s,n,r),this},clear:function(){return this.texture.clear(),this},stamp:function(t,e,i,s,n){return this.texture.stamp(t,e,i,s,n),this},erase:function(t,e,i){return this.texture.erase(t,e,i),this},draw:function(t,e,i,s,n){return this.texture.draw(t,e,i,s,n),this},drawFrame:function(t,e,i,s,n,r){return this.texture.drawFrame(t,e,i,s,n,r),this},repeat:function(t,e,i,s,n,r,o,a,h){return this.texture.repeat(t,e,i,s,n,r,o,a,h),this},beginDraw:function(){return this.texture.beginDraw(),this},batchDraw:function(t,e,i,s,n){return this.texture.batchDraw(t,e,i,s,n),this},batchDrawFrame:function(t,e,i,s,n,r){return this.texture.batchDrawFrame(t,e,i,s,n,r),this},endDraw:function(t){return this.texture.endDraw(t),this},snapshotArea:function(t,e,i,s,n,r,o){return this.texture.snapshotArea(t,e,i,s,n,r,o),this},snapshot:function(t,e,i){return this.snapshotArea(0,0,this.width,this.height,t,e,i)},snapshotPixel:function(t,e,i){return this.snapshotArea(t,e,1,1,i,"pixel")},preDestroy:function(){this.camera=null,this._saved||this.texture.destroy()}});t.exports=o},34495:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(591);n.register("renderTexture",(function(t,e){void 0===t&&(t={});var i=r(t,"x",0),n=r(t,"y",0),a=r(t,"width",32),h=r(t,"height",32),l=new o(this.scene,i,n,a,h);return void 0!==e&&(t.add=e),s(this.scene,l,t),l}))},60505:(t,e,i)=>{var s=i(39429),n=i(591);s.register("renderTexture",(function(t,e,i,s){return this.displayList.add(new n(this.scene,t,e,i,s))}))},77757:(t,e,i)=>{var s=i(9674),n=i(83419),r=i(31401),o=i(95643),a=i(36060),h=i(38745),l=i(26099),u=new n({Extends:o,Mixins:[r.AlphaSingle,r.BlendMode,r.Depth,r.Flip,r.Mask,r.Pipeline,r.PostPipeline,r.Size,r.Texture,r.Transform,r.Visible,r.ScrollFactor,h],initialize:function(t,e,i,n,r,h,u,c,d){void 0===n&&(n="__DEFAULT"),void 0===h&&(h=2),void 0===u&&(u=!0),o.call(this,t,"Rope"),this.anims=new s(this),this.points=h,this.vertices,this.uv,this.colors,this.alphas,this.tintFill="__DEFAULT"===n,this.dirty=!1,this.horizontal=u,this._flipX=!1,this._flipY=!1,this._perp=new l,this.debugCallback=null,this.debugGraphic=null,this.setTexture(n,r),this.setPosition(e,i),this.setSizeToFrame(),this.initPipeline(a.ROPE_PIPELINE),this.initPostPipeline(),Array.isArray(h)&&this.resizeArrays(h.length),this.setPoints(h,c,d),this.updateVertices()},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},setTintFill:function(t){return void 0===t&&(t=!1),this.tintFill=t,this},setAlphas:function(t,e){var i=this.points.length;if(i<1)return this;var s,n=this.alphas;void 0===t?t=[1]:Array.isArray(t)||void 0!==e||(t=[t]);var r=0;if(void 0!==e)for(s=0;sr&&(o=t[r]),n[r]=o,t.length>r+1&&(o=t[r+1]),n[r+1]=o}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 n=0;if(t.length===e)for(i=0;in&&(r=t[n]),s[n]=r,t.length>n+1&&(r=t[n+1]),s[n+1]=r}return this},setPoints:function(t,e,i){if(void 0===t&&(t=2),"number"==typeof t){var s,n,r,o=t;if(o<2&&(o=2),t=[],this.horizontal)for(r=-this.frame.halfWidth,n=this.frame.width/(o-1),s=0;s{t.exports=function(){}},26209:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(35154),a=i(77757);n.register("rope",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"frame",null),h=r(t,"horizontal",!0),l=o(t,"points",void 0),u=o(t,"colors",void 0),c=o(t,"alphas",void 0),d=new a(this.scene,0,0,i,n,l,h,u,c);return void 0!==e&&(t.add=e),s(this.scene,d,t),d}))},96819:(t,e,i)=>{var s=i(77757);i(39429).register("rope",(function(t,e,i,n,r,o,a,h){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a,h))}))},38745:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(20439),r=i(95262),t.exports={renderWebGL:n,renderCanvas:r}},20439:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.pipelines.set(e.pipeline,e),a=s(e,i,r).calc,h=e.vertices,l=e.uv,u=e.colors,c=e.alphas,d=e.alpha,f=n.getTintAppendFloatAlpha,p=i.roundPixels,v=h.length,g=Math.floor(.5*v);o.flush(),t.pipelines.preBatch(e);var m=o.setGameObject(e),y=o.vertexViewF32,x=o.vertexViewU32,T=o.vertexCount*o.currentShader.vertexComponentCount-1,w=0,b=e.tintFill;e.dirty&&e.updateVertices();for(var S=e.debugCallback,E=[],A=0;A{var s=i(83419),n=i(31401),r=i(95643),o=i(95540),a=i(79291),h=i(61622),l=i(25479),u=i(61340),c=i(95428),d=i(92503),f=new s({Extends:r,Mixins:[n.ComputedSize,n.Depth,n.GetBounds,n.Mask,n.Origin,n.ScrollFactor,n.Transform,n.Visible,l],initialize:function(t,e,i,s,n,o,a,h){void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=128),void 0===o&&(o=128),r.call(this,t,"Shader"),this.blendMode=-1,this.shader;var l=t.sys.renderer;this.renderer=l,this.gl=l.gl,this.vertexData=new ArrayBuffer(2*Float32Array.BYTES_PER_ELEMENT*6),this.vertexBuffer=l.createVertexBuffer(this.vertexData.byteLength,this.gl.STREAM_DRAW),this._deferSetShader=null,this._deferProjOrtho=null,this.program=null,this.bytes=new Uint8Array(this.vertexData),this.vertexViewF32=new Float32Array(this.vertexData),this._tempMatrix1=new u,this._tempMatrix2=new u,this._tempMatrix3=new u,this.viewMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.projectionMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.uniforms={},this.pointer=null,this._rendererWidth=l.width,this._rendererHeight=l.height,this._textureCount=0,this.framebuffer=null,this.glTexture=null,this.renderToTexture=!1,this.texture=null,this.setPosition(i,s),this.setSize(n,o),this.setOrigin(.5,.5),this.setShader(e,a,h),this.renderer.on(d.RESTORE_WEBGL,this.onContextRestored,this)},willRender:function(t){return!!this.renderToTexture||!(r.RENDER_MASK!==this.renderFlags||0!==this.cameraFilter&&this.cameraFilter&t.id)},setRenderToTexture:function(t,e){if(void 0===e&&(e=!1),!this.renderToTexture){var i=this.width,s=this.height,n=this.renderer;this.glTexture=n.createTextureFromSource(null,i,s,0),this.framebuffer=n.createFramebuffer(i,s,this.glTexture,!1),this._rendererWidth=i,this._rendererHeight=s,this.renderToTexture=!0,this.projOrtho(0,this.width,this.height,0),t&&(this.texture=this.scene.sys.textures.addGLTexture(t,this.glTexture))}return this.shader&&(n.pipelines.clear(),this.load(),this.flush(),n.pipelines.rebind()),this},setShader:function(t,e,i){if(this.renderer.contextLost)return this._deferSetShader={key:t,textures:e,textureData:i},this;if(void 0===e&&(e=[]),"string"==typeof t){var s=this.scene.sys.cache.shader;if(!s.has(t))return console.warn("Shader missing: "+t),this;this.shader=s.get(t)}else this.shader=t;var n=this.gl,r=this.renderer;this.program&&r.deleteProgram(this.program);var o=r.createProgram(this.shader.vertexSrc,this.shader.fragmentSrc);n.uniformMatrix4fv(n.getUniformLocation(o.webGLProgram,"uViewMatrix"),!1,this.viewMatrix),n.uniformMatrix4fv(n.getUniformLocation(o.webGLProgram,"uProjectionMatrix"),!1,this.projectionMatrix),n.uniform2f(n.getUniformLocation(o.webGLProgram,"uResolution"),this.width,this.height),this.program=o;var h=new Date,l={resolution:{type:"2f",value:{x:this.width,y:this.height}},time:{type:"1f",value:0},mouse:{type:"2f",value:{x:this.width/2,y:this.height/2}},date:{type:"4fv",value:[h.getFullYear(),h.getMonth(),h.getDate(),60*h.getHours()*60+60*h.getMinutes()+h.getSeconds()]},sampleRate:{type:"1f",value:44100},iChannel0:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel1:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel2:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel3:{type:"sampler2D",value:null,textureData:{repeat:!0}}};this.shader.uniforms?this.uniforms=a(!0,{},this.shader.uniforms,l):this.uniforms=l;for(var u=0;u<4;u++)e[u]&&this.setSampler2D("iChannel"+u,e[u],u,i);return this.initUniforms(),this.projOrtho(0,this._rendererWidth,this._rendererHeight,0),this},setPointer:function(t){return this.pointer=t,this},projOrtho:function(t,e,i,s){if(this.renderer.contextLost)this._deferProjOrtho={left:t,right:e,bottom:i,top:s};else{var n=1/(t-e),r=1/(i-s),o=this.projectionMatrix;o[0]=-2*n,o[5]=-2*r,o[10]=-.001,o[12]=(t+e)*n,o[13]=(s+i)*r,o[14]=-0;var a=this.program,h=this.gl;this.renderer.setProgram(a),h.uniformMatrix4fv(h.getUniformLocation(a.webGLProgram,"uProjectionMatrix"),!1,this.projectionMatrix),this._rendererWidth=e,this._rendererHeight=i}},initUniforms:function(){var t=this.renderer.glFuncMap,e=this.program;for(var i in this._textureCount=0,this.uniforms){var s=this.uniforms[i],n=s.type,r=t[n];s.uniformLocation=this.renderer.createUniformLocation(e,i),"sampler2D"!==n&&(s.glMatrix=r.matrix,s.glValueLength=r.length,s.glFunc=r.func)}},setSampler2DBuffer:function(t,e,i,s,n,r){void 0===n&&(n=0),void 0===r&&(r={});var o=this.uniforms[t];return o.value=e,r.width=i,r.height=s,o.textureData=r,this._textureCount=n,this.initSampler2D(o),this},setSampler2D:function(t,e,i,s){void 0===i&&(i=0);var n=this.scene.sys.textures;if(n.exists(e)){var r=n.getFrame(e);if(r.glTexture&&r.glTexture.isRenderTexture)return this.setSampler2DBuffer(t,r.glTexture,r.width,r.height,i,s);var o=this.uniforms[t],a=r.source;o.textureKey=e,o.source=a.image,o.value=r.glTexture,a.isGLTexture&&(s||(s={}),s.width=a.width,s.height=a.height),s&&(o.textureData=s),this._textureCount=i,this.initSampler2D(o)}return this},setUniform:function(t,e){return h(this.uniforms,t,e),this},getUniform:function(t){return o(this.uniforms,t,null)},setChannel0:function(t,e){return this.setSampler2D("iChannel0",t,0,e)},setChannel1:function(t,e){return this.setSampler2D("iChannel1",t,1,e)},setChannel2:function(t,e){return this.setSampler2D("iChannel2",t,2,e)},setChannel3:function(t,e){return this.setSampler2D("iChannel3",t,3,e)},initSampler2D:function(t){if(t.value){var e=t.textureData;if(e&&!t.value.isRenderTexture){var i=this.gl,s=t.value,n=i[o(e,"magFilter","linear").toUpperCase()],r=i[o(e,"minFilter","linear").toUpperCase()],a=i[o(e,"wrapS","repeat").toUpperCase()],h=i[o(e,"wrapT","repeat").toUpperCase()],l=i[o(e,"format","rgba").toUpperCase()],u=o(e,"flipY",!1),c=o(e,"width",s.width),d=o(e,"height",s.height),f=o(e,"source",s.pixels);e.repeat&&(a=i.REPEAT,h=i.REPEAT),e.width&&(f=null),s.update(f,c,d,u,a,h,r,n,l)}this.renderer.setProgram(this.program),this._textureCount++}},syncUniforms:function(){var t,e,i,s,n,r=this.gl,o=this.uniforms,a=0;for(var h in o)i=(t=o[h]).glFunc,e=t.glValueLength,s=t.uniformLocation,null!==(n=t.value)&&(1===e?t.glMatrix?i.call(r,s.webGLUniformLocation,t.transpose,n):i.call(r,s.webGLUniformLocation,n):2===e?i.call(r,s.webGLUniformLocation,n.x,n.y):3===e?i.call(r,s.webGLUniformLocation,n.x,n.y,n.z):4===e?i.call(r,s.webGLUniformLocation,n.x,n.y,n.z,n.w):"sampler2D"===t.type&&(r.activeTexture(r.TEXTURE0+a),r.bindTexture(r.TEXTURE_2D,n.webGLTexture),r.uniform1i(s.webGLUniformLocation,a),a++))},load:function(t){var e=this.gl,i=this.width,s=this.height,n=this.renderer,r=this.program,o=this.viewMatrix;if(!this.renderToTexture){var a=-this._displayOriginX,h=-this._displayOriginY;o[0]=t[0],o[1]=t[1],o[4]=t[2],o[5]=t[3],o[8]=t[4],o[9]=t[5],o[12]=o[0]*a+o[4]*h,o[13]=o[1]*a+o[5]*h}e.useProgram(r.webGLProgram),e.uniformMatrix4fv(e.getUniformLocation(r.webGLProgram,"uViewMatrix"),!1,o),e.uniformMatrix4fv(e.getUniformLocation(r.webGLProgram,"uProjectionMatrix"),!1,this.projectionMatrix),e.uniform2f(e.getUniformLocation(r.webGLProgram,"uResolution"),this.width,this.height);var l=this.uniforms,u=l.resolution;u.value.x=i,u.value.y=s,l.time.value=n.game.loop.getDuration();var c=this.pointer;if(c){var d=l.mouse,f=c.x/i,p=1-c.y/s;d.value.x=f.toFixed(2),d.value.y=p.toFixed(2)}this.syncUniforms()},flush:function(){var t=this.width,e=this.height,i=this.program,s=this.gl,n=this.vertexBuffer,r=this.renderer,o=2*Float32Array.BYTES_PER_ELEMENT;this.renderToTexture&&(r.setFramebuffer(this.framebuffer),s.clearColor(0,0,0,0),s.clear(s.COLOR_BUFFER_BIT)),s.bindBuffer(s.ARRAY_BUFFER,n.webGLBuffer);var a=s.getAttribLocation(i.webGLProgram,"inPosition");-1!==a&&(s.enableVertexAttribArray(a),s.vertexAttribPointer(a,2,s.FLOAT,!1,o,0));var h=this.vertexViewF32;h[3]=e,h[4]=t,h[5]=e,h[8]=t,h[9]=e,h[10]=t;s.bufferSubData(s.ARRAY_BUFFER,0,this.bytes.subarray(0,6*o)),s.drawArrays(s.TRIANGLES,0,6),this.renderToTexture&&r.setFramebuffer(null,!1)},setAlpha:function(){},setBlendMode:function(){},onContextRestored:function(){if(null!==this._deferSetShader){var t=this._deferSetShader.key,e=this._deferSetShader.textures,i=this._deferSetShader.textureData;this._deferSetShader=null,this.setShader(t,e,i)}if(null!==this._deferProjOrtho){var s=this._deferProjOrtho.left,n=this._deferProjOrtho.right,r=this._deferProjOrtho.bottom,o=this._deferProjOrtho.top;this._deferProjOrtho=null,this.projOrtho(s,n,r,o)}},preDestroy:function(){var t=this.renderer;t.off(d.RESTORE_WEBGL,this.onContextRestored,this),t.deleteProgram(this.program),t.deleteBuffer(this.vertexBuffer),this.renderToTexture&&(t.deleteFramebuffer(this.framebuffer),this.texture.destroy(),this.framebuffer=null,this.glTexture=null,this.texture=null),c(this.uniforms,(function(e){t.deleteUniformLocation(e.uniformLocation),e.uniformLocation=null}))}});t.exports=f},80464:t=>{t.exports=function(){}},54935:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(20071);n.register("shader",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"x",0),a=r(t,"y",0),h=r(t,"width",128),l=r(t,"height",128),u=new o(this.scene,i,n,a,h,l);return void 0!==e&&(t.add=e),s(this.scene,u,t),u}))},74177:(t,e,i)=>{var s=i(20071);i(39429).register("shader",(function(t,e,i,n,r,o,a){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a))}))},25479:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(19257),r=i(80464),t.exports={renderWebGL:n,renderCanvas:r}},19257:(t,e,i)=>{var s=i(91296);t.exports=function(t,e,i,n){if(e.shader){if(i.addToRenderList(e),t.pipelines.clear(),e.renderToTexture)e.load(),e.flush();else{var r=s(e,i,n).calc;t.width===e._rendererWidth&&t.height===e._rendererHeight||e.projOrtho(0,t.width,t.height,0),e.load(r.matrix),e.flush()}t.pipelines.rebind()}}},10441:(t,e,i)=>{var s=i(70554);t.exports=function(t,e,i,n,r,o){for(var a=s.getTintAppendFloatAlpha(i.fillColor,i.fillAlpha*n),h=i.pathData,l=i.pathIndexes,u=0;u{t.exports=function(t,e,i,s){var n=i||e.fillColor,r=s||e.fillAlpha,o=(16711680&n)>>>16,a=(65280&n)>>>8,h=255&n;t.fillStyle="rgba("+o+","+a+","+h+","+r+")"}},75177:t=>{t.exports=function(t,e,i,s){var n=i||e.strokeColor,r=s||e.strokeAlpha,o=(16711680&n)>>>16,a=(65280&n)>>>8,h=255&n;t.strokeStyle="rgba("+o+","+a+","+h+","+r+")",t.lineWidth=e.lineWidth}},17803:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(95643),o=i(23031),a=new s({Extends:r,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.GetBounds,n.Mask,n.Origin,n.Pipeline,n.PostPipeline,n.ScrollFactor,n.Transform,n.Visible],initialize:function(t,e,i){void 0===e&&(e="Shape"),r.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.initPipeline(),this.initPostPipeline()},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=a},34682:(t,e,i)=>{var s=i(70554);t.exports=function(t,e,i,n,r){var o=t.strokeTint,a=s.getTintAppendFloatAlpha(e.strokeColor,e.strokeAlpha*i);o.TL=a,o.TR=a,o.BL=a,o.BR=a;var h=e.pathData,l=h.length-1,u=e.lineWidth,c=u/2,d=h[0]-n,f=h[1]-r;e.closePath||(l-=2);for(var p=2;p{var s=i(13609),n=i(83419),r=i(39506),o=i(94811),a=i(96503),h=i(36383),l=i(17803),u=new n({Extends:l,Mixins:[s],initialize:function(t,e,i,s,n,r,o,h,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=128),void 0===n&&(n=0),void 0===r&&(r=360),void 0===o&&(o=!1),l.call(this,t,"Arc",new a(0,0,s)),this._startAngle=n,this._endAngle=r,this._anticlockwise=o,this._iterations=.01,this.setPosition(e,i);var c=2*this.geom.radius;this.setSize(c,c),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=r(this._startAngle),n=r(this._endAngle),a=i,l=i;n-=s,this._anticlockwise?n<-h.PI2?n=-h.PI2:n>0&&(n=-h.PI2+n%h.PI2):n>h.PI2?n=h.PI2:n<0&&(n=h.PI2+n%h.PI2);for(var u,c=[a+Math.cos(s)*i,l+Math.sin(s)*i];e<1;)u=n*e+s,c.push(a+Math.cos(u)*i,l+Math.sin(u)*i),e+=t;return u=n+s,c.push(a+Math.cos(u)*i,l+Math.sin(u)*i),c.push(a+Math.cos(s)*i,l+Math.sin(s)*i),this.pathIndexes=o(c),this.pathData=c,this}});t.exports=u},42542:(t,e,i)=>{var s=i(39506),n=i(65960),r=i(75177),o=i(20926);t.exports=function(t,e,i,a){i.addToRenderList(e);var h=t.currentContext;if(o(t,h,e,i,a)){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&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},42563:(t,e,i)=>{var s=i(23629),n=i(39429);n.register("arc",(function(t,e,i,n,r,o,a,h){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a,h))})),n.register("circle",(function(t,e,i,n,r){return this.displayList.add(new s(this.scene,t,e,i,0,360,!1,n,r))}))},13609:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(41447),r=i(42542),t.exports={renderWebGL:n,renderCanvas:r}},41447:(t,e,i)=>{var s=i(91296),n=i(10441),r=i(34682);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=s(e,i,o),l=a.calcMatrix.copyFrom(h.calc),u=e._displayOriginX,c=e._displayOriginY,d=i.alpha*e.alpha;t.pipelines.preBatch(e),e.isFilled&&n(a,l,e,d,u,c),e.isStroked&&r(a,e,d,u,c),t.pipelines.postBatch(e)}},89:(t,e,i)=>{var s=i(83419),n=i(33141),r=i(94811),o=i(87841),a=i(17803),h=new s({Extends:a,Mixins:[n],initialize:function(t,e,i,s,n,r){void 0===e&&(e=0),void 0===i&&(i=0),a.call(this,t,"Curve",s),this._smoothness=32,this._curveBounds=new o,this.closePath=!1,this.setPosition(e,i),void 0!==n&&this.setFillStyle(n,r),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),n=0;n{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=e._displayOriginX+e._curveBounds.x,l=e._displayOriginY+e._curveBounds.y,u=e.pathData,c=u.length-1,d=u[0]-h,f=u[1]-l;a.beginPath(),a.moveTo(d,f),e.closePath||(c-=2);for(var p=2;p{var s=i(39429),n=i(89);s.register("curve",(function(t,e,i,s,r){return this.displayList.add(new n(this.scene,t,e,i,s,r))}))},33141:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(53987),r=i(3170),t.exports={renderWebGL:n,renderCanvas:r}},53987:(t,e,i)=>{var s=i(10441),n=i(91296),r=i(34682);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=n(e,i,o),l=a.calcMatrix.copyFrom(h.calc),u=e._displayOriginX+e._curveBounds.x,c=e._displayOriginY+e._curveBounds.y,d=i.alpha*e.alpha;t.pipelines.preBatch(e),e.isFilled&&s(a,l,e,d,u,c),e.isStroked&&r(a,e,d,u,c),t.pipelines.postBatch(e)}},19921:(t,e,i)=>{var s=i(83419),n=i(94811),r=i(54205),o=i(8497),a=i(17803),h=new s({Extends:a,Mixins:[r],initialize:function(t,e,i,s,n,r,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=128),void 0===n&&(n=128),a.call(this,t,"Ellipse",new o(s/2,n/2,s,n)),this._smoothness=64,this.setPosition(e,i),this.width=s,this.height=n,void 0!==r&&this.setFillStyle(r,h),this.updateDisplayOrigin(),this.updateData()},smoothness:{get:function(){return this._smoothness},set:function(t){this._smoothness=t,this.updateData()}},setSize:function(t,e){return this.width=t,this.height=e,this.geom.setPosition(t/2,e/2),this.geom.setSize(t,e),this.updateDisplayOrigin(),this.updateData()},setSmoothness:function(t){return this._smoothness=t,this.updateData()},updateData:function(){for(var t=[],e=this.geom.getPoints(this._smoothness),i=0;i{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=e._displayOriginX,l=e._displayOriginY,u=e.pathData,c=u.length-1,d=u[0]-h,f=u[1]-l;a.beginPath(),a.moveTo(d,f),e.closePath||(c-=2);for(var p=2;p{var s=i(19921);i(39429).register("ellipse",(function(t,e,i,n,r,o){return this.displayList.add(new s(this.scene,t,e,i,n,r,o))}))},54205:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(19467),r=i(7930),t.exports={renderWebGL:n,renderCanvas:r}},19467:(t,e,i)=>{var s=i(10441),n=i(91296),r=i(34682);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=n(e,i,o),l=a.calcMatrix.copyFrom(h.calc),u=e._displayOriginX,c=e._displayOriginY,d=i.alpha*e.alpha;t.pipelines.preBatch(e),e.isFilled&&s(a,l,e,d,u,c),e.isStroked&&r(a,e,d,u,c),t.pipelines.postBatch(e)}},30479:(t,e,i)=>{var s=i(83419),n=i(17803),r=i(26015),o=new s({Extends:n,Mixins:[r],initialize:function(t,e,i,s,r,o,a,h,l,u,c){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=128),void 0===r&&(r=128),void 0===o&&(o=32),void 0===a&&(a=32),n.call(this,t,"Grid",null),this.cellWidth=o,this.cellHeight=a,this.showCells=!0,this.outlineFillColor=0,this.outlineFillAlpha=0,this.showOutline=!0,this.showAltCells=!1,this.altFillColor,this.altFillAlpha,this.setPosition(e,i),this.setSize(s,r),this.setFillStyle(h,l),void 0!==u&&this.setOutlineStyle(u,c),this.updateDisplayOrigin()},setFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showCells=!1:(this.fillColor=t,this.fillAlpha=e,this.showCells=!0),this},setAltFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showAltCells=!1:(this.altFillColor=t,this.altFillAlpha=e,this.showAltCells=!0),this},setOutlineStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showOutline=!1:(this.outlineFillColor=t,this.outlineFillAlpha=e,this.showOutline=!0),this}});t.exports=o},49912:(t,e,i)=>{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=-e._displayOriginX,l=-e._displayOriginY,u=i.alpha*e.alpha,c=e.width,d=e.height,f=e.cellWidth,p=e.cellHeight,v=Math.ceil(c/f),g=Math.ceil(d/p),m=f,y=p,x=f-(v*f-c),T=p-(g*p-d),w=e.showCells,b=e.showAltCells,S=e.showOutline,E=0,A=0,C=0,_=0,M=0;if(S&&(m--,y--,x===f&&x--,T===p&&T--),w&&e.fillAlpha>0)for(s(a,e),A=0;A0)for(s(a,e,e.altFillColor,e.altFillAlpha*u),A=0;A0){for(n(a,e,e.outlineFillColor,e.outlineFillAlpha*u),E=1;E{var s=i(39429),n=i(30479);s.register("grid",(function(t,e,i,s,r,o,a,h,l,u){return this.displayList.add(new n(this.scene,t,e,i,s,r,o,a,h,l,u))}))},26015:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(46161),r=i(49912),t.exports={renderWebGL:n,renderCanvas:r}},46161:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.pipelines.set(e.pipeline),a=s(e,i,r);o.calcMatrix.copyFrom(a.calc).translate(-e._displayOriginX,-e._displayOriginY);var h,l,u=i.alpha*e.alpha,c=e.width,d=e.height,f=e.cellWidth,p=e.cellHeight,v=Math.ceil(c/f),g=Math.ceil(d/p),m=f,y=p,x=f-(v*f-c),T=p-(g*p-d),w=e.showCells,b=e.showAltCells,S=e.showOutline,E=0,A=0,C=0,_=0,M=0;if(S&&(m--,y--,x===f&&x--,T===p&&T--),t.pipelines.preBatch(e),w&&e.fillAlpha>0)for(h=o.fillTint,l=n.getTintAppendFloatAlpha(e.fillColor,e.fillAlpha*u),h.TL=l,h.TR=l,h.BL=l,h.BR=l,A=0;A0)for(h=o.fillTint,l=n.getTintAppendFloatAlpha(e.altFillColor,e.altFillAlpha*u),h.TL=l,h.TR=l,h.BL=l,h.BR=l,A=0;A0){var P=o.strokeTint,R=n.getTintAppendFloatAlpha(e.outlineFillColor,e.outlineFillAlpha*u);for(P.TL=R,P.TR=R,P.BL=R,P.BR=R,E=1;E{var s=i(99651),n=i(83419),r=i(17803),o=new n({Extends:r,Mixins:[s],initialize:function(t,e,i,s,n,o,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=48),void 0===n&&(n=32),void 0===o&&(o=15658734),void 0===a&&(a=10066329),void 0===h&&(h=13421772),r.call(this,t,"IsoBox",null),this.projection=4,this.fillTop=o,this.fillLeft=a,this.fillRight=h,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isFilled=!0,this.setPosition(e,i),this.setSize(s,n),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=o},11508:(t,e,i)=>{var s=i(65960),n=i(20926);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.currentContext;if(n(t,o,e,i,r)&&e.isFilled){var a=e.width,h=e.height,l=a/2,u=a/e.projection;e.showTop&&(s(o,e,e.fillTop),o.beginPath(),o.moveTo(-l,-h),o.lineTo(0,-u-h),o.lineTo(l,-h),o.lineTo(l,-1),o.lineTo(0,u-1),o.lineTo(-l,-1),o.lineTo(-l,-h),o.fill()),e.showLeft&&(s(o,e,e.fillLeft),o.beginPath(),o.moveTo(-l,0),o.lineTo(0,u),o.lineTo(0,u-h),o.lineTo(-l,-h),o.lineTo(-l,0),o.fill()),e.showRight&&(s(o,e,e.fillRight),o.beginPath(),o.moveTo(l,0),o.lineTo(0,u),o.lineTo(0,u-h),o.lineTo(l,-h),o.lineTo(l,0),o.fill()),o.restore()}}},3933:(t,e,i)=>{var s=i(39429),n=i(61475);s.register("isobox",(function(t,e,i,s,r,o,a){return this.displayList.add(new n(this.scene,t,e,i,s,r,o,a))}))},99651:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(68149),r=i(11508),t.exports={renderWebGL:n,renderCanvas:r}},68149:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){i.addToRenderList(e);var o,a,h,l,u,c,d,f,p,v=t.pipelines.set(e.pipeline),g=s(e,i,r),m=v.calcMatrix.copyFrom(g.calc),y=e.width,x=e.height,T=y/2,w=y/e.projection,b=i.alpha*e.alpha;e.isFilled&&(t.pipelines.preBatch(e),e.showTop&&(o=n.getTintAppendFloatAlpha(e.fillTop,b),a=m.getX(-T,-x),h=m.getY(-T,-x),l=m.getX(0,-w-x),u=m.getY(0,-w-x),c=m.getX(T,-x),d=m.getY(T,-x),f=m.getX(0,w-x),p=m.getY(0,w-x),v.batchQuad(e,a,h,l,u,c,d,f,p,0,0,1,1,o,o,o,o,2)),e.showLeft&&(o=n.getTintAppendFloatAlpha(e.fillLeft,b),a=m.getX(-T,0),h=m.getY(-T,0),l=m.getX(0,w),u=m.getY(0,w),c=m.getX(0,w-x),d=m.getY(0,w-x),f=m.getX(-T,-x),p=m.getY(-T,-x),v.batchQuad(e,a,h,l,u,c,d,f,p,0,0,1,1,o,o,o,o,2)),e.showRight&&(o=n.getTintAppendFloatAlpha(e.fillRight,b),a=m.getX(T,0),h=m.getY(T,0),l=m.getX(0,w),u=m.getY(0,w),c=m.getX(0,w-x),d=m.getY(0,w-x),f=m.getX(T,-x),p=m.getY(T,-x),v.batchQuad(e,a,h,l,u,c,d,f,p,0,0,1,1,o,o,o,o,2)),t.pipelines.postBatch(e))}},16933:(t,e,i)=>{var s=i(83419),n=i(60561),r=i(17803),o=new s({Extends:r,Mixins:[n],initialize:function(t,e,i,s,n,o,a,h,l){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=48),void 0===n&&(n=32),void 0===o&&(o=!1),void 0===a&&(a=15658734),void 0===h&&(h=10066329),void 0===l&&(l=13421772),r.call(this,t,"IsoTriangle",null),this.projection=4,this.fillTop=a,this.fillLeft=h,this.fillRight=l,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isReversed=o,this.isFilled=!0,this.setPosition(e,i),this.setSize(s,n),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=o},79590:(t,e,i)=>{var s=i(65960),n=i(20926);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.currentContext;if(n(t,o,e,i,r)&&e.isFilled){var a=e.width,h=e.height,l=a/2,u=a/e.projection,c=e.isReversed;e.showTop&&c&&(s(o,e,e.fillTop),o.beginPath(),o.moveTo(-l,-h),o.lineTo(0,-u-h),o.lineTo(l,-h),o.lineTo(0,u-h),o.fill()),e.showLeft&&(s(o,e,e.fillLeft),o.beginPath(),c?(o.moveTo(-l,-h),o.lineTo(0,u),o.lineTo(0,u-h)):(o.moveTo(-l,0),o.lineTo(0,u),o.lineTo(0,u-h)),o.fill()),e.showRight&&(s(o,e,e.fillRight),o.beginPath(),c?(o.moveTo(l,-h),o.lineTo(0,u),o.lineTo(0,u-h)):(o.moveTo(l,0),o.lineTo(0,u),o.lineTo(0,u-h)),o.fill()),o.restore()}}},49803:(t,e,i)=>{var s=i(39429),n=i(16933);s.register("isotriangle",(function(t,e,i,s,r,o,a,h){return this.displayList.add(new n(this.scene,t,e,i,s,r,o,a,h))}))},60561:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(51503),r=i(79590),t.exports={renderWebGL:n,renderCanvas:r}},51503:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.pipelines.set(e.pipeline),a=s(e,i,r),h=o.calcMatrix.copyFrom(a.calc),l=e.width,u=e.height,c=l/2,d=l/e.projection,f=e.isReversed,p=i.alpha*e.alpha;if(e.isFilled){var v,g,m,y,x,T,w;if(t.pipelines.preBatch(e),e.showTop&&f){v=n.getTintAppendFloatAlpha(e.fillTop,p),g=h.getX(-c,-u),m=h.getY(-c,-u),y=h.getX(0,-d-u),x=h.getY(0,-d-u),T=h.getX(c,-u),w=h.getY(c,-u);var b=h.getX(0,d-u),S=h.getY(0,d-u);o.batchQuad(e,g,m,y,x,T,w,b,S,0,0,1,1,v,v,v,v,2)}e.showLeft&&(v=n.getTintAppendFloatAlpha(e.fillLeft,p),f?(g=h.getX(-c,-u),m=h.getY(-c,-u),y=h.getX(0,d),x=h.getY(0,d),T=h.getX(0,d-u),w=h.getY(0,d-u)):(g=h.getX(-c,0),m=h.getY(-c,0),y=h.getX(0,d),x=h.getY(0,d),T=h.getX(0,d-u),w=h.getY(0,d-u)),o.batchTri(e,g,m,y,x,T,w,0,0,1,1,v,v,v,2)),e.showRight&&(v=n.getTintAppendFloatAlpha(e.fillRight,p),f?(g=h.getX(c,-u),m=h.getY(c,-u),y=h.getX(0,d),x=h.getY(0,d),T=h.getX(0,d-u),w=h.getY(0,d-u)):(g=h.getX(c,0),m=h.getY(c,0),y=h.getX(0,d),x=h.getY(0,d),T=h.getX(0,d-u),w=h.getY(0,d-u)),o.batchTri(e,g,m,y,x,T,w,0,0,1,1,v,v,v,2)),t.pipelines.postBatch(e)}}},57847:(t,e,i)=>{var s=i(83419),n=i(17803),r=i(23031),o=i(36823),a=new s({Extends:n,Mixins:[o],initialize:function(t,e,i,s,o,a,h,l,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===o&&(o=0),void 0===a&&(a=128),void 0===h&&(h=0),n.call(this,t,"Line",new r(s,o,a,h));var c=Math.max(1,this.geom.right-this.geom.left),d=Math.max(1,this.geom.bottom-this.geom.top);this.lineWidth=1,this._startWidth=1,this._endWidth=1,this.setPosition(e,i),this.setSize(c,d),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=a},17440:(t,e,i)=>{var s=i(75177),n=i(20926);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.currentContext;if(n(t,o,e,i,r)){var a=e._displayOriginX,h=e._displayOriginY;e.isStroked&&(s(o,e),o.beginPath(),o.moveTo(e.geom.x1-a,e.geom.y1-h),o.lineTo(e.geom.x2-a,e.geom.y2-h),o.stroke()),o.restore()}}},2481:(t,e,i)=>{var s=i(39429),n=i(57847);s.register("line",(function(t,e,i,s,r,o,a,h){return this.displayList.add(new n(this.scene,t,e,i,s,r,o,a,h))}))},36823:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(77385),r=i(17440),t.exports={renderWebGL:n,renderCanvas:r}},77385:(t,e,i)=>{var s=i(91296),n=i(70554);t.exports=function(t,e,i,r){i.addToRenderList(e);var o=t.pipelines.set(e.pipeline),a=s(e,i,r);o.calcMatrix.copyFrom(a.calc);var h=e._displayOriginX,l=e._displayOriginY,u=i.alpha*e.alpha;if(t.pipelines.preBatch(e),e.isStroked){var c=o.strokeTint,d=n.getTintAppendFloatAlpha(e.strokeColor,e.strokeAlpha*u);c.TL=d,c.TR=d,c.BL=d,c.BR=d,o.batchLine(e.geom.x1-h,e.geom.y1-l,e.geom.x2-h,e.geom.y2-l,e._startWidth/2,e._endWidth/2,1,0,!1,a.sprite,a.camera)}t.pipelines.postBatch(e)}},24949:(t,e,i)=>{var s=i(90273),n=i(83419),r=i(94811),o=i(13829),a=i(25717),h=i(17803),l=i(5469),u=new n({Extends:h,Mixins:[s],initialize:function(t,e,i,s,n,r){void 0===e&&(e=0),void 0===i&&(i=0),h.call(this,t,"Polygon",new a(s));var l=o(this.geom);this.setPosition(e,i),this.setSize(l.width,l.height),void 0!==n&&this.setFillStyle(n,r),this.updateDisplayOrigin(),this.updateData()},smooth:function(t){void 0===t&&(t=1);for(var e=0;e{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=e._displayOriginX,l=e._displayOriginY,u=e.pathData,c=u.length-1,d=u[0]-h,f=u[1]-l;a.beginPath(),a.moveTo(d,f),e.closePath||(c-=2);for(var p=2;p{var s=i(39429),n=i(24949);s.register("polygon",(function(t,e,i,s,r){return this.displayList.add(new n(this.scene,t,e,i,s,r))}))},90273:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(73695),r=i(38710),t.exports={renderWebGL:n,renderCanvas:r}},73695:(t,e,i)=>{var s=i(10441),n=i(91296),r=i(34682);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=n(e,i,o),l=a.calcMatrix.copyFrom(h.calc),u=e._displayOriginX,c=e._displayOriginY,d=i.alpha*e.alpha;t.pipelines.preBatch(e),e.isFilled&&s(a,l,e,d,u,c),e.isStroked&&r(a,e,d,u,c),t.pipelines.postBatch(e)}},74561:(t,e,i)=>{var s=i(83419),n=i(94811),r=i(87841),o=i(17803),a=i(95597),h=new s({Extends:o,Mixins:[a],initialize:function(t,e,i,s,n,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=128),void 0===n&&(n=128),o.call(this,t,"Rectangle",new r(0,0,s,n)),this.radius=20,this.isRounded=!1,this.setPosition(e,i),this.setSize(s,n),void 0!==a&&this.setFillStyle(a,h),this.updateDisplayOrigin(),this.updateData()},setRounded:function(t){return void 0===t&&(t=16),this.radius=t,this.isRounded=t>0,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),r=Math.min(this.radius,s),o=e,a=i,h=Math.max(1,Math.floor(r/5));return this.arcTo(t,o-e+r,a-i+r,r,Math.PI,1.5*Math.PI,h),t.push(o+e-r,a-i),this.arcTo(t,o+e-r,a-i+r,r,1.5*Math.PI,2*Math.PI,h),t.push(o+e,a+i-r),this.arcTo(t,o+e-r,a+i-r,r,0,.5*Math.PI,h),t.push(o-e+r,a+i),this.arcTo(t,o-e+r,a+i-r,r,.5*Math.PI,Math.PI,h),t.push(o-e,a-i+r),this.pathIndexes=n(t),this.pathData=t,this},arcTo:function(t,e,i,s,n,r,o){for(var a=(r-n)/o,h=0;h<=o;h++){var l=n+a*h;t.push(e+Math.cos(l)*s,i+Math.sin(l)*s)}}});t.exports=h},48682:(t,e,i)=>{var s=i(65960),n=i(75177),r=i(20926),o=function(t,e,i,s,n,r){var o=Math.min(s/2,n/2),a=Math.min(r,o);0!==a?(t.moveTo(e+a,i),t.lineTo(e+s-a,i),t.arcTo(e+s,i,e+s,i+a,a),t.lineTo(e+s,i+n-a),t.arcTo(e+s,i+n,e+s-a,i+n,a),t.lineTo(e+a,i+n),t.arcTo(e,i+n,e,i+n-a,a),t.lineTo(e,i+a),t.arcTo(e,i,e+a,i,a),t.closePath()):t.rect(e,i,s,n)};t.exports=function(t,e,i,a){i.addToRenderList(e);var h=t.currentContext;if(r(t,h,e,i,a)){var l=e._displayOriginX,u=e._displayOriginY;e.isFilled&&(s(h,e),e.isRounded?(h.beginPath(),o(h,-l,-u,e.width,e.height,e.radius),h.fill()):h.fillRect(-l,-u,e.width,e.height)),e.isStroked&&(n(h,e),h.beginPath(),e.isRounded?o(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),n=i(74561);s.register("rectangle",(function(t,e,i,s,r,o){return this.displayList.add(new n(this.scene,t,e,i,s,r,o))}))},95597:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(52059),r=i(48682),t.exports={renderWebGL:n,renderCanvas:r}},52059:(t,e,i)=>{var s=i(10441),n=i(91296),r=i(34682),o=i(70554);t.exports=function(t,e,i,a){i.addToRenderList(e);var h=t.pipelines.set(e.pipeline),l=n(e,i,a);h.calcMatrix.copyFrom(l.calc);var u=e._displayOriginX,c=e._displayOriginY,d=i.alpha*e.alpha;if(t.pipelines.preBatch(e),e.isRounded&&e.isFilled)s(h,l.calc,e,d,u,c);else if(e.isFilled){var f=h.fillTint,p=o.getTintAppendFloatAlpha(e.fillColor,e.fillAlpha*d);f.TL=p,f.TR=p,f.BL=p,f.BR=p,h.batchFillRect(-u,-c,e.width,e.height)}e.isStroked&&r(h,e,d,u,c),t.pipelines.postBatch(e)}},55911:(t,e,i)=>{var s=i(81991),n=i(83419),r=i(94811),o=i(17803),a=new n({Extends:o,Mixins:[s],initialize:function(t,e,i,s,n,r,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=5),void 0===n&&(n=32),void 0===r&&(r=64),o.call(this,t,"Star",null),this._points=s,this._innerRadius=n,this._outerRadius=r,this.setPosition(e,i),this.setSize(2*r,2*r),void 0!==a&&this.setFillStyle(a,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,n=Math.PI/2*3,o=Math.PI/e,a=s,h=s;t.push(a,h+-s);for(var l=0;l{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=e._displayOriginX,l=e._displayOriginY,u=e.pathData,c=u.length-1,d=u[0]-h,f=u[1]-l;a.beginPath(),a.moveTo(d,f),e.closePath||(c-=2);for(var p=2;p{var s=i(55911);i(39429).register("star",(function(t,e,i,n,r,o,a){return this.displayList.add(new s(this.scene,t,e,i,n,r,o,a))}))},81991:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(57017),r=i(64272),t.exports={renderWebGL:n,renderCanvas:r}},57017:(t,e,i)=>{var s=i(10441),n=i(91296),r=i(34682);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=n(e,i,o),l=a.calcMatrix.copyFrom(h.calc),u=e._displayOriginX,c=e._displayOriginY,d=i.alpha*e.alpha;t.pipelines.preBatch(e),e.isFilled&&s(a,l,e,d,u,c),e.isStroked&&r(a,e,d,u,c),t.pipelines.postBatch(e)}},36931:(t,e,i)=>{var s=i(83419),n=i(17803),r=i(16483),o=i(96195),a=new s({Extends:n,Mixins:[o],initialize:function(t,e,i,s,o,a,h,l,u,c,d){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===o&&(o=128),void 0===a&&(a=64),void 0===h&&(h=0),void 0===l&&(l=128),void 0===u&&(u=128),n.call(this,t,"Triangle",new r(s,o,a,h,l,u));var f=this.geom.right-this.geom.left,p=this.geom.bottom-this.geom.top;this.setPosition(e,i),this.setSize(f,p),void 0!==c&&this.setFillStyle(c,d),this.updateDisplayOrigin(),this.updateData()},setTo:function(t,e,i,s,n,r){return this.geom.setTo(t,e,i,s,n,r),this.updateData()},updateData:function(){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),this.pathData=t,this}});t.exports=a},85172:(t,e,i)=>{var s=i(65960),n=i(75177),r=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,o)){var h=e._displayOriginX,l=e._displayOriginY,u=e.geom.x1-h,c=e.geom.y1-l,d=e.geom.x2-h,f=e.geom.y2-l,p=e.geom.x3-h,v=e.geom.y3-l;a.beginPath(),a.moveTo(u,c),a.lineTo(d,f),a.lineTo(p,v),a.closePath(),e.isFilled&&(s(a,e),a.fill()),e.isStroked&&(n(a,e),a.stroke()),a.restore()}}},45245:(t,e,i)=>{var s=i(39429),n=i(36931);s.register("triangle",(function(t,e,i,s,r,o,a,h,l,u){return this.displayList.add(new n(this.scene,t,e,i,s,r,o,a,h,l,u))}))},96195:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(83253),r=i(85172),t.exports={renderWebGL:n,renderCanvas:r}},83253:(t,e,i)=>{var s=i(91296),n=i(34682),r=i(70554);t.exports=function(t,e,i,o){i.addToRenderList(e);var a=t.pipelines.set(e.pipeline),h=s(e,i,o);a.calcMatrix.copyFrom(h.calc);var l=e._displayOriginX,u=e._displayOriginY,c=i.alpha*e.alpha;if(t.pipelines.preBatch(e),e.isFilled){var d=a.fillTint,f=r.getTintAppendFloatAlpha(e.fillColor,e.fillAlpha*c);d.TL=f,d.TR=f,d.BL=f,d.BR=f;var p=e.geom.x1-l,v=e.geom.y1-u,g=e.geom.x2-l,m=e.geom.y2-u,y=e.geom.x3-l,x=e.geom.y3-u;a.batchFillTriangle(p,v,g,m,y,x,h.sprite,h.camera)}e.isStroked&&n(a,e,c,l,u),t.pipelines.postBatch(e)}},68287:(t,e,i)=>{var s=i(9674),n=i(83419),r=i(31401),o=i(95643),a=i(92751),h=new n({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.PostPipeline,r.ScrollFactor,r.Size,r.TextureCrop,r.Tint,r.Transform,r.Visible,a],initialize:function(t,e,i,n,r){o.call(this,t,"Sprite"),this._crop=this.resetCropObject(),this.anims=new s(this),this.setTexture(n,r),this.setPosition(e,i),this.setSizeToFrame(),this.setOriginFromFrame(),this.initPipeline(),this.initPostPipeline(!0)},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)},play:function(t,e){return this.anims.play(t,e)},playReverse:function(t,e){return this.anims.playReverse(t,e)},playAfterDelay:function(t,e){return this.anims.playAfterDelay(t,e)},playAfterRepeat:function(t,e){return this.anims.playAfterRepeat(t,e)},chain:function(t){return this.anims.chain(t)},stop:function(){return this.anims.stop()},stopAfterDelay:function(t){return this.anims.stopAfterDelay(t)},stopAfterRepeat:function(t){return this.anims.stopAfterRepeat(t)},stopOnFrame:function(t){return this.anims.stopOnFrame(t)},toJSON:function(){return r.ToJSON(this)},preDestroy:function(){this.anims.destroy(),this.anims=void 0}});t.exports=h},76552:t=>{t.exports=function(t,e,i,s){i.addToRenderList(e),t.batchSprite(e,e.frame,i,s)}},15567:(t,e,i)=>{var s=i(25305),n=i(13059),r=i(44603),o=i(23568),a=i(68287);r.register("sprite",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),r=o(t,"frame",null),h=new a(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),s(this.scene,h,t),n(h,t),h}))},46409:(t,e,i)=>{var s=i(39429),n=i(68287);s.register("sprite",(function(t,e,i,s){return this.displayList.add(new n(this.scene,t,e,i,s))}))},92751:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(9409),r=i(76552),t.exports={renderWebGL:n,renderCanvas:r}},9409:t=>{t.exports=function(t,e,i,s){i.addToRenderList(e),e.pipeline.batchSprite(e,i,s)}},14220:t=>{t.exports=function(t,e,i){var s=t.canvas,n=t.context,r=t.style,o=[],a=0,h=i.length;r.maxLines>0&&r.maxLines1&&(c+=l*(d.length-1))}r.wordWrap&&(c-=n.measureText(" ").width),o[u]=Math.ceil(c),a=Math.max(a,o[u])}var p=e.fontSize+r.strokeThickness,v=p*h,g=t.lineSpacing;return h>1&&(v+=g*(h-1)),{width:a,height:v,lines:h,lineWidths:o,lineSpacing:g,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 n=i.measureText(t.testString);if("actualBoundingBoxAscent"in n){var r=n.actualBoundingBoxAscent,o=n.actualBoundingBoxDescent;return s.remove(e),{ascent:r,descent:o,fontSize:r+o}}var a=Math.ceil(n.width*t.baselineX),h=a,l=2*h;h=h*t.baselineY|0,e.width=a,e.height=l,i.fillStyle="#f00",i.fillRect(0,0,a,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},c=i.getImageData(0,0,a,l);if(!c)return u.ascent=h,u.descent=h+6,u.fontSize=u.ascent+u.descent,s.remove(e),u;var d,f,p=c.data,v=p.length,g=4*a,m=0,y=!1;for(d=0;dh;d--){for(f=0;f{var s=i(40366),n=i(27919),r=i(83419),o=i(31401),a=i(95643),h=i(14220),l=i(35154),u=i(35846),c=i(61771),d=i(35762),f=i(45650),p=new r({Extends:a,Mixins:[o.Alpha,o.BlendMode,o.ComputedSize,o.Crop,o.Depth,o.Flip,o.GetBounds,o.Mask,o.Origin,o.Pipeline,o.PostPipeline,o.ScrollFactor,o.Tint,o.Transform,o.Visible,c],initialize:function(t,e,i,s,r){void 0===e&&(e=0),void 0===i&&(i=0),a.call(this,t,"Text"),this.renderer=t.sys.renderer,this.setPosition(e,i),this.setOrigin(0,0),this.initPipeline(),this.initPostPipeline(!0),this.canvas=n.create(this),this.context,this.style=new d(this,r),this.autoRound=!0,this.splitRegExp=/(?:\r\n|\r|\n)/,this._text=void 0,this.padding={left:0,right:0,top:0,bottom:0},this.width=1,this.height=1,this.lineSpacing=0,this.letterSpacing=0,0===this.style.resolution&&(this.style.resolution=1),this._crop=this.resetCropObject(),this._textureKey=f(),this.texture=t.sys.textures.addCanvas(this._textureKey,this.canvas),this.context=this.texture.context,this.frame=this.texture.get(),this.frame.source.resolution=this.style.resolution,this.renderer&&this.renderer.gl&&(this.renderer.deleteTexture(this.frame.source.glTexture),this.frame.source.glTexture=null),this.initRTL(),this.setText(s),r&&r.padding&&this.setPadding(r.padding),r&&r.lineSpacing&&this.setLineSpacing(r.lineSpacing),r&&r.letterSpacing&&this.setLetterSpacing(r.letterSpacing)},initRTL:function(){if(!this.style.rtl)return this.canvas.dir="ltr",void(this.context.direction="ltr");this.canvas.dir="rtl",this.context.direction="rtl",this.canvas.style.display="none",s(this.canvas,this.scene.sys.canvas),this.originX=1},runWordWrap:function(t){var e=this.style;if(e.wordWrapCallback){var i=e.wordWrapCallback.call(e.wordWrapCallbackScope,t,this);return Array.isArray(i)&&(i=i.join("\n")),i}return e.wordWrapWidth?e.wordWrapUseAdvanced?this.advancedWordWrap(t,this.context,this.style.wordWrapWidth):this.basicWordWrap(t,this.context,this.style.wordWrapWidth):t},advancedWordWrap:function(t,e,i){for(var s="",n=t.replace(/ +/gi," ").split(this.splitRegExp),r=n.length,o=0;ou){if(0===d){for(var m=p;m.length;){var y=(m=m.slice(0,-1)).length*this.letterSpacing;if((g=e.measureText(m).width+y)<=u)break}if(!m.length)throw new Error("wordWrapWidth < a single character");var x=f.substr(m.length);c[d]=x,h+=m}var T=c[d].length?d:d+1,w=c.slice(T).join(" ").replace(/[ \n]*$/gi,"");n.splice(o+1,0,w),r=n.length;break}h+=p,u-=g}s+=h.replace(/[ \n]*$/gi,"")+"\n"}}return s=s.replace(/[\s|\n]*$/gi,"")},basicWordWrap:function(t,e,i){for(var s="",n=t.split(this.splitRegExp),r=n.length-1,o=e.measureText(" ").width,a=0;a<=r;a++){for(var h=i,l=n[a].split(" "),u=l.length-1,c=0;c<=u;c++){var d=l[c],f=d.length*this.letterSpacing,p=e.measureText(d).width+f,v=p;ch&&c>0&&(s+="\n",h=i),s+=d,c0&&(d+=l.lineSpacing*v),i.rtl)c=f-c-u.left-u.right;else if("right"===i.align)c+=o-l.lineWidths[v];else if("center"===i.align)c+=(o-l.lineWidths[v])/2;else if("justify"===i.align){if(l.lineWidths[v]/l.width>=.85){var g=l.width-l.lineWidths[v],m=e.measureText(" ").width,y=a[v].trim(),x=y.split(" ");g+=(a[v].length-y.length)*m;for(var T=Math.floor(g/m),w=0;T>0;)x[w]+=" ",w=(w+1)%(x.length-1||1),--T;a[v]=x.join(" ")}}this.autoRound&&(c=Math.round(c),d=Math.round(d));var b=this.letterSpacing;if(i.strokeThickness&&0===b&&(i.syncShadow(e,i.shadowStroke),e.strokeText(a[v],c,d)),i.color)if(i.syncShadow(e,i.shadowFill),0!==b)for(var S=0,E=a[v].split(""),A=0;A{t.exports=function(t,e,i,s){0!==e.width&&0!==e.height&&(i.addToRenderList(e),t.batchSprite(e,e.frame,i,s))}},71259:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(50171);n.register("text",(function(t,e){void 0===t&&(t={});var i=r(t,"text",""),n=r(t,"style",null),a=r(t,"padding",null);null!==a&&(n.padding=a);var h=new o(this.scene,0,0,i,n);return void 0!==e&&(t.add=e),s(this.scene,h,t),h.autoRound=r(t,"autoRound",!0),h.resolution=r(t,"resolution",1),h}))},68005:(t,e,i)=>{var s=i(50171);i(39429).register("text",(function(t,e,i,n){return this.displayList.add(new s(this.scene,t,e,i,n))}))},61771:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(34397),r=i(79724),t.exports={renderWebGL:n,renderCanvas:r}},35762:(t,e,i)=>{var s=i(83419),n=i(23568),r=i(35154),o=i(79557),a={fontFamily:["fontFamily","Courier"],fontSize:["fontSize","16px"],fontStyle:["fontStyle",""],backgroundColor:["backgroundColor",null],color:["color","#fff"],stroke:["stroke","#fff"],strokeThickness:["strokeThickness",0],shadowOffsetX:["shadow.offsetX",0],shadowOffsetY:["shadow.offsetY",0],shadowColor:["shadow.color","#000"],shadowBlur:["shadow.blur",0],shadowStroke:["shadow.stroke",!1],shadowFill:["shadow.fill",!1],align:["align","left"],maxLines:["maxLines",0],fixedWidth:["fixedWidth",0],fixedHeight:["fixedHeight",0],resolution:["resolution",0],rtl:["rtl",!1],testString:["testString","|MÉqgy"],baselineX:["baselineX",1.2],baselineY:["baselineY",1.4],wordWrapWidth:["wordWrap.width",null],wordWrapCallback:["wordWrap.callback",null],wordWrapCallbackScope:["wordWrap.callbackScope",null],wordWrapUseAdvanced:["wordWrap.useAdvancedWrap",!1]},h=new s({initialize:function(t,e){this.parent=t,this.fontFamily,this.fontSize,this.fontStyle,this.backgroundColor,this.color,this.stroke,this.strokeThickness,this.shadowOffsetX,this.shadowOffsetY,this.shadowColor,this.shadowBlur,this.shadowStroke,this.shadowFill,this.align,this.maxLines,this.fixedWidth,this.fixedHeight,this.resolution,this.rtl,this.testString,this.baselineX,this.baselineY,this.wordWrapWidth,this.wordWrapCallback,this.wordWrapCallbackScope,this.wordWrapUseAdvanced,this._font,this.setStyle(e,!1,!0)},setStyle:function(t,e,i){for(var s in void 0===e&&(e=!0),void 0===i&&(i=!1),a){var h=i?a[s][1]:this[s];"wordWrapCallback"===s||"wordWrapCallbackScope"===s?this[s]=r(t,a[s][0],h):t&&"fontSize"===s&&"number"==typeof t.fontSize?this[s]=t.fontSize.toString()+"px":this[s]=n(t,a[s][0],h)}var l=r(t,"font",null);null!==l&&this.setFont(l,!1),this._font=[this.fontStyle,this.fontSize,this.fontFamily].join(" ").trim();var u=r(t,"fill",null);null!==u&&(this.color=u);var c=r(t,"metrics",!1);return c?this.metrics={ascent:r(c,"ascent",0),descent:r(c,"descent",0),fontSize:r(c,"fontSize",0)}:!e&&this.metrics||(this.metrics=o(this)),e?this.parent.updateText():this.parent},syncFont:function(t,e){e.font=this._font},syncStyle:function(t,e){e.textBaseline="alphabetic",e.fillStyle=this.color,e.strokeStyle=this.stroke,e.lineWidth=this.strokeThickness,e.lineCap="round",e.lineJoin="round"},syncShadow:function(t,e){e?(t.shadowOffsetX=this.shadowOffsetX,t.shadowOffsetY=this.shadowOffsetY,t.shadowColor=this.shadowColor,t.shadowBlur=this.shadowBlur):(t.shadowOffsetX=0,t.shadowOffsetY=0,t.shadowColor=0,t.shadowBlur=0)},update:function(t){return t&&(this._font=[this.fontStyle,this.fontSize,this.fontFamily].join(" ").trim(),this.metrics=o(this)),this.parent.updateText()},setFont:function(t,e){void 0===e&&(e=!0);var i=t,s="",n="";if("string"!=typeof t)i=r(t,"fontFamily","Courier"),s=r(t,"fontSize","16px"),n=r(t,"fontStyle","");else{var o=t.split(" "),a=0;n=o.length>2?o[a++]:"",s=o[a++]||"16px",i=o[a++]||"Courier"}return i===this.fontFamily&&s===this.fontSize&&n===this.fontStyle||(this.fontFamily=i,this.fontSize=s,this.fontStyle=n,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,n,r){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i="#000"),void 0===s&&(s=0),void 0===n&&(n=!1),void 0===r&&(r=!0),this.shadowOffsetX=t,this.shadowOffsetY=e,this.shadowColor=i,this.shadowBlur=s,this.shadowStroke=n,this.shadowFill=r,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 a)t[e]=this[e];return t.metrics=this.getTextMetrics(),t},destroy:function(){this.parent=void 0}});t.exports=h},34397:(t,e,i)=>{var s=i(70554);t.exports=function(t,e,i,n){if(0!==e.width&&0!==e.height){i.addToRenderList(e);var r=e.frame,o=r.width,a=r.height,h=s.getTintAppendFloatAlpha,l=t.pipelines.set(e.pipeline,e),u=l.setTexture2D(r.glTexture,e);l.batchTexture(e,r.glTexture,o,a,e.x,e.y,o/e.style.resolution,a/e.style.resolution,e.scaleX,e.scaleY,e.rotation,e.flipX,e.flipY,e.scrollFactorX,e.scrollFactorY,e.displayOriginX,e.displayOriginY,0,0,o,a,h(e.tintTopLeft,i.alpha*e._alphaTL),h(e.tintTopRight,i.alpha*e._alphaTR),h(e.tintBottomLeft,i.alpha*e._alphaBL),h(e.tintBottomRight,i.alpha*e._alphaBR),e.tintFill,0,0,i,n,!1,u)}}},20839:(t,e,i)=>{var s=i(27919),n=i(83419),r=i(31401),o=i(95643),a=i(98439),h=i(68703),l=i(56295),u=i(45650),c=i(26099),d=new n({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.ComputedSize,r.Crop,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.PostPipeline,r.ScrollFactor,r.Tint,r.Transform,r.Visible,l],initialize:function(t,e,i,n,r,h,l){var d=t.sys.renderer;o.call(this,t,"TileSprite");var f=t.sys.textures.get(h),p=f.get(l);p.source.compressionAlgorithm&&(console.warn("TileSprite cannot use compressed texture"),p=(f=t.sys.textures.get("__MISSING")).get()),"DynamicTexture"===f.type&&(console.warn("TileSprite cannot use Dynamic Texture"),p=(f=t.sys.textures.get("__MISSING")).get()),n&&r?(n=Math.floor(n),r=Math.floor(r)):(n=n||p.width,r=r||p.height),this._tilePosition=new c,this._tileScale=new c(1,1),this.dirty=!1,this.renderer=d,this.canvas=s.create(this,n,r),this.context=this.canvas.getContext("2d",{willReadFrequently:!1}),this.displayTexture=f,this.displayFrame=p,this._crop=this.resetCropObject(),this._textureKey=u(),this.texture=t.sys.textures.addCanvas(this._textureKey,this.canvas),this.frame=this.texture.get(),this.potWidth=a(p.width),this.potHeight=a(p.height),this.fillCanvas=s.create2D(this,this.potWidth,this.potHeight),this.fillContext=this.fillCanvas.getContext("2d",{willReadFrequently:!1}),this.fillPattern=null,this.setPosition(e,i),this.setSize(n,r),this.setFrame(l),this.setOriginFromFrame(),this.initPipeline(),this.initPostPipeline(!0)},setTexture:function(t,e){return this.displayTexture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t){var e=this.displayTexture.get(t);return this.potWidth=a(e.width),this.potHeight=a(e.height),this.canvas.width=0,e.cutWidth&&e.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this.displayFrame=e,this.dirty=!0,this.updateTileTexture(),this},setTilePosition:function(t,e){return void 0!==t&&(this.tilePositionX=t),void 0!==e&&(this.tilePositionY=e),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.dirty&&this.renderer){var t=this.displayFrame;if(t.source.isRenderTexture||t.source.isGLTexture)return console.warn("TileSprites can only use Image or Canvas based textures"),void(this.dirty=!1);var e=this.fillContext,i=this.fillCanvas,s=this.potWidth,n=this.potHeight;this.renderer&&this.renderer.gl||(s=t.cutWidth,n=t.cutHeight),e.clearRect(0,0,s,n),i.width=s,i.height=n,e.drawImage(t.source.image,t.cutX,t.cutY,t.cutWidth,t.cutHeight,0,0,s,n),this.renderer&&this.renderer.gl?this.fillPattern=this.renderer.canvasToTexture(i,this.fillPattern):this.fillPattern=e.createPattern(i,"repeat"),this.updateCanvas(),this.dirty=!1}},updateCanvas:function(){var t=this.canvas;if(t.width===this.width&&t.height===this.height||(t.width=this.width,t.height=this.height,this.frame.setSize(this.width,this.height),this.updateDisplayOrigin(),this.dirty=!0),!this.dirty||this.renderer&&this.renderer.gl)this.dirty=!1;else{var e=this.context;this.scene.sys.game.config.antialias||h.disable(e);var i=this._tileScale.x,s=this._tileScale.y,n=this._tilePosition.x,r=this._tilePosition.y;e.clearRect(0,0,this.width,this.height),e.save(),e.scale(i,s),e.translate(-n,-r),e.fillStyle=this.fillPattern,e.fillRect(n,r,this.width/i,this.height/s),e.restore(),this.dirty=!1}},preDestroy:function(){this.renderer&&this.renderer.gl&&this.renderer.deleteTexture(this.fillPattern),s.remove(this.canvas),s.remove(this.fillCanvas),this.fillPattern=null,this.fillContext=null,this.fillCanvas=null,this.displayTexture=null,this.displayFrame=null;var t=this.texture;t&&t.destroy(),this.renderer=null},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}},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=d},46992:t=>{t.exports=function(t,e,i,s){e.updateCanvas(),i.addToRenderList(e),t.batchSprite(e,e.frame,i,s)}},14167:(t,e,i)=>{var s=i(25305),n=i(44603),r=i(23568),o=i(20839);n.register("tileSprite",(function(t,e){void 0===t&&(t={});var i=r(t,"x",0),n=r(t,"y",0),a=r(t,"width",512),h=r(t,"height",512),l=r(t,"key",""),u=r(t,"frame",""),c=new o(this.scene,i,n,a,h,l,u);return void 0!==e&&(t.add=e),s(this.scene,c,t),c}))},91681:(t,e,i)=>{var s=i(20839);i(39429).register("tileSprite",(function(t,e,i,n,r,o){return this.displayList.add(new s(this.scene,t,e,i,n,r,o))}))},56295:(t,e,i)=>{var s=i(29747),n=s,r=s;n=i(18553),r=i(46992),t.exports={renderWebGL:n,renderCanvas:r}},18553:(t,e,i)=>{var s=i(70554);t.exports=function(t,e,i,n){e.updateCanvas();var r=e.width,o=e.height;if(0!==r&&0!==o){i.addToRenderList(e);var a=s.getTintAppendFloatAlpha,h=t.pipelines.set(e.pipeline,e),l=h.setTexture2D(e.fillPattern,e);h.batchTexture(e,e.fillPattern,e.displayFrame.width*e.tileScaleX,e.displayFrame.height*e.tileScaleY,e.x,e.y,r,o,e.scaleX,e.scaleY,e.rotation,e.flipX,e.flipY,e.scrollFactorX,e.scrollFactorY,e.originX*r,e.originY*o,0,0,r,o,a(e.tintTopLeft,i.alpha*e._alphaTL),a(e.tintTopRight,i.alpha*e._alphaTR),a(e.tintBottomLeft,i.alpha*e._alphaBL),a(e.tintBottomRight,i.alpha*e._alphaBR),e.tintFill,e.tilePositionX%e.displayFrame.width/e.displayFrame.width,e.tilePositionY%e.displayFrame.height/e.displayFrame.height,i,n,!1,l)}}},18471:(t,e,i)=>{var s=i(45319),n=i(83419),r=i(31401),o=i(51708),a=i(8443),h=i(95643),l=i(36383),u=i(14463),c=i(45650),d=i(10247),f=new n({Extends:h,Mixins:[r.Alpha,r.BlendMode,r.ComputedSize,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.PostPipeline,r.ScrollFactor,r.TextureCrop,r.Tint,r.Transform,r.Visible,d],initialize:function(t,e,i,s){h.call(this,t,"Video"),this.video,this.videoTexture,this.videoTextureSource,this.snapshotTexture,this.flipY=!1,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 n=t.sys.game;this._device=n.device.video,this.setPosition(e,i),this.setSize(256,256),this.initPipeline(),this.initPostPipeline(!0),n.events.on(a.PAUSE,this.globalPause,this),n.events.on(a.RESUME,this.globalResume,this);var r=t.sys.sound;r&&r.on(u.GLOBAL_MUTE,this.globalMute,this),s&&this.load(s)},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,n){void 0===e&&(e=!0),void 0===i&&(i=!1),this.cacheKey!==t&&(this.load(t),e&&this.play(i,s,n))},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 n=this.video;if(n?(this.removeLoadEventHandlers(),this.stop()):((n=document.createElement("video")).controls=!1,n.setAttribute("playsinline","playsinline"),n.setAttribute("preload","auto"),n.setAttribute("disablePictureInPicture","true")),e?(n.muted=!0,n.defaultMuted=!0,n.setAttribute("autoplay","autoplay")):(n.muted=!1,n.defaultMuted=!1,n.removeAttribute("autoplay")),i?n.setAttribute("crossorigin",i):n.removeAttribute("crossorigin"),s)if("srcObject"in n)try{n.srcObject=s}catch(t){if("TypeError"!==t.name)throw t;n.src=URL.createObjectURL(s)}else n.src=URL.createObjectURL(s);else n.src=t;this.retry=0,this.video=n,this._playCalled=!1,n.load(),this.addLoadEventHandlers();var r=this.scene.sys.textures.get(this._key);return this.setTexture(r),this},requestVideoFrame:function(t,e){var i=this.video;if(i){var s=e.width,n=e.height,r=this.videoTexture,a=this.videoTextureSource,h=!r||a.source!==i;h?(this._codePaused=i.paused,this._codeMuted=i.muted,r?(a.source=i,a.width=s,a.height=n,r.get().setSize(s,n)):((r=this.scene.sys.textures.create(this._key,i,s,n)).add("__BASE",0,0,0,s,n),this.setTexture(r),this.videoTexture=r,this.videoTextureSource=r.source[0],this.videoTextureSource.setFlipY(this.flipY),this.emit(o.VIDEO_TEXTURE,this,r)),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,n),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,n,r){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===s&&(s=this.height),void 0===n&&(n=i),void 0===r&&(r=s);var o=this.video,a=this.snapshotTexture;return a?(a.setSize(n,r),o&&a.context.drawImage(o,t,e,i,s,0,0,n,r)):(a=this.scene.sys.textures.createCanvas(c(),n,r),this.snapshotTexture=a,o&&a.context.drawImage(o,t,e,i,s,0,0,n,r)),a.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=!1),this.videoTexture&&(this.scene.sys.textures.renameTexture(this._key,t),this.videoTextureSource.setFlipY(e)),this._key=t,this.flipY=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(a.PAUSE,this.globalPause,this),t.off(a.RESUME,this.globalResume,this);var e=this.scene.sys.sound;e&&e.off(u.GLOBAL_MUTE,this.globalMute,this)}});t.exports=f},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),n=i(44603),r=i(23568),o=i(18471);n.register("video",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=new o(this.scene,0,0,i);return void 0!==e&&(t.add=e),s(this.scene,n,t),n}))},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),n=s,r=s;n=i(29849),r=i(58352),t.exports={renderWebGL:n,renderCanvas:r}},29849:t=>{t.exports=function(t,e,i,s){e.videoTexture&&(i.addToRenderList(e),e.pipeline.batchSprite(e,i,s))}},41481:(t,e,i)=>{var s=i(10312),n=i(96503),r=i(87902),o=i(83419),a=i(31401),h=i(95643),l=i(87841),u=i(37303),c=new o({Extends:h,Mixins:[a.Depth,a.GetBounds,a.Origin,a.Transform,a.ScrollFactor,a.Visible],initialize:function(t,e,i,n,r){void 0===n&&(n=1),void 0===r&&(r=n),h.call(this,t,"Zone"),this.setPosition(e,i),this.width=n,this.height=r,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 n(0,0,t),r)},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.addToRenderList(e)}});t.exports=c},95261:(t,e,i)=>{var s=i(44603),n=i(23568),r=i(41481);s.register("zone",(function(t){var e=n(t,"x",0),i=n(t,"y",0),s=n(t,"width",1),o=n(t,"height",s);return new r(this.scene,e,i,s,o)}))},84175:(t,e,i)=>{var s=i(41481);i(39429).register("zone",(function(t,e,i,n){return this.displayList.add(new s(this.scene,t,e,i,n))}))},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),n=i(87902),r=i(26241),o=i(79124),a=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=a.CIRCLE,this.x=t,this.y=e,this._radius=i,this._diameter=2*i},contains:function(t,e){return n(this,t,e)},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return o(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(2141);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),n=i(62945),r=i(36383),o=i(2141);t.exports=function(t,e,i){void 0===i&&(i=new o);var a=n(e,0,r.PI2);return s(t,a,i)}},79124:(t,e,i)=>{var s=i(71562),n=i(92110),r=i(62945),o=i(36383);t.exports=function(t,e,i,a){void 0===a&&(a=[]),!e&&i>0&&(e=s(t)/i);for(var h=0;h{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},39212:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},28176:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){void 0===e&&(e=new s);var i=2*Math.PI*Math.random(),n=Math.random()+Math.random(),r=n>1?2-n:n,o=r*Math.cos(i),a=r*Math.sin(i);return e.x=t.x+o*t.radius,e.y=t.y+a*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(2141);t.exports=function(t,e,i){void 0===i&&(i=new s);var n=t.width/2,r=t.height/2;return i.x=t.x+n*Math.cos(e),i.y=t.y+r*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,n=(i-t.y)/t.height;return(s*=s)+(n*=n)<.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),n=i(81154),r=i(90549),o=i(48320),a=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=a.ELLIPSE,this.x=t,this.y=e,this.width=i,this.height=s},contains:function(t,e){return n(this,t,e)},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return o(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),n=i(62945),r=i(36383),o=i(2141);t.exports=function(t,e,i){void 0===i&&(i=new o);var a=n(e,0,r.PI2);return s(t,a,i)}},48320:(t,e,i)=>{var s=i(92990),n=i(79522),r=i(62945),o=i(36383);t.exports=function(t,e,i,a){void 0===a&&(a=[]),!e&&i>0&&(e=s(t)/i);for(var h=0;h{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},44808:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},24820:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){void 0===e&&(e=new s);var i=Math.random()*Math.PI*2,n=Math.sqrt(Math.random());return e.x=t.x+n*Math.cos(i)*t.width/2,e.y=t.y+n*Math.sin(i)*t.height/2,e}},49203:(t,e,i)=>{var s=i(8497);s.Area=i(78874),s.Circumference=i(92990),s.CircumferencePoint=i(79522),s.Clone=i(58102),s.Contains=i(81154),s.ContainsPoint=i(46662),s.ContainsRect=i(1632),s.CopyFrom=i(65534),s.Equals=i(36146),s.GetBounds=i(23694),s.GetPoint=i(90549),s.GetPoints=i(48320),s.Offset=i(73424),s.OffsetPoint=i(44808),s.Random=i(24820),t.exports=s},55738:(t,e,i)=>{var s=i(23777),n=i(79291),r={Circle:i(88911),Ellipse:i(49203),Intersects:i(91865),Line:i(2529),Mesh:i(73090),Point:i(43711),Polygon:i(58423),Rectangle:i(93232),Triangle:i(84435)};r=n(!1,r,s),t.exports=r},2044:(t,e,i)=>{var s=i(20339);t.exports=function(t,e){return s(t.x,t.y,e.x,e.y)<=t.radius+e.radius}},81491:t=>{t.exports=function(t,e){var i=e.width/2,s=e.height/2,n=Math.abs(t.x-e.x-i),r=Math.abs(t.y-e.y-s),o=i+t.radius,a=s+t.radius;if(n>o||r>a)return!1;if(n<=i||r<=s)return!0;var h=n-i,l=r-s;return h*h+l*l<=t.radius*t.radius}},63376:(t,e,i)=>{var s=i(2141),n=i(2044);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var r,o,a,h,l=t.x,u=t.y,c=t.radius,d=e.x,f=e.y,p=e.radius;if(u===f)0===(a=(o=-2*f)*o-4*(r=1)*(d*d+(h=(p*p-c*c-d*d+l*l)/(2*(l-d)))*h-2*d*h+f*f-p*p))?i.push(new s(h,-o/(2*r))):a>0&&(i.push(new s(h,(-o+Math.sqrt(a))/(2*r))),i.push(new s(h,(-o-Math.sqrt(a))/(2*r))));else{var v=(l-d)/(u-f),g=(p*p-c*c-d*d+l*l-f*f+u*u)/(2*(u-f));0===(a=(o=2*u*v-2*g*v-2*l)*o-4*(r=v*v+1)*(l*l+u*u+g*g-c*c-2*u*g))?(h=-o/(2*r),i.push(new s(h,g-h*v))):a>0&&(h=(-o+Math.sqrt(a))/(2*r),i.push(new s(h,g-h*v)),h=(-o-Math.sqrt(a))/(2*r),i.push(new s(h,g-h*v)))}}return i}},97439:(t,e,i)=>{var s=i(4042),n=i(81491);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var r=e.getLineA(),o=e.getLineB(),a=e.getLineC(),h=e.getLineD();s(r,t,i),s(o,t,i),s(a,t,i),s(h,t,i)}return i}},4042:(t,e,i)=>{var s=i(2141),n=i(80462);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var r,o,a=t.x1,h=t.y1,l=t.x2,u=t.y2,c=e.x,d=e.y,f=e.radius,p=l-a,v=u-h,g=a-c,m=h-d,y=p*p+v*v,x=2*(p*g+v*m),T=x*x-4*y*(g*g+m*m-f*f);if(0===T){var w=-x/(2*y);r=a+w*p,o=h+w*v,w>=0&&w<=1&&i.push(new s(r,o))}else if(T>0){var b=(-x-Math.sqrt(T))/(2*y);r=a+b*p,o=h+b*v,b>=0&&b<=1&&i.push(new s(r,o));var S=(-x+Math.sqrt(T))/(2*y);r=a+S*p,o=h+S*v,S>=0&&S<=1&&i.push(new s(r,o))}}return i}},36100:(t,e,i)=>{var s=i(25836);t.exports=function(t,e,i,n){void 0===i&&(i=!1);var r,o,a,h=t.x1,l=t.y1,u=t.x2,c=t.y2,d=e.x1,f=e.y1,p=u-h,v=c-l,g=e.x2-d,m=e.y2-f,y=p*m-v*g;if(0===y)return null;if(i){if(r=(p*(f-l)+v*(h-d))/(g*v-m*p),0!==p)o=(d+g*r-h)/p;else{if(0===v)return null;o=(f+m*r-l)/v}if(o<0||r<0||r>1)return null;a=o}else{if(o=((l-f)*p-(h-d)*v)/y,(r=((d-h)*m-(f-l)*g)/y)<0||r>1||o<0||o>1)return null;a=r}return void 0===n&&(n=new s),n.set(h+p*a,l+v*a,a)}},3073:(t,e,i)=>{var s=i(36100),n=i(23031),r=i(25836),o=new n,a=new r;t.exports=function(t,e,i,n){void 0===i&&(i=!1),void 0===n&&(n=new r);var h=!1;n.set(),a.set();for(var l=e[e.length-1],u=0;u{var s=i(25836),n=i(61369),r=i(3073),o=new s;t.exports=function(t,e,i,s){void 0===s&&(s=new n),Array.isArray(e)||(e=[e]);var a=!1;s.set(),o.set();for(var h=0;h{var s=i(2141),n=i(76112),r=i(92773);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e))for(var o=e.getLineA(),a=e.getLineB(),h=e.getLineC(),l=e.getLineD(),u=[new s,new s,new s,new s],c=[n(o,t,u[0]),n(a,t,u[1]),n(h,t,u[2]),n(l,t,u[3])],d=0;d<4;d++)c[d]&&i.push(u[d]);return i}},71147:(t,e,i)=>{var s=i(61369),n=i(56362),r=new(i(23031));function o(t,e,i,o,a){var h=Math.cos(t),l=Math.sin(t);r.setTo(e,i,e+h,i+l);var u=n(r,o,!0);u&&a.push(new s(u.x,u.y,t,u.w))}function a(t,e){return t.z-e.z}t.exports=function(t,e,i){Array.isArray(i)||(i=[i]);for(var s=[],n=[],r=0;r{var s=i(87841),n=i(59996);t.exports=function(t,e,i){return void 0===i&&(i=new s),n(t,e)&&(i.x=Math.max(t.x,e.x),i.y=Math.max(t.y,e.y),i.width=Math.min(t.right,e.right)-i.x,i.height=Math.min(t.bottom,e.bottom)-i.y),i}},52784:(t,e,i)=>{var s=i(60646),n=i(59996);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var r=t.getLineA(),o=t.getLineB(),a=t.getLineC(),h=t.getLineD();s(r,e,i),s(o,e,i),s(a,e,i),s(h,e,i)}return i}},26341:(t,e,i)=>{var s=i(89265),n=i(60646);t.exports=function(t,e,i){if(void 0===i&&(i=[]),s(t,e)){var r=e.getLineA(),o=e.getLineB(),a=e.getLineC();n(r,t,i),n(o,t,i),n(a,t,i)}return i}},38720:(t,e,i)=>{var s=i(4042),n=i(67636);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var r=t.getLineA(),o=t.getLineB(),a=t.getLineC();s(r,e,i),s(o,e,i),s(a,e,i)}return i}},13882:(t,e,i)=>{var s=i(2141),n=i(2822),r=i(76112);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e))for(var o=t.getLineA(),a=t.getLineB(),h=t.getLineC(),l=[new s,new s,new s],u=[r(o,e,l[0]),r(a,e,l[1]),r(h,e,l[2])],c=0;c<3;c++)u[c]&&i.push(l[c]);return i}},75636:(t,e,i)=>{var s=i(82944),n=i(13882);t.exports=function(t,e,i){if(void 0===i&&(i=[]),s(t,e)){var r=e.getLineA(),o=e.getLineB(),a=e.getLineC();n(t,r,i),n(t,o,i),n(t,a,i)}return i}},80462:(t,e,i)=>{var s=i(87902),n=new(i(2141));t.exports=function(t,e,i){if(void 0===i&&(i=n),s(e,t.x1,t.y1))return i.x=t.x1,i.y=t.y1,!0;if(s(e,t.x2,t.y2))return i.x=t.x2,i.y=t.y2,!0;var r=t.x2-t.x1,o=t.y2-t.y1,a=e.x-t.x1,h=e.y-t.y1,l=r*r+o*o,u=r,c=o;if(l>0){var d=(a*r+h*o)/l;u*=d,c*=d}return i.x=t.x1+u,i.y=t.y1+c,u*u+c*c<=l&&u*r+c*o>=0&&s(e,i.x,i.y)}},76112:t=>{t.exports=function(t,e,i){var s=t.x1,n=t.y1,r=t.x2,o=t.y2,a=e.x1,h=e.y1,l=e.x2,u=e.y2;if(s===r&&n===o||a===l&&h===u)return!1;var c=(u-h)*(r-s)-(l-a)*(o-n);if(0===c)return!1;var d=((l-a)*(n-h)-(u-h)*(s-a))/c,f=((r-s)*(n-h)-(o-n)*(s-a))/c;return!(d<0||d>1||f<0||f>1)&&(i&&(i.x=s+d*(r-s),i.y=n+d*(o-n)),!0)}},92773:t=>{t.exports=function(t,e){var i=t.x1,s=t.y1,n=t.x2,r=t.y2,o=e.x,a=e.y,h=e.right,l=e.bottom,u=0;if(i>=o&&i<=h&&s>=a&&s<=l||n>=o&&n<=h&&r>=a&&r<=l)return!0;if(i=o){if((u=s+(r-s)*(o-i)/(n-i))>a&&u<=l)return!0}else if(i>h&&n<=h&&(u=s+(r-s)*(h-i)/(n-i))>=a&&u<=l)return!0;if(s=a){if((u=i+(n-i)*(a-s)/(r-s))>=o&&u<=h)return!0}else if(s>l&&r<=l&&(u=i+(n-i)*(l-s)/(r-s))>=o&&u<=h)return!0;return!1}},16204:t=>{t.exports=function(t,e,i){void 0===i&&(i=1);var s=e.x1,n=e.y1,r=e.x2,o=e.y2,a=t.x,h=t.y,l=(r-s)*(r-s)+(o-n)*(o-n);if(0===l)return!1;var u=((a-s)*(r-s)+(h-n)*(o-n))/l;if(u<0)return Math.sqrt((s-a)*(s-a)+(n-h)*(n-h))<=i;if(u>=0&&u<=1){var c=((n-h)*(r-s)-(s-a)*(o-n))/l;return Math.abs(c)*Math.sqrt(l)<=i}return Math.sqrt((r-a)*(r-a)+(o-h)*(o-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),n=Math.max(e.x1,e.x2),r=Math.min(e.y1,e.y2),o=Math.max(e.y1,e.y2);return t.x>=i&&t.x<=n&&t.y>=r&&t.y<=o}},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),n=i(37303),r=i(48653),o=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,n,r){return void 0===r&&(r=0),!(e>t.right+r||it.bottom+r||n{var s=i(80462),n=i(10690);t.exports=function(t,e){return!(t.left>e.right||t.righte.bottom||t.bottom{var s=i(76112);t.exports=function(t,e){return!(!t.contains(e.x1,e.y1)&&!t.contains(e.x2,e.y2))||(!!s(t.getLineA(),e)||(!!s(t.getLineB(),e)||!!s(t.getLineC(),e)))}},82944:(t,e,i)=>{var s=i(48653),n=i(71694),r=i(76112);t.exports=function(t,e){if(t.left>e.right||t.righte.bottom||t.bottom0||(c=n(e),(d=s(t,c,!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),n=Math.round(t.y1),r=Math.round(t.x2),o=Math.round(t.y2),a=Math.abs(r-s),h=Math.abs(o-n),l=s-h&&(c-=h,s+=l),f{t.exports=function(t,e,i){var s=e-(t.x1+t.x2)/2,n=i-(t.y1+t.y2)/2;return t.x1+=s,t.y1+=n,t.x2+=s,t.y2+=n,t}},31116:(t,e,i)=>{var s=i(23031);t.exports=function(t){return new s(t.x1,t.y1,t.x2,t.y2)}},59944:t=>{t.exports=function(t,e){return e.setTo(t.x1,t.y1,t.x2,t.y2)}},59220:t=>{t.exports=function(t,e){return t.x1===e.x1&&t.y1===e.y1&&t.x2===e.x2&&t.y2===e.y2}},78177:(t,e,i)=>{var s=i(35001);t.exports=function(t,e,i){void 0===i&&(i=e);var n=s(t),r=t.x2-t.x1,o=t.y2-t.y1;return e&&(t.x1=t.x1-r/n*e,t.y1=t.y1-o/n*e),i&&(t.x2=t.x2+r/n*i,t.y2=t.y2+o/n*i),t}},26708:(t,e,i)=>{var s=i(52816),n=i(6113),r=i(2141);t.exports=function(t,e,i,o,a){void 0===o&&(o=0),void 0===a&&(a=[]);var h,l,u=[],c=t.x1,d=t.y1,f=t.x2-c,p=t.y2-d,v=n(e,a),g=i-1;for(h=0;h0){var m=u[0],y=[m];for(h=1;h=o&&(y.push(x),m=x)}var T=u[u.length-1];return s(m,T){var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=(t.x1+t.x2)/2,e.y=(t.y1+t.y2)/2,e}},99569:(t,e,i)=>{var s=i(2141);t.exports=function(t,e,i){void 0===i&&(i=new s);var n=t.x1,r=t.y1,o=t.x2,a=t.y2,h=(o-n)*(o-n)+(a-r)*(a-r);if(0===h)return i;var l=((e.x-n)*(o-n)+(e.y-r)*(a-r))/h;return i.x=n+l*(o-n),i.y=r+l*(a-r),i}},34638:(t,e,i)=>{var s=i(36383),n=i(91938),r=i(2141);t.exports=function(t,e){void 0===e&&(e=new r);var i=n(t)-s.TAU;return e.x=Math.cos(i),e.y=Math.sin(i),e}},13151:(t,e,i)=>{var s=i(2141);t.exports=function(t,e,i){return void 0===i&&(i=new s),i.x=t.x1+(t.x2-t.x1)*e,i.y=t.y1+(t.y2-t.y1)*e,i}},15258:(t,e,i)=>{var s=i(35001),n=i(2141);t.exports=function(t,e,i,r){void 0===r&&(r=[]),!e&&i>0&&(e=s(t)/i);for(var o=t.x1,a=t.y1,h=t.x2,l=t.y2,u=0;u{t.exports=function(t,e){var i=t.x1,s=t.y1,n=t.x2,r=t.y2,o=(n-i)*(n-i)+(r-s)*(r-s);if(0===o)return!1;var a=((s-e.y)*(n-i)-(i-e.x)*(r-s))/o;return Math.abs(a)*Math.sqrt(o)}},98770:t=>{t.exports=function(t){return Math.abs(t.y1-t.y2)}},35001:t=>{t.exports=function(t){return Math.sqrt((t.x2-t.x1)*(t.x2-t.x1)+(t.y2-t.y1)*(t.y2-t.y1))}},23031:(t,e,i)=>{var s=i(83419),n=i(13151),r=i(15258),o=i(23777),a=i(65822),h=i(26099),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.LINE,this.x1=t,this.y1=e,this.x2=i,this.y2=s},getPoint:function(t,e){return n(this,t,e)},getPoints:function(t,e,i){return r(this,t,e,i)},getRandomPoint:function(t){return a(this,t)},setTo:function(t,e,i,s){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),this.x1=t,this.y1=e,this.x2=i,this.y2=s,this},setFromObjects:function(t,e){return this.x1=t.x,this.y1=t.y,this.x2=e.x,this.y2=e.y,this},getPointA:function(t){return void 0===t&&(t=new h),t.set(this.x1,this.y1),t},getPointB:function(t){return void 0===t&&(t=new h),t.set(this.x2,this.y2),t},left:{get:function(){return Math.min(this.x1,this.x2)},set:function(t){this.x1<=this.x2?this.x1=t:this.x2=t}},right:{get:function(){return Math.max(this.x1,this.x2)},set:function(t){this.x1>this.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),n=i(15994),r=i(91938);t.exports=function(t){var e=r(t)-s.TAU;return n(e,-Math.PI,Math.PI)}},52616:(t,e,i)=>{var s=i(36383),n=i(91938);t.exports=function(t){return Math.cos(n(t)-s.TAU)}},87231:(t,e,i)=>{var s=i(36383),n=i(91938);t.exports=function(t){return Math.sin(n(t)-s.TAU)}},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(2141);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),n=i(64795);t.exports=function(t,e){return 2*n(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,n=(t.y1+t.y2)/2;return s(t,i,n,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 n=Math.cos(s),r=Math.sin(s),o=t.x1-e,a=t.y1-i;return t.x1=o*n-a*r+e,t.y1=o*r+a*n+i,o=t.x2-e,a=t.y2-i,t.x2=o*n-a*r+e,t.y2=o*r+a*n+i,t}},62377:t=>{t.exports=function(t,e,i,s,n){return t.x1=e,t.y1=i,t.x2=e+Math.cos(s)*n,t.y2=i+Math.sin(s)*n,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},83997:(t,e,i)=>{var s=i(83419),n=i(87841),r=i(26099);function o(t,e,i,s){var n=t-i,r=e-s,o=n*n+r*r;return Math.sqrt(o)}var a=new s({initialize:function(t,e,i){this.vertex1=t,this.vertex2=e,this.vertex3=i,this.bounds=new n,this._inCenter=new r},getInCenter:function(t){void 0===t&&(t=!0);var e,i,s,n,r,a,h=this.vertex1,l=this.vertex2,u=this.vertex3;t?(e=h.x,i=h.y,s=l.x,n=l.y,r=u.x,a=u.y):(e=h.vx,i=h.vy,s=l.vx,n=l.vy,r=u.vx,a=u.vy);var c=o(r,a,s,n),d=o(e,i,r,a),f=o(s,n,e,i),p=c+d+f;return this._inCenter.set((e*c+s*d+r*f)/p,(i*c+n*d+a*f)/p)},contains:function(t,e,i){var s=this.vertex1,n=this.vertex2,r=this.vertex3,o=s.vx,a=s.vy,h=n.vx,l=n.vy,u=r.vx,c=r.vy;if(i){var d=i.a,f=i.b,p=i.c,v=i.d,g=i.e,m=i.f;o=s.vx*d+s.vy*p+g,a=s.vx*f+s.vy*v+m,h=n.vx*d+n.vy*p+g,l=n.vx*f+n.vy*v+m,u=r.vx*d+r.vy*p+g,c=r.vx*f+r.vy*v+m}var y=u-o,x=c-a,T=h-o,w=l-a,b=t-o,S=e-a,E=y*y+x*x,A=y*T+x*w,C=y*b+x*S,_=T*T+w*w,M=T*b+w*S,P=E*_-A*A,R=0===P?0:1/P,L=(_*C-A*M)*R,O=(E*M-A*C)*R;return L>=0&&O>=0&&L+O<1},isCounterClockwise:function(t){var e=this.vertex1,i=this.vertex2,s=this.vertex3,n=(i.vx-e.vx)*(s.vy-e.vy)-(i.vy-e.vy)*(s.vx-e.vx);return t<=0?n>=0:n<0},load:function(t,e,i,s,n){return i=this.vertex1.load(t,e,i,s,n),i=this.vertex2.load(t,e,i,s,n),i=this.vertex3.load(t,e,i,s,n)},transformCoordinatesLocal:function(t,e,i,s){return this.vertex1.transformCoordinatesLocal(t,e,i,s),this.vertex2.transformCoordinatesLocal(t,e,i,s),this.vertex3.transformCoordinatesLocal(t,e,i,s),this},updateBounds:function(){var t=this.vertex1,e=this.vertex2,i=this.vertex3,s=this.bounds;return s.x=Math.min(t.vx,e.vx,i.vx),s.y=Math.min(t.vy,e.vy,i.vy),s.width=Math.max(t.vx,e.vx,i.vx)-s.x,s.height=Math.max(t.vy,e.vy,i.vy)-s.y,this},isInView:function(t,e,i,s,n,r,o,a,h,l,u){this.update(s,n,r,o,a,h,l,u);var c=this.vertex1,d=this.vertex2,f=this.vertex3;if(c.ta<=0&&d.ta<=0&&f.ta<=0)return!1;if(e&&!this.isCounterClockwise(i))return!1;var p=this.bounds;p.x=Math.min(c.tx,d.tx,f.tx),p.y=Math.min(c.ty,d.ty,f.ty),p.width=Math.max(c.tx,d.tx,f.tx)-p.x,p.height=Math.max(c.ty,d.ty,f.ty)-p.y;var v=t.x+t.width,g=t.y+t.height;return!(p.width<=0||p.height<=0||t.width<=0||t.height<=0)&&!(p.rightv||p.y>g)},scrollUV:function(t,e){return this.vertex1.scrollUV(t,e),this.vertex2.scrollUV(t,e),this.vertex3.scrollUV(t,e),this},scaleUV:function(t,e){return this.vertex1.scaleUV(t,e),this.vertex2.scaleUV(t,e),this.vertex3.scaleUV(t,e),this},setColor:function(t){return this.vertex1.color=t,this.vertex2.color=t,this.vertex3.color=t,this},update:function(t,e,i,s,n,r,o,a){return this.vertex1.update(e,i,s,n,r,o,a,t),this.vertex2.update(e,i,s,n,r,o,a,t),this.vertex3.update(e,i,s,n,r,o,a,t),this},translate:function(t,e){void 0===e&&(e=0);var i=this.vertex1,s=this.vertex2,n=this.vertex3;return i.x+=t,i.y+=e,s.x+=t,s.y+=e,n.x+=t,n.y+=e,this},x:{get:function(){return this.getInCenter().x},set:function(t){var e=this.getInCenter();this.translate(t-e.x,0)}},y:{get:function(){return this.getInCenter().y},set:function(t){var e=this.getInCenter();this.translate(0,t-e.y)}},alpha:{get:function(){var t=this.vertex1,e=this.vertex2,i=this.vertex3;return(t.alpha+e.alpha+i.alpha)/3},set:function(t){this.vertex1.alpha=t,this.vertex2.alpha=t,this.vertex3.alpha=t}},depth:{get:function(){var t=this.vertex1,e=this.vertex2,i=this.vertex3;return(t.vz+e.vz+i.vz)/3}},destroy:function(){this.vertex1=null,this.vertex2=null,this.vertex3=null}});t.exports=a},48803:(t,e,i)=>{var s=i(83997),n=i(95540),r=i(37867),o=i(25836),a=i(39318),h=new o,l=new o,u=new r;t.exports=function(t){var e,i=n(t,"mesh"),r=n(t,"texture",null),o=n(t,"frame"),c=n(t,"width",1),d=n(t,"height",c),f=n(t,"widthSegments",1),p=n(t,"heightSegments",f),v=n(t,"x",0),g=n(t,"y",0),m=n(t,"z",0),y=n(t,"rotateX",0),x=n(t,"rotateY",0),T=n(t,"rotateZ",0),w=n(t,"zIsUp",!0),b=n(t,"isOrtho",!!i&&i.dirtyCache[11]),S=n(t,"colors",[16777215]),E=n(t,"alphas",[1]),A=n(t,"tile",!1),C=n(t,"flipY",!1),_=n(t,"width",null),M={faces:[],verts:[]};if(h.set(v,g,m),l.set(y,x,T),u.fromRotationXYTranslation(l,h,w),!r&&i)r=i.texture,o||(e=i.frame);else if(i&&"string"==typeof r)r=i.scene.sys.textures.get(r);else if(!r)return M;e||(e=r.get(o)),!_&&b&&r&&i&&(c=e.width/i.height,d=e.height/i.height);var P,R,L=c/2,O=d/2,F=Math.floor(f),D=Math.floor(p),I=F+1,k=D+1,B=c/F,N=d/D,U=[],X=[],Y=0,z=1,G=0,V=1;e&&(Y=e.u0,z=e.u1,C?(G=e.v1,V=e.v0):(G=e.v0,V=e.v1));var W=z-Y,H=V-G;for(R=0;R{var s=i(83997),n=i(37867),r=i(25836),o=i(39318),a=new r,h=new r,l=new n;t.exports=function(t,e,i,n,r,u,c,d,f,p){void 0===i&&(i=1),void 0===n&&(n=0),void 0===r&&(r=0),void 0===u&&(u=0),void 0===c&&(c=0),void 0===d&&(d=0),void 0===f&&(f=0),void 0===p&&(p=!0);var v={faces:[],verts:[]},g=t.materials;a.set(n,r,u),h.set(c,d,f),l.fromRotationXYTranslation(h,a,p);for(var m=0;m{var s=i(83997),n=i(39318);t.exports=function(t,e,i,r,o,a,h,l){if(void 0===r&&(r=!1),void 0===a&&(a=16777215),void 0===h&&(h=1),void 0===l&&(l=!1),t.length===e.length||r){var u,c,d,f,p,v,g,m,y,x,T,w={faces:[],vertices:[]},b=r?3:2,S=Array.isArray(a),E=Array.isArray(h);if(Array.isArray(i)&&i.length>0)for(u=0;u{var e=!0,i="untitled",s="",n="";function r(t){var e=t.indexOf("#");return e>-1?t.substring(0,e):t}function o(t){return 0===t.models.length&&t.models.push({faces:[],name:i,textureCoords:[],vertexNormals:[],vertices:[]}),s="",t.models[t.models.length-1]}function a(t,e){var n=t.length>=2?t[1]:i;e.models.push({faces:[],name:n,textureCoords:[],vertexNormals:[],vertices:[]}),s=""}function h(t){2===t.length&&(s=t[1])}function l(t,e){var i=t.length,s=i>=2?parseFloat(t[1]):0,n=i>=3?parseFloat(t[2]):0,r=i>=4?parseFloat(t[3]):0;o(e).vertices.push({x:s,y:n,z:r})}function u(t,i){var s=t.length,n=s>=2?parseFloat(t[1]):0,r=s>=3?parseFloat(t[2]):0,a=s>=4?parseFloat(t[3]):0;isNaN(n)&&(n=0),isNaN(r)&&(r=0),isNaN(a)&&(a=0),e&&(r=1-r),o(i).textureCoords.push({u:n,v:r,w:a})}function c(t,e){var i=t.length,s=i>=2?parseFloat(t[1]):0,n=i>=3?parseFloat(t[2]):0,r=i>=4?parseFloat(t[3]):0;o(e).vertexNormals.push({x:s,y:n,z:r})}function d(t,e){var i=t.length-1;if(!(i<3)){for(var r={group:s,material:n,vertices:[]},a=0;a3)){var u=0,c=0,d=0;u=parseInt(h[0],10),l>1&&""!==h[1]&&(c=parseInt(h[1],10)),l>2&&(d=parseInt(h[2],10)),0!==u&&(u<0&&(u=o(e).vertices.length+1+u),c-=1,u-=1,d-=1,r.vertices.push({textureCoordsIndex:c,vertexIndex:u,vertexNormalIndex:d}))}}o(e).faces.push(r)}}function f(t,e){t.length>=2&&e.materialLibraries.push(t[1])}function p(t){t.length>=2&&(n=t[1])}t.exports=function(t,i){void 0===i&&(i=!0),e=i;var o={materials:{},materialLibraries:[],models:[]};s="",n="";for(var v=t.split("\n"),g=0;g{var s=i(37589);t.exports=function(t){for(var e={},i=t.split("\n"),n="",r=0;r=2?Math.floor(255*a[2]):h,u=a.length>=3?Math.floor(255*a[3]):h;e[n]=s(h,l,u)}}}return e}},92570:t=>{t.exports=function(t,e,i,s){var n,r;if(void 0===i&&void 0===s){var o=t.getInCenter();n=o.x,r=o.y}var a=Math.cos(e),h=Math.sin(e),l=t.vertex1,u=t.vertex2,c=t.vertex3,d=l.x-n,f=l.y-r;l.set(d*a-f*h+n,d*h+f*a+r),d=u.x-n,f=u.y-r,u.set(d*a-f*h+n,d*h+f*a+r),d=c.x-n,f=c.y-r,c.set(d*a-f*h+n,d*h+f*a+r)}},39318:(t,e,i)=>{var s=i(83419),n=i(70554),r=i(25836),o=new s({Extends:r,initialize:function(t,e,i,s,n,o,a,h,l,u){void 0===o&&(o=16777215),void 0===a&&(a=1),void 0===h&&(h=0),void 0===l&&(l=0),void 0===u&&(u=0),r.call(this,t,e,i),this.vx=0,this.vy=0,this.vz=0,this.nx=h,this.ny=l,this.nz=u,this.u=s,this.v=n,this.color=o,this.alpha=a,this.tx=0,this.ty=0,this.ta=0,this.tu=s,this.tv=n},setUVs:function(t,e){return this.u=t,this.v=e,this.tu=t,this.tv=e,this},scrollUV:function(t,e){return this.tu+=t,this.tv+=e,this},scaleUV:function(t,e){return this.tu=this.u*t,this.tv=this.v*e,this},transformCoordinatesLocal:function(t,e,i,s){var n=this.x,r=this.y,o=this.z,a=t.val,h=n*a[0]+r*a[4]+o*a[8]+a[12],l=n*a[1]+r*a[5]+o*a[9]+a[13],u=n*a[2]+r*a[6]+o*a[10]+a[14],c=n*a[3]+r*a[7]+o*a[11]+a[15];this.vx=h/c*e,this.vy=-l/c*i,this.vz=s<=0?u/c:-u/c},resize:function(t,e,i,s,n,r){return this.x=t,this.y=e,this.vx=this.x*i,this.vy=-this.y*s,this.vz=0,n<.5?this.vx+=i*(.5-n):n>.5&&(this.vx-=i*(n-.5)),r<.5?this.vy+=s*(.5-r):r>.5&&(this.vy-=s*(r-.5)),this},update:function(t,e,i,s,n,r,o,a){var h=this.vx*t+this.vy*i+n,l=this.vx*e+this.vy*s+r;return o&&(h=Math.round(h),l=Math.round(l)),this.tx=h,this.ty=l,this.ta=this.alpha*a,this},load:function(t,e,i,s,r){return t[++i]=this.tx,t[++i]=this.ty,t[++i]=this.tu,t[++i]=this.tv,t[++i]=s,t[++i]=r,e[++i]=n.getTintAppendFloatAlpha(this.color,this.ta),i}});t.exports=o},73090:(t,e,i)=>{var s={Face:i(83997),GenerateGridVerts:i(48803),GenerateObjVerts:i(34684),GenerateVerts:i(92515),ParseObj:i(85048),ParseObjMaterial:i(61485),RotateFace:i(92570),Vertex:i(39318)};t.exports=s},96550:t=>{t.exports=function(t){return t.setTo(Math.ceil(t.x),Math.ceil(t.y))}},99706:(t,e,i)=>{var s=i(2141);t.exports=function(t){return new s(t.x,t.y)}},68010:t=>{t.exports=function(t,e){return e.setTo(t.x,t.y)}},27814:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y}},73565:t=>{t.exports=function(t){return t.setTo(Math.floor(t.x),Math.floor(t.y))}},87555:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){if(void 0===e&&(e=new s),!Array.isArray(t))throw new Error("GetCentroid points argument must be an array");var i=t.length;if(i<1)throw new Error("GetCentroid points array must not be empty");if(1===i)e.x=t[0].x,e.y=t[0].y;else{for(var n=0;n{t.exports=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)}},44405:t=>{t.exports=function(t){return t.x*t.x+t.y*t.y}},20873:(t,e,i)=>{var s=i(87841);t.exports=function(t,e){void 0===e&&(e=new s);for(var i=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=0;ai&&(i=h.x),h.xr&&(r=h.y),h.y{var s=i(2141);t.exports=function(t,e,i,n){return void 0===i&&(i=0),void 0===n&&(n=new s),n.x=t.x+(e.x-t.x)*i,n.y=t.y+(e.y-t.y)*i,n}},55767:t=>{t.exports=function(t){return t.setTo(t.y,t.x)}},79432:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.setTo(-t.x,-t.y)}},2141:(t,e,i)=>{var s=i(83419),n=i(23777),r=new s({initialize:function(t,e){void 0===t&&(t=0),void 0===e&&(e=t),this.type=n.POINT,this.x=t,this.y=e},setTo:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x=t,this.y=e,this}});t.exports=r},72930:(t,e,i)=>{var s=i(2141),n=i(44405);t.exports=function(t,e,i){void 0===i&&(i=new s);var r=(t.x*e.x+t.y*e.y)/n(e);return 0!==r&&(i.x=r*e.x,i.y=r*e.y),i}},62880:(t,e,i)=>{var s=i(2141);t.exports=function(t,e,i){void 0===i&&(i=new s);var n=t.x*e.x+t.y*e.y;return 0!==n&&(i.x=n*e.x,i.y=n*e.y),i}},15093:(t,e,i)=>{var s=i(28793);t.exports=function(t,e){if(0!==t.x||0!==t.y){var i=s(t);t.x/=i,t.y/=i}return t.x*=e,t.y*=e,t}},43711:(t,e,i)=>{var s=i(2141);s.Ceil=i(96550),s.Clone=i(99706),s.CopyFrom=i(68010),s.Equals=i(27814),s.Floor=i(73565),s.GetCentroid=i(87555),s.GetMagnitude=i(28793),s.GetMagnitudeSq=i(44405),s.GetRectangleFromPoints=i(20873),s.Interpolate=i(26152),s.Invert=i(55767),s.Negative=i(79432),s.Project=i(72930),s.ProjectUnit=i(62880),s.SetMagnitude=i(15093),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,n=-1,r=t.points.length-1;++n{var s=i(63814);t.exports=function(t,e){return s(t,e.x,e.y)}},94811:t=>{"use strict";function e(t,e,s){s=s||2;var r,o,a,h,c,d,p,v=e&&e.length,g=v?e[0]*s:t.length,m=i(t,0,g,s,!0),y=[];if(!m||m.next===m.prev)return y;if(v&&(m=function(t,e,s,n){var r,o,a,h=[];for(r=0,o=e.length;r80*s){r=a=t[0],o=h=t[1];for(var x=s;xa&&(a=c),d>h&&(h=d);p=0!==(p=Math.max(a-r,h-o))?32767/p:0}return n(m,y,s,r,o,p,0),y}function i(t,e,i,s,n){var r,o;if(n===C(t,e,i,s)>0)for(r=e;r=e;r-=s)o=S(r,t[r],t[r+1],o);return o&&m(o,o.next)&&(E(o),o=o.next),o}function s(t,e){if(!t)return t;e||(e=t);var i,s=t;do{if(i=!1,s.steiner||!m(s,s.next)&&0!==g(s.prev,s,s.next))s=s.next;else{if(E(s),(s=e=s.prev)===s.next)break;i=!0}}while(i||s!==e);return e}function n(t,e,i,l,u,c,f){if(t){!f&&c&&function(t,e,i,s){var n=t;do{0===n.z&&(n.z=d(n.x,n.y,e,i,s)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next}while(n!==t);n.prevZ.nextZ=null,n.prevZ=null,function(t){var e,i,s,n,r,o,a,h,l=1;do{for(i=t,t=null,r=null,o=0;i;){for(o++,s=i,a=0,e=0;e0||h>0&&s;)0!==a&&(0===h||!s||i.z<=s.z)?(n=i,i=i.nextZ,a--):(n=s,s=s.nextZ,h--),r?r.nextZ=n:t=n,n.prevZ=r,r=n;i=s}r.nextZ=null,l*=2}while(o>1)}(n)}(t,l,u,c);for(var p,v,g=t;t.prev!==t.next;)if(p=t.prev,v=t.next,c?o(t,l,u,c):r(t))e.push(p.i/i|0),e.push(t.i/i|0),e.push(v.i/i|0),E(t),t=v.next,g=v.next;else if((t=v)===g){f?1===f?n(t=a(s(t),e,i),e,i,l,u,c,2):2===f&&h(t,e,i,l,u,c):n(s(t),e,i,l,u,c,1);break}}}function r(t){var e=t.prev,i=t,s=t.next;if(g(e,i,s)>=0)return!1;for(var n=e.x,r=i.x,o=s.x,a=e.y,h=i.y,l=s.y,u=nr?n>o?n:o:r>o?r:o,f=a>h?a>l?a:l:h>l?h:l,v=s.next;v!==e;){if(v.x>=u&&v.x<=d&&v.y>=c&&v.y<=f&&p(n,a,r,h,o,l,v.x,v.y)&&g(v.prev,v,v.next)>=0)return!1;v=v.next}return!0}function o(t,e,i,s){var n=t.prev,r=t,o=t.next;if(g(n,r,o)>=0)return!1;for(var a=n.x,h=r.x,l=o.x,u=n.y,c=r.y,f=o.y,v=ah?a>l?a:l:h>l?h:l,x=u>c?u>f?u:f:c>f?c:f,T=d(v,m,e,i,s),w=d(y,x,e,i,s),b=t.prevZ,S=t.nextZ;b&&b.z>=T&&S&&S.z<=w;){if(b.x>=v&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==o&&p(a,u,h,c,l,f,b.x,b.y)&&g(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,S.x>=v&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==o&&p(a,u,h,c,l,f,S.x,S.y)&&g(S.prev,S,S.next)>=0)return!1;S=S.nextZ}for(;b&&b.z>=T;){if(b.x>=v&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==o&&p(a,u,h,c,l,f,b.x,b.y)&&g(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;S&&S.z<=w;){if(S.x>=v&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==o&&p(a,u,h,c,l,f,S.x,S.y)&&g(S.prev,S,S.next)>=0)return!1;S=S.nextZ}return!0}function a(t,e,i){var n=t;do{var r=n.prev,o=n.next.next;!m(r,o)&&y(r,n,n.next,o)&&w(r,o)&&w(o,r)&&(e.push(r.i/i|0),e.push(n.i/i|0),e.push(o.i/i|0),E(n),E(n.next),n=t=o),n=n.next}while(n!==t);return s(n)}function h(t,e,i,r,o,a){var h=t;do{for(var l=h.next.next;l!==h.prev;){if(h.i!==l.i&&v(h,l)){var u=b(h,l);return h=s(h,h.next),u=s(u,u.next),n(h,e,i,r,o,a,0),void n(u,e,i,r,o,a,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,n=t.x,r=t.y,o=-1/0;do{if(r<=s.y&&r>=s.next.y&&s.next.y!==s.y){var a=s.x+(r-s.y)*(s.next.x-s.x)/(s.next.y-s.y);if(a<=n&&a>o&&(o=a,i=s.x=s.x&&s.x>=u&&n!==s.x&&p(ri.x||s.x===i.x&&c(i,s)))&&(i=s,f=h)),s=s.next}while(s!==l);return i}(t,e);if(!i)return e;var n=b(i,t);return s(n,n.next),s(i,i.next)}function c(t,e){return g(t.prev,t,e.prev)<0&&g(e.next,t,t.next)<0}function d(t,e,i,s,n){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*n|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*n|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function f(t){var e=t,i=t;do{(e.x=(t-o)*(r-a)&&(t-o)*(s-a)>=(i-o)*(e-a)&&(i-o)*(r-a)>=(n-o)*(s-a)}function v(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,n=(t.x+e.x)/2,r=(t.y+e.y)/2;do{i.y>r!=i.next.y>r&&i.next.y!==i.y&&n<(i.next.x-i.x)*(r-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(g(t.prev,t,e.prev)||g(t,e.prev,e))||m(t,e)&&g(t.prev,t,t.next)>0&&g(e.prev,e,e.next)>0)}function g(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function m(t,e){return t.x===e.x&&t.y===e.y}function y(t,e,i,s){var n=T(g(t,e,i)),r=T(g(t,e,s)),o=T(g(i,s,t)),a=T(g(i,s,e));return n!==r&&o!==a||(!(0!==n||!x(t,i,e))||(!(0!==r||!x(t,s,e))||(!(0!==o||!x(i,t,s))||!(0!==a||!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 g(t.prev,t,t.next)<0?g(t,e,t.next)>=0&&g(t,t.prev,e)>=0:g(t,e,t.prev)<0||g(t,t.next,e)<0}function b(t,e){var i=new A(t.i,t.x,t.y),s=new A(e.i,e.x,e.y),n=t.next,r=e.prev;return t.next=e,e.prev=t,i.next=n,n.prev=i,s.next=i,i.prev=s,r.next=s,s.prev=r,s}function S(t,e,i,s){var n=new A(t,e,i);return s?(n.next=s.next,n.prev=s,s.next.prev=n,s.next=n):(n.prev=n,n.next=n),n}function E(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 A(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 C(t,e,i,s){for(var n=0,r=e,o=i-s;r0&&(s+=t[n-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,n=1/0,r=1/0,o=-n,a=-r,h=0;h{t.exports=function(t,e){void 0===e&&(e=[]);for(var i=0;i{var s=i(35001),n=i(23031),r=i(30052);t.exports=function(t,e,i,o){void 0===o&&(o=[]);var a=t.points,h=r(t);!e&&i>0&&(e=h/i);for(var l=0;lc+g)){var m=v.getPoint((u-c)/g);o.push(m);break}c+=g}return o}},30052:(t,e,i)=>{var s=i(35001),n=i(23031);t.exports=function(t){for(var e=t.points,i=0,r=0;r{var s=i(83419),n=i(63814),r=i(9564),o=i(23777),a=new s({initialize:function(t){this.type=o.POLYGON,this.area=0,this.points=[],t&&this.setTo(t)},contains:function(t,e){return n(this,t,e)},setTo:function(t){if(this.area=0,this.points=[],"string"==typeof t&&(t=t.split(" ")),!Array.isArray(t))return this;for(var e,i=0;i{t.exports=function(t){return t.points.reverse(),t}},29524:t=>{function e(t,e,i){var s=e.x,n=e.y,r=i.x-s,o=i.y-n;if(0!==r||0!==o){var a=((t.x-s)*r+(t.y-n)*o)/(r*r+o*o);a>1?(s=i.x,n=i.y):a>0&&(s+=r*a,n+=o*a)}return(r=t.x-s)*r+(o=t.y-n)*o}function i(t,s,n,r,o){for(var a,h=r,l=s+1;lh&&(a=l,h=u)}h>r&&(a-s>1&&i(t,s,a,r,o),o.push(t[a]),n-a>1&&i(t,a,n,r,o))}function s(t,e){var s=t.length-1,n=[t[0]];return i(t,0,s,e,n),n.push(t[s]),n}t.exports=function(t,e,i){void 0===e&&(e=1),void 0===i&&(i=!1);var n=t.points;if(n.length>2){var r=e*e;i||(n=function(t,e){for(var i,s,n,r,o,a=t[0],h=[a],l=1,u=t.length;le&&(h.push(i),a=i);return a!==i&&h.push(i),h}(n,r)),t.setTo(s(n,r))}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=[],n=t.points;for(i=0;i0&&r.push(e([0,0],s[0])),i=0;i1&&r.push(e([0,0],s[s.length-1])),t.setTo(r)}},24709:t=>{t.exports=function(t,e,i){for(var s=t.points,n=0;n{var s=i(25717);s.Clone=i(12306),s.Contains=i(63814),s.ContainsPoint=i(99338),s.Earcut=i(94811),s.GetAABB=i(13829),s.GetNumberArray=i(26173),s.GetPoints=i(9564),s.Perimeter=i(30052),s.Reverse=i(8133),s.Simplify=i(29524),s.Smooth=i(5469),s.Translate=i(24709),t.exports=s},62224:t=>{t.exports=function(t){return t.width*t.height}},98615:t=>{t.exports=function(t){return t.x=Math.ceil(t.x),t.y=Math.ceil(t.y),t}},31688:t=>{t.exports=function(t){return t.x=Math.ceil(t.x),t.y=Math.ceil(t.y),t.width=Math.ceil(t.width),t.height=Math.ceil(t.height),t}},67502:t=>{t.exports=function(t,e,i){return t.x=e-t.width/2,t.y=i-t.height/2,t}},65085:(t,e,i)=>{var s=i(87841);t.exports=function(t){return new s(t.x,t.y,t.width,t.height)}},37303:t=>{t.exports=function(t,e,i){return!(t.width<=0||t.height<=0)&&(t.x<=e&&t.x+t.width>=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.bottom{t.exports=function(t,e){return e.setTo(t.x,t.y,t.width,t.height)}},77493:t=>{t.exports=function(t,e){return void 0===e&&(e=[]),e.push({x:t.x,y:t.y}),e.push({x:t.right,y:t.y}),e.push({x:t.right,y:t.bottom}),e.push({x:t.x,y:t.bottom}),e}},9219:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}},53751:(t,e,i)=>{var s=i(8249);t.exports=function(t,e){var i=s(t);return i{var s=i(8249);t.exports=function(t,e){var i=s(t);return i>s(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),n=i(36383);t.exports=function(t,e){if(void 0===e&&(e=new s),0===t.length)return e;for(var i,r,o,a=Number.MAX_VALUE,h=Number.MAX_VALUE,l=n.MIN_SAFE_INTEGER,u=n.MIN_SAFE_INTEGER,c=0;c{var s=i(87841);t.exports=function(t,e,i,n,r){return void 0===r&&(r=new s),r.setTo(Math.min(t,i),Math.min(e,n),Math.abs(t-i),Math.abs(e-n))}},8249:t=>{t.exports=function(t){return 0===t.height?NaN:t.width/t.height}},27165:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=t.centerX,e.y=t.centerY,e}},20812:(t,e,i)=>{var s=i(13019),n=i(2141);t.exports=function(t,e,i){if(void 0===i&&(i=new n),e<=0||e>=1)return i.x=t.x,i.y=t.y,i;var r=s(t)*e;return e>.5?(r-=t.width+t.height)<=t.width?(i.x=t.right-r,i.y=t.bottom):(i.x=t.x,i.y=t.bottom-(r-t.width)):r<=t.width?(i.x=t.x+r,i.y=t.y):(i.x=t.right,i.y=t.y+(r-t.width)),i}},34819:(t,e,i)=>{var s=i(20812),n=i(13019);t.exports=function(t,e,i,r){void 0===r&&(r=[]),!e&&i>0&&(e=n(t)/i);for(var o=0;o{var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=t.width,e.y=t.height,e}},86091:(t,e,i)=>{var s=i(67502);t.exports=function(t,e,i){var n=t.centerX,r=t.centerY;return t.setSize(t.width+2*e,t.height+2*i),s(t,n,r)}},53951:(t,e,i)=>{var s=i(87841),n=i(59996);t.exports=function(t,e,i){return void 0===i&&(i=new s),n(t,e)?(i.x=Math.max(t.x,e.x),i.y=Math.max(t.y,e.y),i.width=Math.min(t.right,e.right)-i.x,i.height=Math.min(t.bottom,e.bottom)-i.y):i.setEmpty(),i}},14649:(t,e,i)=>{var s=i(13019),n=i(2141);t.exports=function(t,e,i,r){if(void 0===r&&(r=[]),!e&&!i)return r;e?i=Math.round(s(t)/e):e=s(t)/i;for(var o=t.x,a=t.y,h=0,l=0;l=t.right&&(h=1,a+=o-t.right,o=t.right);break;case 1:(a+=e)>=t.bottom&&(h=2,o-=a-t.bottom,a=t.bottom);break;case 2:(o-=e)<=t.left&&(h=3,a-=t.left-o,o=t.left);break;case 3:(a-=e)<=t.top&&(h=0,a=t.top)}return r}},33595:t=>{t.exports=function(t,e){for(var i=t.x,s=t.right,n=t.y,r=t.bottom,o=0;o{t.exports=function(t,e){var i=Math.min(t.x,e.x),s=Math.max(t.right,e.right);t.x=i,t.width=s-i;var n=Math.min(t.y,e.y),r=Math.max(t.bottom,e.bottom);return t.y=n,t.height=r-n,t}},92171:t=>{t.exports=function(t,e,i){var s=Math.min(t.x,e),n=Math.max(t.right,e);t.x=s,t.width=n-s;var r=Math.min(t.y,i),o=Math.max(t.bottom,i);return t.y=r,t.height=o-r,t}},42981:t=>{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},46907:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},60170:t=>{t.exports=function(t,e){return t.xe.x&&t.ye.y}},13019:t=>{t.exports=function(t){return 2*(t.width+t.height)}},85133:(t,e,i)=>{var s=i(2141),n=i(39506);t.exports=function(t,e,i){void 0===i&&(i=new s),e=n(e);var r=Math.sin(e),o=Math.cos(e),a=o>0?t.width/2:t.width/-2,h=r>0?t.height/2:t.height/-2;return Math.abs(a*r){var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=t.x+Math.random()*t.width,e.y=t.y+Math.random()*t.height,e}},86470:(t,e,i)=>{var s=i(30976),n=i(70273),r=i(2141);t.exports=function(t,e,i){if(void 0===i&&(i=new r),n(t,e))switch(s(0,3)){case 0:i.x=t.x+Math.random()*(e.right-t.x),i.y=t.y+Math.random()*(e.top-t.y);break;case 1:i.x=e.x+Math.random()*(t.right-e.x),i.y=e.bottom+Math.random()*(t.bottom-e.bottom);break;case 2:i.x=t.x+Math.random()*(e.x-t.x),i.y=e.y+Math.random()*(t.bottom-e.y);break;case 3:i.x=e.right+Math.random()*(t.right-e.right),i.y=t.y+Math.random()*(e.bottom-t.y)}return i}},87841:(t,e,i)=>{var s=i(83419),n=i(37303),r=i(20812),o=i(34819),a=i(23777),h=i(23031),l=i(26597),u=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=a.RECTANGLE,this.x=t,this.y=e,this.width=i,this.height=s},contains:function(t,e){return n(this,t,e)},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return l(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.setTo(0,0,0,0)},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},getLineA:function(t){return void 0===t&&(t=new h),t.setTo(this.x,this.y,this.right,this.y),t},getLineB:function(t){return void 0===t&&(t=new h),t.setTo(this.right,this.y,this.right,this.bottom),t},getLineC:function(t){return void 0===t&&(t=new h),t.setTo(this.right,this.bottom,this.x,this.bottom),t},getLineD:function(t){return void 0===t&&(t=new h),t.setTo(this.x,this.bottom,this.x,this.y),t},left:{get:function(){return this.x},set:function(t){t>=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 n=Math.min(t.x,e.x),r=Math.min(t.y,e.y),o=Math.max(t.right,e.right)-n,a=Math.max(t.bottom,e.bottom)-r;return i.setTo(n,r,o,a)}},93232:(t,e,i)=>{var s=i(87841);s.Area=i(62224),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,n=t.y2,r=t.x3,o=t.y3;return Math.abs(((r-e)*(n-i)-(s-e)*(o-i))/2)}},39208:(t,e,i)=>{var s=i(16483);t.exports=function(t,e,i){var n=i*(Math.sqrt(3)/2);return new s(t,e,t+i/2,e+n,t-i/2,e+n)}},39545:(t,e,i)=>{var s=i(94811),n=i(16483);t.exports=function(t,e,i,r,o){void 0===e&&(e=null),void 0===i&&(i=1),void 0===r&&(r=1),void 0===o&&(o=[]);for(var a,h,l,u,c,d,f,p,v,g=s(t,e),m=0;m{var s=i(16483);t.exports=function(t,e,i,n){return void 0===n&&(n=i),new s(t,e,t,e-n,t+i,e)}},23707:(t,e,i)=>{var s=i(97523),n=i(13584);t.exports=function(t,e,i,r){void 0===r&&(r=s);var o=r(t),a=e-o.x,h=i-o.y;return n(t,a,h)}},97523:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=(t.x1+t.x2+t.x3)/3,e.y=(t.y1+t.y2+t.y3)/3,e}},24951:(t,e,i)=>{var s=i(26099);function n(t,e,i,s){return t*s-e*i}t.exports=function(t,e){void 0===e&&(e=new s);var i=t.x3,r=t.y3,o=t.x1-i,a=t.y1-r,h=t.x2-i,l=t.y2-r,u=2*n(o,a,h,l),c=n(a,o*o+a*a,l,h*h+l*l),d=n(o,o*o+a*a,h,h*h+l*l);return e.x=i-c/u,e.y=r+d/u,e}},85614:(t,e,i)=>{var s=i(96503);t.exports=function(t,e){void 0===e&&(e=new s);var i,n,r=t.x1,o=t.y1,a=t.x2,h=t.y2,l=t.x3,u=t.y3,c=a-r,d=h-o,f=l-r,p=u-o,v=c*(r+a)+d*(o+h),g=f*(r+l)+p*(o+u),m=2*(c*(u-h)-d*(l-a));if(Math.abs(m)<1e-6){var y=Math.min(r,a,l),x=Math.min(o,h,u);i=.5*(Math.max(r,a,l)-y),n=.5*(Math.max(o,h,u)-x),e.x=y+i,e.y=x+n,e.radius=Math.sqrt(i*i+n*n)}else e.x=(p*v-d*g)/m,e.y=(c*g-f*v)/m,i=e.x-r,n=e.y-o,e.radius=Math.sqrt(i*i+n*n);return e}},74422:(t,e,i)=>{var s=i(16483);t.exports=function(t){return new s(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)}},10690:t=>{t.exports=function(t,e,i){var s=t.x3-t.x1,n=t.y3-t.y1,r=t.x2-t.x1,o=t.y2-t.y1,a=e-t.x1,h=i-t.y1,l=s*s+n*n,u=s*r+n*o,c=s*a+n*h,d=r*r+o*o,f=r*a+o*h,p=l*d-u*u,v=0===p?0:1/p,g=(d*c-u*f)*v,m=(l*f-u*c)*v;return g>=0&&m>=0&&g+m<1}},48653:t=>{t.exports=function(t,e,i,s){void 0===i&&(i=!1),void 0===s&&(s=[]);for(var n,r,o,a,h,l,u=t.x3-t.x1,c=t.y3-t.y1,d=t.x2-t.x1,f=t.y2-t.y1,p=u*u+c*c,v=u*d+c*f,g=d*d+f*f,m=p*g-v*v,y=0===m?0:1/m,x=t.x1,T=t.y1,w=0;w=0&&r>=0&&n+r<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(2141),n=i(35001);t.exports=function(t,e,i){void 0===i&&(i=new s);var r=t.getLineA(),o=t.getLineB(),a=t.getLineC();if(e<=0||e>=1)return i.x=r.x1,i.y=r.y1,i;var h=n(r),l=n(o),u=n(a),c=(h+l+u)*e,d=0;return ch+l?(d=(c-=h+l)/u,i.x=a.x1+(a.x2-a.x1)*d,i.y=a.y1+(a.y2-a.y1)*d):(d=(c-=h)/l,i.x=o.x1+(o.x2-o.x1)*d,i.y=o.y1+(o.y2-o.y1)*d),i}},80672:(t,e,i)=>{var s=i(35001),n=i(2141);t.exports=function(t,e,i,r){void 0===r&&(r=[]);var o=t.getLineA(),a=t.getLineB(),h=t.getLineC(),l=s(o),u=s(a),c=s(h),d=l+u+c;!e&&i>0&&(e=d/i);for(var f=0;fl+u?(v=(p-=l+u)/c,g.x=h.x1+(h.x2-h.x1)*v,g.y=h.y1+(h.y2-h.y1)*v):(v=(p-=l)/u,g.x=a.x1+(a.x2-a.x1)*v,g.y=a.y1+(a.y2-a.y1)*v),r.push(g)}return r}},39757:(t,e,i)=>{var s=i(2141);function n(t,e,i,s){var n=t-i,r=e-s,o=n*n+r*r;return Math.sqrt(o)}t.exports=function(t,e){void 0===e&&(e=new s);var i=t.x1,r=t.y1,o=t.x2,a=t.y2,h=t.x3,l=t.y3,u=n(h,l,o,a),c=n(i,r,h,l),d=n(o,a,i,r),f=u+c+d;return e.x=(i*u+o*c+h*d)/f,e.y=(r*u+a*c+l*d)/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(),n=t.getLineC();return s(e)+s(i)+s(n)}},90260:(t,e,i)=>{var s=i(2141);t.exports=function(t,e){void 0===e&&(e=new s);var i=t.x2-t.x1,n=t.y2-t.y1,r=t.x3-t.x1,o=t.y3-t.y1,a=Math.random(),h=Math.random();return a+h>=1&&(a=1-a,h=1-h),e.x=t.x1+(i*a+r*h),e.y=t.y1+(n*a+o*h),e}},52172:(t,e,i)=>{var s=i(99614),n=i(39757);t.exports=function(t,e){var i=n(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 n=Math.cos(s),r=Math.sin(s),o=t.x1-e,a=t.y1-i;return t.x1=o*n-a*r+e,t.y1=o*r+a*n+i,o=t.x2-e,a=t.y2-i,t.x2=o*n-a*r+e,t.y2=o*r+a*n+i,o=t.x3-e,a=t.y3-i,t.x3=o*n-a*r+e,t.y3=o*r+a*n+i,t}},16483:(t,e,i)=>{var s=i(83419),n=i(10690),r=i(20437),o=i(80672),a=i(23777),h=i(23031),l=i(90260),u=new s({initialize:function(t,e,i,s,n,r){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=0),void 0===r&&(r=0),this.type=a.TRIANGLE,this.x1=t,this.y1=e,this.x2=i,this.y2=s,this.x3=n,this.y3=r},contains:function(t,e){return n(this,t,e)},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return l(this,t)},setTo:function(t,e,i,s,n,r){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=0),void 0===r&&(r=0),this.x1=t,this.y1=e,this.x2=i,this.y2=s,this.x3=n,this.y3=r,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,n,r){var o=t.getPixelAlpha(s,n,r.texture.key,r.frame.name);return o&&o>=e}}},7003:(t,e,i)=>{var s=i(83419),n=i(93301),r=i(50792),o=i(8214),a=i(8443),h=i(78970),l=i(85098),u=i(42515),c=i(36210),d=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 r,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 c(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 d,this._tempMatrix2=new d,this._tempSkip=!1,this.mousePointerContainer=[this.mousePointer],t.events.once(a.BOOT,this.boot,this)},boot:function(){var t=this.game,e=t.events;this.canvas=t.canvas,this.scaleManager=t.scale,this.events.emit(o.MANAGER_BOOT),e.on(a.PRE_RENDER,this.preRender,this),e.once(a.DESTROY,this.destroy,this)},setCanvasOver:function(t){this.isOver=!0,this.events.emit(o.GAME_OVER,t)},setCanvasOut:function(t){this.isOver=!1,this.events.emit(o.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(o.MANAGER_UPDATE);for(var s=0;s10&&(t=10-this.pointersTotal);for(var i=0;i{var s=i(96503),n=i(87902),r=i(83419),o=i(93301),a=i(74457),h=i(84409),l=i(20339),u=i(8497),c=i(81154),d=i(8214),f=i(50792),p=i(95540),v=i(23777),g=i(89639),m=i(41212),y=i(37277),x=i(87841),T=i(37303),w=i(44594),b=i(16483),S=i(10690),E=new r({Extends:f,initialize:function(t){f.call(this),this.scene=t,this.systems=t.sys,this.settings=t.sys.settings,this.manager=t.sys.game.input,this.pluginEvents=new f,this.enabled=!0,this.displayList,this.cameras,g.install(this),this.mouse=this.manager.mouse,this.topOnly=!0,this.pollRate=-1,this._pollTimer=0;var e={cancelled:!1};this._eventContainer={stopPropagation:function(){e.cancelled=!0}},this._eventData=e,this.dragDistanceThreshold=0,this.dragTimeThreshold=0,this._temp=[],this._tempZones=[],this._list=[],this._pendingInsertion=[],this._pendingRemoval=[],this._draggable=[],this._drag={0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],10:[]},this._dragState=[],this._over={0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],10:[]},this._validTypes=["onDown","onUp","onOver","onOut","onMove","onDragStart","onDrag","onDragEnd","onDragEnter","onDragLeave","onDragOver","onDrop"],this._updatedThisFrame=!1,t.sys.events.once(w.BOOT,this.boot,this),t.sys.events.on(w.START,this.start,this)},boot:function(){this.cameras=this.systems.cameras,this.displayList=this.systems.displayList,this.systems.events.once(w.DESTROY,this.destroy,this),this.pluginEvents.emit(d.BOOT)},start:function(){var t=this.systems.events;t.on(w.TRANSITION_START,this.transitionIn,this),t.on(w.TRANSITION_OUT,this.transitionOut,this),t.on(w.TRANSITION_COMPLETE,this.transitionComplete,this),t.on(w.PRE_UPDATE,this.preUpdate,this),t.once(w.SHUTDOWN,this.shutdown,this),this.manager.events.on(d.GAME_OUT,this.onGameOut,this),this.manager.events.on(d.GAME_OVER,this.onGameOver,this),this.enabled=!0,this._dragState=[0,0,0,0,0,0,0,0,0,0],this.pluginEvents.emit(d.START)},onGameOver:function(t){this.isActive()&&this.emit(d.GAME_OVER,t.timeStamp,t)},onGameOut:function(t){this.isActive()&&this.emit(d.GAME_OUT,t.timeStamp,t)},preUpdate:function(){this.pluginEvents.emit(d.PRE_UPDATE);var t=this._pendingRemoval,e=this._pendingInsertion,i=t.length,s=e.length;if(0!==i||0!==s){for(var n=this._list,r=0;r-1&&(n.splice(a,1),this.clear(o,!0))}this._pendingRemoval.length=0,this._list=n.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(d.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 r=!1;for(i=0;i0&&(r=!0)}return r},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,n=this._drag,r=this._over,o=this.manager,a=0;a-1&&n[a].splice(s,1),(s=r[a].indexOf(t))>-1&&r[a].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,n}return t.camera=e[0],[]},processDownEvents:function(t){var e=0,i=this._temp,s=this._eventData,n=this._eventContainer;s.cancelled=!1;for(var r=0;r0&&l(t.x,t.y,t.downX,t.downY)>=n||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?(o.emit(d.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(d.DRAG_LEAVE,t,o,h),a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h)):(o.emit(d.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(d.DRAG_LEAVE,t,o,h),e[0]?(a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h)):a.target=null)}else!h&&e[0]&&(a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h));var u=t.positionToCamera(a.dragStartCamera);if(o.parentContainer){var c=u.x-a.dragStartXGlobal,f=u.y-a.dragStartYGlobal,p=o.getParentRotation(),v=c*Math.cos(p)+f*Math.sin(p),g=f*Math.cos(p)-c*Math.sin(p);v*=1/o.parentContainer.scaleX,g*=1/o.parentContainer.scaleY,n=v+a.dragStartX,r=g+a.dragStartY}else n=u.x-a.dragX,r=u.y-a.dragY;o.emit(d.GAMEOBJECT_DRAG,t,n,r),this.emit(d.DRAG,t,o,n,r)}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 r=this.manager,o=this._eventData,a=this._eventContainer;o.cancelled=!1;for(var h=0;h0){var n=this.manager,r=this._eventData,o=this._eventContainer;r.cancelled=!1,this.sortGameObjects(e,t);for(var a=0;a0){for(this.sortGameObjects(n,t),e=0;e0){for(this.sortGameObjects(r,t),e=0;e-1&&this._draggable.splice(n,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,n=!1,r=!1,o=!1,h=!1,l=!0;if(m(e)&&Object.keys(e).length){var u=e,c=t.some((function(t){return t.hasOwnProperty("faces")}));if(!c){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),n=p(u,"dropZone",!1),r=p(u,"cursor",!1),o=p(u,"useHandCursor",!1),e&&i||(this.setHitAreaFromTexture(t),l=!1)}else"function"!=typeof e||i||(i=e,e={});for(var f=0;f{var s=i(35154),n={},r={register:function(t,e,i,s,r){n[t]={plugin:e,mapping:i,settingsKey:s,configKey:r}},getPlugin:function(t){return n[t]},install:function(t){var e=t.scene.sys,i=e.settings.input,r=e.game.config;for(var o in n){var a=n[o].plugin,h=n[o].mapping,l=n[o].settingsKey,u=n[o].configKey;s(i,l,r[u])&&(t[h]=new a(t))}},remove:function(t){n.hasOwnProperty(t)&&delete n[t]}};t.exports=r},42515:(t,e,i)=>{var s=i(31040),n=i(83419),r=i(20339),o=i(43855),a=i(47235),h=i(26099),l=i(25892),u=new n({initialize:function(t,e){this.manager=t,this.id=e,this.event,this.downElement,this.upElement,this.camera=null,this.button=0,this.buttons=0,this.position=new h,this.prevPosition=new h,this.midPoint=new h(-1,-1),this.velocity=new h,this.angle=0,this.distance=0,this.smoothFactor=0,this.motionFactor=.2,this.worldX=0,this.worldY=0,this.moveTime=0,this.downX=0,this.downY=0,this.downTime=0,this.upX=0,this.upY=0,this.upTime=0,this.primaryDown=!1,this.isDown=!1,this.wasTouch=!1,this.wasCanceled=!1,this.movementX=0,this.movementY=0,this.identifier=0,this.pointerId=null,this.active=0===e,this.locked=!1,this.deltaX=0,this.deltaY=0,this.deltaZ=0},updateWorldPoint:function(t){var e=t.getWorldPoint(this.x,this.y);return this.worldX=e.x,this.worldY=e.y,this},positionToCamera:function(t,e){return t.getWorldPoint(this.x,this.y,e)},updateMotion:function(){var t=this.position.x,e=this.position.y,i=this.midPoint.x,n=this.midPoint.y;if(t!==i||e!==n){var r=a(this.motionFactor,i,t),h=a(this.motionFactor,n,e);o(r,t,.1)&&(r=t),o(h,e,.1)&&(h=e),this.midPoint.set(r,h);var l=t-r,u=e-h;this.velocity.set(l,u),this.angle=s(r,h,t,e),this.distance=Math.sqrt(l*l+u*u)}},up:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.button=t.button,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),0===t.button&&(this.primaryDown=!1,this.upX=this.x,this.upY=this.y),0===this.buttons&&(this.isDown=!1,this.upTime=t.timeStamp,this.wasTouch=!1)},down:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.button=t.button,this.downElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),0===t.button&&(this.primaryDown=!0,this.downX=this.x,this.downY=this.y),l.macOS&&t.ctrlKey&&(this.buttons=2,this.primaryDown=!1),this.isDown||(this.isDown=!0,this.downTime=t.timeStamp),this.wasTouch=!1},move:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.manager.transformPointer(this,t.pageX,t.pageY,!0),this.locked&&(this.movementX=t.movementX||t.mozMovementX||t.webkitMovementX||0,this.movementY=t.movementY||t.mozMovementY||t.webkitMovementY||0),this.moveTime=t.timeStamp,this.wasTouch=!1},wheel:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.deltaX=t.deltaX,this.deltaY=t.deltaY,this.deltaZ=t.deltaZ,this.wasTouch=!1},touchstart:function(t,e){t.pointerId&&(this.pointerId=t.pointerId),this.identifier=t.identifier,this.target=t.target,this.active=!0,this.buttons=1,this.event=e,this.downElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!0,this.downX=this.x,this.downY=this.y,this.downTime=e.timeStamp,this.isDown=!0,this.wasTouch=!0,this.wasCanceled=!1,this.updateMotion()},touchmove:function(t,e){this.event=e,this.manager.transformPointer(this,t.pageX,t.pageY,!0),this.moveTime=e.timeStamp,this.wasTouch=!0,this.updateMotion()},touchend:function(t,e){this.buttons=0,this.event=e,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!1,this.upX=this.x,this.upY=this.y,this.upTime=e.timeStamp,this.isDown=!1,this.wasTouch=!0,this.wasCanceled=!1,this.active=!1,this.updateMotion()},touchcancel:function(t,e){this.buttons=0,this.event=e,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!1,this.upX=this.x,this.upY=this.y,this.upTime=e.timeStamp,this.isDown=!1,this.wasTouch=!0,this.wasCanceled=!0,this.active=!1},noButtonDown:function(){return 0===this.buttons},leftButtonDown:function(){return!!(1&this.buttons)},rightButtonDown:function(){return!!(2&this.buttons)},middleButtonDown:function(){return!!(4&this.buttons)},backButtonDown:function(){return!!(8&this.buttons)},forwardButtonDown:function(){return!!(16&this.buttons)},leftButtonReleased:function(){return 0===this.buttons?0===this.button&&!this.isDown:0===this.button},rightButtonReleased:function(){return 0===this.buttons?2===this.button&&!this.isDown:2===this.button},middleButtonReleased:function(){return 0===this.buttons?1===this.button&&!this.isDown:1===this.button},backButtonReleased:function(){return 0===this.buttons?3===this.button&&!this.isDown:3===this.button},forwardButtonReleased:function(){return 0===this.buttons?4===this.button&&!this.isDown:4===this.button},getDistance:function(){return this.isDown?r(this.downX,this.downY,this.x,this.y):r(this.downX,this.downY,this.upX,this.upY)},getDistanceX:function(){return this.isDown?Math.abs(this.downX-this.x):Math.abs(this.downX-this.upX)},getDistanceY:function(){return this.isDown?Math.abs(this.downY-this.y):Math.abs(this.downY-this.upY)},getDuration:function(){return this.isDown?this.manager.time-this.downTime:this.upTime-this.downTime},getAngle:function(){return this.isDown?s(this.downX,this.downY,this.x,this.y):s(this.downX,this.downY,this.upX,this.upY)},getInterpolatedPosition:function(t,e){void 0===t&&(t=10),void 0===e&&(e=[]);for(var i=this.prevPosition.x,s=this.prevPosition.y,n=this.position.x,r=this.position.y,o=0;o{t.exports={MOUSE_DOWN:0,MOUSE_MOVE:1,MOUSE_UP:2,TOUCH_START:3,TOUCH_MOVE:4,TOUCH_END:5,POINTER_LOCK_CHANGE:6,TOUCH_CANCEL:7,MOUSE_WHEEL:8}},7179:t=>{t.exports="boot"},85375:t=>{t.exports="destroy"},39843:t=>{t.exports="dragend"},23388:t=>{t.exports="dragenter"},16133:t=>{t.exports="drag"},27829:t=>{t.exports="dragleave"},53904:t=>{t.exports="dragover"},56058:t=>{t.exports="dragstart"},2642:t=>{t.exports="drop"},88171:t=>{t.exports="gameobjectdown"},36147:t=>{t.exports="dragend"},71692:t=>{t.exports="dragenter"},96149:t=>{t.exports="drag"},81285:t=>{t.exports="dragleave"},74048:t=>{t.exports="dragover"},21322:t=>{t.exports="dragstart"},49378:t=>{t.exports="drop"},86754:t=>{t.exports="gameobjectmove"},86433:t=>{t.exports="gameobjectout"},60709:t=>{t.exports="gameobjectover"},24081:t=>{t.exports="pointerdown"},11172:t=>{t.exports="pointermove"},18907:t=>{t.exports="pointerout"},95579:t=>{t.exports="pointerover"},35368:t=>{t.exports="pointerup"},26972:t=>{t.exports="wheel"},47078:t=>{t.exports="gameobjectup"},73802:t=>{t.exports="gameobjectwheel"},56718:t=>{t.exports="gameout"},25936:t=>{t.exports="gameover"},27503:t=>{t.exports="boot"},50852:t=>{t.exports="process"},96438:t=>{t.exports="update"},59152:t=>{t.exports="pointerlockchange"},47777:t=>{t.exports="pointerdown"},27957:t=>{t.exports="pointerdownoutside"},19444:t=>{t.exports="pointermove"},54251:t=>{t.exports="pointerout"},18667:t=>{t.exports="pointerover"},27192:t=>{t.exports="pointerup"},24652:t=>{t.exports="pointerupoutside"},45132:t=>{t.exports="wheel"},44512:t=>{t.exports="preupdate"},15757:t=>{t.exports="shutdown"},41637:t=>{t.exports="start"},93802:t=>{t.exports="update"},8214:(t,e,i)=>{t.exports={BOOT:i(7179),DESTROY:i(85375),DRAG_END:i(39843),DRAG_ENTER:i(23388),DRAG:i(16133),DRAG_LEAVE:i(27829),DRAG_OVER:i(53904),DRAG_START:i(56058),DROP:i(2642),GAME_OUT:i(56718),GAME_OVER:i(25936),GAMEOBJECT_DOWN:i(88171),GAMEOBJECT_DRAG_END:i(36147),GAMEOBJECT_DRAG_ENTER:i(71692),GAMEOBJECT_DRAG:i(96149),GAMEOBJECT_DRAG_LEAVE:i(81285),GAMEOBJECT_DRAG_OVER:i(74048),GAMEOBJECT_DRAG_START:i(21322),GAMEOBJECT_DROP:i(49378),GAMEOBJECT_MOVE:i(86754),GAMEOBJECT_OUT:i(86433),GAMEOBJECT_OVER:i(60709),GAMEOBJECT_POINTER_DOWN:i(24081),GAMEOBJECT_POINTER_MOVE:i(11172),GAMEOBJECT_POINTER_OUT:i(18907),GAMEOBJECT_POINTER_OVER:i(95579),GAMEOBJECT_POINTER_UP:i(35368),GAMEOBJECT_POINTER_WHEEL:i(26972),GAMEOBJECT_UP:i(47078),GAMEOBJECT_WHEEL:i(73802),MANAGER_BOOT:i(27503),MANAGER_PROCESS:i(50852),MANAGER_UPDATE:i(96438),POINTER_DOWN:i(47777),POINTER_DOWN_OUTSIDE:i(27957),POINTER_MOVE:i(19444),POINTER_OUT:i(54251),POINTER_OVER:i(18667),POINTER_UP:i(27192),POINTER_UP_OUTSIDE:i(24652),POINTER_WHEEL:i(45132),POINTERLOCK_CHANGE:i(59152),PRE_UPDATE:i(44512),SHUTDOWN:i(15757),START:i(41637),UPDATE:i(93802)}},97421:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e){this.pad=t,this.events=t.events,this.index=e,this.value=0,this.threshold=.1},update:function(t){this.value=t},getValue:function(){return Math.abs(this.value){var s=i(83419),n=i(92734),r=new s({initialize:function(t,e){this.pad=t,this.events=t.manager,this.index=e,this.value=0,this.threshold=1,this.pressed=!1},update:function(t){this.value=t;var e=this.pad,i=this.index;t>=this.threshold?this.pressed||(this.pressed=!0,this.events.emit(n.BUTTON_DOWN,e,this,t),this.pad.emit(n.GAMEPAD_BUTTON_DOWN,i,t,this)):this.pressed&&(this.pressed=!1,this.events.emit(n.BUTTON_UP,e,this,t),this.pad.emit(n.GAMEPAD_BUTTON_UP,i,t,this))},destroy:function(){this.pad=null,this.events=null}});t.exports=r},99125:(t,e,i)=>{var s=i(97421),n=i(28884),r=i(83419),o=i(50792),a=i(26099),h=new r({Extends:o,initialize:function(t,e){o.call(this),this.manager=t,this.pad=e,this.id=e.id,this.index=e.index;for(var i=[],r=0;r=2&&(this.leftStick.set(r[0].getValue(),r[1].getValue()),n>=4&&this.rightStick.set(r[2].getValue(),r[3].getValue()))}},destroy:function(){var t;for(this.removeAllListeners(),this.manager=null,this.pad=null,t=0;t{var s=i(83419),n=i(50792),r=i(92734),o=i(99125),a=i(35154),h=i(89639),l=i(8214),u=new s({Extends:n,initialize:function(t){n.call(this),this.scene=t.scene,this.settings=this.scene.sys.settings,this.sceneInputPlugin=t,this.enabled=!0,this.target,this.gamepads=[],this.queue=[],this.onGamepadHandler,this._pad1,this._pad2,this._pad3,this._pad4,t.pluginEvents.once(l.BOOT,this.boot,this),t.pluginEvents.on(l.START,this.start,this)},boot:function(){var t=this.scene.sys.game,e=this.settings.input,i=t.config;this.enabled=a(e,"gamepad",i.inputGamepad)&&t.device.input.gamepads,this.target=a(e,"gamepad.target",i.inputGamepadEventTarget),this.sceneInputPlugin.pluginEvents.once(l.DESTROY,this.destroy,this)},start:function(){this.enabled&&(this.startListeners(),this.refreshPads()),this.sceneInputPlugin.pluginEvents.once(l.SHUTDOWN,this.shutdown,this)},isActive:function(){return this.enabled&&this.scene.sys.isActive()},startListeners:function(){var t=this,e=this.target,i=function(e){!e.defaultPrevented&&t.isActive()&&(t.refreshPads(),t.queue.push(e))};this.onGamepadHandler=i,e.addEventListener("gamepadconnected",i,!1),e.addEventListener("gamepaddisconnected",i,!1),this.sceneInputPlugin.pluginEvents.on(l.UPDATE,this.update,this)},stopListeners:function(){this.target.removeEventListener("gamepadconnected",this.onGamepadHandler),this.target.removeEventListener("gamepaddisconnected",this.onGamepadHandler),this.sceneInputPlugin.pluginEvents.off(l.UPDATE,this.update);for(var t=0;t{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,SELECT:8,START:9,B:0,A:1,Y:2,X:3,LEFT_SHOULDER:4,RIGHT_SHOULDER:5}},65294:t=>{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,SHARE:8,OPTIONS:9,PS:16,TOUCHBAR:17,X:0,CIRCLE:1,SQUARE:2,TRIANGLE:3,L1:4,R1:5,L2:6,R2:7,L3:10,R3:11,LEFT_STICK_H:0,LEFT_STICK_V:1,RIGHT_STICK_H:2,RIGHT_STICK_V:3}},90089:t=>{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,MENU:16,A:0,B:1,X:2,Y:3,LB:4,RB:5,LT:6,RT:7,BACK:8,START:9,LS:10,RS:11,LEFT_STICK_H:0,LEFT_STICK_V:1,RIGHT_STICK_H:2,RIGHT_STICK_V:3}},64894:(t,e,i)=>{t.exports={DUALSHOCK_4:i(65294),SNES_USB:i(89651),XBOX_360:i(90089)}},46008:t=>{t.exports="down"},7629:t=>{t.exports="up"},42206:t=>{t.exports="connected"},86544:t=>{t.exports="disconnected"},94784:t=>{t.exports="down"},14325:t=>{t.exports="up"},92734:(t,e,i)=>{t.exports={BUTTON_DOWN:i(46008),BUTTON_UP:i(7629),CONNECTED:i(42206),DISCONNECTED:i(86544),GAMEPAD_BUTTON_DOWN:i(94784),GAMEPAD_BUTTON_UP:i(14325)}},48646:(t,e,i)=>{t.exports={Axis:i(97421),Button:i(28884),Events:i(92734),Gamepad:i(99125),GamepadPlugin:i(56654),Configs:i(64894)}},14350:(t,e,i)=>{var s=i(93301),n=i(79291),r={CreatePixelPerfectHandler:i(84409),CreateInteractiveObject:i(74457),Events:i(8214),Gamepad:i(48646),InputManager:i(7003),InputPlugin:i(48205),InputPluginCache:i(89639),Keyboard:i(51442),Mouse:i(87078),Pointer:i(42515),Touch:i(95618)};r=n(!1,r,s),t.exports=r},78970:(t,e,i)=>{var s=i(72905),n=i(83419),r=i(8443),o=i(8214),a=i(46032),h=i(29747),l=new n({initialize:function(t){this.manager=t,this.queue=[],this.preventDefault=!0,this.captures=[],this.enabled=!1,this.target,this.onKeyDown=h,this.onKeyUp=h,t.events.once(o.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputKeyboard,this.target=t.inputKeyboardEventTarget,this.addCapture(t.inputKeyboardCapture),!this.target&&window&&(this.target=window),this.enabled&&this.target&&this.startListeners(),this.manager.game.events.on(r.POST_STEP,this.postUpdate,this)},startListeners:function(){var t=this;this.onKeyDown=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.events.emit(o.MANAGER_PROCESS);var i=e.altKey||e.ctrlKey||e.shiftKey||e.metaKey;t.preventDefault&&!i&&t.captures.indexOf(e.keyCode)>-1&&e.preventDefault()}},this.onKeyUp=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.events.emit(o.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(r.POST_RENDER,this.postUpdate,this),this.target=null,this.enabled=!1,this.manager=null}});t.exports=l},28846:(t,e,i)=>{var s=i(83419),n=i(50792),r=i(95922),o=i(8443),a=i(35154),h=i(8214),l=i(89639),u=i(30472),c=i(46032),d=i(87960),f=i(74600),p=i(44594),v=i(56583),g=new s({Extends:n,initialize:function(t){n.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=a(t,"keyboard",!0);var e=a(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(o.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:c.UP,down:c.DOWN,left:c.LEFT,right:c.RIGHT,space:c.SPACE,shift:c.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 n=0;n-1?s[n]=t:s[t.keyCode]=t,e&&this.addCapture(t.keyCode),t.setEmitOnRepeat(i),t}return"string"==typeof t&&(t=c[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,n=this.keys;if(t instanceof u){var r=n.indexOf(t);r>-1&&(s=this.keys[r],this.keys[r]=void 0)}else"string"==typeof t&&(t=c[t.toUpperCase()]);return n[t]&&(s=n[t],n[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;s{t.exports=function(t,e){return e.timeLastMatched=t.timeStamp,e.index++,e.index===e.size||(e.current=e.keyCodes[e.index],!1)}},87960:(t,e,i)=>{var s=i(83419),n=i(95922),r=i(95540),o=i(68769),a=i(92803),h=new s({initialize:function(t,e,i){if(void 0===i&&(i={}),e.length<2)return!1;this.manager=t,this.enabled=!0,this.keyCodes=[];for(var s=0;s{var s=i(66970);t.exports=function(t,e){if(e.matched)return!0;var i=!1,n=!1;if(t.keyCode===e.current)if(e.index>0&&e.maxKeyDelay>0){var r=e.timeLastMatched+e.maxKeyDelay;t.timeStamp<=r&&(n=!0,i=s(t,e))}else n=!0,i=s(t,e);return!n&&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{t.exports=function(t){return!!t._justDown&&(t._justDown=!1,!0)}},38796:t=>{t.exports=function(t){return!!t._justUp&&(t._justUp=!1,!0)}},30472:(t,e,i)=>{var s=i(83419),n=i(50792),r=i(95922),o=new s({Extends:n,initialize:function(t,e){n.call(this),this.plugin=t,this.keyCode=e,this.originalEvent=void 0,this.enabled=!0,this.isDown=!1,this.isUp=!0,this.altKey=!1,this.ctrlKey=!1,this.shiftKey=!1,this.metaKey=!1,this.location=0,this.timeDown=0,this.duration=0,this.timeUp=0,this.emitOnRepeat=!1,this.repeats=0,this._justDown=!1,this._justUp=!1,this._tick=-1},setEmitOnRepeat:function(t){return this.emitOnRepeat=t,this},onDown:function(t){this.originalEvent=t,this.enabled&&(this.altKey=t.altKey,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.metaKey=t.metaKey,this.location=t.location,this.repeats++,this.isDown?this.emitOnRepeat&&this.emit(r.DOWN,this,t):(this.isDown=!0,this.isUp=!1,this.timeDown=t.timeStamp,this.duration=0,this._justDown=!0,this._justUp=!1,this.emit(r.DOWN,this,t)))},onUp:function(t){this.originalEvent=t,this.enabled&&(this.isDown=!1,this.isUp=!0,this.timeUp=t.timeStamp,this.duration=this.timeUp-this.timeDown,this.repeats=0,this._justDown=!1,this._justUp=!0,this._tick=-1,this.emit(r.UP,this,t))},reset:function(){return this.isDown=!1,this.isUp=!0,this.altKey=!1,this.ctrlKey=!1,this.shiftKey=!1,this.metaKey=!1,this.timeDown=0,this.duration=0,this.timeUp=0,this.repeats=0,this._justDown=!1,this._justUp=!1,this._tick=-1,this},getDuration:function(){return this.isDown?this.plugin.game.loop.time-this.timeDown:0},destroy:function(){this.removeAllListeners(),this.originalEvent=null,this.plugin=null}});t.exports=o},46032:t=>{t.exports={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:42,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,NUMPAD_ZERO:96,NUMPAD_ONE:97,NUMPAD_TWO:98,NUMPAD_THREE:99,NUMPAD_FOUR:100,NUMPAD_FIVE:101,NUMPAD_SIX:102,NUMPAD_SEVEN:103,NUMPAD_EIGHT:104,NUMPAD_NINE:105,NUMPAD_ADD:107,NUMPAD_SUBTRACT:109,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,SEMICOLON:186,PLUS:187,COMMA:188,MINUS:189,PERIOD:190,FORWARD_SLASH:191,BACK_SLASH:220,QUOTES:222,BACKTICK:192,OPEN_BRACKET:219,CLOSED_BRACKET:221,SEMICOLON_FIREFOX:59,COLON:58,COMMA_FIREFOX_WINDOWS:60,COMMA_FIREFOX:62,BRACKET_RIGHT_FIREFOX:174,BRACKET_LEFT_FIREFOX:175}},74600:(t,e,i)=>{var s=i(46032),n={};for(var r in s)n[s[r]]=r;t.exports=n},41170:t=>{t.exports=function(t,e){void 0===e&&(e=50);var i=t.plugin.game.loop.time-t.timeUp;return t.isUp&&i{var s=i(83419),n=i(89357),r=i(8214),o=i(29747),a=new s({initialize:function(t){this.manager=t,this.preventDefaultDown=!0,this.preventDefaultUp=!0,this.preventDefaultMove=!0,this.preventDefaultWheel=!1,this.enabled=!1,this.target,this.locked=!1,this.onMouseMove=o,this.onMouseDown=o,this.onMouseUp=o,this.onMouseDownWindow=o,this.onMouseUpWindow=o,this.onMouseOver=o,this.onMouseOut=o,this.onMouseWheel=o,this.pointerLockChange=o,this.isTop=!0,t.events.once(r.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputMouse,this.target=t.inputMouseEventTarget,this.passive=t.inputMousePassive,this.preventDefaultDown=t.inputMousePreventDefaultDown,this.preventDefaultUp=t.inputMousePreventDefaultUp,this.preventDefaultMove=t.inputMousePreventDefaultMove,this.preventDefaultWheel=t.inputMousePreventDefaultWheel,this.target?"string"==typeof this.target&&(this.target=document.getElementById(this.target)):this.target=this.manager.game.canvas,t.disableContextMenu&&this.disableContextMenu(),this.enabled&&this.target&&this.startListeners()},disableContextMenu:function(){return this.target.addEventListener("contextmenu",(function(t){return t.preventDefault(),!1})),this},requestPointerLock:function(){if(n.pointerLock){var t=this.target;t.requestPointerLock=t.requestPointerLock||t.mozRequestPointerLock||t.webkitRequestPointerLock,t.requestPointerLock()}},releasePointerLock:function(){n.pointerLock&&(document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock,document.exitPointerLock())},startListeners:function(){var t=this.target;if(t){var e=this,i=this.manager,s=i.canvas,r=window&&window.focus&&i.game.config.autoFocus;this.onMouseMove=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onMouseMove(t),e.preventDefaultMove&&t.preventDefault())},this.onMouseDown=function(t){r&&window.focus(),!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onMouseDown(t),e.preventDefaultDown&&t.target===s&&t.preventDefault())},this.onMouseDownWindow=function(t){t.sourceCapabilities&&t.sourceCapabilities.firesTouchEvents||!t.defaultPrevented&&e.enabled&&i&&i.enabled&&t.target!==s&&i.onMouseDown(t)},this.onMouseUp=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onMouseUp(t),e.preventDefaultUp&&t.target===s&&t.preventDefault())},this.onMouseUpWindow=function(t){t.sourceCapabilities&&t.sourceCapabilities.firesTouchEvents||!t.defaultPrevented&&e.enabled&&i&&i.enabled&&t.target!==s&&i.onMouseUp(t)},this.onMouseOver=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&i.setCanvasOver(t)},this.onMouseOut=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&i.setCanvasOut(t)},this.onMouseWheel=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&i.onMouseWheel(t),e.preventDefaultWheel&&t.target===s&&t.preventDefault()};var o={passive:!0};if(t.addEventListener("mousemove",this.onMouseMove),t.addEventListener("mousedown",this.onMouseDown),t.addEventListener("mouseup",this.onMouseUp),t.addEventListener("mouseover",this.onMouseOver,o),t.addEventListener("mouseout",this.onMouseOut,o),this.preventDefaultWheel?t.addEventListener("wheel",this.onMouseWheel,{passive:!1}):t.addEventListener("wheel",this.onMouseWheel,o),window&&i.game.config.inputWindowEvents)try{window.top.addEventListener("mousedown",this.onMouseDownWindow,o),window.top.addEventListener("mouseup",this.onMouseUpWindow,o)}catch(t){window.addEventListener("mousedown",this.onMouseDownWindow,o),window.addEventListener("mouseup",this.onMouseUpWindow,o),this.isTop=!1}n.pointerLock&&(this.pointerLockChange=function(t){var s=e.target;e.locked=document.pointerLockElement===s||document.mozPointerLockElement===s||document.webkitPointerLockElement===s,i.onPointerLockChange(t)},document.addEventListener("pointerlockchange",this.pointerLockChange,!0),document.addEventListener("mozpointerlockchange",this.pointerLockChange,!0),document.addEventListener("webkitpointerlockchange",this.pointerLockChange,!0)),this.enabled=!0}},stopListeners:function(){var t=this.target;t.removeEventListener("mousemove",this.onMouseMove),t.removeEventListener("mousedown",this.onMouseDown),t.removeEventListener("mouseup",this.onMouseUp),t.removeEventListener("mouseover",this.onMouseOver),t.removeEventListener("mouseout",this.onMouseOut),window&&((t=this.isTop?window.top:window).removeEventListener("mousedown",this.onMouseDownWindow),t.removeEventListener("mouseup",this.onMouseUpWindow)),n.pointerLock&&(document.removeEventListener("pointerlockchange",this.pointerLockChange,!0),document.removeEventListener("mozpointerlockchange",this.pointerLockChange,!0),document.removeEventListener("webkitpointerlockchange",this.pointerLockChange,!0))},destroy:function(){this.stopListeners(),this.target=null,this.enabled=!1,this.manager=null}});t.exports=a},87078:(t,e,i)=>{t.exports={MouseManager:i(85098)}},36210:(t,e,i)=>{var s=i(83419),n=i(8214),r=i(29747),o=new s({initialize:function(t){this.manager=t,this.capture=!0,this.enabled=!1,this.target,this.onTouchStart=r,this.onTouchStartWindow=r,this.onTouchMove=r,this.onTouchEnd=r,this.onTouchEndWindow=r,this.onTouchCancel=r,this.onTouchCancelWindow=r,this.isTop=!0,t.events.once(n.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputTouch,this.target=t.inputTouchEventTarget,this.capture=t.inputTouchCapture,this.target?"string"==typeof this.target&&(this.target=document.getElementById(this.target)):this.target=this.manager.game.canvas,t.disableContextMenu&&this.disableContextMenu(),this.enabled&&this.target&&this.startListeners()},disableContextMenu:function(){return this.target.addEventListener("contextmenu",(function(t){return t.preventDefault(),!1})),this},startListeners:function(){var t=this.target;if(t){var e=this,i=this.manager,s=i.canvas,n=window&&window.focus&&i.game.config.autoFocus;this.onTouchMove=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onTouchMove(t),e.capture&&t.cancelable&&t.preventDefault())},this.onTouchStart=function(t){n&&window.focus(),!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onTouchStart(t),e.capture&&t.cancelable&&t.target===s&&t.preventDefault())},this.onTouchStartWindow=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&t.target!==s&&i.onTouchStart(t)},this.onTouchEnd=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onTouchEnd(t),e.capture&&t.cancelable&&t.target===s&&t.preventDefault())},this.onTouchEndWindow=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&t.target!==s&&i.onTouchEnd(t)},this.onTouchCancel=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&(i.onTouchCancel(t),e.capture&&t.preventDefault())},this.onTouchCancelWindow=function(t){!t.defaultPrevented&&e.enabled&&i&&i.enabled&&i.onTouchCancel(t)};var r=this.capture,o={passive:!0},a={passive:!1};if(t.addEventListener("touchstart",this.onTouchStart,r?a:o),t.addEventListener("touchmove",this.onTouchMove,r?a:o),t.addEventListener("touchend",this.onTouchEnd,r?a:o),t.addEventListener("touchcancel",this.onTouchCancel,r?a:o),window&&i.game.config.inputWindowEvents)try{window.top.addEventListener("touchstart",this.onTouchStartWindow,a),window.top.addEventListener("touchend",this.onTouchEndWindow,a),window.top.addEventListener("touchcancel",this.onTouchCancelWindow,a)}catch(t){window.addEventListener("touchstart",this.onTouchStartWindow,a),window.addEventListener("touchend",this.onTouchEndWindow,a),window.addEventListener("touchcancel",this.onTouchCancelWindow,a),this.isTop=!1}this.enabled=!0}},stopListeners:function(){var t=this.target;t.removeEventListener("touchstart",this.onTouchStart),t.removeEventListener("touchmove",this.onTouchMove),t.removeEventListener("touchend",this.onTouchEnd),t.removeEventListener("touchcancel",this.onTouchCancel),window&&((t=this.isTop?window.top:window).removeEventListener("touchstart",this.onTouchStartWindow),t.removeEventListener("touchend",this.onTouchEndWindow),t.removeEventListener("touchcancel",this.onTouchCancelWindow))},destroy:function(){this.stopListeners(),this.target=null,this.enabled=!1,this.manager=null}});t.exports=o},95618:(t,e,i)=>{t.exports={TouchManager:i(36210)}},41299:(t,e,i)=>{var s=i(83419),n=i(23906),r=i(54899),o=i(95540),a=i(98356),h=i(3374),l=i(84376),u=i(92638),c=new s({initialize:function(t,e){if(this.loader=t,this.cache=o(e,"cache",!1),this.type=o(e,"type",!1),!this.type)throw new Error("Invalid File type: "+this.type);this.key=o(e,"key",!1);var i=this.key;if(t.prefix&&""!==t.prefix&&(this.key=t.prefix+i),!this.key)throw new Error("Invalid File key: "+this.key);var s=o(e,"url");void 0===s?s=t.path+i+"."+o(e,"extension",""):"string"!=typeof s||s.match(/^(?:blob:|data:|capacitor:\/\/|http:\/\/|https:\/\/|\/\/)/)||(s=t.path+s),this.url=s,this.src="",this.xhrSettings=u(o(e,"responseType",void 0)),o(e,"xhrSettings",!1)&&(this.xhrSettings=h(this.xhrSettings,o(e,"xhrSettings",{}))),this.xhrLoader=null,this.state="function"==typeof this.url?n.FILE_POPULATED:n.FILE_PENDING,this.bytesTotal=0,this.bytesLoaded=-1,this.percentComplete=-1,this.crossOrigin=void 0,this.data=void 0,this.config=o(e,"config",{}),this.multiFile,this.linkFile,this.base64="string"==typeof s&&0===s.indexOf("data:"),this.retryAttempts=o(e,"maxRetries",t.maxRetries)},setLink:function(t){this.linkFile=t,t.linkFile=this},resetXHR:function(){this.xhrLoader&&(this.xhrLoader.onload=void 0,this.xhrLoader.onerror=void 0,this.xhrLoader.onprogress=void 0)},load:function(){if(this.state===n.FILE_POPULATED)this.loader.nextFile(this,!0);else{if(this.state=n.FILE_LOADING,this.src=a(this,this.loader.baseURL),!this.src)throw new Error("URL Error in File: "+this.key+" from: "+this.url);0===this.src.indexOf("data:")&&(this.base64=!0),this.xhrLoader=l(this,this.loader.xhr)}},onLoad:function(t,e){var i=t.responseURL&&this.loader.localSchemes.some((function(e){return 0===t.responseURL.indexOf(e)}))&&0===e.target.status,s=!(e.target&&200!==e.target.status)||i;4===t.readyState&&t.status>=400&&t.status<=599&&(s=!1),this.state=n.FILE_LOADED,this.resetXHR(),this.loader.nextFile(this,s)},onBase64Load:function(t){this.xhrLoader=t,this.state=n.FILE_LOADED,this.percentComplete=1,this.loader.emit(r.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(r.FILE_PROGRESS,this,this.percentComplete))},onProcess:function(){this.state=n.FILE_PROCESSING,this.onProcessComplete()},onProcessComplete:function(){this.state=n.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=n.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!==n.FILE_PENDING_DESTROY){void 0===t&&(t=this.data);var e=this.key,i=this.type;this.loader.emit(r.FILE_COMPLETE,e,i,t),this.loader.emit(r.FILE_KEY_COMPLETE+i+"-"+e,e,i,t),this.loader.flagForRemoval(this),this.state=n.FILE_PENDING_DESTROY}},destroy:function(){this.loader=null,this.cache=null,this.xhrSettings=null,this.multiFile=null,this.linkFile=null,this.data=null}});c.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)}},c.revokeObjectURL=function(t){"function"==typeof URL&&URL.revokeObjectURL(t.src)},t.exports=c},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:\/\/|http:\/\/|https:\/\/|\/\/)/)?t.url:e+t.url)}},74261:(t,e,i)=>{var s=i(83419),n=i(23906),r=i(35072),o=i(50792),a=i(54899),h=i(74099),l=i(95540),u=i(35154),c=i(41212),d=i(37277),f=i(44594),p=i(92638),v=new s({Extends:o,initialize:function(t){o.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,h.install(this),this.prefix="",this.path="",this.baseURL="",this.setBaseURL(l(i,"baseURL",e.loaderBaseURL)),this.setPath(l(i,"path",e.loaderPath)),this.setPrefix(l(i,"prefix",e.loaderPrefix)),this.maxParallelDownloads=l(i,"maxParallelDownloads",e.loaderMaxParallelDownloads),this.xhr=p(l(i,"responseType",e.loaderResponseType),l(i,"async",e.loaderAsync),l(i,"user",e.loaderUser),l(i,"password",e.loaderPassword),l(i,"timeout",e.loaderTimeout),l(i,"withCredentials",e.loaderWithCredentials)),this.crossOrigin=l(i,"crossOrigin",e.loaderCrossOrigin),this.imageLoadType=l(i,"imageLoadType",e.loaderImageLoadType),this.localSchemes=l(i,"localScheme",e.loaderLocalScheme),this.totalToLoad=0,this.progress=0,this.list=new r,this.inflight=new r,this.queue=new r,this._deleteQueue=new r,this.totalFailed=0,this.totalComplete=0,this.state=n.LOADER_IDLE,this.multiKeyIndex=0,this.maxRetries=l(i,"maxRetries",e.loaderMaxRetries),t.sys.events.once(f.BOOT,this.boot,this),t.sys.events.on(f.START,this.pluginStart,this)},boot:function(){this.systems.events.once(f.DESTROY,this.destroy,this)},pluginStart:function(){this.systems.events.once(f.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,n=this.cacheManager,r=this.textureManager,o={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(c(t))i=t;else if(!(i=n.json.get(t)))return void console.warn("Asset Pack not found in JSON cache:",t);for(var a in e&&(i={_:i[e]}),i){var h=i[a],u=l(h,"prefix",""),d=l(h,"files"),f=l(h,"defaultType");if(Array.isArray(d))for(var p=0;p0&&this.inflight.size{var s=i(79291),n=i(92638);t.exports=function(t,e){var i=void 0===t?n():s({},t);if(e)for(var r in e)void 0!==e[r]&&(i[r]=e[r]);return i}},26430:(t,e,i)=>{var s=i(83419),n=i(23906),r=i(54899),o=new s({initialize:function(t,e,i,s){var r=[];s.forEach((function(t){t&&r.push(t)})),this.loader=t,this.type=e,this.key=i;var o=this.key;t.prefix&&""!==t.prefix&&(this.key=t.prefix+o),this.multiKeyIndex=t.multiKeyIndex++,this.files=r,this.state=n.FILE_PENDING,this.complete=!1,this.pending=r.length,this.failed=0,this.config={},this.baseURL=t.baseURL,this.path=t.path,this.prefix=t.prefix;for(var a=0;a{var s=i(3374);t.exports=function(t,e){var i=s(e,t.xhrSettings);if(t.base64){var n,r=t.url.split(";base64,").pop()||t.url.split(",").pop();return n="arraybuffer"===t.xhrSettings.responseType?{response:Uint8Array.from(atob(r),(function(t){return t.charCodeAt(0)})).buffer}:{responseText:atob(r)},void t.onBase64Load(n)}var o=new XMLHttpRequest;if(o.open("GET",t.src,i.async,i.user,i.password),o.responseType=t.xhrSettings.responseType,o.timeout=i.timeout,i.headers)for(var a in i.headers)o.setRequestHeader(a,i.headers[a]);return i.header&&i.headerValue&&o.setRequestHeader(i.header,i.headerValue),i.requestedWith&&o.setRequestHeader("X-Requested-With",i.requestedWith),i.overrideMimeType&&o.overrideMimeType(i.overrideMimeType),i.withCredentials&&(o.withCredentials=!0),o.onload=t.onLoad.bind(t,o),o.onerror=t.onError.bind(t,o),o.onprogress=t.onProgress.bind(t),o.ontimeout=t.onError.bind(t,o),o.send(),o}},92638:t=>{t.exports=function(t,e,i,s,n,r){return void 0===t&&(t=""),void 0===e&&(e=!0),void 0===i&&(i=""),void 0===s&&(s=""),void 0===n&&(n=0),void 0===r&&(r=!1),{responseType:t,async:e,user:i,password:s,timeout:n,headers:void 0,header:void 0,headerValue:void 0,requestedWith:!1,overrideMimeType:void 0,withCredentials:r}}},23906:t=>{t.exports={LOADER_IDLE:0,LOADER_LOADING:1,LOADER_PROCESSING:2,LOADER_COMPLETE:3,LOADER_SHUTDOWN:4,LOADER_DESTROYED:5,FILE_PENDING:10,FILE_LOADING:11,FILE_LOADED:12,FILE_FAILED:13,FILE_PROCESSING:14,FILE_ERRORED:16,FILE_COMPLETE:17,FILE_DESTROYED:18,FILE_POPULATED:19,FILE_PENDING_DESTROY:20}},42155:t=>{t.exports="addfile"},38991:t=>{t.exports="complete"},27540:t=>{t.exports="filecomplete"},87464:t=>{t.exports="filecomplete-"},94486:t=>{t.exports="loaderror"},13035:t=>{t.exports="load"},38144:t=>{t.exports="fileprogress"},97520:t=>{t.exports="postprocess"},85595:t=>{t.exports="progress"},55680:t=>{t.exports="start"},54899:(t,e,i)=>{t.exports={ADD:i(42155),COMPLETE:i(38991),FILE_COMPLETE:i(27540),FILE_KEY_COMPLETE:i(87464),FILE_LOAD_ERROR:i(94486),FILE_LOAD:i(13035),FILE_PROGRESS:i(38144),POST_PROCESS:i(97520),PROGRESS:i(85595),START:i(55680)}},14135:(t,e,i)=>{var s=i(83419),n=i(74099),r=i(518),o=i(54899),a=new s({Extends:r,initialize:function(t,e,i,s,n){r.call(this,t,e,i,s,n),this.type="animationJSON"},onProcess:function(){this.loader.once(o.POST_PROCESS,this.onLoadComplete,this),r.prototype.onProcess.call(this)},onLoadComplete:function(){this.loader.systems.anims.fromJSON(this.data)}});n.register("animation",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(518),l=i(26430),u=new s({Extends:l,initialize:function(t,e,i,s,n,u){var c,d;if(a(e)){var f=e;e=r(f,"key"),c=new o(t,{key:e,url:r(f,"textureURL"),extension:r(f,"textureExtension","png"),normalMap:r(f,"normalMap"),xhrSettings:r(f,"textureXhrSettings")}),d=new h(t,{key:e,url:r(f,"atlasURL"),extension:r(f,"atlasExtension","json"),xhrSettings:r(f,"atlasXhrSettings")})}else c=new o(t,e,i,n),d=new h(t,e,s,u);c.linkFile?l.call(this,t,"atlasjson",e,[c,d,c.linkFile]):l.call(this,t,"atlasjson",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addAtlas(t.key,t.data,e.data,i),e.addToCache(),this.complete=!0}}});n.register("aseprite",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(518),l=i(26430),u=new s({Extends:l,initialize:function(t,e,i,s,n,u){var c,d;if(a(e)){var f=e;e=r(f,"key"),c=new o(t,{key:e,url:r(f,"textureURL"),extension:r(f,"textureExtension","png"),normalMap:r(f,"normalMap"),xhrSettings:r(f,"textureXhrSettings")}),d=new h(t,{key:e,url:r(f,"atlasURL"),extension:r(f,"atlasExtension","json"),xhrSettings:r(f,"atlasXhrSettings")})}else c=new o(t,e,i,n),d=new h(t,e,s,u);c.linkFile?l.call(this,t,"atlasjson",e,[c,d,c.linkFile]):l.call(this,t,"atlasjson",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addAtlas(t.key,t.data,e.data,i),this.complete=!0}}});n.register("atlas",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(26430),l=i(57318),u=new s({Extends:h,initialize:function(t,e,i,s,n,u){var c,d;if(a(e)){var f=e;e=r(f,"key"),c=new o(t,{key:e,url:r(f,"textureURL"),extension:r(f,"textureExtension","png"),normalMap:r(f,"normalMap"),xhrSettings:r(f,"textureXhrSettings")}),d=new l(t,{key:e,url:r(f,"atlasURL"),extension:r(f,"atlasExtension","xml"),xhrSettings:r(f,"atlasXhrSettings")})}else c=new o(t,e,i,n),d=new l(t,e,s,u);c.linkFile?h.call(this,t,"atlasxml",e,[c,d,c.linkFile]):h.call(this,t,"atlasxml",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addAtlasXML(t.key,t.data,e.data,i),this.complete=!0}}});n.register("atlasXML",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(89749),l=i(41212),u=new s({Extends:r,initialize:function(t,e,i,s,n){if(l(e)){var o=e;e=a(o,"key"),s=a(o,"xhrSettings"),n=a(o,"context",n)}var h={type:"audio",cache:t.cacheManager.audio,extension:i.type,responseType:"arraybuffer",key:e,url:i.url,xhrSettings:s,config:{context:n}};r.call(this,t,h)},onProcess:function(){this.state=n.FILE_PROCESSING;var t=this;this.config.context.decodeAudioData(this.xhrLoader.response,(function(e){t.data=e,t.onProcessComplete()}),(function(e){console.error("Error decoding audio: "+t.key+" - ",e?e.message:null),t.onProcessError()})),this.config.context=null}});u.create=function(t,e,i,s,n){var r=t.systems.game,o=r.config.audio,c=r.device.audio;l(e)&&(i=a(e,"url",[]),s=a(e,"config",{}));var d=u.getAudioURL(r,i);return d?c.webAudio&&!o.disableWebAudio?new u(t,e,d,n,r.sound.context):new h(t,e,d,s):(console.warn('No audio URLs for "%s" can play on this device',e),null)},u.getAudioURL=function(t,e){Array.isArray(e)||(e=[e]);for(var i=0;i{var s=i(21097),n=i(83419),r=i(74099),o=i(95540),a=i(41212),h=i(518),l=i(26430),u=new n({Extends:l,initialize:function(t,e,i,n,r,u,c){if(a(e)){var d=e;e=o(d,"key"),i=o(d,"jsonURL"),n=o(d,"audioURL"),r=o(d,"audioConfig"),u=o(d,"audioXhrSettings"),c=o(d,"jsonXhrSettings")}var f;if(n){var p=s.create(t,e,n,r,u);p&&(f=new h(t,e,i,c),l.call(this,t,"audiosprite",e,[p,f]),this.config.resourceLoad=!1)}else f=new h(t,e,i,c),l.call(this,t,"audiosprite",e,[f]),this.config.resourceLoad=!0,this.config.audioConfig=r,this.config.audioXhrSettings=u},onFileComplete:function(t){if(-1!==this.files.indexOf(t)&&(this.pending--,this.config.resourceLoad&&"json"===t.type&&t.data.hasOwnProperty("resources"))){var e=t.data.resources,i=o(this.config,"audioConfig"),n=o(this.config,"audioXhrSettings"),r=s.create(this.loader,t.key,e,i,n);r&&(this.addToMultiFile(r),this.loader.addFile(r))}},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1];t.addToCache(),e.addToCache(),this.complete=!0}}});r.register("audioSprite",(function(t,e,i,s,n,r){var o,a=this.systems.game,h=a.config.audio,l=a.device.audio;if(h&&h.noAudio||!l.webAudio&&!l.audioData)return this;if(Array.isArray(t))for(var c=0;c{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,n){var o="bin";if(h(e)){var l=e;e=a(l,"key"),i=a(l,"url"),s=a(l,"xhrSettings"),o=a(l,"extension",o),n=a(l,"dataType",n)}var u={type:"binary",cache:t.cacheManager.binary,extension:o,responseType:"arraybuffer",key:e,url:i,xhrSettings:s,config:{dataType:n}};r.call(this,t,u)},onProcess:function(){this.state=n.FILE_PROCESSING;var t=this.config.dataType;this.data=t?new t(this.xhrLoader.response):this.xhrLoader.response,this.onProcessComplete()}});o.register("binary",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(26430),l=i(21859),u=i(57318),c=new s({Extends:h,initialize:function(t,e,i,s,n,l){var c,d;if(a(e)){var f=e;e=r(f,"key"),c=new o(t,{key:e,url:r(f,"textureURL"),extension:r(f,"textureExtension","png"),normalMap:r(f,"normalMap"),xhrSettings:r(f,"textureXhrSettings")}),d=new u(t,{key:e,url:r(f,"fontDataURL"),extension:r(f,"fontDataExtension","xml"),xhrSettings:r(f,"fontDataXhrSettings")})}else c=new o(t,e,i,n),d=new u(t,e,s,l);c.linkFile?h.call(this,t,"bitmapfont",e,[c,d,c.linkFile]):h.call(this,t,"bitmapfont",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1];t.addToCache();var i=t.cache.get(t.key),s=l(e.data,t.cache.getFrame(t.key),0,0,i);this.loader.cacheManager.bitmapFont.add(t.key,{data:s,texture:t.key,frame:null}),this.complete=!0}}});n.register("bitmapFont",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s){var n="css";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),s=a(o,"xhrSettings"),n=a(o,"extension",n)}var l={type:"script",cache:!1,extension:n,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,l)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=document.createElement("style"),this.data.defer=!1,this.data.innerHTML=this.xhrLoader.responseText,document.head.appendChild(this.data),this.onProcessComplete()}});o.register("css",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(38734),n=i(85722),r=i(83419),o=i(74099),a=i(95540),h=i(19550),l=i(41212),u=i(518),c=i(31403),d=i(46975),f=i(59327),p=i(26430),v=i(82038),g=i(55222),m=new r({Extends:p,initialize:function(t,e,i,s){if(i.multiAtlasURL){var r=new u(t,{key:e,url:i.multiAtlasURL,xhrSettings:s,config:i});p.call(this,t,"texture",e,[r])}else{var o=i.textureURL.substr(i.textureURL.length-3);i.type||(i.type="ktx"===o.toLowerCase()?"KTX":"PVR");var a=new n(t,{key:e,url:i.textureURL,extension:o,xhrSettings:s,config:i});if(i.atlasURL){var h=new u(t,{key:e,url:i.atlasURL,xhrSettings:s,config:i});p.call(this,t,"texture",e,[a,h])}else p.call(this,t,"texture",e,[a])}this.config=i},onFileComplete:function(t){if(-1!==this.files.indexOf(t)){if(this.pending--,!this.config.multiAtlasURL)return;if("json"===t.type&&t.data.hasOwnProperty("textures")){var e=t.data.textures,i=this.config,s=this.loader,r=s.baseURL,o=s.path,h=s.prefix,l=a(i,"multiBaseURL",this.baseURL),u=a(i,"multiPath",this.path),c=a(i,"prefix",this.prefix),d=a(i,"textureXhrSettings");l&&s.setBaseURL(l),u&&s.setPath(u),c&&s.setPrefix(c);for(var f=0;f{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(98356),l=i(41212),u=new s({Extends:r,initialize:function(t,e,i,s,o,h){var u="ttf";if(l(e)){var c=e;e=a(c,"key"),i=a(c,"url"),s=a(c,"format","truetype"),o=a(c,"descriptors",null),h=a(c,"xhrSettings"),u=a(c,"extension",u)}else void 0===s&&(s="truetype");var d={type:"font",cache:!1,extension:u,responseType:"text",key:e,url:i,xhrSettings:h};r.call(this,t,d),this.data={format:s,descriptors:o},this.state=n.FILE_POPULATED},onProcess:function(){var t;this.state=n.FILE_PROCESSING,this.src=h(this,this.loader.baseURL);var e=this.key,i="url("+this.src+') format("'+this.data.format+'")';t=this.data.descriptors?new FontFace(e,i,this.data.descriptors):new FontFace(e,i);var s=this;t.load().then((function(){document.fonts.add(t),document.body.classList.add("fonts-loaded"),s.onProcessComplete()})).catch((function(){console.warn("Font failed to load",i),s.onProcessComplete()}))}});o.register("font",(function(t,e,i,s,n){if(Array.isArray(t))for(var r=0;r{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=i(73894),u=new s({Extends:r,initialize:function(t,e,i,s,n){var o="glsl";if(h(e)){var l=e;e=a(l,"key"),i=a(l,"url"),s=a(l,"shaderType","fragment"),n=a(l,"xhrSettings"),o=a(l,"extension",o)}else void 0===s&&(s="fragment");var u={type:"glsl",cache:t.cacheManager.shader,extension:o,responseType:"text",key:e,url:i,config:{shaderType:s},xhrSettings:n};r.call(this,t,u)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t=this.data.split("\n"),e=this.extractBlock(t,0);if(e)for(;e;){var i=this.getShaderName(e.header),s=this.getShaderType(e.header),n=this.getShaderUniforms(e.header),r=e.shader;if(this.cache.has(i)){var o=this.cache.get(i);"fragment"===s?o.fragmentSrc=r:o.vertexSrc=r,o.uniforms||(o.uniforms=n)}else"fragment"===s?this.cache.add(i,new l(i,r,"",n)):this.cache.add(i,new l(i,"",r,n));e=this.extractBlock(t,e.offset)}else"fragment"===this.config.shaderType?this.cache.add(this.key,new l(this.key,this.data)):this.cache.add(this.key,new l(this.key,"",this.data))},getShaderName:function(t){for(var e=0;e{var s=i(83419),n=i(54899),r=i(41299),o=i(95540),a=i(98356),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s){if(h(e)){var n=e;e=o(n,"key"),s=o(n,"config",s)}var a={type:"audio",cache:t.cacheManager.audio,extension:i.type,key:e,url:i.url,config:s};r.call(this,t,a),this.locked="ontouchstart"in window,this.loaded=!1,this.filesLoaded=0,this.filesTotal=0},onLoad:function(){this.loaded||(this.loaded=!0,this.loader.nextFile(this,!0))},onError:function(){for(var t=0;t{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s){var n="html";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),s=a(o,"xhrSettings"),n=a(o,"extension",n)}var l={type:"text",cache:t.cacheManager.html,extension:n,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,l)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()}});o.register("html",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,n,o){void 0===s&&(s=512),void 0===n&&(n=512);var l="html";if(h(e)){var u=e;e=a(u,"key"),i=a(u,"url"),o=a(u,"xhrSettings"),l=a(u,"extension",l),s=a(u,"width",s),n=a(u,"height",n)}var c={type:"html",cache:t.textureManager,extension:l,responseType:"text",key:e,url:i,xhrSettings:o,config:{width:s,height:n}};r.call(this,t,c)},onProcess:function(){this.state=n.FILE_PROCESSING;var t=this.config.width,e=this.config.height,i=[];i.push(''),i.push(''),i.push(''),i.push(this.xhrLoader.responseText),i.push(""),i.push(""),i.push("");var s=[i.join("\n")],o=this;try{var a=new window.Blob(s,{type:"image/svg+xml;charset=utf-8"})}catch(t){return o.state=n.FILE_ERRORED,void o.onProcessComplete()}this.data=new Image,this.data.crossOrigin=this.crossOrigin,this.data.onload=function(){r.revokeObjectURL(o.data),o.onProcessComplete()},this.data.onerror=function(){r.revokeObjectURL(o.data),o.onProcessError()},r.createObjectURL(this.data,a,"image/svg+xml")},addToCache:function(){this.cache.addImage(this.key,this.data)}});o.register("htmlTexture",(function(t,e,i,s,n){if(Array.isArray(t))for(var r=0;r{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=i(98356),u=new s({Extends:r,initialize:function t(e,i,s,n,o){var l,u="png";if(h(i)){var c=i;i=a(c,"key"),s=a(c,"url"),l=a(c,"normalMap"),n=a(c,"xhrSettings"),u=a(c,"extension",u),o=a(c,"frameConfig")}Array.isArray(s)&&(l=s[1],s=s[0]);var d={type:"image",cache:e.textureManager,extension:u,responseType:"blob",key:i,url:s,xhrSettings:n,config:o};if(r.call(this,e,d),l){var f=new t(e,this.key,l,n,o);f.type="normalMap",this.setLink(f),e.addFile(f)}this.useImageElementLoad="HTMLImageElement"===e.imageLoadType||this.base64,this.useImageElementLoad&&(this.load=this.loadImage,this.onProcess=this.onProcessImage)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=new Image,this.data.crossOrigin=this.crossOrigin;var t=this;this.data.onload=function(){r.revokeObjectURL(t.data),t.onProcessComplete()},this.data.onerror=function(){r.revokeObjectURL(t.data),t.onProcessError()},r.createObjectURL(this.data,this.xhrLoader.response,"image/png")},onProcessImage:function(){var t=this.state;this.state=n.FILE_PROCESSING,t===n.FILE_LOADED?this.onProcessComplete():this.onProcessError()},loadImage:function(){this.state=n.FILE_LOADING,this.src=l(this,this.loader.baseURL),this.data=new Image,this.data.crossOrigin=this.crossOrigin;var t=this;this.data.onload=function(){t.state=n.FILE_LOADED,t.loader.nextFile(t,!0)},this.data.onerror=function(){t.loader.nextFile(t,!1)},this.data.src=this.src},addToCache:function(){var t=this.linkFile;t?t.state>=n.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)}});o.register("image",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(35154),l=i(41212),u=new s({Extends:r,initialize:function(t,e,i,s,o){var u="json";if(l(e)){var c=e;e=a(c,"key"),i=a(c,"url"),s=a(c,"xhrSettings"),u=a(c,"extension",u),o=a(c,"dataKey",o)}var d={type:"json",cache:t.cacheManager.json,extension:u,responseType:"text",key:e,url:i,xhrSettings:s,config:o};r.call(this,t,d),l(i)&&(this.data=o?h(i,o):i,this.state=n.FILE_POPULATED)},onProcess:function(){if(this.state!==n.FILE_POPULATED){this.state=n.FILE_PROCESSING;try{var t=JSON.parse(this.xhrLoader.responseText)}catch(t){throw this.onProcessError(),t}var e=this.config;this.data="string"==typeof e?h(t,e,t):t}this.onProcessComplete()}});o.register("json",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(518),l=i(26430),u=new s({Extends:l,initialize:function(t,e,i,s,n,o,u){if(a(e)){var c=e;e=r(c,"key"),i=r(c,"url",!1)?r(c,"url"):r(c,"atlasURL"),o=r(c,"xhrSettings"),s=r(c,"path"),n=r(c,"baseURL"),u=r(c,"textureXhrSettings")}var d=new h(t,e,i,o);l.call(this,t,"multiatlas",e,[d]),this.config.path=s,this.config.baseURL=n,this.config.textureXhrSettings=u},onFileComplete:function(t){if(-1!==this.files.indexOf(t)&&(this.pending--,"json"===t.type&&t.data.hasOwnProperty("textures"))){var e=t.data.textures,i=this.config,s=this.loader,n=s.baseURL,a=s.path,h=s.prefix,l=r(i,"baseURL",this.baseURL),u=r(i,"path",this.path),c=r(i,"prefix",this.prefix),d=r(i,"textureXhrSettings");s.setBaseURL(l),s.setPath(u),s.setPrefix(c);for(var f=0;f{var s=i(83419),n=i(74099),r=i(95540),o=i(41212),a=i(26430),h=i(34328),l=new s({Extends:a,initialize:function(t,e,i,s){var n="js",l=[];if(o(e)){var u=e;e=r(u,"key"),i=r(u,"url"),s=r(u,"xhrSettings"),n=r(u,"extension",n)}Array.isArray(i)||(i=[i]);for(var c=0;c{var s=i(83419),n=i(74099),r=i(95540),o=i(41212),a=i(26430),h=i(85048),l=i(61485),u=i(78776),c=new s({Extends:a,initialize:function(t,e,i,s,n,h){var l,c,d=t.cacheManager.obj;if(o(e)){var f=e;e=r(f,"key"),l=new u(t,{key:e,type:"obj",cache:d,url:r(f,"url"),extension:r(f,"extension","obj"),xhrSettings:r(f,"xhrSettings"),config:{flipUV:r(f,"flipUV",n)}}),(s=r(f,"matURL"))&&(c=new u(t,{key:e,type:"mat",cache:d,url:s,extension:r(f,"matExtension","mat"),xhrSettings:r(f,"xhrSettings")}))}else l=new u(t,{key:e,url:i,type:"obj",cache:d,extension:"obj",xhrSettings:h,config:{flipUV:n}}),s&&(c=new u(t,{key:e,url:s,type:"mat",cache:d,extension:"mat",xhrSettings:h}));a.call(this,t,"obj",e,[l,c])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=h(t.data,t.config.flipUV);e&&(i.materials=l(e.data)),t.cache.add(t.key,i),this.complete=!0}}});n.register("obj",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(23906),r=i(74099),o=i(518),a=new s({Extends:o,initialize:function(t,e,i,s,n){o.call(this,t,e,i,s,n),this.type="packfile"},onProcess:function(){if(this.state!==n.FILE_POPULATED&&(this.state=n.FILE_PROCESSING,this.data=JSON.parse(this.xhrLoader.responseText)),this.data.hasOwnProperty("files")&&this.config){var t={};t[this.config]=this.data,this.data=t}this.loader.addPack(this.data,this.config),this.onProcessComplete()}});r.register("pack",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,o,l){var u="js";if(h(e)){var c=e;e=a(c,"key"),i=a(c,"url"),l=a(c,"xhrSettings"),u=a(c,"extension",u),s=a(c,"start"),o=a(c,"mapping")}var d={type:"plugin",cache:!1,extension:u,responseType:"text",key:e,url:i,xhrSettings:l,config:{start:s,mapping:o}};r.call(this,t,d),"function"==typeof i&&(this.data=i,this.state=n.FILE_POPULATED)},onProcess:function(){var t=this.loader.systems.plugins,e=this.config,i=a(e,"start",!1),s=a(e,"mapping",null);if(this.state===n.FILE_POPULATED)t.install(this.key,this.data,i,s);else{this.state=n.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data);var r=t.install(this.key,window[this.key],i,s);(i||s)&&(this.loader.systems[s]=r,this.loader.scene[s]=r)}this.onProcessComplete()}});o.register("plugin",(function(t,e,i,s,n){if(Array.isArray(t))for(var r=0;r{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,n){var o="svg";if(h(e)){var l=e;e=a(l,"key"),i=a(l,"url"),s=a(l,"svgConfig",{}),n=a(l,"xhrSettings"),o=a(l,"extension",o)}var u={type:"svg",cache:t.textureManager,extension:o,responseType:"text",key:e,url:i,xhrSettings:n,config:{width:a(s,"width"),height:a(s,"height"),scale:a(s,"scale")}};r.call(this,t,u)},onProcess:function(){this.state=n.FILE_PROCESSING;var t=this.xhrLoader.responseText,e=[t],i=this.config.width,s=this.config.height,o=this.config.scale;t:if(i&&s||o){var a=(new DOMParser).parseFromString(t,"text/xml").getElementsByTagName("svg")[0],h=a.hasAttribute("viewBox"),l=parseFloat(a.getAttribute("width")),u=parseFloat(a.getAttribute("height"));if(!h&&l&&u)a.setAttribute("viewBox","0 0 "+l+" "+u);else if(h&&!l&&!u){var c=a.getAttribute("viewBox").split(/\s+|,/);l=c[2],u=c[3]}if(o){if(!l||!u)break t;i=l*o,s=u*o}a.setAttribute("width",i.toString()+"px"),a.setAttribute("height",s.toString()+"px"),e=[(new XMLSerializer).serializeToString(a)]}try{var d=new window.Blob(e,{type:"image/svg+xml;charset=utf-8"})}catch(t){return void this.onProcessError()}this.data=new Image,this.data.crossOrigin=this.crossOrigin;var f=this,p=!1;this.data.onload=function(){p||r.revokeObjectURL(f.data),f.onProcessComplete()},this.data.onerror=function(){p?f.onProcessError():(p=!0,r.revokeObjectURL(f.data),f.data.src="data:image/svg+xml,"+encodeURIComponent(e.join("")))},r.createObjectURL(this.data,d,"image/svg+xml")},addToCache:function(){this.cache.addImage(this.key,this.data)}});o.register("svg",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s){var n="js";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),s=a(o,"xhrSettings"),n=a(o,"extension",n)}var l={type:"text",extension:n,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,l)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t=this.data.concat("(function(){\nreturn new "+this.key+"();\n}).call(this);"),e=eval;this.loader.sceneManager.add(this.key,e(t)),this.complete=!0}});o.register("sceneFile",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,o,l){var u="js";if(h(e)){var c=e;e=a(c,"key"),i=a(c,"url"),l=a(c,"xhrSettings"),u=a(c,"extension",u),s=a(c,"systemKey"),o=a(c,"sceneKey")}var d={type:"scenePlugin",cache:!1,extension:u,responseType:"text",key:e,url:i,xhrSettings:l,config:{systemKey:s,sceneKey:o}};r.call(this,t,d),"function"==typeof i&&(this.data=i,this.state=n.FILE_POPULATED)},onProcess:function(){var t=this.loader.systems.plugins,e=this.config,i=this.key,s=a(e,"systemKey",i),r=a(e,"sceneKey",i);this.state===n.FILE_POPULATED?t.installScenePlugin(s,this.data,r,this.loader.scene,!0):(this.state=n.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data),t.installScenePlugin(s,window[this.key],r,this.loader.scene,!0)),this.onProcessComplete()}});o.register("scenePlugin",(function(t,e,i,s,n){if(Array.isArray(t))for(var r=0;r{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s,n){var o="js";if(h(e)){var l=e;e=a(l,"key"),i=a(l,"url"),s=a(l,"type","script"),n=a(l,"xhrSettings"),o=a(l,"extension",o)}else void 0===s&&(s="script");var u={type:s,cache:!1,extension:o,responseType:"text",key:e,url:i,xhrSettings:n};r.call(this,t,u)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data),this.onProcessComplete()}});o.register("script",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(23906),r=i(74099),o=i(19550),a=new s({Extends:o,initialize:function(t,e,i,s,n){o.call(this,t,e,i,n,s),this.type="spritesheet"},addToCache:function(){var t=this.linkFile;t?t.state>=n.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)}});r.register("spritesheet",(function(t,e,i,s){if(Array.isArray(t))for(var n=0;n{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=new s({Extends:r,initialize:function(t,e,i,s){var n="text",o="txt",l=t.cacheManager.text;if(h(e)){var u=e;e=a(u,"key"),i=a(u,"url"),s=a(u,"xhrSettings"),o=a(u,"extension",o),n=a(u,"type",n),l=a(u,"cache",l)}var c={type:n,cache:l,extension:o,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,c)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()}});o.register("text",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=i(80341),u=new s({Extends:r,initialize:function(t,e,i,s){var n="csv";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),s=a(o,"xhrSettings"),n=a(o,"extension",n)}var u={type:"tilemapCSV",cache:t.cacheManager.tilemap,extension:n,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,u),this.tilemapFormat=l.CSV},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t={format:this.tilemapFormat,data:this.data};this.cache.add(this.key,t)}});o.register("tilemapCSV",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(74099),r=i(518),o=i(80341),a=new s({Extends:r,initialize:function(t,e,i,s){r.call(this,t,e,i,s),this.type="tilemapJSON",this.cache=t.cacheManager.tilemap},addToCache:function(){var t={format:o.WELTMEISTER,data:this.data};this.cache.add(this.key,t)}});n.register("tilemapImpact",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(74099),r=i(518),o=i(80341),a=new s({Extends:r,initialize:function(t,e,i,s){r.call(this,t,e,i,s),this.type="tilemapJSON",this.cache=t.cacheManager.tilemap},addToCache:function(){var t={format:o.TILED_JSON,data:this.data};this.cache.add(this.key,t)}});n.register("tilemapTiledJSON",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(74099),r=i(95540),o=i(19550),a=i(41212),h=i(26430),l=i(78776),u=new s({Extends:h,initialize:function(t,e,i,s,n,u){var c,d;if(a(e)){var f=e;e=r(f,"key"),c=new o(t,{key:e,url:r(f,"textureURL"),extension:r(f,"textureExtension","png"),normalMap:r(f,"normalMap"),xhrSettings:r(f,"textureXhrSettings")}),d=new l(t,{key:e,url:r(f,"atlasURL"),extension:r(f,"atlasExtension","txt"),xhrSettings:r(f,"atlasXhrSettings")})}else c=new o(t,e,i,n),d=new l(t,e,s,u);c.linkFile?h.call(this,t,"unityatlas",e,[c,d,c.linkFile]):h.call(this,t,"unityatlas",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addUnityAtlas(t.key,t.data,e.data,i),this.complete=!0}}});n.register("unityAtlas",(function(t,e,i,s,n){var r;if(Array.isArray(t))for(var o=0;o{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(98356),h=i(95540),l=i(41212),u=new s({Extends:r,initialize:function(t,e,i,s){if(void 0===s&&(s=!1),l(e)){var n=e;e=h(n,"key"),i=h(n,"url",[]),s=h(n,"noAudio",!1)}var o=t.systems.game.device.video.getVideoURL(i);o||console.warn("VideoFile: No supported format for "+e);var a={type:"video",cache:t.cacheManager.video,extension:o.type,key:e,url:o.url,config:{noAudio:s}};r.call(this,t,a)},onProcess:function(){this.data={url:this.src,noAudio:this.config.noAudio,crossOrigin:this.crossOrigin},this.onProcessComplete()},load:function(){this.src=a(this,this.loader.baseURL),this.state=n.FILE_LOADED,this.loader.nextFile(this,!0)}});o.register("video",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{var s=i(83419),n=i(23906),r=i(41299),o=i(74099),a=i(95540),h=i(41212),l=i(56836),u=new s({Extends:r,initialize:function(t,e,i,s){var n="xml";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),s=a(o,"xhrSettings"),n=a(o,"extension",n)}var l={type:"xml",cache:t.cacheManager.xml,extension:n,responseType:"text",key:e,url:i,xhrSettings:s};r.call(this,t,l)},onProcess:function(){this.state=n.FILE_PROCESSING,this.data=l(this.xhrLoader.responseText),this.data?this.onProcessComplete():this.onProcessError()}});o.register("xml",(function(t,e,i){if(Array.isArray(t))for(var s=0;s{t.exports={AnimationJSONFile:i(14135),AsepriteFile:i(76272),AtlasJSONFile:i(38734),AtlasXMLFile:i(74599),AudioFile:i(21097),AudioSpriteFile:i(89524),BinaryFile:i(85722),BitmapFontFile:i(97025),CompressedTextureFile:i(69559),CSSFile:i(16024),FontFile:i(87674),GLSLFile:i(47931),HTML5AudioFile:i(89749),HTMLFile:i(88470),HTMLTextureFile:i(14643),ImageFile:i(19550),JSONFile:i(518),MultiAtlasFile:i(59327),MultiScriptFile:i(99297),OBJFile:i(41846),PackFile:i(58610),PluginFile:i(48988),SceneFile:i(88423),ScenePluginFile:i(56812),ScriptFile:i(34328),SpriteSheetFile:i(85035),SVGFile:i(67397),TextFile:i(78776),TilemapCSVFile:i(49477),TilemapImpactFile:i(40807),TilemapJSONFile:i(56775),UnityAtlasFile:i(25771),VideoFile:i(33720),XMLFile:i(57318)}},57777:(t,e,i)=>{var s=i(23906),n=i(79291),r={Events:i(54899),FileTypes:i(64589),File:i(41299),FileTypesManager:i(74099),GetURL:i(98356),LoaderPlugin:i(74261),MergeXHRSettings:i(3374),MultiFile:i(26430),XHRLoader:i(84376),XHRSettings:i(92638)};r=n(!1,r,s),t.exports=r},53307:t=>{t.exports=function(t){for(var e=0,i=0;i{var s=i(6411);t.exports=function(t,e){return s(t)/s(e)/s(t-e)}},30976:t=>{t.exports=function(t,e){return Math.floor(Math.random()*(e-t+1)+t)}},87842:t=>{t.exports=function(t,e,i,s,n){var r=.5*(s-e),o=.5*(n-i),a=t*t;return(2*i-2*s+r+o)*(t*a)+(-3*i+3*s-2*r-o)*a+r*t+i}},26302: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.ceil(t*s)/s}},45319:t=>{t.exports=function(t,e,i){return Math.max(e,Math.min(i,t))}},39506:(t,e,i)=>{var s=i(36383);t.exports=function(t){return t*s.DEG_TO_RAD}},61241:t=>{t.exports=function(t,e){return Math.abs(t-e)}},38857:(t,e,i)=>{var s=i(45319),n=i(83419),r=i(37867),o=i(29747),a=new r,h=new n({initialize:function t(e,i,s,n){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=t.DefaultOrder),this._x=e,this._y=i,this._z=s,this._order=n,this.onChangeCallback=o},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)}},order:{get:function(){return this._order},set:function(t){this._order=t,this.onChangeCallback(this)}},set:function(t,e,i,s){return void 0===s&&(s=this._order),this._x=t,this._y=e,this._z=i,this._order=s,this.onChangeCallback(this),this},copy:function(t){return this.set(t.x,t.y,t.z,t.order)},setFromQuaternion:function(t,e,i){return void 0===e&&(e=this._order),void 0===i&&(i=!1),a.fromQuat(t),this.setFromRotationMatrix(a,e,i)},setFromRotationMatrix:function(t,e,i){void 0===e&&(e=this._order),void 0===i&&(i=!1);var n=t.val,r=n[0],o=n[4],a=n[8],h=n[1],l=n[5],u=n[9],c=n[2],d=n[6],f=n[10],p=0,v=0,g=0,m=.99999;switch(e){case"XYZ":v=Math.asin(s(a,-1,1)),Math.abs(a){t.exports=function(t){if(0===t)return 1;for(var e=t;--t;)e*=t;return e}},99472:t=>{t.exports=function(t,e){return Math.random()*(e-t)+t}},77623: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.floor(t*s)/s}},62945:(t,e,i)=>{var s=i(45319);t.exports=function(t,e,i){return(i-e)*(t=s(t,0,1))+e}},38265:t=>{t.exports=function(t,e){return t/e/1e3}},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],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=l*r-o*h,c=-l*n+o*a,d=h*n-r*a,f=e*u+i*c+s*d;return f?(f=1/f,t[0]=u*f,t[1]=(-l*i+s*h)*f,t[2]=(o*i-s*r)*f,t[3]=c*f,t[4]=(l*e-s*a)*f,t[5]=(-o*e+s*n)*f,t[6]=d*f,t[7]=(-h*e+i*a)*f,t[8]=(r*e-i*n)*f,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return t[0]=r*l-o*h,t[1]=s*h-i*l,t[2]=i*o-s*r,t[3]=o*a-n*l,t[4]=e*l-s*a,t[5]=s*n-e*o,t[6]=n*h-r*a,t[7]=i*a-e*h,t[8]=e*r-i*n,this},determinant:function(){var t=this.val,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*(l*r-o*h)+i*(-l*n+o*a)+s*(h*n-r*a)},multiply:function(t){var e=this.val,i=e[0],s=e[1],n=e[2],r=e[3],o=e[4],a=e[5],h=e[6],l=e[7],u=e[8],c=t.val,d=c[0],f=c[1],p=c[2],v=c[3],g=c[4],m=c[5],y=c[6],x=c[7],T=c[8];return e[0]=d*i+f*r+p*h,e[1]=d*s+f*o+p*l,e[2]=d*n+f*a+p*u,e[3]=v*i+g*r+m*h,e[4]=v*s+g*o+m*l,e[5]=v*n+g*a+m*u,e[6]=y*i+x*r+T*h,e[7]=y*s+x*o+T*l,e[8]=y*n+x*a+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],n=e[2],r=e[3],o=e[4],a=e[5],h=Math.sin(t),l=Math.cos(t);return e[0]=l*i+h*r,e[1]=l*s+h*o,e[2]=l*n+h*a,e[3]=l*r-h*i,e[4]=l*o-h*s,e[5]=l*a-h*n,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,n=t.w,r=e+e,o=i+i,a=s+s,h=e*r,l=e*o,u=e*a,c=i*o,d=i*a,f=s*a,p=n*r,v=n*o,g=n*a,m=this.val;return m[0]=1-(c+f),m[3]=l+g,m[6]=u-v,m[1]=l-g,m[4]=1-(h+f),m[7]=d+p,m[2]=u+v,m[5]=d-p,m[8]=1-(h+c),this},normalFromMat4:function(t){var e=t.val,i=this.val,s=e[0],n=e[1],r=e[2],o=e[3],a=e[4],h=e[5],l=e[6],u=e[7],c=e[8],d=e[9],f=e[10],p=e[11],v=e[12],g=e[13],m=e[14],y=e[15],x=s*h-n*a,T=s*l-r*a,w=s*u-o*a,b=n*l-r*h,S=n*u-o*h,E=r*u-o*l,A=c*g-d*v,C=c*m-f*v,_=c*y-p*v,M=d*m-f*g,P=d*y-p*g,R=f*y-p*m,L=x*R-T*P+w*M+b*_-S*C+E*A;return L?(L=1/L,i[0]=(h*R-l*P+u*M)*L,i[1]=(l*_-a*R-u*C)*L,i[2]=(a*P-h*_+u*A)*L,i[3]=(r*P-n*R-o*M)*L,i[4]=(s*R-r*_+o*C)*L,i[5]=(n*_-s*P-o*A)*L,i[6]=(g*E-m*S+y*b)*L,i[7]=(m*w-v*E-y*T)*L,i[8]=(v*S-g*w+y*x)*L,this):null}});t.exports=s},37867:(t,e,i)=>{var s=i(83419),n=i(25836),r=1e-6,o=new s({initialize:function(t){this.val=new Float32Array(16),t?this.copy(t):this.identity()},clone:function(){return new o(this)},set:function(t){return this.copy(t)},setValues:function(t,e,i,s,n,r,o,a,h,l,u,c,d,f,p,v){var g=this.val;return g[0]=t,g[1]=e,g[2]=i,g[3]=s,g[4]=n,g[5]=r,g[6]=o,g[7]=a,g[8]=h,g[9]=l,g[10]=u,g[11]=c,g[12]=d,g[13]=f,g[14]=p,g[15]=v,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=a.fromQuat(i).val,n=e.x,r=e.y,o=e.z;return this.setValues(s[0]*n,s[1]*n,s[2]*n,0,s[4]*r,s[5]*r,s[6]*r,0,s[8]*o,s[9]*o,s[10]*o,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],n=t[6],r=t[7],o=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]=n,t[11]=t[14],t[12]=s,t[13]=r,t[14]=o,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],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],v=t[14],g=t[15],m=e*o-i*r,y=e*a-s*r,x=e*h-n*r,T=i*a-s*o,w=i*h-n*o,b=s*h-n*a,S=l*p-u*f,E=l*v-c*f,A=l*g-d*f,C=u*v-c*p,_=u*g-d*p,M=c*g-d*v,P=m*M-y*_+x*C+T*A-w*E+b*S;return P?(P=1/P,this.setValues((o*M-a*_+h*C)*P,(s*_-i*M-n*C)*P,(p*b-v*w+g*T)*P,(c*w-u*b-d*T)*P,(a*A-r*M-h*E)*P,(e*M-s*A+n*E)*P,(v*x-f*b-g*y)*P,(l*b-c*x+d*y)*P,(r*_-o*A+h*S)*P,(i*A-e*_-n*S)*P,(f*w-p*x+g*m)*P,(u*x-l*w-d*m)*P,(o*E-r*C-a*S)*P,(e*C-i*E+s*S)*P,(p*y-f*T-v*m)*P,(l*T-u*y+c*m)*P)):this},adjoint:function(){var t=this.val,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],v=t[14],g=t[15];return this.setValues(o*(c*g-d*v)-u*(a*g-h*v)+p*(a*d-h*c),-(i*(c*g-d*v)-u*(s*g-n*v)+p*(s*d-n*c)),i*(a*g-h*v)-o*(s*g-n*v)+p*(s*h-n*a),-(i*(a*d-h*c)-o*(s*d-n*c)+u*(s*h-n*a)),-(r*(c*g-d*v)-l*(a*g-h*v)+f*(a*d-h*c)),e*(c*g-d*v)-l*(s*g-n*v)+f*(s*d-n*c),-(e*(a*g-h*v)-r*(s*g-n*v)+f*(s*h-n*a)),e*(a*d-h*c)-r*(s*d-n*c)+l*(s*h-n*a),r*(u*g-d*p)-l*(o*g-h*p)+f*(o*d-h*u),-(e*(u*g-d*p)-l*(i*g-n*p)+f*(i*d-n*u)),e*(o*g-h*p)-r*(i*g-n*p)+f*(i*h-n*o),-(e*(o*d-h*u)-r*(i*d-n*u)+l*(i*h-n*o)),-(r*(u*v-c*p)-l*(o*v-a*p)+f*(o*c-a*u)),e*(u*v-c*p)-l*(i*v-s*p)+f*(i*c-s*u),-(e*(o*v-a*p)-r*(i*v-s*p)+f*(i*a-s*o)),e*(o*c-a*u)-r*(i*c-s*u)+l*(i*a-s*o))},determinant:function(){var t=this.val,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],v=t[14],g=t[15];return(e*o-i*r)*(c*g-d*v)-(e*a-s*r)*(u*g-d*p)+(e*h-n*r)*(u*v-c*p)+(i*a-s*o)*(l*g-d*f)-(i*h-n*o)*(l*v-c*f)+(s*h-n*a)*(l*p-u*f)},multiply:function(t){var e=this.val,i=e[0],s=e[1],n=e[2],r=e[3],o=e[4],a=e[5],h=e[6],l=e[7],u=e[8],c=e[9],d=e[10],f=e[11],p=e[12],v=e[13],g=e[14],m=e[15],y=t.val,x=y[0],T=y[1],w=y[2],b=y[3];return e[0]=x*i+T*o+w*u+b*p,e[1]=x*s+T*a+w*c+b*v,e[2]=x*n+T*h+w*d+b*g,e[3]=x*r+T*l+w*f+b*m,x=y[4],T=y[5],w=y[6],b=y[7],e[4]=x*i+T*o+w*u+b*p,e[5]=x*s+T*a+w*c+b*v,e[6]=x*n+T*h+w*d+b*g,e[7]=x*r+T*l+w*f+b*m,x=y[8],T=y[9],w=y[10],b=y[11],e[8]=x*i+T*o+w*u+b*p,e[9]=x*s+T*a+w*c+b*v,e[10]=x*n+T*h+w*d+b*g,e[11]=x*r+T*l+w*f+b*m,x=y[12],T=y[13],w=y[14],b=y[15],e[12]=x*i+T*o+w*u+b*p,e[13]=x*s+T*a+w*c+b*v,e[14]=x*n+T*h+w*d+b*g,e[15]=x*r+T*l+w*f+b*m,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,n=i[0],r=i[4],o=i[8],a=i[12],h=i[1],l=i[5],u=i[9],c=i[13],d=i[2],f=i[6],p=i[10],v=i[14],g=i[3],m=i[7],y=i[11],x=i[15],T=s[0],w=s[4],b=s[8],S=s[12],E=s[1],A=s[5],C=s[9],_=s[13],M=s[2],P=s[6],R=s[10],L=s[14],O=s[3],F=s[7],D=s[11],I=s[15];return this.setValues(n*T+r*E+o*M+a*O,h*T+l*E+u*M+c*O,d*T+f*E+p*M+v*O,g*T+m*E+y*M+x*O,n*w+r*A+o*P+a*F,h*w+l*A+u*P+c*F,d*w+f*A+p*P+v*F,g*w+m*A+y*P+x*F,n*b+r*C+o*R+a*D,h*b+l*C+u*R+c*D,d*b+f*C+p*R+v*D,g*b+m*C+y*R+x*D,n*S+r*_+o*L+a*I,h*S+l*_+u*L+c*I,d*S+f*_+p*L+v*I,g*S+m*_+y*L+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),n=1-i,r=t.x,o=t.y,a=t.z,h=n*r,l=n*o;return this.setValues(h*r+i,h*o-s*a,h*a+s*o,0,h*o+s*a,l*o+i,l*a-s*r,0,h*a-s*o,l*a+s*r,n*a*a+i,0,0,0,0,1)},rotate:function(t,e){var i=this.val,s=e.x,n=e.y,o=e.z,a=Math.sqrt(s*s+n*n+o*o);if(Math.abs(a){t.exports=function(t,e,i){return Math.min(t+e,i)}},50040:t=>{t.exports=function(t){var e=t.length;if(0===e)return 0;t.sort((function(t,e){return t-e}));var i=Math.floor(e/2);return e%2==0?(t[i]+t[i-1])/2:t[i]}},37204:t=>{t.exports=function(t,e,i){return Math.max(t-e,i)}},65201:t=>{t.exports=function(t,e,i,s){void 0===i&&(i=e+1);var n=(t-e)/(i-e);return n>1?void 0!==s?(n=(s-t)/(s-i))<0&&(n=0):n=1:n<0&&(n=0),n}},15746:(t,e,i)=>{var s=i(83419),n=i(94434),r=i(29747),o=i(25836),a=1e-6,h=new Int8Array([1,2,0]),l=new Float32Array([0,0,0]),u=new o(1,0,0),c=new o(0,1,0),d=new o,f=new n,p=new s({initialize:function(t,e,i,s){this.onChangeCallback=r,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,n){return void 0===n&&(n=!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),n&&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,n=t*t+e*e+i*i+s*s;return n>0&&(n=1/Math.sqrt(n),this._x=t*n,this._y=e*n,this._z=i*n,this._w=s*n),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,n=this.z,r=this.w;return this.set(i+e*(t.x-i),s+e*(t.y-s),n+e*(t.z-n),r+e*(t.w-r))},rotationTo:function(t,e){var i=t.x*e.x+t.y*e.y+t.z*e.z;return i<-.999999?(d.copy(u).cross(t).length().999999?this.set(0,0,0,1):(d.copy(t).cross(e),this._x=d.x,this._y=d.y,this._z=d.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,n=this.w,r=t.x,o=t.y,a=t.z,h=t.w;return this.set(e*h+n*r+i*a-s*o,i*h+n*o+s*r-e*a,s*h+n*a+e*o-i*r,n*h-e*r-i*o-s*a)},slerp:function(t,e){var i=this.x,s=this.y,n=this.z,r=this.w,o=t.x,h=t.y,l=t.z,u=t.w,c=i*o+s*h+n*l+r*u;c<0&&(c=-c,o=-o,h=-h,l=-l,u=-u);var d=1-e,f=e;if(1-c>a){var p=Math.acos(c),v=Math.sin(p);d=Math.sin((1-e)*p)/v,f=Math.sin(e*p)/v}return this.set(d*i+f*o,d*s+f*h,d*n+f*l,d*r+f*u)},invert:function(){var t=this.x,e=this.y,i=this.z,s=this.w,n=t*t+e*e+i*i+s*s,r=n?1/n:0;return this.set(-t*r,-e*r,-i*r,s*r)},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,n=this.w,r=Math.sin(t),o=Math.cos(t);return this.set(e*o+n*r,i*o+s*r,s*o-i*r,n*o-e*r)},rotateY:function(t){t*=.5;var e=this.x,i=this.y,s=this.z,n=this.w,r=Math.sin(t),o=Math.cos(t);return this.set(e*o-s*r,i*o+n*r,s*o+e*r,n*o-i*r)},rotateZ:function(t){t*=.5;var e=this.x,i=this.y,s=this.z,n=this.w,r=Math.sin(t),o=Math.cos(t);return this.set(e*o+i*r,i*o-e*r,s*o+n*r,n*o-s*r)},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,n=t.z/2,r=Math.cos(i),o=Math.cos(s),a=Math.cos(n),h=Math.sin(i),l=Math.sin(s),u=Math.sin(n);switch(t.order){case"XYZ":this.set(h*o*a+r*l*u,r*l*a-h*o*u,r*o*u+h*l*a,r*o*a-h*l*u,e);break;case"YXZ":this.set(h*o*a+r*l*u,r*l*a-h*o*u,r*o*u-h*l*a,r*o*a+h*l*u,e);break;case"ZXY":this.set(h*o*a-r*l*u,r*l*a+h*o*u,r*o*u+h*l*a,r*o*a-h*l*u,e);break;case"ZYX":this.set(h*o*a-r*l*u,r*l*a+h*o*u,r*o*u-h*l*a,r*o*a+h*l*u,e);break;case"YZX":this.set(h*o*a+r*l*u,r*l*a+h*o*u,r*o*u-h*l*a,r*o*a-h*l*u,e);break;case"XZY":this.set(h*o*a-r*l*u,r*l*a-h*o*u,r*o*u+h*l*a,r*o*a+h*l*u,e)}return this},setFromRotationMatrix:function(t){var e,i=t.val,s=i[0],n=i[4],r=i[8],o=i[1],a=i[5],h=i[9],l=i[2],u=i[6],c=i[10],d=s+a+c;return d>0?(e=.5/Math.sqrt(d+1),this.set((u-h)*e,(r-l)*e,(o-n)*e,.25/e)):s>a&&s>c?(e=2*Math.sqrt(1+s-a-c),this.set(.25*e,(n+o)/e,(r+l)/e,(u-h)/e)):a>c?(e=2*Math.sqrt(1+a-s-c),this.set((n+o)/e,.25*e,(h+u)/e,(r-l)/e)):(e=2*Math.sqrt(1+c-s-a),this.set((r+l)/e,(h+u)/e,.25*e,(o-n)/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 n=0;i[4]>i[0]&&(n=1),i[8]>i[3*n+n]&&(n=2);var r=h[n],o=h[r];e=Math.sqrt(i[3*n+n]-i[3*r+r]-i[3*o+o]+1),l[n]=.5*e,e=.5/e,l[r]=(i[3*r+n]+i[3*n+r])*e,l[o]=(i[3*o+n]+i[3*n+o])*e,this._x=l[0],this._y=l[1],this._z=l[2],this._w=(i[3*o+r]-i[3*r+o])*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,n=Math.sqrt(1-s*s)*e;return t.x=Math.cos(i)*n,t.y=Math.sin(i)*n,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 n=Math.cos(s),r=Math.sin(s),o=t.x-e,a=t.y-i;return t.x=o*n-a*r+e,t.y=o*r+a*n+i,t}},1163:t=>{t.exports=function(t,e,i,s,n){var r=s+Math.atan2(t.y-i,t.x-e);return t.x=e+n*Math.cos(r),t.y=i+n*Math.sin(r),t}},70336:t=>{t.exports=function(t,e,i,s,n){return t.x=e+n*Math.cos(s),t.y=i+n*Math.sin(s),t}},72678:(t,e,i)=>{var s=i(25836),n=i(37867),r=i(15746),o=new n,a=new r,h=new s;t.exports=function(t,e,i){return a.setAxisAngle(e,i),o.fromRotationTranslation(a,h.set(0,0,0)),t.transformMat4(o)}},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}},16922:t=>{t.exports=function(t,e,i,s){void 0===e&&(e=1),void 0===i&&(i=1),void 0===s&&(s=1),s*=Math.PI/t;for(var n=[],r=[],o=0;o{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,n){void 0===n&&(n=new s);var r=0,o=0;return t>0&&t<=e*i&&(r=t>e-1?t-(o=Math.floor(t/e))*e:t),n.set(r,o)}},85955:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r,o,a,h){void 0===h&&(h=new s);var l=Math.sin(r),u=Math.cos(r),c=u*o,d=l*o,f=-l*a,p=u*a,v=1/(c*p+f*-d);return h.x=p*v*t+-f*v*e+(n*f-i*p)*v,h.y=c*v*e+-d*v*t+(-n*c+i*d)*v,h}},26099:(t,e,i)=>{var s=i(83419),n=i(43855),r=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 r(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)},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 n(this.x,t.x,e)&&n(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)}});r.ZERO=new r,r.RIGHT=new r(1,0),r.LEFT=new r(-1,0),r.UP=new r(0,-1),r.DOWN=new r(0,1),r.ONE=new r(1,1),t.exports=r},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,n=t.z,r=e.x,o=e.y,a=e.z;return this.x=s*a-n*o,this.y=n*r-i*a,this.z=i*o-s*r,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,n=t.x,r=t.y,o=t.z;return this.x=i*o-s*r,this.y=s*n-e*o,this.z=e*r-i*n,this},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,s=this.y,n=this.z;return this.x=i+e*(t.x-i),this.y=s+e*(t.y-s),this.z=n+e*(t.z-n),this},applyMatrix3:function(t){var e=this.x,i=this.y,s=this.z,n=t.val;return this.x=n[0]*e+n[3]*i+n[6]*s,this.y=n[1]*e+n[4]*i+n[7]*s,this.z=n[2]*e+n[5]*i+n[8]*s,this},applyMatrix4:function(t){var e=this.x,i=this.y,s=this.z,n=t.val,r=1/(n[3]*e+n[7]*i+n[11]*s+n[15]);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},transformMat3:function(t){var e=this.x,i=this.y,s=this.z,n=t.val;return this.x=e*n[0]+i*n[3]+s*n[6],this.y=e*n[1]+i*n[4]+s*n[7],this.z=e*n[2]+i*n[5]+s*n[8],this},transformMat4:function(t){var e=this.x,i=this.y,s=this.z,n=t.val;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12],this.y=n[1]*e+n[5]*i+n[9]*s+n[13],this.z=n[2]*e+n[6]*i+n[10]*s+n[14],this},transformCoordinates:function(t){var e=this.x,i=this.y,s=this.z,n=t.val,r=e*n[0]+i*n[4]+s*n[8]+n[12],o=e*n[1]+i*n[5]+s*n[9]+n[13],a=e*n[2]+i*n[6]+s*n[10]+n[14],h=e*n[3]+i*n[7]+s*n[11]+n[15];return this.x=r/h,this.y=o/h,this.z=a/h,this},transformQuat:function(t){var e=this.x,i=this.y,s=this.z,n=t.x,r=t.y,o=t.z,a=t.w,h=a*e+r*s-o*i,l=a*i+o*e-n*s,u=a*s+n*i-r*e,c=-n*e-r*i-o*s;return this.x=h*a+c*-n+l*-o-u*-r,this.y=l*a+c*-r+u*-n-h*-o,this.z=u*a+c*-o+h*-r-l*-n,this},project:function(t){var e=this.x,i=this.y,s=this.z,n=t.val,r=n[0],o=n[1],a=n[2],h=n[3],l=n[4],u=n[5],c=n[6],d=n[7],f=n[8],p=n[9],v=n[10],g=n[11],m=n[12],y=n[13],x=n[14],T=1/(e*h+i*d+s*g+n[15]);return this.x=(e*r+i*l+s*f+m)*T,this.y=(e*o+i*u+s*p+y)*T,this.z=(e*a+i*c+s*v+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,n=t.z,r=t.w,o=this.x-i,a=r-this.y-1-s,h=this.z;return this.x=2*o/n-1,this.y=2*a/r-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,n=t*t+e*e+i*i+s*s;return n>0&&(n=1/Math.sqrt(n),this.x=t*n,this.y=e*n,this.z=i*n,this.w=s*n),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,n=this.z,r=this.w;return this.x=i+e*(t.x-i),this.y=s+e*(t.y-s),this.z=n+e*(t.z-n),this.w=r+e*(t.w-r),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,n=t.w-this.w||0;return Math.sqrt(e*e+i*i+s*s+n*n)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y,s=t.z-this.z||0,n=t.w-this.w||0;return e*e+i*i+s*s+n*n},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,n=this.w,r=t.val;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.w=r[3]*e+r[7]*i+r[11]*s+r[15]*n,this},transformQuat:function(t){var e=this.x,i=this.y,s=this.z,n=t.x,r=t.y,o=t.z,a=t.w,h=a*e+r*s-o*i,l=a*i+o*e-n*s,u=a*s+n*i-r*e,c=-n*e-r*i-o*s;return this.x=h*a+c*-n+l*-o-u*-r,this.y=l*a+c*-r+u*-n-h*-o,this.z=u*a+c*-o+h*-r-l*-n,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.PI2),Math.abs(((t+s.TAU)%s.PI2-s.PI2)%s.PI2)}},49127:(t,e,i)=>{var s=i(12407);t.exports=function(t,e){return s(e-t)}},52285:(t,e,i)=>{var s=i(12407),n=2*Math.PI;t.exports=function(t,e){var i=s(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.PI2-i?t=e:(Math.abs(e-t)>Math.PI&&(et?t+=i:e{t.exports=function(t,e){var i=e-t;return 0===i?0:i-360*Math.floor((i- -180)/360)}},86554:(t,e,i)=>{var s=i(15994);t.exports=function(t){return s(t,-Math.PI,Math.PI)}},30954:(t,e,i)=>{var s=i(15994);t.exports=function(t){return s(t,-180,180)}},25588:(t,e,i)=>{t.exports={Between:i(31040),BetweenPoints:i(55495),BetweenPointsY:i(128),BetweenY:i(41273),CounterClockwise:i(1432),GetClockwiseDistance:i(49127),GetCounterClockwiseDistance:i(52285),GetShortestDistance:i(67317),Normalize:i(12407),Random:i(53993),RandomDegrees:i(86564),Reverse:i(90154),RotateTo:i(48736),ShortestBetween:i(61430),Wrap:i(86554),WrapDegrees:i(30954)}},36383:t=>{var e={PI2:2*Math.PI,TAU:.5*Math.PI,EPSILON:1e-6,DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,RND:null,MIN_SAFE_INTEGER:Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER||9007199254740991};t.exports=e},20339:t=>{t.exports=function(t,e,i,s){var n=t-i,r=e-s;return Math.sqrt(n*n+r*r)}},52816:t=>{t.exports=function(t,e){var i=t.x-e.x,s=t.y-e.y;return Math.sqrt(i*i+s*s)}},64559:t=>{t.exports=function(t,e){var i=t.x-e.x,s=t.y-e.y;return i*i+s*s}},82340:t=>{t.exports=function(t,e,i,s){return Math.max(Math.abs(t-i),Math.abs(e-s))}},14390:t=>{t.exports=function(t,e,i,s,n){return void 0===n&&(n=2),Math.sqrt(Math.pow(i-t,n)+Math.pow(s-e,n))}},2243:t=>{t.exports=function(t,e,i,s){return Math.abs(t-i)+Math.abs(e-s)}},89774:t=>{t.exports=function(t,e,i,s){var n=t-i,r=e-s;return n*n+r*r}},50994:(t,e,i)=>{t.exports={Between:i(20339),BetweenPoints:i(52816),BetweenPointsSquared:i(64559),Chebyshev:i(82340),Power:i(14390),Snake:i(2243),Squared:i(89774)}},62640:(t,e,i)=>{var s=i(54178),n=i(41521),r=i(79980),o=i(85433),a=i(99140),h=i(48857),l=i(81596),u=i(59133),c=i(98516),d=i(35248),f=i(82500),p=i(49752);t.exports={Power0:l,Power1:u.Out,Power2:o.Out,Power3:c.Out,Power4:d.Out,Linear:l,Quad:u.Out,Cubic:o.Out,Quart:c.Out,Quint:d.Out,Sine:f.Out,Expo:h.Out,Circ:r.Out,Elastic:a.Out,Back:s.Out,Bounce:n.Out,Stepped:p,"Quad.easeIn":u.In,"Cubic.easeIn":o.In,"Quart.easeIn":c.In,"Quint.easeIn":d.In,"Sine.easeIn":f.In,"Expo.easeIn":h.In,"Circ.easeIn":r.In,"Elastic.easeIn":a.In,"Back.easeIn":s.In,"Bounce.easeIn":n.In,"Quad.easeOut":u.Out,"Cubic.easeOut":o.Out,"Quart.easeOut":c.Out,"Quint.easeOut":d.Out,"Sine.easeOut":f.Out,"Expo.easeOut":h.Out,"Circ.easeOut":r.Out,"Elastic.easeOut":a.Out,"Back.easeOut":s.Out,"Bounce.easeOut":n.Out,"Quad.easeInOut":u.InOut,"Cubic.easeInOut":o.InOut,"Quart.easeInOut":c.InOut,"Quint.easeInOut":d.InOut,"Sine.easeInOut":f.InOut,"Expo.easeInOut":h.InOut,"Circ.easeInOut":r.InOut,"Elastic.easeInOut":a.InOut,"Back.easeInOut":s.InOut,"Bounce.easeInOut":n.InOut}},1639:t=>{t.exports=function(t,e){return void 0===e&&(e=1.70158),t*t*((e+1)*t-e)}},50099:t=>{t.exports=function(t,e){void 0===e&&(e=1.70158);var i=1.525*e;return(t*=2)<1?t*t*((i+1)*t-i)*.5:.5*((t-=2)*t*((i+1)*t+i)+2)}},41286:t=>{t.exports=function(t,e){return void 0===e&&(e=1.70158),--t*t*((e+1)*t+e)+1}},54178:(t,e,i)=>{t.exports={In:i(1639),Out:i(41286),InOut:i(50099)}},59590:t=>{t.exports=function(t){return(t=1-t)<1/2.75?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}},41788:t=>{t.exports=function(t){var e=!1;return t<.5?(t=1-2*t,e=!0):t=2*t-1,t<1/2.75?t*=7.5625*t:t=t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5}},69905:t=>{t.exports=function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}},41521:(t,e,i)=>{t.exports={In:i(59590),Out:i(69905),InOut:i(41788)}},91861:t=>{t.exports=function(t){return 1-Math.sqrt(1-t*t)}},4177:t=>{t.exports=function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},57512:t=>{t.exports=function(t){return Math.sqrt(1- --t*t)}},79980:(t,e,i)=>{t.exports={In:i(91861),Out:i(57512),InOut:i(4177)}},51150:t=>{t.exports=function(t){return t*t*t}},82820:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},35033:t=>{t.exports=function(t){return--t*t*t+1}},85433:(t,e,i)=>{t.exports={In:i(51150),Out:i(35033),InOut:i(82820)}},69965:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var s=i/4;return e<1?e=1:s=i*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/i)}},50665:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var s=i/4;return e<1?e=1:s=i*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/i)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/i)*.5+1}},7744:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var s=i/4;return e<1?e=1:s=i*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-s)*(2*Math.PI)/i)+1}},99140:(t,e,i)=>{t.exports={In:i(69965),Out:i(7744),InOut:i(50665)}},24590:t=>{t.exports=function(t){return Math.pow(2,10*(t-1))-.001}},87844:t=>{t.exports=function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))}},89433:t=>{t.exports=function(t){return 1-Math.pow(2,-10*t)}},48857:(t,e,i)=>{t.exports={In:i(24590),Out:i(89433),InOut:i(87844)}},48820:(t,e,i)=>{t.exports={Back:i(54178),Bounce:i(41521),Circular:i(79980),Cubic:i(85433),Elastic:i(99140),Expo:i(48857),Linear:i(81596),Quadratic:i(59133),Quartic:i(98516),Quintic:i(35248),Sine:i(82500),Stepped:i(49752)}},7147:t=>{t.exports=function(t){return t}},81596:(t,e,i)=>{t.exports=i(7147)},34826:t=>{t.exports=function(t){return t*t}},20544:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},92029:t=>{t.exports=function(t){return t*(2-t)}},59133:(t,e,i)=>{t.exports={In:i(34826),Out:i(92029),InOut:i(20544)}},64413:t=>{t.exports=function(t){return t*t*t*t}},78137:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},45840:t=>{t.exports=function(t){return 1- --t*t*t*t}},98516:(t,e,i)=>{t.exports={In:i(64413),Out:i(45840),InOut:i(78137)}},87745:t=>{t.exports=function(t){return t*t*t*t*t}},16509:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},17868:t=>{t.exports=function(t){return--t*t*t*t*t+1}},35248:(t,e,i)=>{t.exports={In:i(87745),Out:i(17868),InOut:i(16509)}},80461:t=>{t.exports=function(t){return 0===t?0:1===t?1:1-Math.cos(t*Math.PI/2)}},34025:t=>{t.exports=function(t){return 0===t?0:1===t?1:.5*(1-Math.cos(Math.PI*t))}},52768:t=>{t.exports=function(t){return 0===t?0:1===t?1:Math.sin(t*Math.PI/2)}},82500:(t,e,i)=>{t.exports={In:i(80461),Out:i(52768),InOut:i(34025)}},72251:t=>{t.exports=function(t,e){return void 0===e&&(e=1),t<=0?0:t>=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){t.exports=function(t,e){return void 0===e&&(e=1e-4),Math.floor(t+e)}},5470:t=>{t.exports=function(t,e,i){return void 0===i&&(i=1e-4),t>e-i}},94977:t=>{t.exports=function(t,e,i){return void 0===i&&(i=1e-4),t{t.exports={Ceil:i(75698),Equal:i(43855),Floor:i(25777),GreaterThan:i(5470),LessThan:i(94977)}},75508:(t,e,i)=>{var s=i(36383),n=i(79291),r={Angle:i(25588),Distance:i(50994),Easing:i(48820),Fuzzy:i(48379),Interpolation:i(38289),Pow2:i(49001),Snap:i(73697),RandomDataGenerator:i(28453),Average:i(53307),Bernstein:i(85710),Between:i(30976),CatmullRom:i(87842),CeilTo:i(26302),Clamp:i(45319),DegToRad:i(39506),Difference:i(61241),Euler:i(38857),Factorial:i(6411),FloatBetween:i(99472),FloorTo:i(77623),FromPercent:i(62945),GetSpeed:i(38265),IsEven:i(78702),IsEvenStrict:i(94883),Linear:i(28915),LinearXY:i(94908),MaxAdd:i(86883),Median:i(50040),MinSub:i(37204),Percent:i(65201),RadToDeg:i(43396),RandomXY:i(74362),RandomXYZ:i(60706),RandomXYZW:i(67421),Rotate:i(36305),RotateAround:i(11520),RotateAroundDistance:i(1163),RotateTo:i(70336),RoundAwayFromZero:i(2284),RoundTo:i(41013),SinCosTableGenerator:i(16922),SmootherStep:i(54261),SmoothStep:i(7602),ToXY:i(44408),TransformXY:i(85955),Within:i(60417),Wrap:i(15994),Vector2:i(26099),Vector3:i(25836),Vector4:i(61369),Matrix3:i(94434),Matrix4:i(37867),Quaternion:i(15746),RotateVec3:i(72678)};r=n(!1,r,s),t.exports=r},89318:(t,e,i)=>{var s=i(85710);t.exports=function(t,e){for(var i=0,n=t.length-1,r=0;r<=n;r++)i+=Math.pow(1-e,n-r)*Math.pow(e,r)*t[r]*s(n,r);return i}},77259:(t,e,i)=>{var s=i(87842);t.exports=function(t,e){var i=t.length-1,n=i*e,r=Math.floor(n);return t[0]===t[i]?(e<0&&(r=Math.floor(n=i*(1+e))),s(n-r,t[(r-1+i)%i],t[r],t[(r+1)%i],t[(r+2)%i])):e<0?t[0]-(s(-n,t[0],t[0],t[1],t[1])-t[0]):e>1?t[i]-(s(n-i,t[i],t[i],t[i-1],t[i-1])-t[i]):s(n-r,t[r?r-1:0],t[r],t[i{t.exports=function(t,e,i,s,n){return function(t,e){var i=1-t;return i*i*i*e}(t,e)+function(t,e){var i=1-t;return 3*i*i*t*e}(t,i)+function(t,e){return 3*(1-t)*t*t*e}(t,s)+function(t,e){return t*t*t*e}(t,n)}},28392:(t,e,i)=>{var s=i(28915);t.exports=function(t,e){var i=t.length-1,n=i*e,r=Math.floor(n);return e<0?s(t[0],t[1],n):e>1?s(t[i],t[i-1],i-n):s(t[r],t[r+1>i?i:r+1],n-r)}},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<{t.exports=function(t,e){return t>0&&0==(t&t-1)&&e>0&&0==(e&e-1)}},81230:t=>{t.exports=function(t){return t>0&&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),n=i(79291),r={Actions:i(61061),Animations:i(60421),BlendModes:i(10312),Cache:i(83388),Cameras:i(26638),Core:i(42857),Class:i(83419),Create:i(15822),Curves:i(25410),Data:i(44965),Display:i(27460),DOM:i(84902),Events:i(93055),FX:i(66064),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),Tweens:i(43066),Utils:i(91799)};r.Sound=i(23717),r=n(!1,r,s),t.exports=r,i.g.Phaser=r},71289:(t,e,i)=>{var s=i(83419),n=i(92209),r=i(88571),o=new s({Extends:r,Mixins:[n.Acceleration,n.Angular,n.Bounce,n.Collision,n.Debug,n.Drag,n.Enable,n.Friction,n.Gravity,n.Immovable,n.Mass,n.Pushable,n.Size,n.Velocity],initialize:function(t,e,i,s,n){r.call(this,t,e,i,s,n),this.body=null}});t.exports=o},86689:(t,e,i)=>{var s=i(83419),n=i(39506),r=i(20339),o=i(89774),a=i(66022),h=i(95540),l=i(46975),u=i(72441),c=i(47956),d=i(37277),f=i(44594),p=i(26099),v=i(82248),g=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 v(this.scene,this.config),this.add=new a(this.world),this.systems.events.once(f.DESTROY,this.destroy,this)},start:function(){this.world||(this.world=new v(this.scene,this.config),this.add=new a(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,n){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===n&&(n=i),this.world.collideObjects(t,e,i,s,n,!0)},collide:function(t,e,i,s,n){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===n&&(n=i),this.world.collideObjects(t,e,i,s,n,!1)},collideTiles:function(t,e,i,s,n){return this.world.collideTiles(t,e,i,s,n)},overlapTiles:function(t,e,i,s,n){return this.world.overlapTiles(t,e,i,s,n)},pause:function(){return this.world.pause()},resume:function(){return this.world.resume()},accelerateTo:function(t,e,i,s,n,r){void 0===s&&(s=60);var o=Math.atan2(i-t.y,e-t.x);return t.body.acceleration.setToPolar(o,s),void 0!==n&&void 0!==r&&t.body.maxVelocity.set(n,r),o},accelerateToObject:function(t,e,i,s,n){return this.accelerateTo(t,e.x,e.y,i,s,n)},closest:function(t,e){e||(e=this.world.bodies.entries);for(var i=Number.MAX_VALUE,s=null,n=t.x,r=t.y,a=e.length,h=0;hi&&(s=l,i=c)}}return s},moveTo:function(t,e,i,s,n){void 0===s&&(s=60),void 0===n&&(n=0);var o=Math.atan2(i-t.y,e-t.x);return n>0&&(s=r(t.x,t.y,e,i)/(n/1e3)),t.body.velocity.setToPolar(o,s),o},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(n(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,n,r){return c(this.world,t,e,i,s,n,r)},overlapCirc:function(t,e,i,s,n){return u(this.world,t,e,i,s,n)},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}});d.register("ArcadePhysics",g,"arcadePhysics"),t.exports=g},13759:(t,e,i)=>{var s=i(83419),n=i(92209),r=i(68287),o=new s({Extends:r,Mixins:[n.Acceleration,n.Angular,n.Bounce,n.Collision,n.Debug,n.Drag,n.Enable,n.Friction,n.Gravity,n.Immovable,n.Mass,n.Pushable,n.Size,n.Velocity],initialize:function(t,e,i,s,n){r.call(this,t,e,i,s,n),this.body=null}});t.exports=o},37742:(t,e,i)=>{var s=i(83419),n=i(78389),r=i(37747),o=i(63012),a=i(43396),h=i(87841),l=i(37303),u=i(95829),c=i(26099),d=new s({Mixins:[n],initialize:function(t,e){var i=64,s=64,n=void 0!==e;n&&e.displayWidth&&(i=e.displayWidth,s=e.displayHeight),n||(e={x:0,y:0,angle:0,rotation:0,scaleX:1,scaleY:1,displayOriginX:0,displayOriginY:0}),this.world=t,this.gameObject=n?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 c,this.position=new c(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 c(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.velocity=new c,this.newVelocity=new c,this.deltaMax=new c,this.acceleration=new c,this.allowDrag=!0,this.drag=new c,this.allowGravity=!0,this.gravity=new c,this.bounce=new c,this.worldBounce=null,this.customBoundsRectangle=t.bounds,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.maxVelocity=new c(1e4,1e4),this.maxSpeed=-1,this.friction=new c(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=r.FACING_NONE,this.immovable=!1,this.pushable=!0,this.slideFactor=new c(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=r.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=a(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 n=t.getBounds(this._bounds);this.width=n.width,this.height=n.height,s=!0}else{var r=Math.abs(e.scaleX),o=Math.abs(e.scaleY);this._sx===r&&this._sy===o||(this.width=this.sourceWidth*r,this.height=this.sourceHeight*o,this._sx=r,this._sy=o,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 n=this.autoFrame;s.set((i.x-n.x)/t,(i.y-n.y)/t),this.world.updateMotion(this,t),this._dx=i.x-n.x,this._dy=i.y-n.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 r=s.x,a=s.y;if(this.updateCenter(),this.angle=Math.atan2(a,r),this.speed=Math.sqrt(r*r+a*a),this.collideWorldBounds&&this.checkWorldBounds()&&this.onWorldBounds){var h=this.blocked;this.world.emit(o.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 n=this.deltaMax.x,o=this.deltaMax.y;0!==n&&0!==e&&(e<0&&e<-n?e=-n:e>0&&e>n&&(e=n)),0!==o&&0!==i&&(i<0&&i<-o?i=-o:i>0&&i>o&&(i=o)),s&&(s.x+=e,s.y+=i)}e<0?this.facing=r.FACING_LEFT:e>0&&(this.facing=r.FACING_RIGHT),i<0?this.facing=r.FACING_UP:i>0&&(this.facing=r.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,n=this.world.checkCollision,r=this.worldBounce?-this.worldBounce.x:-this.bounce.x,o=this.worldBounce?-this.worldBounce.y:-this.bounce.y,a=!1;return t.xs.right&&n.right&&(t.x=s.right-this.width,e.x*=r,i.right=!0,a=!0),t.ys.bottom&&n.down&&(t.y=s.bottom-this.height,e.y*=o,i.down=!0,a=!0),a&&(this.blocked.none=!1,this.updateCenter()),a},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 n=(s.width-t)/2,r=(s.height-e)/2;this.offset.set(n,r)}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.set(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 n=void 0!==e,r=void 0!==i;return(n||r)&&(this.worldBounce||(this.worldBounce=new c),n&&(this.worldBounce.x=e),r&&(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 n=this.blocked;i&&(n.left=!0,n.none=!1),s&&(n.right=!0,n.none=!1)},processY:function(t,e,i,s){this.y+=t,this.updateCenter(),null!==e&&(this.velocity.y=e*this.slideFactor.y);var n=this.blocked;i&&(n.up=!0,n.none=!1),s&&(n.down=!0,n.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=d},79342:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i,s,n,r,o){this.world=t,this.name="",this.active=!0,this.overlapOnly=e,this.object1=i,this.object2=s,this.collideCallback=n,this.processCallback=r,this.callbackContext=o},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),n=i(13759),r=i(37742),o=i(83419),a=i(37747),h=i(60758),l=i(72624),u=i(71464),c=new o({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},collider:function(t,e,i,s,n){return this.world.addCollider(t,e,i,s,n)},overlap:function(t,e,i,s,n){return this.world.addOverlap(t,e,i,s,n)},existing:function(t,e){var i=e?a.STATIC_BODY:a.DYNAMIC_BODY;return this.world.enableBody(t,i),t},staticImage:function(t,e,i,n){var r=new s(this.scene,t,e,i,n);return this.sys.displayList.add(r),this.world.enableBody(r,a.STATIC_BODY),r},image:function(t,e,i,n){var r=new s(this.scene,t,e,i,n);return this.sys.displayList.add(r),this.world.enableBody(r,a.DYNAMIC_BODY),r},staticSprite:function(t,e,i,s){var r=new n(this.scene,t,e,i,s);return this.sys.displayList.add(r),this.sys.updateList.add(r),this.world.enableBody(r,a.STATIC_BODY),r},sprite:function(t,e,i,s){var r=new n(this.scene,t,e,i,s);return this.sys.displayList.add(r),this.sys.updateList.add(r),this.world.enableBody(r,a.DYNAMIC_BODY),r},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 n=new r(this.world);return n.position.set(t,e),i&&s&&n.setSize(i,s),this.world.add(n,a.DYNAMIC_BODY),n},staticBody:function(t,e,i,s){var n=new l(this.world);return n.position.set(t,e),i&&s&&n.setSize(i,s),this.world.add(n,a.STATIC_BODY),n},destroy:function(){this.world=null,this.scene=null,this.sys=null}});t.exports=c},79599:t=>{t.exports=function(t){var e=0;if(Array.isArray(t))for(var i=0;i{var s=i(37747);t.exports=function(t,e,i,n){var r=0,o=t.deltaAbsX()+e.deltaAbsX()+n;return 0===t._dx&&0===e._dx?(t.embedded=!0,e.embedded=!0):t._dx>e._dx?(r=t.right-e.x)>o&&!i||!1===t.checkCollision.right||!1===e.checkCollision.left?r=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._dxo&&!i||!1===t.checkCollision.left||!1===e.checkCollision.right?r=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=r,e.overlapX=r,r}},45170:(t,e,i)=>{var s=i(37747);t.exports=function(t,e,i,n){var r=0,o=t.deltaAbsY()+e.deltaAbsY()+n;return 0===t._dy&&0===e._dy?(t.embedded=!0,e.embedded=!0):t._dy>e._dy?(r=t.bottom-e.y)>o&&!i||!1===t.checkCollision.down||!1===e.checkCollision.up?r=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._dyo&&!i||!1===t.checkCollision.up||!1===e.checkCollision.down?r=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=r,e.overlapY=r,r}},60758:(t,e,i)=>{var s=i(13759),n=i(83419),r=i(78389),o=i(37747),a=i(95540),h=i(26479),l=i(41212),u=new n({Extends:h,Mixins:[r],initialize:function(t,e,i,n){if(i||n)if(l(i))n=i,i=null,n.internalCreateCallback=this.createCallbackHandler,n.internalRemoveCallback=this.removeCallbackHandler;else if(Array.isArray(i)&&l(i[0])){var r=this;i.forEach((function(t){t.internalCreateCallback=r.createCallbackHandler,t.internalRemoveCallback=r.removeCallbackHandler,t.classType=a(t,"classType",s)})),n=null}else n={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};else n={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};this.world=t,n&&(n.classType=a(n,"classType",s)),this.physicsType=o.DYNAMIC_BODY,this.collisionCategory=1,this.collisionMask=2147483647,this.defaults={setCollideWorldBounds:a(n,"collideWorldBounds",!1),setBoundsRectangle:a(n,"customBoundsRectangle",null),setAccelerationX:a(n,"accelerationX",0),setAccelerationY:a(n,"accelerationY",0),setAllowDrag:a(n,"allowDrag",!0),setAllowGravity:a(n,"allowGravity",!0),setAllowRotation:a(n,"allowRotation",!0),setDamping:a(n,"useDamping",!1),setBounceX:a(n,"bounceX",0),setBounceY:a(n,"bounceY",0),setDragX:a(n,"dragX",0),setDragY:a(n,"dragY",0),setEnable:a(n,"enable",!0),setGravityX:a(n,"gravityX",0),setGravityY:a(n,"gravityY",0),setFrictionX:a(n,"frictionX",0),setFrictionY:a(n,"frictionY",0),setMaxSpeed:a(n,"maxSpeed",-1),setMaxVelocityX:a(n,"maxVelocityX",1e4),setMaxVelocityY:a(n,"maxVelocityY",1e4),setVelocityX:a(n,"velocityX",0),setVelocityY:a(n,"velocityY",0),setAngularVelocity:a(n,"angularVelocity",0),setAngularAcceleration:a(n,"angularAcceleration",0),setAngularDrag:a(n,"angularDrag",0),setMass:a(n,"mass",1),setImmovable:a(n,"immovable",!1)},h.call(this,e,i,n),this.type="PhysicsGroup"},createCallbackHandler:function(t){t.body||this.world.enableBody(t,o.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(),n=0;n{var e,i,s,n,r,o,a,h,l,u,c,d,f,p,v,g,m,y=function(){return u&&v&&i.blocked.right?(e.processX(-m,a,!1,!0),1):l&&g&&i.blocked.left?(e.processX(m,a,!0),1):f&&g&&e.blocked.right?(i.processX(-m,h,!1,!0),2):d&&v&&e.blocked.left?(i.processX(m,h,!0),2):0},x=function(t){if(s&&n)m*=.5,0===t||3===t?(e.processX(m,r),i.processX(-m,o)):(e.processX(-m,r),i.processX(m,o));else if(s&&!n)0===t||3===t?e.processX(m,a,!0):e.processX(-m,a,!1,!0);else if(!s&&n)0===t||3===t?i.processX(-m,h,!1,!0):i.processX(m,h,!0);else{var v=.5*m;0===t?p?(e.processX(m,0,!0),i.processX(0,null,!1,!0)):f?(e.processX(v,0,!0),i.processX(-v,0,!1,!0)):(e.processX(v,i.velocity.x,!0),i.processX(-v,null,!1,!0)):1===t?c?(e.processX(0,null,!1,!0),i.processX(m,0,!0)):u?(e.processX(-v,0,!1,!0),i.processX(v,0,!0)):(e.processX(-v,null,!1,!0),i.processX(v,e.velocity.x,!0)):2===t?p?(e.processX(-m,0,!1,!0),i.processX(0,null,!0)):d?(e.processX(-v,0,!1,!0),i.processX(v,0,!0)):(e.processX(-v,i.velocity.x,!1,!0),i.processX(v,null,!0)):3===t&&(c?(e.processX(0,null,!0),i.processX(-m,0,!1,!0)):l?(e.processX(v,0,!0),i.processX(-v,0,!1,!0)):(e.processX(v,i.velocity.y,!0),i.processX(-v,null,!1,!0)))}return!0};t.exports={BlockCheck:y,Check:function(){var t=e.velocity.x,s=i.velocity.x,n=Math.sqrt(s*s*i.mass/e.mass)*(s>0?1:-1),a=Math.sqrt(t*t*e.mass/i.mass)*(t>0?1:-1),h=.5*(n+a);return a-=h,r=h+(n-=h)*e.bounce.x,o=h+a*i.bounce.x,l&&g?x(0):d&&v?x(1):u&&v?x(2):!(!f||!g)&&x(3)},Set:function(t,r,o){i=r;var x=(e=t).velocity.x,T=i.velocity.x;return s=e.pushable,l=e._dx<0,u=e._dx>0,c=0===e._dx,v=Math.abs(e.right-i.x)<=Math.abs(i.right-e.x),a=T-x*e.bounce.x,n=i.pushable,d=i._dx<0,f=i._dx>0,p=0===i._dx,g=!v,h=x-T*i.bounce.x,m=Math.abs(o),y()},Run:x,RunImmovableBody1:function(t){if(1===t?i.velocity.x=0:v?i.processX(m,h,!0):i.processX(-m,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:g?e.processX(m,a,!0):e.processX(-m,a,!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,n,r,o,a,h,l,u,c,d,f,p,v,g,m,y=function(){return u&&v&&i.blocked.down?(e.processY(-m,a,!1,!0),1):l&&g&&i.blocked.up?(e.processY(m,a,!0),1):f&&g&&e.blocked.down?(i.processY(-m,h,!1,!0),2):d&&v&&e.blocked.up?(i.processY(m,h,!0),2):0},x=function(t){if(s&&n)m*=.5,0===t||3===t?(e.processY(m,r),i.processY(-m,o)):(e.processY(-m,r),i.processY(m,o));else if(s&&!n)0===t||3===t?e.processY(m,a,!0):e.processY(-m,a,!1,!0);else if(!s&&n)0===t||3===t?i.processY(-m,h,!1,!0):i.processY(m,h,!0);else{var v=.5*m;0===t?p?(e.processY(m,0,!0),i.processY(0,null,!1,!0)):f?(e.processY(v,0,!0),i.processY(-v,0,!1,!0)):(e.processY(v,i.velocity.y,!0),i.processY(-v,null,!1,!0)):1===t?c?(e.processY(0,null,!1,!0),i.processY(m,0,!0)):u?(e.processY(-v,0,!1,!0),i.processY(v,0,!0)):(e.processY(-v,null,!1,!0),i.processY(v,e.velocity.y,!0)):2===t?p?(e.processY(-m,0,!1,!0),i.processY(0,null,!0)):d?(e.processY(-v,0,!1,!0),i.processY(v,0,!0)):(e.processY(-v,i.velocity.y,!1,!0),i.processY(v,null,!0)):3===t&&(c?(e.processY(0,null,!0),i.processY(-m,0,!1,!0)):l?(e.processY(v,0,!0),i.processY(-v,0,!1,!0)):(e.processY(v,i.velocity.y,!0),i.processY(-v,null,!1,!0)))}return!0};t.exports={BlockCheck:y,Check:function(){var t=e.velocity.y,s=i.velocity.y,n=Math.sqrt(s*s*i.mass/e.mass)*(s>0?1:-1),a=Math.sqrt(t*t*e.mass/i.mass)*(t>0?1:-1),h=.5*(n+a);return a-=h,r=h+(n-=h)*e.bounce.y,o=h+a*i.bounce.y,l&&g?x(0):d&&v?x(1):u&&v?x(2):!(!f||!g)&&x(3)},Set:function(t,r,o){i=r;var x=(e=t).velocity.y,T=i.velocity.y;return s=e.pushable,l=e._dy<0,u=e._dy>0,c=0===e._dy,v=Math.abs(e.bottom-i.y)<=Math.abs(i.bottom-e.y),a=T-x*e.bounce.y,n=i.pushable,d=i._dy<0,f=i._dy>0,p=0===i._dy,g=!v,h=x-T*i.bounce.y,m=Math.abs(o),y()},Run:x,RunImmovableBody1:function(t){if(1===t?i.velocity.y=0:v?i.processY(m,h,!0):i.processY(-m,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:g?e.processY(m,a,!0):e.processY(-m,a,!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),n=i(3017);t.exports=function(t,e,i,r,o){void 0===o&&(o=s(t,e,i,r));var a=t.immovable,h=e.immovable;if(i||0===o||a&&h||t.customSeparateX||e.customSeparateX)return 0!==o||t.embedded&&e.embedded;var l=n.Set(t,e,o);return a||h?(a?n.RunImmovableBody1(l):h&&n.RunImmovableBody2(l),!0):l>0||n.Check()}},89936:(t,e,i)=>{var s=i(45170),n=i(47962);t.exports=function(t,e,i,r,o){void 0===o&&(o=s(t,e,i,r));var a=t.immovable,h=e.immovable;if(i||0===o||a&&h||t.customSeparateY||e.customSeparateY)return 0!==o||t.embedded&&e.embedded;var l=n.Set(t,e,o);return a||h?(a?n.RunImmovableBody1(l):h&&n.RunImmovableBody2(l),!0):l>0||n.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),n=i(83419),r=i(78389),o=i(37747),a=i(37303),h=i(95829),l=i(26099),u=new n({Mixins:[r],initialize:function(t,e){var i=64,s=64,n=void 0!==e;n&&e.displayWidth&&(i=e.displayWidth,s=e.displayHeight),n||(e={x:0,y:0,angle:0,rotation:0,scaleX:1,scaleY:1,displayOriginX:0,displayOriginY:0}),this.world=t,this.gameObject=n?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=o.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 n=s.displayWidth/2,r=s.displayHeight/2;this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(n-this.halfWidth,r-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):a(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.set(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),n=i(83419),r=i(78389),o=i(37747),a=i(95540),h=i(26479),l=i(41212),u=new n({Extends:h,Mixins:[r],initialize:function(t,e,i,n){i||n?l(i)?(n=i,i=null,n.internalCreateCallback=this.createCallbackHandler,n.internalRemoveCallback=this.removeCallbackHandler,n.createMultipleCallback=this.createMultipleCallbackHandler,n.classType=a(n,"classType",s)):Array.isArray(i)&&l(i[0])?(n=i,i=null,n.forEach((function(t){t.internalCreateCallback=this.createCallbackHandler,t.internalRemoveCallback=this.removeCallbackHandler,t.createMultipleCallback=this.createMultipleCallbackHandler,t.classType=a(t,"classType",s)}))):n={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler}:n={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler,createMultipleCallback:this.createMultipleCallbackHandler,classType:s},this.world=t,this.physicsType=o.STATIC_BODY,this.collisionCategory=1,this.collisionMask=1,h.call(this,e,i,n),this.type="StaticPhysicsGroup"},createCallbackHandler:function(t){t.body||this.world.enableBody(t,o.STATIC_BODY)},removeCallbackHandler:function(t){t.body&&this.world.disableBody(t)},createMultipleCallbackHandler:function(){this.refresh()},refresh:function(){for(var t=this.children.entries,e=0;e{var s=i(55495),n=i(37742),r=i(45319),o=i(83419),a=i(79342),h=i(37747),l=i(20339),u=i(52816),c=i(50792),d=i(63012),f=i(43855),p=i(5470),v=i(94977),g=i(64897),m=i(45170),y=i(96523),x=i(35154),T=i(36383),w=i(25774),b=i(96602),S=i(87841),E=i(59542),A=i(40012),C=i(14087),_=i(89936),M=i(35072),P=i(72624),R=i(2483),L=i(61340),O=i(26099),F=i(15994),D=new o({Extends:c,initialize:function(t,e){c.call(this),this.scene=t,this.bodies=new M,this.staticBodies=new M,this.pendingDestroy=new M,this.colliders=new w,this.gravity=new O(x(e,"gravity.x",0),x(e,"gravity.y",0)),this.bounds=new S(x(e,"x",0),x(e,"y",0),x(e,"width",t.sys.scale.width),x(e,"height",t.sys.scale.height)),this.checkCollision={up:x(e,"checkCollision.up",!0),down:x(e,"checkCollision.down",!0),left:x(e,"checkCollision.left",!0),right:x(e,"checkCollision.right",!0)},this.fps=x(e,"fps",60),this.fixedStep=x(e,"fixedStep",!0),this._elapsed=0,this._frameTime=1/this.fps,this._frameTimeMS=1e3*this._frameTime,this.stepsLastFrame=0,this.timeScale=x(e,"timeScale",1),this.OVERLAP_BIAS=x(e,"overlapBias",4),this.TILE_BIAS=x(e,"tileBias",16),this.forceX=x(e,"forceX",!1),this.isPaused=x(e,"isPaused",!1),this._total=0,this.drawDebug=x(e,"debug",!1),this.debugGraphic,this.defaults={debugShowBody:x(e,"debugShowBody",!0),debugShowStaticBody:x(e,"debugShowStaticBody",!0),debugShowVelocity:x(e,"debugShowVelocity",!0),bodyDebugColor:x(e,"debugBodyColor",16711935),staticBodyDebugColor:x(e,"debugStaticBodyColor",255),velocityDebugColor:x(e,"debugVelocityColor",65280)},this.maxEntries=x(e,"maxEntries",16),this.useTree=x(e,"useTree",!0),this.tree=new E(this.maxEntries),this.staticTree=new E(this.maxEntries),this.treeMinMax={minX:0,minY:0,maxX:0,maxY:0},this._tempMatrix=new L,this._tempMatrix2=new L,this.tileFilterOptions={isColliding:!0,isNotEmpty:!0,hasInterestingFace:!0},this.drawDebug&&this.createDebugGraphic()},enable:function(t,e){void 0===e&&(e=h.DYNAMIC_BODY),Array.isArray(t)||(t=[t]);for(var i=0;i=r;for(this.fixedStep||(n=.001*e,a=!0,this._elapsed=0),i=0;i=r;)this._elapsed-=r,this.step(n)}},step:function(t){var e,i,s=this.bodies.entries,n=s.length;for(e=0;e0){var l=this.tree,u=this.staticTree;for(s=(i=a.entries).length,t=0;t-1&&t.velocity.length()>d&&(t.velocity.normalize().scale(d),c=d),t.speed=c},separate:function(t,e,i,s,n){var r,o,a=!1,h=!0;if(!t.enable||!e.enable||t.checkCollision.none||e.checkCollision.none||!this.intersects(t,e)||0==(t.collisionMask&e.collisionCategory)||0==(e.collisionMask&t.collisionCategory))return a;if(i&&!1===i.call(s,t.gameObject||t,e.gameObject||e))return a;if(t.isCircle||e.isCircle){var l=this.separateCircle(t,e,n);l.result?(a=!0,h=!1):(r=l.x,o=l.y,h=!0)}if(h){var u=!1,c=!1,f=this.OVERLAP_BIAS;n?(u=C(t,e,n,f,r),c=_(t,e,n,f,o)):this.forceX||Math.abs(this.gravity.y+t.gravity.y)E&&(p=l(y,x,E,S)-w):x>A&&(yE&&(p=l(y,x,E,A)-w)),p*=-1}else p=t.halfWidth+e.halfWidth-u(o,a);t.overlapR=p,e.overlapR=p;var C=s(o,a),_=(p+T.EPSILON)*Math.cos(C),M=(p+T.EPSILON)*Math.sin(C),P={overlap:p,result:!1,x:_,y:M};if(i&&(!v||v&&0!==p))return P.result=!0,P;if(!v&&0===p||h&&c||t.customSeparateX||e.customSeparateX)return P.x=void 0,P.y=void 0,P;var R=!t.pushable&&!e.pushable;if(v){var L=o.x-a.x,O=o.y-a.y,F=Math.sqrt(Math.pow(L,2)+Math.pow(O,2)),D=(a.x-o.x)/F||0,I=(a.y-o.y)/F||0,k=2*(d.x*D+d.y*I-f.x*D-f.y*I)/(t.mass+e.mass);!h&&!c&&t.pushable&&e.pushable||(k*=2),!h&&t.pushable&&(d.x=d.x-k/t.mass*D,d.y=d.y-k/t.mass*I,d.multiply(t.bounce)),!c&&e.pushable&&(f.x=f.x+k/e.mass*D,f.y=f.y+k/e.mass*I,f.multiply(e.bounce)),h||c||(_*=.5,M*=.5),(!h||t.pushable||R)&&(t.x-=_,t.y-=M,t.updateCenter()),(!c||e.pushable||R)&&(e.x+=_,e.y+=M,e.updateCenter()),P.result=!0}else h||!t.pushable&&!R||(t.x-=_,t.y-=M,t.updateCenter()),c||!e.pushable&&!R||(e.x+=_,e.y+=M,e.updateCenter()),P.x=void 0,P.y=void 0;return P},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=r(t.center.x,e.left,e.right),s=r(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,n){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===n&&(n=i),this.collideObjects(t,e,i,s,n,!0)},collide:function(t,e,i,s,n){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===n&&(n=i),this.collideObjects(t,e,i,s,n,!1)},collideObjects:function(t,e,i,s,n,r){var o,a;!t.isParent||void 0!==t.physicsType&&void 0!==e&&t!==e||(t=t.children.entries),e&&e.isParent&&void 0===e.physicsType&&(e=e.children.entries);var h=Array.isArray(t),l=Array.isArray(e);if(this._total=0,h||l)if(!h&&l)for(o=0;o0},collideHandler:function(t,e,i,s,n,r){if(void 0===e&&t.isParent)return this.collideGroupVsGroup(t,t,i,s,n,r);if(!t||!e)return!1;if(t.body||t.isBody){if(e.body||e.isBody)return this.collideSpriteVsSprite(t,e,i,s,n,r);if(e.isParent)return this.collideSpriteVsGroup(t,e,i,s,n,r);if(e.isTilemap)return this.collideSpriteVsTilemapLayer(t,e,i,s,n,r)}else if(t.isParent){if(e.body||e.isBody)return this.collideSpriteVsGroup(e,t,i,s,n,r);if(e.isParent)return this.collideGroupVsGroup(t,e,i,s,n,r);if(e.isTilemap)return this.collideGroupVsTilemapLayer(t,e,i,s,n,r)}else if(t.isTilemap){if(e.body||e.isBody)return this.collideSpriteVsTilemapLayer(e,t,i,s,n,r);if(e.isParent)return this.collideGroupVsTilemapLayer(e,t,i,s,n,r)}},canCollide:function(t,e){return t&&e&&0!=(t.collisionMask&e.collisionCategory)&&0!=(e.collisionMask&t.collisionCategory)},collideSpriteVsSprite:function(t,e,i,s,n,r){var o=t.isBody?t:t.body,a=e.isBody?e:e.body;return!!this.canCollide(o,a)&&(this.separate(o,a,s,n,r)&&(i&&i.call(n,t,e),this._total++),!0)},collideSpriteVsGroup:function(t,e,i,s,n,r){var o,a,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 c=this.treeMinMax;c.minX=u.left,c.minY=u.top,c.maxX=u.right,c.maxY=u.bottom;var d=e.physicsType===h.DYNAMIC_BODY?this.tree.search(c):this.staticTree.search(c);for(a=d.length,o=0;o{t.exports={setAcceleration:function(t,e){return this.body.acceleration.set(t,e),this},setAccelerationX:function(t){return this.body.acceleration.x=t,this},setAccelerationY:function(t){return this.body.acceleration.y=t,this}}},59023:t=>{t.exports={setAngularVelocity:function(t){return this.body.angularVelocity=t,this},setAngularAcceleration:function(t){return this.body.angularAcceleration=t,this},setAngularDrag:function(t){return this.body.angularDrag=t,this}}},62069:t=>{t.exports={setBounce:function(t,e){return this.body.bounce.set(t,e),this},setBounceX:function(t){return this.body.bounce.x=t,this},setBounceY:function(t){return this.body.bounce.y=t,this},setCollideWorldBounds:function(t,e,i,s){return this.body.setCollideWorldBounds(t,e,i,s),this}}},78389:(t,e,i)=>{var s=i(79599),n={setCollisionCategory:function(t){return(this.body?this.body:this).collisionCategory=t,this},willCollideWith:function(t){return 0!=((this.body?this.body:this).collisionMask&t)},addCollidesWith:function(t){var e=this.body?this.body:this;return e.collisionMask=e.collisionMask|t,this},removeCollidesWith:function(t){var e=this.body?this.body:this;return e.collisionMask=e.collisionMask&~t,this},setCollidesWith:function(t){return(this.body?this.body:this).collisionMask=s(t),this},resetCollisionCategory:function(){var t=this.body?this.body:this;return t.collisionCategory=1,t.collisionMask=2147483647,this}};t.exports=n},87118:t=>{t.exports={setDebug:function(t,e,i){return this.debugShowBody=t,this.debugShowVelocity=e,this.debugBodyColor=i,this},setDebugBodyColor:function(t){return this.body.debugBodyColor=t,this},debugShowBody:{get:function(){return this.body.debugShowBody},set:function(t){this.body.debugShowBody=t}},debugShowVelocity:{get:function(){return this.body.debugShowVelocity},set:function(t){this.body.debugShowVelocity=t}},debugBodyColor:{get:function(){return this.body.debugBodyColor},set:function(t){this.body.debugBodyColor=t}}}},52819:t=>{t.exports={setDrag:function(t,e){return this.body.drag.set(t,e),this},setDragX:function(t){return this.body.drag.x=t,this},setDragY:function(t){return this.body.drag.y=t,this},setDamping:function(t){return this.body.useDamping=t,this}}},4074:t=>{var e={setDirectControl:function(t){return this.body.setDirectControl(t),this},enableBody:function(t,e,i,s,n){return t&&this.body.reset(e,i),s&&(this.body.gameObject.active=!0),n&&(this.body.gameObject.visible=!0),this.body.enable=!0,this},disableBody:function(t,e){return void 0===t&&(t=!1),void 0===e&&(e=!1),this.body.stop(),this.body.enable=!1,t&&(this.body.gameObject.active=!1),e&&(this.body.gameObject.visible=!1),this},refreshBody:function(){return this.body.updateFromGameObject(),this}};t.exports=e},40831:t=>{t.exports={setFriction:function(t,e){return this.body.friction.set(t,e),this},setFrictionX:function(t){return this.body.friction.x=t,this},setFrictionY:function(t){return this.body.friction.y=t,this}}},26775:t=>{t.exports={setGravity:function(t,e){return this.body.gravity.set(t,e),this},setGravityX:function(t){return this.body.gravity.x=t,this},setGravityY:function(t){return this.body.gravity.y=t,this}}},9437:t=>{var e={setImmovable:function(t){return void 0===t&&(t=!0),this.body.immovable=t,this}};t.exports=e},30621:t=>{t.exports={setMass:function(t){return this.body.mass=t,this}}},72441:(t,e,i)=>{var s=i(47956),n=i(96503),r=i(2044),o=i(81491);t.exports=function(t,e,i,a,h,l){var u=s(t,e-a,i-a,2*a,2*a,h,l);if(0===u.length)return u;for(var c=new n(e,i,a),d=new n,f=[],p=0;p{t.exports=function(t,e,i,s,n,r,o){void 0===r&&(r=!0),void 0===o&&(o=!1);var a=[],h=[],l=t.treeMinMax;if(l.minX=e,l.minY=i,l.maxX=e+s,l.maxY=i+n,o&&(h=t.staticTree.search(l)),r&&t.useTree)a=t.tree.search(l);else if(r){var u=t.bodies,c={position:{x:e,y:i},left:e,top:i,right:e+s,bottom:i+n,isCircle:!1},d=t.intersects;u.iterate((function(t){d(t,c)&&a.push(t)}))}return h.concat(a)}},62121:t=>{var e={setPushable:function(t){return void 0===t&&(t=!0),this.body.pushable=t,this}};t.exports=e},29384:t=>{t.exports={setOffset:function(t,e){return this.body.setOffset(t,e),this},setSize:function(t,e,i){return this.body.setSize(t,e,i),this},setBodySize:function(t,e,i){return this.body.setSize(t,e,i),this},setCircle:function(t,e,i){return this.body.setCircle(t,e,i),this}}},15098:t=>{t.exports={setVelocity:function(t,e){return this.body.setVelocity(t,e),this},setVelocityX:function(t){return this.body.setVelocityX(t),this},setVelocityY:function(t){return this.body.setVelocityY(t),this},setMaxVelocity:function(t,e){return this.body.maxVelocity.set(t,e),this}}},92209:(t,e,i)=>{t.exports={Acceleration:i(1093),Angular:i(59023),Bounce:i(62069),Collision:i(78389),Debug:i(87118),Drag:i(52819),Enable:i(4074),Friction:i(40831),Gravity:i(26775),Immovable:i(9437),Mass:i(30621),OverlapCirc:i(72441),OverlapRect:i(47956),Pushable:i(62121),Size:i(29384),Velocity:i(15098)}},37747:t=>{t.exports={DYNAMIC_BODY:0,STATIC_BODY:1,GROUP:2,TILEMAPLAYER:3,FACING_NONE:10,FACING_UP:11,FACING_DOWN:12,FACING_LEFT:13,FACING_RIGHT:14}},20009:t=>{t.exports="collide"},36768:t=>{t.exports="overlap"},60473:t=>{t.exports="pause"},89954:t=>{t.exports="resume"},61804:t=>{t.exports="tilecollide"},7161:t=>{t.exports="tileoverlap"},34689:t=>{t.exports="worldbounds"},16006:t=>{t.exports="worldstep"},63012:(t,e,i)=>{t.exports={COLLIDE:i(20009),OVERLAP:i(36768),PAUSE:i(60473),RESUME:i(89954),TILE_COLLIDE:i(61804),TILE_OVERLAP:i(7161),WORLD_BOUNDS:i(34689),WORLD_STEP:i(16006)}},27064:(t,e,i)=>{var s=i(37747),n=i(79291),r={ArcadePhysics:i(86689),Body:i(37742),Collider:i(79342),Components:i(92209),Events:i(63012),Factory:i(66022),GetCollidesWith:i(79599),GetOverlapX:i(64897),GetOverlapY:i(45170),SeparateX:i(14087),SeparateY:i(89936),Group:i(60758),Image:i(71289),Sprite:i(13759),StaticBody:i(72624),StaticGroup:i(71464),Tilemap:i(55173),World:i(82248)};r=n(!1,r,s),t.exports=r},96602:t=>{t.exports=function(t,e){return t.collisionCallback?!t.collisionCallback.call(t.collisionCallbackContext,e,t):!t.layer.callbacks[t.index]||!t.layer.callbacks[t.index].callback.call(t.layer.callbacks[t.index].callbackContext,e,t)}},36294:t=>{t.exports=function(t,e){e<0?(t.blocked.none=!1,t.blocked.left=!0):e>0&&(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),n=i(53442),r=i(2483);t.exports=function(t,e,i,o,a,h,l){var u=o.left,c=o.top,d=o.right,f=o.bottom,p=i.faceLeft||i.faceRight,v=i.faceTop||i.faceBottom;if(l||(p=!0,v=!0),!p&&!v)return!1;var g=0,m=0,y=0,x=1;if(e.deltaAbsX()>e.deltaAbsY()?y=-1:e.deltaAbsX(){var s=i(36294);t.exports=function(t,e,i,n,r,o){var a=0,h=e.faceLeft,l=e.faceRight,u=e.collideLeft,c=e.collideRight;return o||(h=!0,l=!0,u=!0,c=!0),t.deltaX()<0&&c&&t.checkCollision.left?l&&t.x0&&u&&t.checkCollision.right&&h&&t.right>i&&(a=t.right-i)>r&&(a=0),0!==a&&(t.customSeparateX?t.overlapX=a:s(t,a)),a}},53442:(t,e,i)=>{var s=i(67013);t.exports=function(t,e,i,n,r,o){var a=0,h=e.faceTop,l=e.faceBottom,u=e.collideUp,c=e.collideDown;return o||(h=!0,l=!0,u=!0,c=!0),t.deltaY()<0&&c&&t.checkCollision.up?l&&t.y0&&u&&t.checkCollision.down&&h&&t.bottom>i&&(a=t.bottom-i)>r&&(a=0),0!==a&&(t.customSeparateY?t.overlapY=a:s(t,a)),a}},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),n=i(26099),r=new s({initialize:function(){this.boundsCenter=new n,this.centerDiff=new n},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,n=t.bounds.max.y-t.bounds.min.y,r=s*t.centerOfMass.x,o=n*t.centerOfMass.y;return e.set(s/2,n/2),i.set(r-e.x,o-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,r=this.centerDiff;return new n(e+s.x+r.x,i+s.y+r.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,r=this.centerDiff;return new n(e+r.x,i+s.y+r.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,r=this.centerDiff;return new n(e-(s.x-r.x),i+s.y+r.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,r=this.centerDiff;return new n(e+s.x+r.x,i+r.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 n(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,r=this.centerDiff;return new n(e-(s.x-r.x),i+r.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,r=this.centerDiff;return new n(e+s.x+r.x,i-(s.y-r.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,r=this.centerDiff;return new n(e+r.x,i-(s.y-r.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,r=this.centerDiff;return new n(e-(s.x-r.x),i-(s.y-r.y))}return!1}});t.exports=r},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),n=i(83419),r=i(74116),o=i(48140),a=i(74058),h=i(75803),l=i(23181),u=i(34803),c=i(73834),d=i(19496),f=i(85791),p=i(98713),v=i(41598),g=new n({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},rectangle:function(t,e,i,n,r){var o=s.rectangle(t,e,i,n,r);return this.world.add(o),o},trapezoid:function(t,e,i,n,r,o){var a=s.trapezoid(t,e,i,n,r,o);return this.world.add(a),a},circle:function(t,e,i,n,r){var o=s.circle(t,e,i,n,r);return this.world.add(o),o},polygon:function(t,e,i,n,r){var o=s.polygon(t,e,i,n,r);return this.world.add(o),o},fromVertices:function(t,e,i,n,r,o,a){"string"==typeof i&&(i=v.fromPath(i));var h=s.fromVertices(t,e,i,n,r,o,a);return this.world.add(h),h},fromPhysicsEditor:function(t,e,i,s,n){void 0===n&&(n=!0);var r=d.parseBody(t,e,i,s);return n&&!this.world.has(r)&&this.world.add(r),r},fromSVG:function(t,e,i,n,r,o){void 0===n&&(n=1),void 0===r&&(r={}),void 0===o&&(o=!0);for(var h=i.getElementsByTagName("path"),l=[],u=0;u{var s=i(31884),n=i(95540),r=i(26099);t.exports=function(t,e,i,o){void 0===i&&(i={}),void 0===o&&(o=!0);var a=e.x,h=e.y;if(e.body={temp:!0,position:{x:a,y:h}},[s.Bounce,s.Collision,s.Force,s.Friction,s.Gravity,s.Mass,s.Sensor,s.SetBody,s.Sleep,s.Static,s.Transform,s.Velocity].forEach((function(t){for(var i in t)(s=t[i]).get&&"function"==typeof s.get||s.set&&"function"==typeof s.set?Object.defineProperty(e,i,{get:t[i].get,set:t[i].set}):Object.defineProperty(e,i,{value:t[i]});var s})),e.world=t,e._tempVec2=new r(a,h),i.hasOwnProperty("type")&&"body"===i.type)e.setExistingBody(i,o);else{var l=n(i,"shape",null);l||(l="rectangle"),i.addToWorld=o,e.setBody(l,i)}return e}},23181:(t,e,i)=>{var s=i(83419),n=i(31884),r=i(95643),o=i(95540),a=i(88571),h=i(72699),l=i(26099),u=new s({Extends:a,Mixins:[n.Bounce,n.Collision,n.Force,n.Friction,n.Gravity,n.Mass,n.Sensor,n.SetBody,n.Sleep,n.Static,n.Transform,n.Velocity,h],initialize:function(t,e,i,s,n,a){r.call(this,t.scene,"Image"),this._crop=this.resetCropObject(),this.setTexture(s,n),this.setSizeToFrame(),this.setOrigin(),this.world=t,this._tempVec2=new l(e,i);var h=o(a,"shape",null);h?this.setBody(h,a):this.setRectangle(this.width,this.height,a),this.setPosition(e,i),this.initPipeline(),this.initPostPipeline(!0)}});t.exports=u},42045:(t,e,i)=>{var s=i(60461),n=i(66615),r=i(66280),o=i(22562),a=i(68174),h=i(15647),l=i(83419),u=i(52284),c=i(53402),d=i(69351),f=i(74116),p=i(48140),v=i(81388),g=i(20339),m=i(28137),y=i(95540),x=i(35154),T=i(46975),w=i(4506),b=i(99561),S=i(37277),E=i(73296),A=i(66272),C=i(44594),_=i(74058),M=i(31725),P=i(41598),R=i(68243);c.setDecomp(i(55973));var L=new l({initialize:function(t){this.scene=t,this.systems=t.sys,this.config=this.getConfig(),this.world,this.add,this.bodyBounds,this.body=o,this.composite=d,this.collision=u,this.detector=v,this.pair=w,this.pairs=b,this.query=E,this.resolver=A,this.constraint=p,this.bodies=r,this.composites=f,this.axes=n,this.bounds=h,this.svg=_,this.vector=M,this.vertices=P,this.verts=P,this._tempVec2=M.create(),A._restingThresh=x(this.config,"restingThresh",4),A._restingThreshTangent=x(this.config,"restingThreshTangent",6),A._positionDampen=x(this.config,"positionDampen",.9),A._positionWarming=x(this.config,"positionWarming",.8),A._frictionNormalMultiplier=x(this.config,"frictionNormalMultiplier",5),t.sys.events.once(C.BOOT,this.boot,this),t.sys.events.on(C.START,this.start,this)},boot:function(){this.world=new R(this.scene,this.config),this.add=new m(this.world),this.bodyBounds=new a,this.systems.events.once(C.DESTROY,this.destroy,this)},start:function(){this.world||(this.world=new R(this.scene,this.config),this.add=new m(this.world));var t=this.systems.events;t.on(C.UPDATE,this.world.update,this.world),t.on(C.POST_UPDATE,this.world.postUpdate,this.world),t.once(C.SHUTDOWN,this.shutdown,this)},getConfig:function(){var t=this.systems.game.config.physics,e=this.systems.settings.physics;return T(y(e,"matter",{}),y(t,"matter",{}))},pause:function(){return this.world.pause()},resume:function(){return this.world.resume()},set60Hz:function(){return this.world.getDelta=this.world.update60Hz,this.world.autoUpdate=!0,this},set30Hz:function(){return this.world.getDelta=this.world.update30Hz,this.world.autoUpdate=!0,this},step:function(t,e){this.world.step(t,e)},containsPoint:function(t,e,i){t=this.getMatterBodies(t);var s=M.create(e,i);return E.point(t,s).length>0},intersectPoint:function(t,e,i){i=this.getMatterBodies(i);var s=M.create(t,e),n=[];return E.point(i,s).forEach((function(t){-1===n.indexOf(t)&&n.push(t)})),n},intersectRect:function(t,e,i,s,n,r){void 0===n&&(n=!1),r=this.getMatterBodies(r);var o={min:{x:t,y:e},max:{x:t+i,y:e+s}},a=[];return E.region(r,o,n).forEach((function(t){-1===a.indexOf(t)&&a.push(t)})),a},intersectRay:function(t,e,i,s,n,r){void 0===n&&(n=1),r=this.getMatterBodies(r);for(var o=[],a=E.ray(r,M.create(t,e),M.create(i,s),n),h=0;h{var s=i(9674),n=i(83419),r=i(31884),o=i(95643),a=i(95540),h=i(72699),l=i(68287),u=i(26099),c=new n({Extends:l,Mixins:[r.Bounce,r.Collision,r.Force,r.Friction,r.Gravity,r.Mass,r.Sensor,r.SetBody,r.Sleep,r.Static,r.Transform,r.Velocity,h],initialize:function(t,e,i,n,r,h){o.call(this,t.scene,"Sprite"),this._crop=this.resetCropObject(),this.anims=new s(this),this.setTexture(n,r),this.setSizeToFrame(),this.setOrigin(),this.world=t,this._tempVec2=new u(e,i);var l=a(h,"shape",null);l?this.setBody(l,h):this.setRectangle(this.width,this.height,h),this.setPosition(e,i),this.initPipeline(),this.initPostPipeline(!0)}});t.exports=c},73834:(t,e,i)=>{var s=i(66280),n=i(22562),r=i(83419),o=i(31884),a=i(62644),h=i(50792),l=i(95540),u=i(97022),c=i(41598),d=new r({Extends:h,Mixins:[o.Bounce,o.Collision,o.Friction,o.Gravity,o.Mass,o.Sensor,o.Sleep,o.Static],initialize:function(t,e,i){h.call(this),this.tile=e,this.world=t,e.physics.matterBody&&e.physics.matterBody.destroy(),e.physics.matterBody=this;var s=l(i,"body",null),r=l(i,"addToWorld",!0);if(s)this.setBody(s,r);else{var o=e.getCollisionGroup();l(o,"objects",[]).length>0?this.setFromTileCollision(i):this.setFromTileRectangle(i)}if(e.flipX||e.flipY){var a={x:e.getCenterX(),y:e.getCenterY()},u=e.flipX?-1:1,c=e.flipY?-1:1;n.scale(s,u,c,a)}},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,n=e.y+e.height/2,r=s.rectangle(i,n,e.width,e.height,t);return this.setBody(r,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,r=this.tile.getLeft(),o=this.tile.getTop(),h=this.tile.getCollisionGroup(),d=l(h,"objects",[]),f=[],p=0;p1){var E=a(t);E.parts=f,this.setBody(n.create(E),E.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=d},19496:(t,e,i)=>{var s=i(66280),n=i(22562),r=i(53402),o=i(95540),a=i(41598),h={parseBody:function(t,e,i,s){void 0===s&&(s={});for(var a=o(i,"fixtures",[]),h=[],l=0;l{var s=i(66280),n=i(22562),r={parseBody:function(t,e,i,r){var o;void 0===r&&(r={});var a=i.vertices;if(1===a.length)r.vertices=a[0],o=n.create(r),s.flagCoincidentParts(o.parts);else{for(var h=[],l=0;l{var s=i(15647),n=i(83419),r=i(69351),o=i(48140),a=i(81388),h=i(1121),l=i(8214),u=i(46975),c=i(53614),d=i(26099),f=i(41598),p=new n({initialize:function(t,e,i){void 0===i&&(i={});this.scene=t,this.world=e,this.camera=null,this.pointer=null,this.active=!0,this.position=new d,this.body=null,this.part=null,this.constraint=o.create(u(i,{label:"Pointer Constraint",pointA:{x:0,y:0},pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,collisionFilter:{category:1,mask:4294967295,group:0}})),this.world.on(h.BEFORE_UPDATE,this.update,this),t.sys.input.on(l.POINTER_DOWN,this.onDown,this),t.sys.input.on(l.POINTER_UP,this.onUp,this)},onDown:function(t){this.pointer||(this.pointer=t,this.camera=t.camera)},onUp:function(t){t===this.pointer&&(this.pointer=null)},getBody:function(t){var e=this.position,i=this.constraint;this.camera.getWorldPoint(t.x,t.y,e);for(var n=r.allBodies(this.world.localWorld),o=0;o1?1:0;n{var s=i(66280),n=i(22562),r=i(83419),o=i(53402),a=i(69351),h=i(48413),l=i(50792),u=i(1121),c=i(95540),d=i(35154),f=i(22562),p=i(35810),v=i(73834),g=i(4372),m=i(13037),y=i(31725),x=new r({Extends:l,initialize:function(t,e){l.call(this),this.scene=t,this.engine=h.create(e),this.localWorld=this.engine.world;var i=d(e,"gravity",null);i?this.setGravity(i.x,i.y,i.scale):!1===i&&this.setGravity(0,0,0),this.walls={left:null,right:null,top:null,bottom:null},this.enabled=d(e,"enabled",!0),this.getDelta=d(e,"getDelta",this.update60Hz);var s=c(e,"runner",{});c(s,"fps",!1)&&(s.delta=1e3/c(s,"fps",60)),this.runner=m.create(s),this.autoUpdate=d(e,"autoUpdate",!0);var n=d(e,"debug",!1);if(this.drawDebug="object"==typeof n||n,this.debugGraphic,this.debugConfig={showAxes:c(n,"showAxes",!1),showAngleIndicator:c(n,"showAngleIndicator",!1),angleColor:c(n,"angleColor",15208787),showBroadphase:c(n,"showBroadphase",!1),broadphaseColor:c(n,"broadphaseColor",16757760),showBounds:c(n,"showBounds",!1),boundsColor:c(n,"boundsColor",16777215),showVelocity:c(n,"showVelocity",!1),velocityColor:c(n,"velocityColor",44783),showCollisions:c(n,"showCollisions",!1),collisionColor:c(n,"collisionColor",16094476),showSeparations:c(n,"showSeparations",!1),separationColor:c(n,"separationColor",16753920),showBody:c(n,"showBody",!0),showStaticBody:c(n,"showStaticBody",!0),showInternalEdges:c(n,"showInternalEdges",!1),renderFill:c(n,"renderFill",!1),renderLine:c(n,"renderLine",!0),fillColor:c(n,"fillColor",1075465),fillOpacity:c(n,"fillOpacity",1),lineColor:c(n,"lineColor",2678297),lineOpacity:c(n,"lineOpacity",1),lineThickness:c(n,"lineThickness",1),staticFillColor:c(n,"staticFillColor",857979),staticLineColor:c(n,"staticLineColor",1255396),showSleeping:c(n,"showSleeping",!1),staticBodySleepOpacity:c(n,"staticBodySleepOpacity",.7),sleepFillColor:c(n,"sleepFillColor",4605510),sleepLineColor:c(n,"sleepLineColor",10066585),showSensors:c(n,"showSensors",!0),sensorFillColor:c(n,"sensorFillColor",857979),sensorLineColor:c(n,"sensorLineColor",1255396),showPositions:c(n,"showPositions",!0),positionSize:c(n,"positionSize",4),positionColor:c(n,"positionColor",14697178),showJoint:c(n,"showJoint",!0),jointColor:c(n,"jointColor",14737474),jointLineOpacity:c(n,"jointLineOpacity",1),jointLineThickness:c(n,"jointLineThickness",2),pinSize:c(n,"pinSize",4),pinColor:c(n,"pinColor",4382944),springColor:c(n,"springColor",14697184),anchorColor:c(n,"anchorColor",15724527),anchorSize:c(n,"anchorSize",4),showConvexHulls:c(n,"showConvexHulls",!1),hullColor:c(n,"hullColor",14091216)},this.drawDebug&&this.createDebugGraphic(),this.setEventsProxy(),c(e,"setBounds",!1)){var r=e.setBounds;if("boolean"==typeof r)this.setBounds();else{var o=c(r,"x",0),a=c(r,"y",0),u=c(r,"width",t.sys.scale.width),f=c(r,"height",t.sys.scale.height),p=c(r,"thickness",64),v=c(r,"left",!0),g=c(r,"right",!0),y=c(r,"top",!0),x=c(r,"bottom",!0);this.setBounds(o,a,u,f,p,v,g,y,x)}}},setCompositeRenderStyle:function(t){var e,i,s,n=t.bodies,r=t.constraints,o=t.composites;for(e=0;e0&&n.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,n=e.pairs;n.length>0&&n.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,n=e.pairs;n.length>0&&n.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,n,r,o,a,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===n&&(n=64),void 0===r&&(r=!0),void 0===o&&(o=!0),void 0===a&&(a=!0),void 0===h&&(h=!0),this.updateWall(r,"left",t-n,e-n,n,s+2*n),this.updateWall(o,"right",t+i,e-n,n,s+2*n),this.updateWall(a,"top",t,e-n,i,n),this.updateWall(h,"bottom",t,e+s,i,n),this},updateWall:function(t,e,i,s,n,r){var o=this.walls[e];t?(o&&g.remove(this.localWorld,o),i+=n/2,s+=r/2,this.walls[e]=this.create(i,s,n,r,{isStatic:!0,friction:0,frictionStatic:0})):(o&&g.remove(this.localWorld,o),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,n,r){var o=s.rectangle(t,e,i,n,r);return g.add(this.localWorld,o),o},add:function(t){return g.add(this.localWorld,t),this},remove:function(t,e){Array.isArray(t)||(t=[t]);for(var i=0;iMath.max(m._maxFrameDelta,i.maxFrameTime))&&(a=i.frameDelta||m._frameDeltaFallback),i.frameDeltaSmoothing){i.frameDeltaHistory.push(a),i.frameDeltaHistory=i.frameDeltaHistory.slice(-i.frameDeltaHistorySize);var l=i.frameDeltaHistory.slice(0).sort(),u=i.frameDeltaHistory.slice(l.length*m._smoothingLowerBound,l.length*m._smoothingUpperBound);a=m._mean(u)||a}i.frameDeltaSnapping&&(a=1e3/Math.round(1e3/a)),i.frameDelta=a,i.timeLastTick=t,i.timeBuffer+=i.frameDelta,i.timeBuffer=o.clamp(i.timeBuffer,0,i.frameDelta+n*m._timeBufferMargin),i.lastUpdatesDeferred=0;for(var c=i.maxUpdates||Math.ceil(i.maxFrameTime/n),d=o.now();n>0&&i.timeBuffer>=n*m._timeBufferMargin;){h.update(e,n),i.timeBuffer-=n,r+=1;var f=o.now()-s,p=o.now()-d,v=f+m._elapsedNextEstimate*p/r;if(r>=c||v>i.maxFrameTime){i.lastUpdatesDeferred=Math.round(Math.max(0,i.timeBuffer/n-m._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!==a.get(this.localWorld,e.id,e.type)},getAllBodies:function(){return a.allBodies(this.localWorld)},getAllConstraints:function(){return a.allConstraints(this.localWorld)},getAllComposites:function(){return a.allComposites(this.localWorld)},postUpdate:function(){if(this.drawDebug){var t=this.debugConfig,e=this.engine,i=this.debugGraphic,s=a.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 n=o.keys(t.buckets),r=0;r0){var l=h[0].vertex.x,u=h[0].vertex.y;2===n.contactCount&&(l=(h[0].vertex.x+h[1].vertex.x)/2,u=(h[0].vertex.y+h[1].vertex.y)/2),a.bodyB===a.supports[0].body||a.bodyA.isStatic?e.lineBetween(l-8*a.normal.x,u-8*a.normal.y,l,u):e.lineBetween(l+8*a.normal.x,u+8*a.normal.y,l,u)}}return this},renderBodyBounds:function(t,e,i,s){e.lineStyle(1,i,s);for(var n=0;n1?1:0;h1?1:0;a1?1:0;a1&&this.renderConvexHull(v,e,f,y)}}},renderBody:function(t,e,i,s,n,r,o,a){void 0===s&&(s=null),void 0===n&&(n=null),void 0===r&&(r=1),void 0===o&&(o=null),void 0===a&&(a=null);for(var h=this.debugConfig,l=h.sensorFillColor,u=h.sensorLineColor,c=t.parts,d=c.length,f=d>1?1:0;f1){var n=t.vertices;e.lineStyle(s,i),e.beginPath(),e.moveTo(n[0].x,n[0].y);for(var r=1;r0&&(e.fillStyle(a),e.fillCircle(u.x,u.y,h),e.fillCircle(c.x,c.y,h)),this},resetCollisionIDs:function(){return n._nextCollidingGroupId=1,n._nextNonCollidingGroupId=-1,n._nextCategory=1,this},shutdown:function(){p.off(this.engine),this.removeAllListeners(),g.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;i{var s=i(22562),n={applyForce:function(t){return this._tempVec2.set(this.body.position.x,this.body.position.y),s.applyForce(this.body,this._tempVec2,t),this},applyForceFrom:function(t,e){return s.applyForce(this.body,t,e),this},thrust:function(t){var e=this.body.angle;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),s.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustLeft:function(t){var e=this.body.angle-Math.PI/2;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),s.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustRight:function(t){var e=this.body.angle+Math.PI/2;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),s.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustBack:function(t){var e=this.body.angle-Math.PI;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),s.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this}};t.exports=n},5436:t=>{var e={setFriction:function(t,e,i){return this.body.friction=t,void 0!==e&&(this.body.frictionAir=e),void 0!==i&&(this.body.frictionStatic=i),this},setFrictionAir:function(t){return this.body.frictionAir=t,this},setFrictionStatic:function(t){return this.body.frictionStatic=t,this}};t.exports=e},39858:t=>{t.exports={setIgnoreGravity:function(t){return this.body.ignoreGravity=t,this}}},37302:(t,e,i)=>{var s=i(22562),n=i(26099),r={setMass:function(t){return s.setMass(this.body,t),this},setDensity:function(t){return s.setDensity(this.body,t),this},centerOfMass:{get:function(){return new n(this.body.centerOfMass.x,this.body.centerOfMass.y)}}};t.exports=r},39132:t=>{t.exports={setSensor:function(t){return this.body.isSensor=t,this},isSensor:function(){return this.body.isSensor}}},57772:(t,e,i)=>{var s=i(66280),n=i(22562),r=i(43855),o=i(95540),a=i(19496),h=i(85791),l=i(41598),u={setRectangle:function(t,e,i){return this.setBody({type:"rectangle",width:t,height:e},i)},setCircle:function(t,e){return this.setBody({type:"circle",radius:t},e)},setPolygon:function(t,e,i){return this.setBody({type:"polygon",sides:e,radius:t},i)},setTrapezoid:function(t,e,i,s){return this.setBody({type:"trapezoid",width:t,height:e,slope:i},s)},setExistingBody:function(t,e){void 0===e&&(e=!0),this.body&&this.world.remove(this.body,!0),this.body=t;for(var i=0;i{var s=i(1121),n=i(53614),r=i(35810),o={setToSleep:function(){return n.set(this.body,!0),this},setAwake:function(){return n.set(this.body,!1),this},setSleepThreshold:function(t){return void 0===t&&(t=60),this.body.sleepThreshold=t,this},setSleepEvents:function(t,e){return this.setSleepStartEvent(t),this.setSleepEndEvent(e),this},setSleepStartEvent:function(t){if(t){var e=this.world;r.on(this.body,"sleepStart",(function(t){e.emit(s.SLEEP_START,t,this)}))}else r.off(this.body,"sleepStart");return this},setSleepEndEvent:function(t){if(t){var e=this.world;r.on(this.body,"sleepEnd",(function(t){e.emit(s.SLEEP_END,t,this)}))}else r.off(this.body,"sleepEnd");return this}};t.exports=o},90556:(t,e,i)=>{var s=i(22562),n={setStatic:function(t){return s.setStatic(this.body,t),this},isStatic:function(){return this.body.isStatic}};t.exports=n},85436:(t,e,i)=>{var s=i(22562),n=i(36383),r=i(86554),o=i(30954),a={x:{get:function(){return this.body.position.x},set:function(t){this._tempVec2.set(t,this.y),s.setPosition(this.body,this._tempVec2)}},y:{get:function(){return this.body.position.y},set:function(t){this._tempVec2.set(this.x,t),s.setPosition(this.body,this._tempVec2)}},scale:{get:function(){return(this._scaleX+this._scaleY)/2},set:function(t){this.setScale(t,t)}},scaleX:{get:function(){return this._scaleX},set:function(t){var e=1/this._scaleX,i=1/this._scaleY;this._scaleX=t,0===this._scaleX?this.renderFlags&=-5:this.renderFlags|=4,s.scale(this.body,e,i),s.scale(this.body,t,this._scaleY)}},scaleY:{get:function(){return this._scaleY},set:function(t){var e=1/this._scaleX,i=1/this._scaleY;this._scaleY=t,0===this._scaleY?this.renderFlags&=-5:this.renderFlags|=4,s.scale(this.body,e,i),s.scale(this.body,this._scaleX,t)}},angle:{get:function(){return o(this.body.angle*n.RAD_TO_DEG)},set:function(t){this.rotation=o(t)*n.DEG_TO_RAD}},rotation:{get:function(){return this.body.angle},set:function(t){this._rotation=r(t),s.setAngle(this.body,this._rotation)}},setPosition:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this._tempVec2.set(t,e),s.setPosition(this.body,this._tempVec2),this},setRotation:function(t){return void 0===t&&(t=0),this._rotation=r(t),s.setAngle(this.body,t),this},setFixedRotation:function(){return s.setInertia(this.body,1/0),this},setAngle:function(t){return void 0===t&&(t=0),this.angle=t,s.setAngle(this.body,this.rotation),this},setScale:function(t,e,i){void 0===t&&(t=1),void 0===e&&(e=t);var n=1/this._scaleX,r=1/this._scaleY;return this._scaleX=t,this._scaleY=e,s.scale(this.body,n,r,i),s.scale(this.body,t,e,i),this}};t.exports=a},42081:(t,e,i)=>{var s=i(22562),n={setVelocityX:function(t){return this._tempVec2.set(t,this.body.velocity.y),s.setVelocity(this.body,this._tempVec2),this},setVelocityY:function(t){return this._tempVec2.set(this.body.velocity.x,t),s.setVelocity(this.body,this._tempVec2),this},setVelocity:function(t,e){return this._tempVec2.set(t,e),s.setVelocity(this.body,this._tempVec2),this},getVelocity:function(){return s.getVelocity(this.body)},setAngularVelocity:function(t){return s.setAngularVelocity(this.body,t),this},getAngularVelocity:function(){return s.getAngularVelocity(this.body)},setAngularSpeed:function(t){return s.setAngularSpeed(this.body,t),this},getAngularSpeed:function(){return s.getAngularSpeed(this.body)}};t.exports=n},31884:(t,e,i)=>{t.exports={Bounce:i(70410),Collision:i(66968),Force:i(51607),Friction:i(5436),Gravity:i(39858),Mass:i(37302),Sensor:i(39132),SetBody:i(57772),Sleep:i(38083),Static:i(90556),Transform:i(85436),Velocity:i(42081)}},85608:t=>{t.exports="afteradd"},1213:t=>{t.exports="afterremove"},25968:t=>{t.exports="afterupdate"},67205:t=>{t.exports="beforeadd"},39438:t=>{t.exports="beforeremove"},44823:t=>{t.exports="beforeupdate"},92593:t=>{t.exports="collisionactive"},60128:t=>{t.exports="collisionend"},76861:t=>{t.exports="collisionstart"},92362:t=>{t.exports="dragend"},76408:t=>{t.exports="drag"},93971:t=>{t.exports="dragstart"},5656:t=>{t.exports="pause"},47861:t=>{t.exports="resume"},79099:t=>{t.exports="sleepend"},35906:t=>{t.exports="sleepstart"},1121:(t,e,i)=>{t.exports={AFTER_ADD:i(85608),AFTER_REMOVE:i(1213),AFTER_UPDATE:i(25968),BEFORE_ADD:i(67205),BEFORE_REMOVE:i(39438),BEFORE_UPDATE:i(44823),COLLISION_ACTIVE:i(92593),COLLISION_END:i(60128),COLLISION_START:i(76861),DRAG_END:i(92362),DRAG:i(76408),DRAG_START:i(93971),PAUSE:i(5656),RESUME:i(47861),SLEEP_END:i(79099),SLEEP_START:i(35906)}},3875:(t,e,i)=>{t.exports={BodyBounds:i(68174),Components:i(31884),Events:i(1121),Factory:i(28137),MatterGameObject:i(75803),Image:i(23181),Matter:i(19933),MatterPhysics:i(42045),PolyDecomp:i(55973),Sprite:i(34803),TileBody:i(73834),PhysicsEditorParser:i(19496),PhysicsJSONParser:i(85791),PointerConstraint:i(98713),World:i(68243)}},22562:(t,e,i)=>{var s={};t.exports=s;var n=i(41598),r=i(31725),o=i(53614),a=i(53402),h=i(15647),l=i(66615);!function(){s._timeCorrection=!0,s._inertiaScale=4,s._nextCollidingGroupId=1,s._nextNonCollidingGroupId=-1,s._nextCategory=1,s._baseDelta=1e3/60,s.create=function(e){var i={id:a.nextId(),type:"body",label:"Body",parts:[],plugin:{},attractors:e.attractors||[],wrapBounds:null,angle:0,vertices:null,position:{x:0,y:0},force:{x:0,y:0},torque:0,positionImpulse:{x:0,y:0},constraintImpulse:{x:0,y:0,angle:0},totalContacts:0,speed:0,angularSpeed:0,velocity:{x:0,y:0},angularVelocity:0,isSensor:!1,isStatic:!1,isSleeping:!1,motion:0,sleepThreshold:60,density:.001,restitution:0,friction:.1,frictionStatic:.5,frictionAir:.01,collisionFilter:{category:1,mask:4294967295,group:0},slop:.05,timeScale:1,events:null,bounds:null,chamfer:null,circleRadius:0,positionPrev:null,anglePrev:0,parent:null,axes:null,area:0,mass:0,inverseMass:0,inertia:0,deltaTime:1e3/60,inverseInertia:0,_original:null,render:{visible:!0,opacity:1,sprite:{xOffset:0,yOffset:0},fillColor:null,fillOpacity:null,lineColor:null,lineOpacity:null,lineThickness:null},gameObject:null,scale:{x:1,y:1},centerOfMass:{x:0,y:0},centerOffset:{x:0,y:0},gravityScale:{x:1,y:1},ignoreGravity:!1,ignorePointer:!1,onCollideCallback:null,onCollideEndCallback:null,onCollideActiveCallback:null,onCollideWith:{}};!e.hasOwnProperty("position")&&e.hasOwnProperty("vertices")?e.position=n.centre(e.vertices):e.hasOwnProperty("vertices")||(i.vertices=n.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"));var s=a.extend(i,e);return t(s,e),s.setOnCollideWith=function(t,e){return e?this.onCollideWith[t.id]=e:delete this.onCollideWith[t.id],this},s},s.nextGroup=function(t){return t?s._nextNonCollidingGroupId--:s._nextCollidingGroupId++},s.nextCategory=function(){return s._nextCategory=s._nextCategory<<1,s._nextCategory};var t=function(t,e){if(e=e||{},s.set(t,{bounds:t.bounds||h.create(t.vertices),positionPrev:t.positionPrev||r.clone(t.position),anglePrev:t.anglePrev||t.angle,vertices:t.vertices,parts:t.parts||[t],isStatic:t.isStatic,isSleeping:t.isSleeping,parent:t.parent||t}),n.rotate(t.vertices,t.angle,t.position),l.rotate(t.axes,t.angle),h.update(t.bounds,t.vertices,t.velocity),s.set(t,{axes:e.axes||t.axes,area:e.area||t.area,mass:e.mass||t.mass,inertia:e.inertia||t.inertia}),1===t.parts.length){var i=t.bounds,o=t.centerOfMass,a=t.centerOffset,u=i.max.x-i.min.x,c=i.max.y-i.min.y;o.x=-(i.min.x-t.position.x)/u,o.y=-(i.min.y-t.position.y)/c,a.x=u*o.x,a.y=c*o.y}};s.set=function(t,e,i){var n;for(n in"string"==typeof e&&(n=e,(e={})[n]=i),e)if(Object.prototype.hasOwnProperty.call(e,n))switch(i=e[n],n){case"isStatic":s.setStatic(t,i);break;case"isSleeping":o.set(t,i);break;case"mass":s.setMass(t,i);break;case"density":s.setDensity(t,i);break;case"inertia":s.setInertia(t,i);break;case"vertices":s.setVertices(t,i);break;case"position":s.setPosition(t,i);break;case"angle":s.setAngle(t,i);break;case"velocity":s.setVelocity(t,i);break;case"angularVelocity":s.setAngularVelocity(t,i);break;case"speed":s.setSpeed(t,i);break;case"angularSpeed":s.setAngularSpeed(t,i);break;case"parts":s.setParts(t,i);break;case"centre":s.setCentre(t,i);break;default:t[n]=i}},s.setStatic=function(t,e){for(var i=0;i0&&r.rotateAbout(a.position,s,t.position,a.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=r.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 r.magnitude(s.getVelocity(t))},s.setSpeed=function(t,e){s.setVelocity(t,r.mult(r.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,a.sign(s.getAngularVelocity(t))*e)},s.translate=function(t,e,i){s.setPosition(t,r.add(t.position,e),i)},s.rotate=function(t,e,i,n){if(i){var r=Math.cos(e),o=Math.sin(e),a=t.position.x-i.x,h=t.position.y-i.y;s.setPosition(t,{x:i.x+(a*r-h*o),y:i.y+(a*o+h*r)},n),s.setAngle(t,t.angle+e,n)}else s.setAngle(t,t.angle+e,n)},s.scale=function(t,e,i,r){var o=0,a=0;r=r||t.position;for(var u=t.inertia===1/0,c=0;c0&&(o+=d.area,a+=d.inertia),d.position.x=r.x+(d.position.x-r.x)*e,d.position.y=r.y+(d.position.y-r.y)*i,h.update(d.bounds,d.vertices,t.velocity)}t.parts.length>1&&(t.area=o,t.isStatic||(s.setMass(t,t.density*o),s.setInertia(t,a))),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,o=s._timeCorrection?e/(t.deltaTime||e):1,u=1-t.frictionAir*(e/a._baseDelta),c=(t.position.x-t.positionPrev.x)*o,d=(t.position.y-t.positionPrev.y)*o;t.velocity.x=c*u+t.force.x/t.mass*i,t.velocity.y=d*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*o+t.torque/t.inertia*i,t.anglePrev=t.angle,t.angle+=t.angularVelocity,t.speed=r.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&&(n.rotate(p.vertices,t.angularVelocity,t.position),l.rotate(p.axes,t.angularVelocity),f>0&&r.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,n=e.y-t.position.y;t.force.x+=i.x,t.force.y+=i.y,t.torque+=s*i.y-n*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{var s={};t.exports=s;var n=i(35810),r=i(53402),o=i(15647),a=i(22562);s.create=function(t){return r.extend({id:r.nextId(),type:"composite",parent:null,isModified:!1,bodies:[],constraints:[],composites:[],label:"Composite",plugin:{},wrapBounds:null,cache:{allBodies:null,allConstraints:null,allComposites:null}},t)},s.setModified=function(t,e,i,r){if(n.trigger(t,"compositeModified",t),t.isModified=e,e&&t.cache&&(t.cache.allBodies=null,t.cache.allConstraints=null,t.cache.allComposites=null),i&&t.parent&&s.setModified(t.parent,e,i,r),r)for(var o=0;o{var s={};t.exports=s;var n=i(69351);s.create=n.create,s.add=n.add,s.remove=n.remove,s.clear=n.clear,s.addComposite=n.addComposite,s.addBody=n.addBody,s.addConstraint=n.addConstraint},52284:(t,e,i)=>{var s={};t.exports=s;var n,r,o,a=i(41598),h=i(4506);n=[],r={overlap:0,axis:null},o={overlap:0,axis:null},s.create=function(t,e){return{pair:null,collided:!1,bodyA:t,bodyB:e,parentA:t.parent,parentB:e.parent,depth:0,normal:{x:0,y:0},tangent:{x:0,y:0},penetration:{x:0,y:0},supports:[null,null],supportCount:0}},s.collides=function(t,e,i){if(s._overlapAxes(r,t.vertices,e.vertices,t.axes),r.overlap<=0)return null;if(s._overlapAxes(o,e.vertices,t.vertices,e.axes),o.overlap<=0)return null;var n,l,u=i&&i.table[h.id(t,e)];u?n=u.collision:((n=s.create(t,e)).collided=!0,n.bodyA=t.id=0&&(m=-m,y=-y),c.x=m,c.y=y,d.x=-y,d.y=m,f.x=m*v,f.y=y*v,n.depth=v;var x=s._findSupports(t,e,c,1),T=0;if(a.contains(t.vertices,x[0])&&(p[T++]=x[0]),a.contains(t.vertices,x[1])&&(p[T++]=x[1]),T<2){var w=s._findSupports(e,t,c,-1);a.contains(e.vertices,w[0])&&(p[T++]=w[0]),T<2&&a.contains(e.vertices,w[1])&&(p[T++]=w[1])}return 0===T&&(p[T++]=x[0]),n.supportCount=T,n},s._overlapAxes=function(t,e,i,s){var n,r,o,a,h,l,u=e.length,c=i.length,d=e[0].x,f=e[0].y,p=i[0].x,v=i[0].y,g=s.length,m=Number.MAX_VALUE,y=0;for(h=0;hE?E=a:aA?A=a:a{var e={};t.exports=e,e.create=function(t){return{vertex:t,normalImpulse:0,tangentImpulse:0}}},81388:(t,e,i)=>{var s={};t.exports=s;var n=i(53402),r=i(52284);s.create=function(t){return n.extend({bodies:[],collisions:[],pairs:null},t)},s.setBodies=function(t,e){t.bodies=e.slice(0)},s.clear=function(t){t.bodies=[],t.collisions=[]},s.collisions=function(t){var e,i,n=t.pairs,o=t.bodies,a=o.length,h=s.canCollide,l=r.collides,u=t.collisions,c=0;for(o.sort(s._compareBoundsX),e=0;ep)break;if(!(vM.max.y)&&(!m||!T.isStatic&&!T.isSleeping)&&h(d.collisionFilter,T.collisionFilter)){var w=T.parts.length;if(x&&1===w)(C=l(d,T,n))&&(u[c++]=C);else for(var b=w>1?1:0,S=y>1?1:0;SM.max.x||f.max.xM.max.y||(C=l(E,_,n))&&(u[c++]=C)}}}}return u.length!==c&&(u.length=c),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 n=i(43424);s.create=function(t,e){var i=t.bodyA,r=t.bodyB,o={id:s.id(i,r),bodyA:i,bodyB:r,collision:t,contacts:[n.create(),n.create()],contactCount:0,separation:0,isActive:!0,isSensor:i.isSensor||r.isSensor,timeCreated:e,timeUpdated:e,inverseMass:0,friction:0,frictionStatic:0,restitution:0,slop:0};return s.update(o,t,e),o},s.update=function(t,e,i){var s=e.supports,n=e.supportCount,r=t.contacts,o=e.parentA,a=e.parentB;t.isActive=!0,t.timeUpdated=i,t.collision=e,t.separation=e.depth,t.inverseMass=o.inverseMass+a.inverseMass,t.friction=o.frictiona.frictionStatic?o.frictionStatic:a.frictionStatic,t.restitution=o.restitution>a.restitution?o.restitution:a.restitution,t.slop=o.slop>a.slop?o.slop:a.slop,t.contactCount=n,e.pair=t;var h=s[0],l=r[0],u=s[1],c=r[1];c.vertex!==h&&l.vertex!==u||(r[1]=l,r[0]=l=c,c=r[1]),l.vertex=h,c.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{var s={};t.exports=s;var n=i(4506),r=i(53402);s.create=function(t){return r.extend({table:{},list:[],collisionStart:[],collisionActive:[],collisionEnd:[]},t)},s.update=function(t,e,i){var s,r,o,a=n.update,h=n.create,l=n.setActive,u=t.table,c=t.list,d=c.length,f=d,p=t.collisionStart,v=t.collisionEnd,g=t.collisionActive,m=e.length,y=0,x=0,T=0;for(o=0;o=i?c[f++]=r:(l(r,!1,i),r.collision.bodyA.sleepCounter>0&&r.collision.bodyB.sleepCounter>0?c[f++]=r:(v[x++]=r,delete u[r.id]));c.length!==f&&(c.length=f),p.length!==y&&(p.length=y),v.length!==x&&(v.length=x),g.length!==T&&(g.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 n=i(31725),r=i(52284),o=i(15647),a=i(66280),h=i(41598);s.collides=function(t,e){for(var i=[],s=e.length,n=t.bounds,a=r.collides,h=o.overlaps,l=0;l{var s={};t.exports=s;var n=i(41598),r=i(53402),o=i(15647);s._restingThresh=2,s._restingThreshTangent=Math.sqrt(6),s._positionDampen=.9,s._positionWarming=.8,s._frictionNormalMultiplier=5,s._frictionMaxStatic=Number.MAX_VALUE,s.preSolvePosition=function(t){var e,i,s,n=t.length;for(e=0;eH?(n=G>0?G:-G,(i=v.friction*(G>0?1:-1)*l)<-n?i=-n:i>n&&(i=n)):(i=G,n=f);var j=k*T-B*x,q=N*T-U*x,K=_/(S+m.inverseInertia*j*j+y.inverseInertia*q*q),Z=(1+v.restitution)*z*K;if(i*=K,z0&&(D.normalImpulse=0),Z=D.normalImpulse-J}if(G<-c||G>c)D.tangentImpulse=0;else{var Q=D.tangentImpulse;D.tangentImpulse+=i,D.tangentImpulse<-n&&(D.tangentImpulse=-n),D.tangentImpulse>n&&(D.tangentImpulse=n),i=D.tangentImpulse-Q}var $=x*Z+w*i,tt=T*Z+b*i;m.isStatic||m.isSleeping||(m.positionPrev.x+=$*m.inverseMass,m.positionPrev.y+=tt*m.inverseMass,m.anglePrev+=(k*tt-B*$)*m.inverseInertia),y.isStatic||y.isSleeping||(y.positionPrev.x-=$*y.inverseMass,y.positionPrev.y-=tt*y.inverseMass,y.anglePrev-=(N*tt-U*$)*y.inverseInertia)}}}}},48140:(t,e,i)=>{var s={};t.exports=s;var n=i(41598),r=i(31725),o=i(53614),a=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?r.add(e.bodyA.position,e.pointA):e.pointA,s=e.bodyB?r.add(e.bodyB.position,e.pointB):e.pointB,n=r.magnitude(r.sub(i,s));e.length=void 0!==e.length?e.length:n,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 o={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?(o.type="pin",o.anchors=!1):e.stiffness<.9&&(o.type="spring"),e.render=l.extend(o,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=r.mult(u,m*y),w=(i?i.inverseMass:0)+(n?n.inverseMass:0),b=w+((i?i.inverseInertia:0)+(n?n.inverseInertia:0));if(x>0){var S=r.create();p=r.div(u,c),g=r.sub(n&&r.sub(n.position,n.positionPrev)||S,i&&r.sub(i.position,i.positionPrev)||S),v=r.dot(p,g)}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*v*f,i.positionPrev.y-=x*p.y*v*f),d=r.cross(o,T)/b*s._torqueDampen*i.inverseInertia*(1-t.angularStiffness),i.constraintImpulse.angle-=d,i.angle-=d),n&&!n.isStatic&&(f=n.inverseMass/w,n.constraintImpulse.x+=T.x*f,n.constraintImpulse.y+=T.y*f,n.position.x+=T.x*f,n.position.y+=T.y*f,x>0&&(n.positionPrev.x+=x*p.x*v*f,n.positionPrev.y+=x*p.y*v*f),d=r.cross(a,T)/b*s._torqueDampen*n.inverseInertia*(1-t.angularStiffness),n.constraintImpulse.angle+=d,n.angle+=d)}}},s.postSolveAll=function(t){for(var e=0;e0&&(c.position.x+=l.x,c.position.y+=l.y),0!==l.angle&&(n.rotate(c.vertices,l.angle,i.position),h.rotate(c.axes,l.angle),u>0&&r.rotateAbout(c.position,l.angle,i.position,c.position)),a.update(c.bounds,c.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)),n=i-((t.bodyB?t.bodyB.position.y:0)+(t.pointB?t.pointB.y:0));return Math.sqrt(s*s+n*n)}},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,n;"boolean"==typeof e?(i=2,n=e):(i=1,n=!0);for(var r=i;r0;e--){var i=Math.floor(s.random()*(e+1)),n=t[e];t[e]=t[i],t[i]=n}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;i{var s={};t.exports=s;var n=i(53614),r=i(66272),o=i(81388),a=i(99561),h=i(35810),l=i(69351),u=i(48140),c=i(53402),d=i(22562);s._deltaMax=1e3/60,s.create=function(t){t=t||{};var e=c.extend({positionIterations:6,velocityIterations:4,constraintIterations:2,enableSleeping:!1,events:[],plugin:{},gravity:{x:0,y:1,scale:.001},timing:{timestamp:0,timeScale:1,lastDelta:0,lastElapsed:0,lastUpdatesPerFrame:0}},t);return e.world=t.world||l.create({label:"World"}),e.pairs=t.pairs||a.create(),e.detector=t.detector||o.create(),e.detector.pairs=e.pairs,e.grid={buckets:[]},e.world.gravity=e.gravity,e.broadphase=e.grid,e.metrics={},e},s.update=function(t,e){var i,d=c.now(),f=t.world,p=t.detector,v=t.pairs,g=t.timing,m=g.timestamp;e>s._deltaMax&&c.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:c._baseDelta,e*=g.timeScale,g.timestamp+=e,g.lastDelta=e;var y={timestamp:g.timestamp,delta:e};h.trigger(t,"beforeUpdate",y);var x=l.allBodies(f),T=l.allConstraints(f),w=l.allComposites(f);for(f.isModified&&(o.setBodies(p,x),l.setModified(f,!1,!1,!0)),t.enableSleeping&&n.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:v.collisionStart,timestamp:g.timestamp,delta:e});var S=c.clamp(20/t.positionIterations,0,1);for(r.preSolvePosition(v.list),i=0;i0&&h.trigger(t,"collisionActive",{pairs:v.collisionActive,timestamp:g.timestamp,delta:e}),v.collisionEnd.length>0&&h.trigger(t,"collisionEnd",{pairs:v.collisionEnd,timestamp:g.timestamp,delta:e}),s._bodiesClearForces(x),h.trigger(t,"afterUpdate",y),t.timing.lastElapsed=c.now()-d,t},s.merge=function(t,e){if(c.extend(t,e),e.world){t.world=e.world,s.clear(t);for(var i=l.allBodies(t.world),r=0;r0)for(var n=0;n{var s={};t.exports=s;var n=i(53402);s.on=function(t,e,i){for(var s,n=e.split(" "),r=0;r0){i||(i={}),s=e.split(" ");for(var l=0;l{var s={};t.exports=s;var n=i(73832),r=i(53402);s.name="matter-js",s.version="0.20.0",s.uses=[],s.used=[],s.use=function(){n.use(s,Array.prototype.slice.call(arguments))},s.before=function(t,e){return t=t.replace(/^Matter./,""),r.chainPathBefore(s,t,e)},s.after=function(t,e){return t=t.replace(/^Matter./,""),r.chainPathAfter(s,t,e)}},73832:(t,e,i)=>{var s={};t.exports=s;var n=i(53402);s._registry={},s.register=function(t){if(s.isPlugin(t)||n.warn("Plugin.register:",s.toString(t),"does not implement all required fields."),t.name in s._registry){var e=s._registry[t.name],i=s.versionParse(t.version).number,r=s.versionParse(e.version).number;i>r?(n.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),r=n.topologicalSort(i),o=[],a=0;a0&&!h.silent&&n.info(o.join(" "))}else n.warn("Plugin.use:",s.toString(t),"does not specify any dependencies to install.")},s.dependencies=function(t,e){var i=s.dependencyParse(t),r=i.name;if(!(r in(e=e||{}))){t=s.resolve(t)||t,e[r]=n.map(t.uses||[],(function(e){s.isPlugin(e)&&s.register(e);var r=s.dependencyParse(e),o=s.resolve(e);return o&&!s.versionSatisfies(o.version,r.range)?(n.warn("Plugin.dependencies:",s.toString(o),"does not satisfy",s.toString(r),"used by",s.toString(i)+"."),o._warned=!0,t._warned=!0):o||(n.warn("Plugin.dependencies:",s.toString(e),"used by",s.toString(i),"could not be resolved."),t._warned=!0),r.name}));for(var o=0;o=|>)?\s*((\d+)\.(\d+)\.(\d+))(-[0-9A-Za-z-+]+)?$/;e.test(t)||n.warn("Plugin.versionParse:",t,"is not a valid version or range.");var i=e.exec(t),s=Number(i[4]),r=Number(i[5]),o=Number(i[6]);return{isRange:Boolean(i[1]||i[2]),version:i[3],range:t,operator:i[1]||i[2]||"",major:s,minor:r,patch:o,parts:[s,r,o],prerelease:i[7],number:1e8*s+1e4*r+o}},s.versionSatisfies=function(t,e){e=e||"*";var i=s.versionParse(e),n=s.versionParse(t);if(i.isRange){if("*"===i.operator||"*"===t)return!0;if(">"===i.operator)return n.number>i.number;if(">="===i.operator)return n.number>=i.number;if("~"===i.operator)return n.major===i.major&&n.minor===i.minor&&n.patch>=i.patch;if("^"===i.operator)return i.major>0?n.major===i.major&&n.number>=i.number:i.minor>0?n.minor===i.minor&&n.patch>=i.patch:n.patch===i.patch}return t===e||"*"===t}},13037:(t,e,i)=>{var s={};t.exports=s;var n=i(35810),r=i(48413),o=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=o.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(n){t.frameRequestId=s._onNextFrame(t,i),n&&t.enabled&&s.tick(t,e,n)}(),t},s.tick=function(e,i,a){var h=o.now(),l=e.delta,u=0,c=a-e.timeLastTick;if((!c||!e.timeLastTick||c>Math.max(s._maxFrameDelta,e.maxFrameTime))&&(c=e.frameDelta||s._frameDeltaFallback),e.frameDeltaSmoothing){e.frameDeltaHistory.push(c),e.frameDeltaHistory=e.frameDeltaHistory.slice(-e.frameDeltaHistorySize);var d=e.frameDeltaHistory.slice(0).sort(),f=e.frameDeltaHistory.slice(d.length*s._smoothingLowerBound,d.length*s._smoothingUpperBound);c=t(f)||c}e.frameDeltaSnapping&&(c=1e3/Math.round(1e3/c)),e.frameDelta=c,e.timeLastTick=a,e.timeBuffer+=e.frameDelta,e.timeBuffer=o.clamp(e.timeBuffer,0,e.frameDelta+l*s._timeBufferMargin),e.lastUpdatesDeferred=0;var p=e.maxUpdates||Math.ceil(e.maxFrameTime/l),v={timestamp:i.timing.timestamp};n.trigger(e,"beforeTick",v),n.trigger(e,"tick",v);for(var g=o.now();l>0&&e.timeBuffer>=l*s._timeBufferMargin;){n.trigger(e,"beforeUpdate",v),r.update(i,l),n.trigger(e,"afterUpdate",v),e.timeBuffer-=l,u+=1;var m=o.now()-h,y=o.now()-g,x=m+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,n.trigger(e,"afterTick",v),e.frameDeltaHistory.length>=100&&(e.lastUpdatesDeferred&&Math.round(e.frameDelta/l)>p?o.warnOnce("Matter.Runner: runner reached runner.maxUpdates, see docs."):e.lastUpdatesDeferred&&o.warnOnce("Matter.Runner: runner reached runner.maxFrameTime, see docs."),void 0!==e.isFixed&&o.warnOnce("Matter.Runner: runner.isFixed is now redundant, see docs."),(e.deltaMin||e.deltaMax)&&o.warnOnce("Matter.Runner: runner.deltaMin and runner.deltaMax were removed, see docs."),0!==e.fps&&o.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;s{var s={};t.exports=s;var n=i(22562),r=i(35810),o=i(53402);s._motionWakeThreshold=.18,s._motionSleepThreshold=.08,s._minBias=.9,s.update=function(t,e){for(var i=e/o._baseDelta,r=s._motionSleepThreshold,a=0;a0&&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||r.trigger(t,"sleepStart")):(t.isSleeping=!1,t.sleepCounter=0,i&&r.trigger(t,"sleepEnd"))}},66280:(t,e,i)=>{var s={};t.exports=s;var n=i(41598),r=i(53402),o=i(22562),a=i(15647),h=i(31725);s.rectangle=function(t,e,i,s,a){a=a||{};var h={label:"Rectangle Body",position:{x:t,y:e},vertices:n.fromPath("L 0 0 L "+i+" 0 L "+i+" "+s+" L 0 "+s)};if(a.chamfer){var l=a.chamfer;h.vertices=n.chamfer(h.vertices,l.radius,l.quality,l.qualityMin,l.qualityMax),delete a.chamfer}return o.create(r.extend({},h,a))},s.trapezoid=function(t,e,i,s,a,h){h=h||{},a>=1&&r.warn("Bodies.trapezoid: slope parameter must be < 1.");var l,u=i*(a*=.5),c=u+(1-2*a)*i,d=c+u;l=a<.5?"L 0 0 L "+u+" "+-s+" L "+c+" "+-s+" L "+d+" 0":"L 0 0 L "+c+" "+-s+" L "+d+" 0";var f={label:"Trapezoid Body",position:{x:t,y:e},vertices:n.fromPath(l)};if(h.chamfer){var p=h.chamfer;f.vertices=n.chamfer(f.vertices,p.radius,p.quality,p.qualityMin,p.qualityMax),delete h.chamfer}return o.create(r.extend({},f,h))},s.circle=function(t,e,i,n,o){n=n||{};var a={label:"Circle Body",circleRadius:i};o=o||25;var h=Math.ceil(Math.max(10,Math.min(o,i)));return h%2==1&&(h+=1),s.polygon(t,e,h,i,r.extend({},a,n))},s.polygon=function(t,e,i,a,h){if(h=h||{},i<3)return s.circle(t,e,a,h);for(var l=2*Math.PI/i,u="",c=.5*l,d=0;d0&&n.area(C)1?(p=o.create(r.extend({parts:v.slice(0)},s)),o.setPosition(p,{x:t,y:e}),p):v[0]},s.flagCoincidentParts=function(t,e){void 0===e&&(e=5);for(var i=0;i{var s={};t.exports=s;var n=i(69351),r=i(48140),o=i(53402),a=i(22562),h=i(66280);s.stack=function(t,e,i,s,r,o,h){for(var l,u=n.create({label:"Stack"}),c=t,d=e,f=0,p=0;pv&&(v=y),a.translate(m,{x:.5*x,y:.5*y}),c=m.bounds.max.x+r,n.addBody(u,m),l=m,f+=1}else c+=r}d+=v+o,c=t}return u},s.chain=function(t,e,i,s,a,h){for(var l=t.bodies,u=1;u0)for(l=0;l0&&(d=f[l-1+(h-1)*e],n.addConstraint(t,r.create(o.extend({bodyA:d,bodyB:c},a)))),s&&ld||o<(l=d-l)||o>i-1-l))return 1===c&&a.translate(u,{x:(o+(i%2==1?1:-1))*f,y:0}),h(t+(u?o*f:0)+o*r,s,o,l,u,c)}))},s.newtonsCradle=function(t,e,i,s,o){for(var a=n.create({label:"Newtons Cradle"}),l=0;l{var s={};t.exports=s;var n=i(31725),r=i(53402);s.fromVertices=function(t){for(var e={},i=0;i{var e={};t.exports=e,e.create=function(t){var i={min:{x:0,y:0},max:{x:0,y:0}};return t&&e.update(i,t),i},e.update=function(t,e,i){t.min.x=1/0,t.max.x=-1/0,t.min.y=1/0,t.max.y=-1/0;for(var s=0;st.max.x&&(t.max.x=n.x),n.xt.max.y&&(t.max.y=n.y),n.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,n=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?n=e.min.y-t.max.y:t.max.y{var s={};t.exports=s;i(15647);var n=i(53402);s.pathToVertices=function(t,e){"undefined"==typeof window||"SVGPathSeg"in window||n.warn("Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.");var i,r,o,a,h,l,u,c,d,f,p,v=[],g=0,m=0,y=0;e=e||15;var x=function(t,e,i){var s=i%2==1&&i>1;if(!d||t!=d.x||e!=d.y){d&&s?(f=d.x,p=d.y):(f=0,p=0);var n={x:f+t,y:p+e};!s&&d||(d=n),v.push(n),m=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":m=t.x,y=t.y;break;case"H":m=t.x;break;case"V":y=t.y}x(m,y,t.pathSegType)}};for(s._svgPathToAbsolute(t),o=t.getTotalLength(),l=[],i=0;i{var e={};t.exports=e,e.create=function(t,e){return{x:t||0,y:e||0}},e.clone=function(t){return{x:t.x,y:t.y}},e.magnitude=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},e.magnitudeSquared=function(t){return t.x*t.x+t.y*t.y},e.rotate=function(t,e,i){var s=Math.cos(e),n=Math.sin(e);i||(i={});var r=t.x*s-t.y*n;return i.y=t.x*n+t.y*s,i.x=r,i},e.rotateAbout=function(t,e,i,s){var n=Math.cos(e),r=Math.sin(e);s||(s={});var o=i.x+((t.x-i.x)*n-(t.y-i.y)*r);return s.y=i.y+((t.x-i.x)*r+(t.y-i.y)*n),s.x=o,s},e.normalise=function(t){var i=e.magnitude(t);return 0===i?{x:0,y:0}:{x:t.x/i,y:t.y/i}},e.dot=function(t,e){return t.x*e.x+t.y*e.y},e.cross=function(t,e){return t.x*e.y-t.y*e.x},e.cross3=function(t,e,i){return(e.x-t.x)*(i.y-t.y)-(e.y-t.y)*(i.x-t.x)},e.add=function(t,e,i){return i||(i={}),i.x=t.x+e.x,i.y=t.y+e.y,i},e.sub=function(t,e,i){return i||(i={}),i.x=t.x-e.x,i.y=t.y-e.y,i},e.mult=function(t,e){return{x:t.x*e,y:t.y*e}},e.div=function(t,e){return{x:t.x/e,y:t.y/e}},e.perp=function(t,e){return{x:(e=!0===e?-1:1)*-t.y,y:e*t.x}},e.neg=function(t){return{x:-t.x,y:-t.y}},e.angle=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)},e._temp=[e.create(),e.create(),e.create(),e.create(),e.create(),e.create()]},41598:(t,e,i)=>{var s={};t.exports=s;var n=i(31725),r=i(53402);s.create=function(t,e){for(var i=[],s=0;s0)return!1;o=i}return!0},s.scale=function(t,e,i,r){if(1===e&&1===i)return t;var o,a;r=r||s.centre(t);for(var h=0;h=0?h-1:t.length-1],u=t[h],c=t[(h+1)%t.length],d=e[h0&&(r|=2),3===r)return!1;return 0!==r||null},s.hull=function(t){var e,i,s=[],r=[];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&&n.cross3(r[r.length-2],r[r.length-1],e)<=0;)r.pop();r.push(e)}for(i=t.length-1;i>=0;i-=1){for(e=t[i];s.length>=2&&n.cross3(s[s.length-2],s[s.length-1],e)<=0;)s.pop();s.push(e)}return s.pop(),r.pop(),s.concat(r)}},55973:t=>{function e(t,e,i){i=i||0;var s,n,r,o,a,h,l,u=[0,0];return s=t[1][1]-t[0][1],n=t[0][0]-t[1][0],r=s*t[0][0]+n*t[0][1],o=e[1][1]-e[0][1],a=e[0][0]-e[1][0],h=o*e[0][0]+a*e[0][1],S(l=s*a-o*n,0,i)||(u[0]=(a*r-n*h)/l,u[1]=(s*h-o*r)/l),u}function i(t,e,i,s){var n=e[0]-t[0],r=e[1]-t[1],o=s[0]-i[0],a=s[1]-i[1];if(o*r-a*n==0)return!1;var h=(n*(i[1]-t[1])+r*(t[0]-i[0]))/(o*r-a*n),l=(o*(t[1]-i[1])+a*(i[0]-t[0]))/(a*n-o*r);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 n(t,e,i){return s(t,e,i)>0}function r(t,e,i){return s(t,e,i)>=0}function o(t,e,i){return s(t,e,i)<0}function a(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,v){u=u||100,v=v||0,l=l||25,i=void 0!==i?i:[],s=s||[],h=h||[];var g=[0,0],m=[0,0],x=[0,0],T=0,w=0,S=0,E=0,A=0,C=0,_=0,M=[],P=[],R=e,L=e;if(L.length<3)return i;if(++v>u)return console.warn("quickDecomp: max level ("+u+") reached."),i;for(var O=0;OA&&(A+=e.length),E=Number.MAX_VALUE,A3&&s>=0;--s)u(d(t,s-1),d(t,s),d(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],n=i-1;n>=0;--n)E(s,t[n],e)&&t.splice(i,1)},makeCCW:function(t){for(var e=0,i=t,s=1;si[e][0])&&(e=s);return!n(d(t,e-1),d(t,e),d(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,n){if(n){var r=h,o=l;r[0]=e[0]-t[0],r[1]=e[1]-t[1],o[0]=i[0]-e[0],o[1]=i[1]-e[1];var a=r[0]*o[0]+r[1]*o[1],u=Math.sqrt(r[0]*r[0]+r[1]*r[1]),c=Math.sqrt(o[0]*o[0]+o[1]*o[1]);return Math.acos(a/(u*c)){var s=new(i(83419))({initialize:function(t){this.pluginManager=t,this.game=t.game},init:function(){},start:function(){},stop:function(){},destroy:function(){this.pluginManager=null,this.game=null,this.scene=null,this.systems=null}});t.exports=s},42363:t=>{t.exports={Global:["game","anims","cache","plugins","registry","scale","sound","textures","renderer"],CoreScene:["EventEmitter","CameraManager","GameObjectCreator","GameObjectFactory","ScenePlugin","DisplayList","UpdateList"],DefaultScene:["Clock","DataManagerPlugin","InputPlugin","Loader","TweenManager","LightsPlugin"]}},37277:t=>{var e={},i={},s={register:function(t,i,s,n){void 0===n&&(n=!1),e[t]={plugin:i,mapping:s,custom:n}},registerCustom:function(t,e,s,n){i[t]={plugin:e,mapping:s,data:n}},hasCore:function(t){return e.hasOwnProperty(t)},hasCustom:function(t){return i.hasOwnProperty(t)},getCore:function(t){return e[t]},getCustom:function(t){return i[t]},getCustomClass:function(t){return i.hasOwnProperty(t)?i[t].plugin:null},remove:function(t){e.hasOwnProperty(t)&&delete e[t]},removeCustom:function(t){i.hasOwnProperty(t)&&delete i[t]},destroyCorePlugins:function(){for(var t in e)e.hasOwnProperty(t)&&delete e[t]},destroyCustomPlugins:function(){for(var t in i)i.hasOwnProperty(t)&&delete i[t]}};t.exports=s},77332:(t,e,i)=>{var s=i(83419),n=i(8443),r=i(50792),o=i(74099),a=i(44603),h=i(39429),l=i(95540),u=i(37277),c=i(72905),d=i(8054),f=new s({Extends:r,initialize:function(t){r.call(this),this.game=t,this.plugins=[],this.scenePlugins=[],this._pendingGlobal=[],this._pendingScene=[],t.isBooted||t.config.renderType===d.HEADLESS?this.boot():t.events.once(n.BOOT,this.boot,this)},boot:function(){var t,e,i,s,r,o,a,h=this.game.config,u=h.installGlobalPlugins;for(u=u.concat(this._pendingGlobal),t=0;t{var s=i(52018),n=i(83419),r=i(44594),o=new n({Extends:s,initialize:function(t,e,i){s.call(this,e),this.scene=t,this.systems=t.sys,this.pluginKey=i,t.sys.events.once(r.BOOT,this.boot,this)},boot:function(){},destroy:function(){this.pluginManager=null,this.game=null,this.scene=null,this.systems=null}});t.exports=o},18922:(t,e,i)=>{t.exports={BasePlugin:i(52018),DefaultPlugins:i(42363),PluginCache:i(37277),PluginManager:i(77332),ScenePlugin:i(45145)}},63595:()=>{"undefined"!=typeof HTMLVideoElement&&!("requestVideoFrameCallback"in HTMLVideoElement.prototype)&&"getVideoPlaybackQuality"in HTMLVideoElement.prototype&&(HTMLVideoElement.prototype._rvfcpolyfillmap={},HTMLVideoElement.prototype.requestVideoFrameCallback=function(t){const e=performance.now(),i=this.getVideoPlaybackQuality(),s=this.mozPresentedFrames||this.mozPaintedFrames||i.totalVideoFrames-i.droppedVideoFrames,n=(r,o)=>{const a=this.getVideoPlaybackQuality(),h=this.mozPresentedFrames||this.mozPaintedFrames||a.totalVideoFrames-a.droppedVideoFrames;if(h>s){const s=this.mozFrameDelay||a.totalFrameDelay-i.totalFrameDelay||0,n=o-r;t(o,{presentationTime:o+1e3*s,expectedDisplayTime:o+n,width:this.videoWidth,height:this.videoHeight,mediaTime:Math.max(0,this.currentTime||0)+n/1e3,presentedFrames:h,processingDuration:s}),delete this._rvfcpolyfillmap[e]}else this._rvfcpolyfillmap[e]=requestAnimationFrame((t=>n(o,t)))};return this._rvfcpolyfillmap[e]=requestAnimationFrame((t=>n(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}},68627:(t,e,i)=>{var s=i(19715),n=i(32880),r=i(83419),o=i(8054),a=i(50792),h=i(92503),l=i(56373),u=i(97480),c=i(69442),d=i(8443),f=i(61340),p=new r({Extends:a,initialize:function(t){a.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=o.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(d.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(c.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 n=e.length;this.emit(h.RENDER,t,i);var r=i.x,o=i.y,a=i.width,l=i.height,u=i.renderToTexture?i.context:t.sys.context;u.save(),this.game.scene.customViewports&&(u.beginPath(),u.rect(r,o,a,l),u.clip()),i.emit(s.PRE_RENDER,i),this.currentContext=u;var c=i.mask;c&&c.preRenderCanvas(this,null,i._maskCamera),i.transparent||(u.fillStyle=i.backgroundColor.rgba,u.fillRect(r,o,a,l)),u.globalAlpha=i.alpha,u.globalCompositeOperation="source-over",this.drawCount+=n,i.renderToTexture&&i.emit(s.PRE_RENDER,i),i.matrix.copyToContext(u);for(var d=0;d=0?m=-(m+c):m<0&&(m=Math.abs(m)-c)),t.flipY&&(y>=0?y=-(y+d):y<0&&(y=Math.abs(y)-d))}var T=1,w=1;t.flipX&&(f||(m+=-e.realWidth+2*v),T=-1),t.flipY&&(f||(y+=-e.realHeight+2*g),w=-1);var b=t.x,S=t.y;if(i.roundPixels&&(b=Math.floor(b),S=Math.floor(S)),a.applyITRS(b,S,t.rotation,t.scaleX*T,t.scaleY*w),o.copyFrom(i.matrix),s?(o.multiplyWithOffset(s,-i.scrollX*t.scrollFactorX,-i.scrollY*t.scrollFactorY),a.e=b,a.f=S):(a.e-=i.scrollX*t.scrollFactorX,a.f-=i.scrollY*t.scrollFactorY),o.multiply(a),i.renderRoundPixels&&(o.e=Math.floor(o.e+.5),o.f=Math.floor(o.f+.5)),r.save(),o.setToContext(r),r.globalCompositeOperation=this.blendModes[t.blendMode],r.globalAlpha=n,r.imageSmoothingEnabled=!e.source.scaleMode,t.mask&&t.mask.preRenderCanvas(this,t,i),c>0&&d>0){var E=c/p,A=d/p;i.roundPixels&&(m=Math.floor(m+.5),y=Math.floor(y+.5),E+=.5,A+=.5),r.drawImage(e.source.image,l,u,c,d,m,y,E,A)}t.mask&&t.mask.postRenderCanvas(this,t,i),r.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),n=i(89289);t.exports=function(){var t=[],e=n.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,n,r){var o=n.alpha*i.alpha;if(o<=0)return!1;var a=s(i,n,r).calc;return e.globalCompositeOperation=t.blendModes[i.blendMode],e.globalAlpha=o,e.save(),a.setToContext(e),e.imageSmoothingEnabled=i.frame?!i.frame.source.scaleMode:t.antialias,!0}},63899:t=>{t.exports="losewebgl"},6119:t=>{t.exports="postrender"},48070:t=>{t.exports="prerender"},15640:t=>{t.exports="render"},8912:t=>{t.exports="resize"},87124:t=>{t.exports="restorewebgl"},92503:(t,e,i)=>{t.exports={LOSE_WEBGL:i(63899),POST_RENDER:i(6119),PRE_RENDER:i(48070),RENDER:i(15640),RESIZE:i(8912),RESTORE_WEBGL:i(87124)}},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),n=i(40987),r=i(95540);t.exports=function(t,e){var i=r(e,"callback"),o=r(e,"type","image/png"),a=r(e,"encoder",.92),h=Math.abs(Math.round(r(e,"x",0))),l=Math.abs(Math.round(r(e,"y",0))),u=Math.floor(r(e,"width",t.width)),c=Math.floor(r(e,"height",t.height));if(r(e,"getPixel",!1)){var d=t.getContext("2d",{willReadFrequently:!1}).getImageData(h,l,1,1).data;i.call(null,new n(d[0],d[1],d[2],d[3]))}else if(0!==h||0!==l||u!==t.width||c!==t.height){var f=s.createWebGL(this,u,c),p=f.getContext("2d",{willReadFrequently:!0});u>0&&c>0&&p.drawImage(t,h,l,u,c,0,0,u,c);var v=new Image;v.onerror=function(){i.call(null),s.remove(f)},v.onload=function(){i.call(null,v),s.remove(f)},v.src=f.toDataURL(o,a)}else{var g=new Image;g.onerror=function(){i.call(null)},g.onload=function(){i.call(null,g)},g.src=t.toDataURL(o,a)}}},88815:(t,e,i)=>{var s=i(27919),n=i(40987),r=i(95540);t.exports=function(t,e){var i=t,o=r(e,"callback"),a=r(e,"type","image/png"),h=r(e,"encoder",.92),l=Math.abs(Math.round(r(e,"x",0))),u=Math.abs(Math.round(r(e,"y",0))),c=r(e,"getPixel",!1),d=r(e,"isFramebuffer",!1),f=d?r(e,"bufferWidth",1):i.drawingBufferWidth,p=d?r(e,"bufferHeight",1):i.drawingBufferHeight;if(c){var v=new Uint8Array(4),g=d?u:p-u;i.readPixels(l,g,1,1,i.RGBA,i.UNSIGNED_BYTE,v),o.call(null,new n(v[0],v[1],v[2],v[3]))}else{var m=Math.floor(r(e,"width",f)),y=Math.floor(r(e,"height",p)),x=m*y*4,T=new Uint8Array(x);i.readPixels(l,p-u-y,m,y,i.RGBA,i.UNSIGNED_BYTE,T);for(var w=s.createWebGL(this,m,y),b=w.getContext("2d",{willReadFrequently:!0}),S=b.getImageData(0,0,m,y),E=S.data,A=0;A{t.exports={Canvas:i(32880),WebGL:i(88815)}},7530:(t,e,i)=>{var s=i(83419),n=i(36060),r=i(90330),o=i(82264),a=i(95540),h=i(32302),l=i(63448),u=i(31302),c=i(58918),d=i(14811),f=i(92651),p=i(96569),v=i(56527),g=i(57516),m=i(43439),y=i(81041),x=i(12385),T=i(7589),w=i(95428),b=i(72905),S=new s({initialize:function(t){this.game=t.game,this.renderer=t,this.classes=new r([[n.UTILITY_PIPELINE,T],[n.MULTI_PIPELINE,g],[n.BITMAPMASK_PIPELINE,u],[n.SINGLE_PIPELINE,x],[n.ROPE_PIPELINE,y],[n.LIGHT_PIPELINE,p],[n.POINTLIGHT_PIPELINE,m],[n.MOBILE_PIPELINE,v]]),this.postPipelineClasses=new r,this.pipelines=new r,this.postPipelineInstances=[],this.default=null,this.current=null,this.previous=null,this.MULTI_PIPELINE=null,this.BITMAPMASK_PIPELINE=null,this.UTILITY_PIPELINE=null,this.MOBILE_PIPELINE=null,this.FX_PIPELINE=null,this.fullFrame1,this.fullFrame2,this.halfFrame1,this.halfFrame2,this.renderTargets=[],this.maxDimension=0,this.frameInc=32,this.targetIndex=0},boot:function(t,e,i){var s=this.renderer,r=this.renderTargets;this.frameInc=Math.floor(a(t,"frameInc",32));var l,u,p=s.width,v=s.height,g=this.game.config.disablePreFX;if(this.game.config.disablePostFX||this.postPipelineClasses.setAll([[String(d.BARREL),c.Barrel],[String(d.BLOOM),c.Bloom],[String(d.BLUR),c.Blur],[String(d.BOKEH),c.Bokeh],[String(d.CIRCLE),c.Circle],[String(d.COLOR_MATRIX),c.ColorMatrix],[String(d.DISPLACEMENT),c.Displacement],[String(d.GLOW),c.Glow],[String(d.GRADIENT),c.Gradient],[String(d.PIXELATE),c.Pixelate],[String(d.SHADOW),c.Shadow],[String(d.SHINE),c.Shine],[String(d.VIGNETTE),c.Vignette],[String(d.WIPE),c.Wipe]]),!g){this.classes.set(n.FX_PIPELINE,f);for(var m=Math.min(p,v),y=Math.ceil(m/this.frameInc),x=1;x=0;i--){var s=e[i];s.active&&s.preBatch(t)}}},postBatch:function(t){if(t.hasPostPipeline){this.flush();for(var e=t.postPipelines,i=0;i=0;i--){var s=e[i];s.active&&s.preBatch(t)}}},postBatchCamera:function(t){if(t.hasPostPipeline){this.flush();for(var e=t.postPipelines,i=0;ithis.maxDimension)return this.targetIndex=e.length-3,e[this.targetIndex];var i=3*(l(t,this.frameInc,0,!0)-1);return this.targetIndex=i,e[i]},getSwapRenderTarget:function(){return this.renderTargets[this.targetIndex+1]},getAltSwapRenderTarget:function(){return this.renderTargets[this.targetIndex+2]},destroy:function(){this.flush(),this.classes.clear(),this.postPipelineClasses.clear(),this.pipelines.clear(),this.renderer=null,this.game=null,this.classes=null,this.postPipelineClasses=null,this.pipelines=null,this.default=null,this.current=null,this.previous=null}});t.exports=S},32302:(t,e,i)=>{var s=i(83419),n=i(92503),r=new s({initialize:function(t,e,i,s,r,o,a,h,l){void 0===s&&(s=1),void 0===r&&(r=0),void 0===o&&(o=!0),void 0===a&&(a=!1),void 0===h&&(h=!0),void 0===l&&(l=!0),this.renderer=t,this.framebuffer=null,this.texture=null,this.width=0,this.height=0,this.scale=s,this.minFilter=r,this.autoClear=o,this.autoResize=!0,this.hasDepthBuffer=h,this.forceClamp=l,this.init(e,i),a?this.renderer.on(n.RESIZE,this.resize,this):this.autoResize=!1},init:function(t,e){var i=this.renderer;this.texture=i.createTextureFromSource(null,t,e,this.minFilter,this.forceClamp),this.framebuffer=i.createFramebuffer(t,e,this.texture,this.hasDepthBuffer),this.width=t,this.height=e},setAutoResize:function(t){return t&&!this.autoResize?(this.renderer.on(n.RESIZE,this.resize,this),this.autoResize=!0):!t&&this.autoResize&&(this.renderer.off(n.RESIZE,this.resize,this),this.autoResize=!1),this},resize:function(t,e){if(this.autoResize&&this.willResize(t,e)){var i=this.renderer;i.deleteFramebuffer(this.framebuffer),i.deleteTexture(this.texture),this.texture=i.createTextureFromSource(null,t,e,this.minFilter,this.forceClamp),this.framebuffer=i.createFramebuffer(t,e,this.texture,this.hasDepthBuffer),this.width=t,this.height=e}return this},willResize:function(t,e){return"number"==typeof t&&"number"==typeof e&&(t=Math.round(t*this.scale),e=Math.round(e*this.scale),t=Math.max(t,1),e=Math.max(e,1),t!==this.width||e!==this.height)},bind:function(t,e,i){void 0===t&&(t=!1);var s=this.renderer;if(t&&s.flush(),e&&i&&this.resize(e,i),s.pushFramebuffer(this.framebuffer,!1,!1),t&&this.adjustViewport(),this.autoClear){var n=this.renderer.gl;n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT)}s.clearStencilMask()},adjustViewport:function(){var t=this.renderer.gl;t.viewport(0,0,this.width,this.height),t.disable(t.SCISSOR_TEST)},clear:function(t,e,i,s){var n=this.renderer,r=n.gl;n.pushFramebuffer(this.framebuffer),void 0!==t&&void 0!==e&&void 0!==i&&void 0!==s?(r.enable(r.SCISSOR_TEST),r.scissor(t,e,i,s)):r.disable(r.SCISSOR_TEST),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT),n.popFramebuffer(),n.resetScissor()},unbind:function(t){void 0===t&&(t=!1);var e=this.renderer;return t&&e.flush(),e.popFramebuffer()},destroy:function(){var t=this.renderer;t.off(n.RESIZE,this.resize,this),t.deleteFramebuffer(this.framebuffer),t.deleteTexture(this.texture),this.renderer=null,this.framebuffer=null,this.texture=null}});t.exports=r},70554:t=>{t.exports={getTintFromFloats:function(t,e,i,s){return((255&(255*s|0))<<24|(255&(255*t|0))<<16|(255&(255*e|0))<<8|255&(255*i|0))>>>0},getTintAppendFloatAlpha:function(t,e){return((255&(255*e|0))<<24|t)>>>0},getTintAppendFloatAlphaAndSwap:function(t,e){return((255&(255*e|0))<<24|(255&(0|t))<<16|(255&(t>>8|0))<<8|255&(t>>16|0))>>>0},getFloatsFromUintRGB:function(t){return[(255&(t>>16|0))/255,(255&(t>>8|0))/255,(255&(0|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},parseFragmentShaderMaxTextures:function(t,e){if(!t)return"";for(var i="",s=0;s0&&(i+="\n\telse "),s{var s=i(83419),n=i(62644),r=i(50792),o=i(77085),a=i(95540),h=i(37867),l=i(92503),u=i(32302),c=i(70554),d=i(38683),f=new s({Extends:r,initialize:function(t){r.call(this);var e=t.game,i=e.renderer,s=i.gl;this.name=a(t,"name","WebGLPipeline"),this.game=e,this.renderer=i,this.manager,this.gl=s,this.view=e.canvas,this.width=0,this.height=0,this.vertexCount=0,this.vertexCapacity=0,this.vertexData,this.vertexBuffer,this.activeBuffer,this.topology=a(t,"topology",s.TRIANGLES),this.bytes,this.vertexViewF32,this.vertexViewU32,this.active=!0,this.forceZero=a(t,"forceZero",!1),this.hasBooted=!1,this.isPostFX=!1,this.isPreFX=!1,this.renderTargets=[],this.currentRenderTarget,this.shaders=[],this.currentShader,this.projectionMatrix,this.projectionWidth=0,this.projectionHeight=0,this.config=t,this.glReset=!1,this.batch=[],this.currentBatch=null,this.currentTexture=null,this.currentUnit=0,this.activeTextures=[],this.resizeUniform=a(t,"resizeUniform","")},boot:function(){var t,e=this.gl,i=this.config,s=this.renderer;this.isPostFX||(this.projectionMatrix=(new h).identity());var n=this.renderTargets,r=a(i,"renderTarget",!1);"boolean"==typeof r&&r&&(r=1);var c=s.width,d=s.height;if("number"==typeof r)for(t=0;tT&&(T=x[t].vertexSize);var w=a(i,"batchSize",s.config.batchSize);this.vertexCapacity=6*w;var b=new ArrayBuffer(this.vertexCapacity*T);this.vertexData=b,this.bytes=new Uint8Array(b),this.vertexViewF32=new Float32Array(b),this.vertexViewU32=new Uint32Array(b);var S=a(i,"vertices",null);for(S?(this.vertexViewF32.set(S),this.vertexBuffer=s.createVertexBuffer(b,e.STATIC_DRAW)):this.vertexBuffer=s.createVertexBuffer(b.byteLength,e.DYNAMIC_DRAW),this.setVertexBuffer(),t=x.length-1;t>=0;t--)x[t].rebind();this.hasBooted=!0,s.on(l.RESIZE,this.resize,this),s.on(l.PRE_RENDER,this.onPreRender,this),s.on(l.RENDER,this.onRender,this),s.on(l.POST_RENDER,this.onPostRender,this),this.emit(o.BOOT,this),this.onBoot()},onBoot:function(){},onResize:function(){},setShader:function(t,e,i){var s=this.renderer;t===this.currentShader&&s.currentProgram===this.currentShader.program||(this.flush(),this.setVertexBuffer(i)&&!e&&(e=!0),t.bind(e,!1),this.currentShader=t);return this},getShaderByName:function(t){for(var e=this.shaders,i=0;i-1&&(m=b.substring(20))}y&&x&&g.push(new d(this,m,y,x,n(T)))}this.shaders=g}return 0===this.shaders.length?console.warn("Pipeline: "+this.name+" - Invalid shader config"):this.currentShader=this.shaders[0],this},createBatch:function(t){return this.currentBatch={start:this.vertexCount,count:0,texture:[t],unit:0,maxUnit:0},this.currentUnit=0,this.currentTexture=t,this.batch.push(this.currentBatch),0},addTextureToBatch:function(t){var e=this.currentBatch;e&&(e.texture.push(t),e.unit++,e.maxUnit++)},pushBatch:function(t){if(!this.currentBatch||this.forceZero&&t!==this.currentTexture)return this.createBatch(t);if(t===this.currentTexture)return this.currentUnit;var e=this.currentBatch,i=e.texture.indexOf(t);return-1===i?e.texture.length===this.renderer.maxTextures?this.createBatch(t):(e.unit++,e.maxUnit++,e.texture.push(t),this.currentUnit=e.unit,this.currentTexture=t,e.unit):(this.currentUnit=i,this.currentTexture=t,i)},setGameObject:function(t,e){return void 0===e&&(e=t.frame),this.pushBatch(e.source.glTexture)},shouldFlush:function(t){return void 0===t&&(t=0),this.vertexCount+t>this.vertexCapacity},vertexAvailable:function(){return this.vertexCapacity-this.vertexCount},resize:function(t,e){t===this.width&&e===this.height||this.flush(),this.width=t,this.height=e;for(var i=this.renderTargets,s=0;s=0;i--){var s=e[i].rebind();t&&s!==t||(this.currentShader=s)}return this.activeTextures.length=0,this.emit(o.REBIND,this.currentShader),this.onActive(this.currentShader),this.onRebind(),this.glReset=!1,this},restoreContext:function(){var t=this.shaders,e=!!this.vertexBuffer;this.activeBuffer=null,this.activeTextures.length=0,this.batch.length=0,this.currentBatch=null,this.currentTexture=null,this.currentUnit=0,e&&this.setVertexBuffer();for(var i=0;i0){this.emit(o.BEFORE_FLUSH,this,t),this.onBeforeFlush(t);var e=this.gl,i=this.vertexCount,s=this.currentShader.vertexSize,n=this.topology;if(this.active){var r,a,h;this.setVertexBuffer(),i===this.vertexCapacity?e.bufferData(e.ARRAY_BUFFER,this.vertexData,e.DYNAMIC_DRAW):e.bufferSubData(e.ARRAY_BUFFER,0,this.bytes.subarray(0,i*s));var l=this.batch,u=this.activeTextures;if(this.forceZero)for(u[0]||e.activeTexture(e.TEXTURE0),r=0;r{var s=i(95428),n=i(72905),r=i(19715),o=i(83419),a=i(8054),h=i(50792),l=i(92503),u=i(50030),c=i(37867),d=i(29747),f=i(7530),p=i(32302),v=i(97480),g=i(69442),m=i(70554),y=i(88815),x=i(26128),T=i(1482),w=i(82751),b=i(84387),S=i(93567),E=i(57183),A=!1,C=new o({Extends:h,initialize:function(t){h.call(this);var e=t.config,i={alpha:e.transparent,desynchronized:e.desynchronized,depth:!0,antialias:e.antialiasGL,premultipliedAlpha:e.premultipliedAlpha,stencil:!0,failIfMajorPerformanceCaveat:e.failIfMajorPerformanceCaveat,powerPreference:e.powerPreference,preserveDrawingBuffer:e.preserveDrawingBuffer,willReadFrequently:!1};this.config={clearBeforeRender:e.clearBeforeRender,antialias:e.antialias,backgroundColor:e.backgroundColor,contextCreation:i,roundPixels:e.roundPixels,maxTextures:e.maxTextures,maxTextureSize:e.maxTextureSize,batchSize:e.batchSize,maxLights:e.maxLights,mipmapFilter:e.mipmapFilter},this.game=t,this.type=a.WEBGL,this.pipelines=null,this.width=0,this.height=0,this.canvas=t.canvas,this.blendModes=[],this.contextLost=!1,this.snapshotState={x:0,y:0,width:1,height:1,getPixel:!1,callback:null,type:"image/png",encoder:.92,isFramebuffer:!1,bufferWidth:0,bufferHeight:0},this.maxTextures=0,this.textureIndexes,this.glBufferWrappers=[],this.glProgramWrappers=[],this.glTextureWrappers=[],this.glFramebufferWrappers=[],this.glAttribLocationWrappers=[],this.glUniformLocationWrappers=[],this.currentFramebuffer=null,this.fboStack=[],this.currentProgram=null,this.currentBlendMode=1/0,this.currentScissorEnabled=!1,this.currentScissor=null,this.scissorStack=[],this.contextLostHandler=d,this.contextRestoredHandler=d,this.previousContextLostHandler=d,this.previousContextRestoredHandler=d,this.gl=null,this.supportedExtensions=null,this.instancedArraysExtension=null,this.vaoExtension=null,this.extensions={},this.glFormats,this.compression,this.drawingBufferHeight=0,this.blankTexture=null,this.normalTexture=null,this.whiteTexture=null,this.maskCount=0,this.maskStack=[],this.currentMask={mask:null,camera:null},this.currentCameraMask={mask:null,camera:null},this.glFuncMap=null,this.currentType="",this.newType=!1,this.nextTypeMatch=!1,this.finalType=!1,this.mipmapFilter=null,this.defaultScissor=[0,0,0,0],this.isBooted=!1,this.renderTarget=null,this.projectionMatrix,this.projectionWidth=0,this.projectionHeight=0,this.maskSource=null,this.maskTarget=null,this.spector=null,this._debugCapture=!1,this.init(this.config)},init:function(t){var e,i=this.game,s=this.canvas,n=t.backgroundColor;if(!(e=i.config.context?i.config.context:s.getContext("webgl",t.contextCreation)||s.getContext("experimental-webgl",t.contextCreation))||e.isContextLost())throw this.contextLost=!0,new Error("WebGL unsupported");this.gl=e,this.setExtensions(),this.setContextHandlers(),i.context=e;for(var r=0;r<=27;r++)this.blendModes.push({func:[e.ONE,e.ONE_MINUS_SRC_ALPHA],equation:e.FUNC_ADD});this.blendModes[1].func=[e.ONE,e.DST_ALPHA],this.blendModes[2].func=[e.DST_COLOR,e.ONE_MINUS_SRC_ALPHA],this.blendModes[3].func=[e.ONE,e.ONE_MINUS_SRC_COLOR],this.blendModes[17]={func:[e.ZERO,e.ONE_MINUS_SRC_ALPHA],equation:e.FUNC_REVERSE_SUBTRACT},this.glFormats=[e.BYTE,e.SHORT,e.UNSIGNED_BYTE,e.UNSIGNED_SHORT,e.FLOAT],this.glFuncMap={mat2:{func:e.uniformMatrix2fv,length:1,matrix:!0},mat3:{func:e.uniformMatrix3fv,length:1,matrix:!0},mat4:{func:e.uniformMatrix4fv,length:1,matrix:!0},"1f":{func:e.uniform1f,length:1},"1fv":{func:e.uniform1fv,length:1},"1i":{func:e.uniform1i,length:1},"1iv":{func:e.uniform1iv,length:1},"2f":{func:e.uniform2f,length:2},"2fv":{func:e.uniform2fv,length:1},"2i":{func:e.uniform2i,length:2},"2iv":{func:e.uniform2iv,length:1},"3f":{func:e.uniform3f,length:3},"3fv":{func:e.uniform3fv,length:1},"3i":{func:e.uniform3i,length:3},"3iv":{func:e.uniform3iv,length:1},"4f":{func:e.uniform4f,length:4},"4fv":{func:e.uniform4fv,length:1},"4i":{func:e.uniform4i,length:4},"4iv":{func:e.uniform4iv,length:1}},t.maxTextures&&-1!==t.maxTextures||(t.maxTextures=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)),t.maxTextureSize||(t.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE)),this.compression=this.getCompressedTextures(),e.disable(e.DEPTH_TEST),e.disable(e.CULL_FACE),e.enable(e.BLEND),e.clearColor(n.redGL,n.greenGL,n.blueGL,n.alphaGL),e.clear(e.COLOR_BUFFER_BIT);return-1!==["NEAREST","LINEAR","NEAREST_MIPMAP_NEAREST","LINEAR_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_LINEAR"].indexOf(t.mipmapFilter)&&(this.mipmapFilter=e[t.mipmapFilter]),this.maxTextures=m.checkShaderMax(e,t.maxTextures),this.textureIndexes=[],this.createTemporaryTextures(),this.pipelines=new f(this),this.setBlendMode(a.BlendModes.NORMAL),this.projectionMatrix=(new c).identity(),i.textures.once(g.READY,this.boot,this),this},boot:function(){var t=this.game,e=this.pipelines,i=t.scale.baseSize,s=i.width,n=i.height;this.width=s,this.height=n,this.isBooted=!0,this.renderTarget=new p(this,s,n,1,0,!0,!0),this.maskTarget=new p(this,s,n,1,0,!0,!0),this.maskSource=new p(this,s,n,1,0,!0,!0);var r=t.config;e.boot(r.pipeline,r.defaultPipeline,r.autoMobilePipeline),this.blankTexture=t.textures.getFrame("__DEFAULT").glTexture,this.normalTexture=t.textures.getFrame("__NORMAL").glTexture,this.whiteTexture=t.textures.getFrame("__WHITE").glTexture;var o=this.gl;o.bindFramebuffer(o.FRAMEBUFFER,null),o.enable(o.SCISSOR_TEST),t.scale.on(v.RESIZE,this.onResize,this),this.resize(s,n)},setExtensions:function(){var t=this.gl,e=t.getSupportedExtensions();this.supportedExtensions=e;var i="ANGLE_instanced_arrays";this.instancedArraysExtension=e.indexOf(i)>-1?t.getExtension(i):null;var s="OES_vertex_array_object";this.vaoExtension=e.indexOf(s)>-1?t.getExtension(s):null},setContextHandlers:function(t,e){this.previousContextLostHandler&&this.canvas.removeEventListener("webglcontextlost",this.previousContextLostHandler,!1),this.previousContextRestoredHandler&&this.canvas.removeEventListener("webglcontextlost",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(l.LOSE_WEBGL,this),t.preventDefault()},dispatchContextRestored:function(t){var e=this.gl;if(e.isContextLost())console&&console.log("WebGL Context restored, but context is still lost");else{this.currentProgram=null,this.currentFramebuffer=null,this.setBlendMode(a.BlendModes.NORMAL),e.disable(e.BLEND),e.disable(e.DEPTH_TEST),e.enable(e.CULL_FACE),this.compression=this.getCompressedTextures();var i=function(t){t.createResource()};s(this.glTextureWrappers,i),s(this.glBufferWrappers,i),s(this.glFramebufferWrappers,i),s(this.glProgramWrappers,i),s(this.glAttribLocationWrappers,i),s(this.glUniformLocationWrappers,i),this.createTemporaryTextures(),this.pipelines.restoreContext(),this.resize(this.game.scale.baseSize.width,this.game.scale.baseSize.height),this.setExtensions(),this.contextLost=!1,console&&console.warn("WebGL Context restored. Renderer running again."),this.emit(l.RESTORE_WEBGL,this),t.preventDefault()}},createTemporaryTextures:function(){for(var t=this.gl,e=0;e0&&s>0;if(o&&a){var h=o[0],l=o[1],u=o[2],c=o[3];a=h!==t||l!==e||u!==i||c!==s}a&&(this.flush(),r.scissor(t,n-e-s,i,s))},resetScissor:function(){var t=this.gl;t.enable(t.SCISSOR_TEST);var e=this.currentScissor;if(e){var i=e[0],s=e[1],n=e[2],r=e[3];n>0&&r>0&&t.scissor(i,this.drawingBufferHeight-s-r,n,r)}},popScissor:function(){var t=this.scissorStack;t.pop();var e=t[t.length-1];e&&this.setScissor(e[0],e[1],e[2],e[3]),this.currentScissor=e},hasActiveStencilMask:function(){var t=this.currentMask.mask,e=this.currentCameraMask.mask;return t&&t.isStencil||e&&e.isStencil},resetViewport:function(){var t=this.gl;t.viewport(0,0,this.width,this.height),this.drawingBufferHeight=t.drawingBufferHeight},setBlendMode:function(t,e){void 0===e&&(e=!1);var i=this.gl,s=this.blendModes[t];return!!(e||t!==a.BlendModes.SKIP_CHECK&&this.currentBlendMode!==t)&&(this.flush(),i.enable(i.BLEND),i.blendEquation(s.equation),s.func.length>2?i.blendFuncSeparate(s.func[0],s.func[1],s.func[2],s.func[3]):i.blendFunc(s.func[0],s.func[1]),this.currentBlendMode=t,!0)},addBlendMode:function(t,e){return this.blendModes.push({func:t,equation:e})-1},updateBlendMode:function(t,e,i){return this.blendModes[t]&&(this.blendModes[t].func=e,i&&(this.blendModes[t].equation=i)),this},removeBlendMode:function(t){return t>17&&this.blendModes[t]&&this.blendModes.splice(t,1),this},pushFramebuffer:function(t,e,i,s,n){return t===this.currentFramebuffer?this:(this.fboStack.push(t),this.setFramebuffer(t,e,i,s,n))},setFramebuffer:function(t,e,i,s,n){if(void 0===e&&(e=!1),void 0===i&&(i=!0),void 0===s&&(s=null),void 0===n&&(n=!1),t===this.currentFramebuffer)return this;var r=this.gl,o=this.width,a=this.height;return t&&t.renderTexture&&i?(o=t.renderTexture.width,a=t.renderTexture.height):this.flush(),t?r.bindFramebuffer(r.FRAMEBUFFER,t.webGLFramebuffer):r.bindFramebuffer(r.FRAMEBUFFER,null),i&&r.viewport(0,0,o,a),s&&r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,s.webGLTexture,0),n&&(r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT)),e&&(t?(this.drawingBufferHeight=a,this.pushScissor(0,0,o,a)):(this.drawingBufferHeight=this.height,this.popScissor())),this.currentFramebuffer=t,this},popFramebuffer:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!0);var i=this.fboStack;i.pop();var s=i[i.length-1];return s||(s=null),this.setFramebuffer(s,t,e),s},restoreFramebuffer:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!0);var i=this.fboStack,s=i[i.length-1];s||(s=null),this.currentFramebuffer=null,this.setFramebuffer(s,t,e)},setProgram:function(t){return t!==this.currentProgram&&(this.flush(),this.gl.useProgram(t.webGLProgram),this.currentProgram=t,!0)},resetProgram:function(){return this.gl.useProgram(this.currentProgram.webGLProgramWrapper),this},createTextureFromSource:function(t,e,i,s,n){void 0===n&&(n=!1);var r=this.gl,o=r.NEAREST,h=r.NEAREST,l=r.CLAMP_TO_EDGE;e=t?t.width:e,i=t?t.height:i;var c=u(e,i);if(c&&!n&&(l=r.REPEAT),s===a.ScaleModes.LINEAR&&this.config.antialias){var d=t&&t.compressed,f=!d&&c||d&&t.mipmaps.length>1;o=this.mipmapFilter&&f?this.mipmapFilter:r.LINEAR,h=r.LINEAR}return t||"number"!=typeof e||"number"!=typeof i?this.createTexture2D(0,o,h,l,l,r.RGBA,t):this.createTexture2D(0,o,h,l,l,r.RGBA,null,e,i)},createTexture2D:function(t,e,i,s,n,r,o,a,h,l,u,c){"number"!=typeof a&&(a=o?o.width:1),"number"!=typeof h&&(h=o?o.height:1);var d=new w(this.gl,t,e,i,s,n,r,o,a,h,l,u,c);return this.glTextureWrappers.push(d),d},createFramebuffer:function(t,e,i,s){this.currentFramebuffer=null;var n=new b(this.gl,t,e,i,s);return this.glFramebufferWrappers.push(n),n},beginBitmapMask:function(t,e){this.gl&&(this.flush(),this.maskTarget.bind(!0),this.currentCameraMask.mask!==t&&(this.currentMask.mask=t,this.currentMask.camera=e))},drawBitmapMask:function(t,e,i){this.flush(),this.maskSource.bind(),this.setBlendMode(0,!0),t.renderWebGL(this,t,e),this.maskSource.unbind(!0),this.maskTarget.unbind();var s=this.gl,n=this.getCurrentStencilMask();n?(s.enable(s.STENCIL_TEST),n.mask.applyStencil(this,n.camera,!0)):this.currentMask.mask=null,this.pipelines.set(i),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,this.maskTarget.texture.webGLTexture),s.activeTexture(s.TEXTURE1),s.bindTexture(s.TEXTURE_2D,this.maskSource.texture.webGLTexture)},createProgram:function(t,e){var i=new T(this.gl,t,e);return this.glProgramWrappers.push(i),i},createVertexBuffer:function(t,e){var i=this.gl,s=new x(i,t,i.ARRAY_BUFFER,e);return this.glBufferWrappers.push(s),s},createAttribLocation:function(t,e){var i=new S(this.gl,t,e);return this.glAttribLocationWrappers.push(i),i},createUniformLocation:function(t,e){var i=new E(this.gl,t,e);return this.glUniformLocationWrappers.push(i),i},createIndexBuffer:function(t,e){var i=this.gl,s=new x(i,t,i.ELEMENT_ARRAY_BUFFER,e);return this.glBufferWrappers.push(s),s},deleteTexture:function(t){if(t)return n(this.glTextureWrappers,t),t.destroy(),this},deleteFramebuffer:function(t){return t?(n(this.fboStack,t),n(this.glFramebufferWrappers,t),t.destroy(),this):this},deleteProgram:function(t){return t&&(n(this.glProgramWrappers,t),t.destroy()),this},deleteAttribLocation:function(t){return t&&(n(this.glAttribLocationWrappers,t),t.destroy()),this},deleteUniformLocation:function(t){return t&&(n(this.glUniformLocationWrappers,t),t.destroy()),this},deleteBuffer:function(t){return t?(n(this.glBufferWrappers,t),t.destroy(),this):this},preRenderCamera:function(t){var e=t.x,i=t.y,s=t.width,n=t.height,o=t.backgroundColor;(t.emit(r.PRE_RENDER,t),this.pipelines.preBatchCamera(t),this.pushScissor(e,i,s,n),t.mask&&(this.currentCameraMask.mask=t.mask,this.currentCameraMask.camera=t._maskCamera,t.mask.preRenderWebGL(this,t,t._maskCamera)),o.alphaGL>0)&&this.pipelines.setMulti().drawFillRect(e,i,s,n,m.getTintFromFloats(o.blueGL,o.greenGL,o.redGL,1),o.alphaGL)},getCurrentStencilMask:function(){var t=null,e=this.maskStack,i=this.currentCameraMask;return e.length>0?t=e[e.length-1]:i.mask&&i.mask.isStencil&&(t=i),t},postRenderCamera:function(t){var e=t.flashEffect,i=t.fadeEffect;if(e.isRunning||i.isRunning||i.isComplete){var s=this.pipelines.setMulti();e.postRenderWebGL(s,m.getTintFromFloats),i.postRenderWebGL(s,m.getTintFromFloats)}t.dirty=!1,this.popScissor(),t.mask&&(this.currentCameraMask.mask=null,t.mask.postRenderWebGL(this,t._maskCamera)),this.pipelines.postBatchCamera(t),t.emit(r.POST_RENDER,t)},preRender:function(){if(!this.contextLost){var t=this.gl;if(t.bindFramebuffer(t.FRAMEBUFFER,null),this.emit(l.PRE_RENDER_CLEAR),this.config.clearBeforeRender){var e=this.config.backgroundColor;t.clearColor(e.redGL,e.greenGL,e.blueGL,e.alphaGL),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT)}t.enable(t.SCISSOR_TEST),this.currentScissor=this.defaultScissor,this.scissorStack.length=0,this.scissorStack.push(this.currentScissor),this.game.scene.customViewports&&t.scissor(0,this.drawingBufferHeight-this.height,this.width,this.height),this.currentMask.mask=null,this.currentCameraMask.mask=null,this.maskStack.length=0,this.emit(l.PRE_RENDER)}},render:function(t,e,i){if(!this.contextLost){var s=e.length;if(this.emit(l.RENDER,t,i),this.preRenderCamera(i),0===s)return this.setBlendMode(a.BlendModes.NORMAL),void this.postRenderCamera(i);this.currentType="";for(var n=this.currentMask,r=0;r{var s=i(83419),n=i(95428),r=i(95540),o=i(14500),a=new s({initialize:function(t,e,i,s,n){this.pipeline=t,this.name=e,this.renderer=t.renderer,this.gl=this.renderer.gl,this.fragSrc=s,this.vertSrc=i,this.program=this.renderer.createProgram(i,s),this.attributes,this.vertexComponentCount=0,this.vertexSize=0,this.uniforms={},this.createAttributes(n),this.createUniforms()},createAttributes:function(t){var e=0,i=0,s=[];this.vertexComponentCount=0;for(var n=0;n=0?(e.enableVertexAttribArray(p.webGLAttribLocation),e.vertexAttribPointer(p.webGLAttribLocation,h,l,f,s,u),a.enabled=!0,a.location=p):-1!==p.webGLAttribLocation&&e.disableVertexAttribArray(p.webGLAttribLocation)}else c?e.vertexAttribPointer(d.webGLAttribLocation,h,l,f,s,u):!c&&-1!==d&&d.webGLAttribLocation>-1&&(e.disableVertexAttribArray(d.webGLAttribLocation),a.location=-1)}return this},createUniforms:function(){var t,e,i,s=this.gl,n=this.program,r=this.uniforms,o=s.getProgramParameter(n.webGLProgram,s.ACTIVE_UNIFORMS);for(t=0;t0&&(e=e.substr(0,h),r.hasOwnProperty(e)||null!==(i=this.renderer.createUniformLocation(n,e))&&(r[e]={name:e,location:i,setter:null,value1:null,value2:null,value3:null,value4:null}))}}return this},syncUniforms:function(){var t=this.gl;for(var e in this.renderer.setProgram(this.program),this.uniforms){var i=this.uniforms[e];i.setter&&i.setter.call(t,i.location.webGLUniformLocation,i.value1,i.value2,i.value3,i.value4)}},hasUniform:function(t){return this.uniforms.hasOwnProperty(t)},resetUniform:function(t){var e=this.uniforms[t];return e&&(e.value1=null,e.value2=null,e.value3=null,e.value4=null),this},setUniform1:function(t,e,i,s){var n=this.uniforms[e];return n?((s||n.value1!==i)&&(n.setter||(n.setter=t),n.value1=i,this.renderer.setProgram(this.program),t.call(this.gl,n.location.webGLUniformLocation,i),this.pipeline.currentShader=this),this):this},setUniform2:function(t,e,i,s,n){var r=this.uniforms[e];return r?((n||r.value1!==i||r.value2!==s)&&(r.setter||(r.setter=t),r.value1=i,r.value2=s,this.renderer.setProgram(this.program),t.call(this.gl,r.location.webGLUniformLocation,i,s),this.pipeline.currentShader=this),this):this},setUniform3:function(t,e,i,s,n,r){var o=this.uniforms[e];return o?((r||o.value1!==i||o.value2!==s||o.value3!==n)&&(o.setter||(o.setter=t),o.value1=i,o.value2=s,o.value3=n,this.renderer.setProgram(this.program),t.call(this.gl,o.location.webGLUniformLocation,i,s,n),this.pipeline.currentShader=this),this):this},setUniform4:function(t,e,i,s,n,r,o){var a=this.uniforms[e];return a?((o||a.value1!==i||a.value2!==s||a.value3!==n||a.value4!==r)&&(a.setter||(a.setter=t),a.value1=i,a.value2=s,a.value3=n,a.value4=r,this.renderer.setProgram(this.program),t.call(this.gl,a.location.webGLUniformLocation,i,s,n,r),this.pipeline.currentShader=this),this):this},setBoolean:function(t,e){return this.setUniform1(this.gl.uniform1i,t,Number(e))},set1f:function(t,e){return this.setUniform1(this.gl.uniform1f,t,e)},set2f:function(t,e,i){return this.setUniform2(this.gl.uniform2f,t,e,i)},set3f:function(t,e,i,s){return this.setUniform3(this.gl.uniform3f,t,e,i,s)},set4f:function(t,e,i,s,n){return this.setUniform4(this.gl.uniform4f,t,e,i,s,n)},set1fv:function(t,e){return this.setUniform1(this.gl.uniform1fv,t,e,!0)},set2fv:function(t,e){return this.setUniform1(this.gl.uniform2fv,t,e,!0)},set3fv:function(t,e){return this.setUniform1(this.gl.uniform3fv,t,e,!0)},set4fv:function(t,e){return this.setUniform1(this.gl.uniform4fv,t,e,!0)},set1iv:function(t,e){return this.setUniform1(this.gl.uniform1iv,t,e,!0)},set2iv:function(t,e){return this.setUniform1(this.gl.uniform2iv,t,e,!0)},set3iv:function(t,e){return this.setUniform1(this.gl.uniform3iv,t,e,!0)},set4iv:function(t,e){return this.setUniform1(this.gl.uniform4iv,t,e,!0)},set1i:function(t,e){return this.setUniform1(this.gl.uniform1i,t,e)},set2i:function(t,e,i){return this.setUniform2(this.gl.uniform2i,t,e,i)},set3i:function(t,e,i,s){return this.setUniform3(this.gl.uniform3i,t,e,i,s)},set4i:function(t,e,i,s,n){return this.setUniform4(this.gl.uniform4i,t,e,i,s,n)},setMatrix2fv:function(t,e,i){return this.setUniform2(this.gl.uniformMatrix2fv,t,e,i,!0)},setMatrix3fv:function(t,e,i){return this.setUniform2(this.gl.uniformMatrix3fv,t,e,i,!0)},setMatrix4fv:function(t,e,i){return this.setUniform2(this.gl.uniformMatrix4fv,t,e,i,!0)},createProgram:function(t,e){return void 0===t&&(t=this.vertSrc),void 0===e&&(e=this.fragSrc),this.program&&this.renderer.deleteProgram(this.program),this.vertSrc=t,this.fragSrc=e,this.program=this.renderer.createProgram(t,e),this.createUniforms(),this.rebind()},destroy:function(){var t=this.renderer;n(this.uniforms,(function(e){t.deleteUniformLocation(e.location)})),this.uniforms=null,n(this.attributes,(function(e){t.deleteAttribLocation(e.location)})),this.attributes=null,t.deleteProgram(this.program),this.pipeline=null,this.renderer=null,this.gl=null,this.program=null}});t.exports=a},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),n=i(79291),r={PipelineManager:i(7530),Pipelines:i(96615),RenderTarget:i(32302),Utils:i(70554),WebGLPipeline:i(29100),WebGLRenderer:i(74797),WebGLShader:i(38683),Wrappers:i(9503)};r=n(!1,r,s),t.exports=r},31302:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(78908),o=i(85191),a=i(14500),h=i(29100),l=new s({Extends:h,initialize:function(t){t.fragShader=n(t,"fragShader",r),t.vertShader=n(t,"vertShader",o),t.batchSize=n(t,"batchSize",1),t.vertices=n(t,"vertices",[-1,1,-1,-7,7,1]),t.attributes=n(t,"attributes",[{name:"inPosition",size:2,type:a.FLOAT}]),h.call(this,t)},boot:function(){h.prototype.boot.call(this),this.set1i("uMainSampler",0),this.set1i("uMaskSampler",1)},resize:function(t,e){h.prototype.resize.call(this,t,e),this.set2f("uResolution",t,e)},beginMask:function(t,e,i){this.renderer.beginBitmapMask(t,i)},endMask:function(t,e,i){var s=this.gl,n=this.renderer,r=t.bitmapMask;r&&s&&(n.drawBitmapMask(r,e,this),i&&this.set2f("uResolution",i.width,i.height),this.set1i("uInvertMaskAlpha",t.invertAlpha),s.drawArrays(this.topology,0,3),i&&this.set2f("uResolution",this.width,this.height),s.bindTexture(s.TEXTURE_2D,null))}});t.exports=l},92651:(t,e,i)=>{var s=i(83419),n=i(58918),r=i(14811),o=i(95540),a=i(43558),h=i(89350),l=i(70554),u=new s({Extends:a,initialize:function(t){t.shaders=[l.setGlowQuality(h.FXGlowFrag,t.game),h.FXShadowFrag,h.FXPixelateFrag,h.FXVignetteFrag,h.FXShineFrag,h.FXBlurLowFrag,h.FXBlurMedFrag,h.FXBlurHighFrag,h.FXGradientFrag,h.FXBloomFrag,h.ColorMatrixFrag,h.FXCircleFrag,h.FXBarrelFrag,h.FXDisplacementFrag,h.FXWipeFrag,h.FXBokehFrag],a.call(this,t);var e=this.game;this.glow=new n.Glow(e),this.shadow=new n.Shadow(e),this.pixelate=new n.Pixelate(e),this.vignette=new n.Vignette(e),this.shine=new n.Shine(e),this.gradient=new n.Gradient(e),this.circle=new n.Circle(e),this.barrel=new n.Barrel(e),this.wipe=new n.Wipe(e),this.bokeh=new n.Bokeh(e);var i=[];i[r.GLOW]=this.onGlow,i[r.SHADOW]=this.onShadow,i[r.PIXELATE]=this.onPixelate,i[r.VIGNETTE]=this.onVignette,i[r.SHINE]=this.onShine,i[r.BLUR]=this.onBlur,i[r.GRADIENT]=this.onGradient,i[r.BLOOM]=this.onBloom,i[r.COLOR_MATRIX]=this.onColorMatrix,i[r.CIRCLE]=this.onCircle,i[r.BARREL]=this.onBarrel,i[r.DISPLACEMENT]=this.onDisplacement,i[r.WIPE]=this.onWipe,i[r.BOKEH]=this.onBokeh,this.fxHandlers=i,this.source,this.target,this.swap},onDraw:function(t,e,i){this.source=t,this.target=e,this.swap=i;var s=t.width,n=t.height,r=this.tempSprite,o=this.fxHandlers;if(r&&r.preFX)for(var a=r.preFX.list,h=0;h{var s=i(83419),n=i(95540),r=i(31063),o=i(57516),a=i(61340),h=i(26099),l=i(29100),u=new s({Extends:o,initialize:function(t){var e=n(t,"fragShader",r);t.fragShader=e.replace("%LIGHT_COUNT%",t.game.renderer.config.maxLights),o.call(this,t),this.inverseRotationMatrix=new Float32Array([1,0,0,0,1,0,0,0,1]),this.currentNormalMap,this.lightsActive=!0,this.tempVec2=new h,this._tempMatrix=new a,this._tempMatrix2=new a},boot:function(){l.prototype.boot.call(this)},onRender:function(t,e){var i=t.sys.lights;if(this.lightsActive=!1,i&&i.active){var s,n=i.getLights(e),r=n.length;this.lightsActive=!0;var o=this.renderer.height,a=e.matrix,h=this.tempVec2;for(this.set1i("uMainSampler",0),this.set1i("uNormSampler",1),this.set2f("uResolution",this.width/2,this.height/2),this.set4f("uCamera",e.x,e.y,e.rotation,e.zoom),this.set3f("uAmbientLightColor",i.ambientColor.r,i.ambientColor.g,i.ambientColor.b),this.set1i("uLightCount",r),s=0;s0&&this.flush();var e=this.inverseRotationMatrix;if(t){var i=-t,s=Math.cos(i),n=Math.sin(i);e[1]=n,e[3]=-n,e[0]=e[4]=s}else e[0]=e[4]=1,e[1]=e[3]=0;this.setMatrix3fv("uInverseRotationMatrix",!1,e),this.currentNormalMapRotation=t}},setTexture2D:function(t,e){var i=this.renderer;void 0===t&&(t=i.whiteTexture);var s=this.getNormalMap(e);this.isNewNormalMap(t,s)&&(this.flush(),this.createBatch(t),this.addTextureToBatch(s),this.currentNormalMap=s);var n=0;e&&e.parentContainer?n=e.getWorldTransformMatrix(this._tempMatrix,this._tempMatrix2).rotationNormalized:e&&(n=e.rotation);return null===this.currentBatch&&(this.createBatch(t),this.addTextureToBatch(s)),this.setNormalMapRotation(n),0},setGameObject:function(t,e){void 0===e&&(e=t.frame);var i=e.glTexture,s=this.getNormalMap(t);if(this.isNewNormalMap(i,s)&&(this.flush(),this.createBatch(i),this.addTextureToBatch(s),this.currentNormalMap=s),t.parentContainer){var n=t.getWorldTransformMatrix(this._tempMatrix,this._tempMatrix2);this.setNormalMapRotation(n.rotationNormalized)}else this.setNormalMapRotation(t.rotation);return null===this.currentBatch&&(this.createBatch(i),this.addTextureToBatch(s)),0},isNewNormalMap:function(t,e){return this.currentTexture!==t||this.currentNormalMap!==e},getNormalMap:function(t){var e;return t?(t.displayTexture?e=t.displayTexture.dataSource[t.displayFrame.sourceIndex]:t.texture?e=t.texture.dataSource[t.frame.sourceIndex]:t.tileset&&(e=Array.isArray(t.tileset)?t.tileset[0].image.dataSource[0]:t.tileset.image.dataSource[0]),e?e.glTexture:this.renderer.normalTexture):this.renderer.normalTexture},batchSprite:function(t,e,i){this.lightsActive&&o.prototype.batchSprite.call(this,t,e,i)},batchTexture:function(t,e,i,s,n,r,a,h,l,u,c,d,f,p,v,g,m,y,x,T,w,b,S,E,A,C,_,M,P,R,L,O){this.lightsActive&&o.prototype.batchTexture.call(this,t,e,i,s,n,r,a,h,l,u,c,d,f,p,v,g,m,y,x,T,w,b,S,E,A,C,_,M,P,R,L,O)},batchTextureFrame:function(t,e,i,s,n,r,a){this.lightsActive&&o.prototype.batchTextureFrame.call(this,t,e,i,s,n,r,a)}});t.exports=u},56527:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(57516),o=i(45561),a=i(60722),h=i(14500),l=i(29100),u=new s({Extends:r,initialize:function(t){t.fragShader=n(t,"fragShader",o),t.vertShader=n(t,"vertShader",a),t.attributes=n(t,"attributes",[{name:"inPosition",size:2},{name:"inTexCoord",size:2},{name:"inTexId"},{name:"inTintEffect"},{name:"inTint",size:4,type:h.UNSIGNED_BYTE,normalized:!0}]),t.forceZero=!0,t.resizeUniform="uResolution",r.call(this,t)},boot:function(){l.prototype.boot.call(this);var t=this.renderer;this.set1i("uMainSampler",0),this.set2f("uResolution",t.width,t.height)}});t.exports=u},57516:(t,e,i)=>{var s=i(83419),n=i(94811),r=i(95540),o=i(98840),a=i(44667),h=i(61340),l=i(70554),u=i(14500),c=i(29100),d=new s({Extends:c,initialize:function(t){var e=t.game.renderer,i=r(t,"fragShader",o);t.fragShader=l.parseFragmentShaderMaxTextures(i,e.maxTextures),t.vertShader=r(t,"vertShader",a),t.attributes=r(t,"attributes",[{name:"inPosition",size:2},{name:"inTexCoord",size:2},{name:"inTexId"},{name:"inTintEffect"},{name:"inTint",size:4,type:u.UNSIGNED_BYTE,normalized:!0}]),t.resizeUniform="uResolution",c.call(this,t),this._tempMatrix1=new h,this._tempMatrix2=new h,this._tempMatrix3=new h,this.calcMatrix=new h,this.tempTriangle=[{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0}],this.strokeTint={TL:0,TR:0,BL:0,BR:0},this.fillTint={TL:0,TR:0,BL:0,BR:0},this.currentFrame={u0:0,v0:0,u1:1,v1:1},this.firstQuad=[0,0,0,0,0],this.prevQuad=[0,0,0,0,0],this.polygonCache=[]},boot:function(){c.prototype.boot.call(this);var t=this.renderer;this.set1iv("uMainSampler",t.textureIndexes),this.set2f("uResolution",t.width,t.height)},batchSprite:function(t,e,i){this.manager.set(this,t);var s=this._tempMatrix1,n=this._tempMatrix2,r=this._tempMatrix3,o=t.frame,a=o.glTexture,h=o.u0,u=o.v0,c=o.u1,d=o.v1,f=o.x,p=o.y,v=o.cutWidth,g=o.cutHeight,m=o.customPivot,y=t.displayOriginX,x=t.displayOriginY,T=-y+f,w=-x+p;if(t.isCropped){var b=t._crop;b.flipX===t.flipX&&b.flipY===t.flipY||o.updateCropUVs(b,t.flipX,t.flipY),h=b.u0,u=b.v0,c=b.u1,d=b.v1,v=b.width,g=b.height,T=-y+(f=b.x),w=-x+(p=b.y)}var S=1,E=1;t.flipX&&(m||(T+=-o.realWidth+2*y),S=-1),t.flipY&&(m||(w+=-o.realHeight+2*x),E=-1);var A=t.x,C=t.y;e.roundPixels&&(A=Math.floor(A),C=Math.floor(C)),n.applyITRS(A,C,t.rotation,t.scaleX*S,t.scaleY*E),s.copyFrom(e.matrix),i?(s.multiplyWithOffset(i,-e.scrollX*t.scrollFactorX,-e.scrollY*t.scrollFactorY),n.e=A,n.f=C):(n.e-=e.scrollX*t.scrollFactorX,n.f-=e.scrollY*t.scrollFactorY),s.multiply(n,r);var _=r.setQuad(T,w,T+v,w+g,e.renderRoundPixels),M=l.getTintAppendFloatAlpha,P=e.alpha,R=M(t.tintTopLeft,P*t._alphaTL),L=M(t.tintTopRight,P*t._alphaTR),O=M(t.tintBottomLeft,P*t._alphaBL),F=M(t.tintBottomRight,P*t._alphaBR);this.shouldFlush(6)&&this.flush();var D=this.setGameObject(t,o);this.manager.preBatch(t),this.batchQuad(t,_[0],_[1],_[2],_[3],_[4],_[5],_[6],_[7],h,u,c,d,R,L,O,F,t.tintFill,a,D),this.manager.postBatch(t)},batchTexture:function(t,e,i,s,n,r,o,a,h,l,u,c,d,f,p,v,g,m,y,x,T,w,b,S,E,A,C,_,M,P,R,L,O){void 0===O&&(O=!1),this.manager.set(this,t);var F=this._tempMatrix1,D=this._tempMatrix2,I=this._tempMatrix3,k=m/i+C,B=y/s+_,N=(m+x)/i+C,U=(y+T)/s+_,X=o,Y=a,z=-v,G=-g;if(t.isCropped){var V=t._crop,W=V.width,H=V.height;X=W,Y=H,o=W,a=H;var j=m=V.x,q=y=V.y;c&&(j=x-V.x-W),d&&(q=T-V.y-H),k=j/i+C,B=q/s+_,N=(j+W)/i+C,U=(q+H)/s+_,z=-v+m,G=-g+y}c&&(X*=-1,z+=o),(d^=!R&&e.isRenderTexture?1:0)&&(Y*=-1,G+=a),M.roundPixels&&(n=Math.floor(n),r=Math.floor(r)),D.applyITRS(n,r,u,h,l),F.copyFrom(M.matrix),P?(F.multiplyWithOffset(P,-M.scrollX*f,-M.scrollY*p),D.e=n,D.f=r):(D.e-=M.scrollX*f,D.f-=M.scrollY*p),F.multiply(D,I);var K=I.setQuad(z,G,z+X,G+Y,M.renderRoundPixels);null==L&&(L=this.setTexture2D(e)),t&&!O&&this.manager.preBatch(t),this.batchQuad(t,K[0],K[1],K[2],K[3],K[4],K[5],K[6],K[7],k,B,N,U,w,b,S,E,A,e,L),t&&!O&&this.manager.postBatch(t)},batchTextureFrame:function(t,e,i,s,n,r,o){this.manager.set(this);var a=this._tempMatrix1.copyFrom(r),h=this._tempMatrix2;o?a.multiply(o,h):h=a;var u=h.setQuad(e,i,e+t.width,i+t.height),c=this.setTexture2D(t.source.glTexture);s=l.getTintAppendFloatAlpha(s,n),this.batchQuad(null,u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],t.u0,t.v0,t.u1,t.v1,s,s,s,s,0,t.glTexture,c)},batchFillRect:function(t,e,i,s,n,r){this.renderer.pipelines.set(this);var o=this.calcMatrix;r&&r.multiply(n,o);var a=o.setQuad(t,e,t+i,e+s),h=this.fillTint;this.batchQuad(null,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],0,0,1,1,h.TL,h.TR,h.BL,h.BR,2)},batchFillTriangle:function(t,e,i,s,n,r,o,a){this.renderer.pipelines.set(this);var h=this.calcMatrix;a&&a.multiply(o,h);var l=h.getX(t,e),u=h.getY(t,e),c=h.getX(i,s),d=h.getY(i,s),f=h.getX(n,r),p=h.getY(n,r),v=this.fillTint;this.batchTri(null,l,u,c,d,f,p,0,0,1,1,v.TL,v.TR,v.BL,2)},batchStrokeTriangle:function(t,e,i,s,n,r,o,a,h){var l=this.tempTriangle;l[0].x=t,l[0].y=e,l[0].width=o,l[1].x=i,l[1].y=s,l[1].width=o,l[2].x=n,l[2].y=r,l[2].width=o,l[3].x=t,l[3].y=e,l[3].width=o,this.batchStrokePath(l,o,!1,a,h)},batchFillPath:function(t,e,i){this.renderer.pipelines.set(this);var s=this.calcMatrix;i&&i.multiply(e,s);for(var r,o,a=t.length,h=this.polygonCache,l=this.fillTint.TL,u=this.fillTint.TR,c=this.fillTint.BL,d=0;d0&&X[4]?this.batchQuad(null,F,D,P,R,X[0],X[1],X[2],X[3],0,0,1,1,k,B,N,U,2):(Y[0]=F,Y[1]=D,Y[2]=P,Y[3]=R,Y[4]=1),h&&Y[4]?this.batchQuad(null,_,M,L,O,Y[0],Y[1],Y[2],Y[3],0,0,1,1,k,B,N,U,2):(X[0]=_,X[1]=M,X[2]=L,X[3]=O,X[4]=1)}}},destroy:function(){return this._tempMatrix1.destroy(),this._tempMatrix2.destroy(),this._tempMatrix3.destroy(),this._tempMatrix1=null,this._tempMatrix1=null,this._tempMatrix1=null,c.prototype.destroy.call(this),this}});t.exports=d},43439:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(4127),o=i(89924),a=i(29100),h=new s({Extends:a,initialize:function(t){t.vertShader=n(t,"vertShader",o),t.fragShader=n(t,"fragShader",r),t.attributes=n(t,"attributes",[{name:"inPosition",size:2},{name:"inLightPosition",size:2},{name:"inLightRadius"},{name:"inLightAttenuation"},{name:"inLightColor",size:4}]),a.call(this,t)},onRender:function(t,e){this.set2f("uResolution",this.width,this.height),this.set1f("uCameraZoom",e.zoom)},batchPointLight:function(t,e,i,s,n,r,o,a,h,l,u,c){var d=t.color,f=t.intensity,p=t.radius,v=t.attenuation,g=d.r*f,m=d.g*f,y=d.b*f,x=e.alpha*t.alpha;this.shouldFlush(6)&&this.flush(),this.currentBatch||this.setTexture2D(),this.batchLightVert(i,s,u,c,p,v,g,m,y,x),this.batchLightVert(n,r,u,c,p,v,g,m,y,x),this.batchLightVert(o,a,u,c,p,v,g,m,y,x),this.batchLightVert(i,s,u,c,p,v,g,m,y,x),this.batchLightVert(o,a,u,c,p,v,g,m,y,x),this.batchLightVert(h,l,u,c,p,v,g,m,y,x),this.currentBatch.count=this.vertexCount-this.currentBatch.start},batchLightVert:function(t,e,i,s,n,r,o,a,h,l){var u=this.vertexViewF32,c=this.vertexCount*this.currentShader.vertexComponentCount-1;u[++c]=t,u[++c]=e,u[++c]=i,u[++c]=s,u[++c]=n,u[++c]=r,u[++c]=o,u[++c]=a,u[++c]=h,u[++c]=l,this.vertexCount++}});t.exports=h},84057:(t,e,i)=>{var s=i(83419),n=i(89422),r=i(95540),o=i(27681),a=i(49627),h=i(29100),l=new s({Extends:h,initialize:function(t){t.renderTarget=r(t,"renderTarget",1),t.fragShader=r(t,"fragShader",o),t.vertShader=r(t,"vertShader",a),t.attributes=r(t,"attributes",[{name:"inPosition",size:2},{name:"inTexCoord",size:2}]),t.batchSize=1,t.vertices=[-1,-1,0,0,-1,1,0,1,1,1,1,1,-1,-1,0,0,1,1,1,1,1,-1,1,0],h.call(this,t),this.isPostFX=!0,this.gameObject,this.controller,this.colorMatrix=new n,this.fullFrame1,this.fullFrame2,this.halfFrame1,this.halfFrame2,this.renderer.isBooted&&(this.manager=this.renderer.pipelines)},bootFX:function(){h.prototype.boot.call(this);var t=this.manager.UTILITY_PIPELINE;this.fullFrame1=t.fullFrame1,this.fullFrame2=t.fullFrame2,this.halfFrame1=t.halfFrame1,this.halfFrame2=t.halfFrame2;var e=this.renderer;this.set1i("uMainSampler",0),this.set2f("uResolution",e.width,e.height);for(var i=this.renderTargets,s=0;s{var s=i(10312),n=i(67502),r=i(83419),o=i(96293),a=i(95540),h=i(57516),l=i(27681),u=i(87841),c=i(32302),d=i(45561),f=i(60722),p=i(29100),v=new r({Extends:h,initialize:function(t){var e=a(t,"fragShader",l),i=a(t,"vertShader",f),s=a(t,"drawShader",l),n=[{name:"DrawSprite",fragShader:d,vertShader:f},{name:"CopySprite",fragShader:e,vertShader:i},{name:"DrawGame",fragShader:s,vertShader:f},{name:"ColorMatrix",fragShader:o}],r=a(t,"shaders",[]);t.shaders=n.concat(r),t.vertShader||(t.vertShader=i),t.batchSize=1,h.call(this,t),this.isPreFX=!0,this.customMainSampler=null,this.drawSpriteShader,this.copyShader,this.gameShader,this.colorMatrixShader,this.quadVertexData,this.quadVertexBuffer,this.quadVertexViewF32,this.spriteBounds=new u,this.targetBounds=new u,this.fsTarget,this.tempSprite,this.renderer.isBooted&&(this.manager=this.renderer.pipelines,this.boot())},boot:function(){p.prototype.boot.call(this);var t=this.shaders,e=this.renderer;this.drawSpriteShader=t[0],this.copyShader=t[1],this.gameShader=t[2],this.colorMatrixShader=t[3],this.fsTarget=new c(e,e.width,e.height,1,0,!0,!0),this.renderTargets=this.manager.renderTargets.concat(this.fsTarget);var i=new ArrayBuffer(168);this.quadVertexData=i,this.quadVertexViewF32=new Float32Array(i),this.quadVertexBuffer=e.createVertexBuffer(i,this.gl.STATIC_DRAW),this.onResize(e.width,e.height),this.currentShader=this.copyShader,this.set2f("uResolution",e.width,e.height)},onResize:function(t,e){var i=this.quadVertexViewF32;i[1]=e,i[22]=e,i[14]=t,i[28]=t,i[35]=t,i[36]=e},batchQuad:function(t,e,i,s,r,o,a,h,l,u,c,d,f,p,v,g,m,y,x){var T=Math.min(e,s,o,h),w=Math.min(i,r,a,l),b=Math.max(e,s,o,h)-T,S=Math.max(i,r,a,l)-w,E=this.spriteBounds.setTo(T,w,b,S),A=t?t.preFX.padding:0,C=b+2*A,_=S+2*A,M=Math.abs(Math.max(C,_)),P=this.manager.getRenderTarget(M),R=this.targetBounds.setTo(0,0,P.width,P.height);n(R,Math.round(E.centerX),Math.round(E.centerY)),this.tempSprite=t;var L=this.gl,O=this.renderer;O.clearStencilMask(),this.setShader(this.drawSpriteShader),this.set1i("uMainSampler",0),this.set2f("uResolution",O.width,O.height),this.flipProjectionMatrix(!0),t&&(this.onDrawSprite(t,P),t.preFX.onFX(this));var F=this.fsTarget;return this.flush(),L.viewport(0,0,O.width,O.height),L.bindFramebuffer(L.FRAMEBUFFER,F.framebuffer.webGLFramebuffer),L.framebufferTexture2D(L.FRAMEBUFFER,L.COLOR_ATTACHMENT0,L.TEXTURE_2D,F.texture.webGLTexture,0),L.clearColor(0,0,0,0),L.clear(L.COLOR_BUFFER_BIT),this.setTexture2D(x),this.batchVert(e,i,u,c,0,y,p),this.batchVert(s,r,u,f,0,y,g),this.batchVert(o,a,d,f,0,y,m),this.batchVert(e,i,u,c,0,y,p),this.batchVert(o,a,d,f,0,y,m),this.batchVert(h,l,d,c,0,y,v),this.flush(),this.flipProjectionMatrix(!1),L.activeTexture(L.TEXTURE0),L.bindTexture(L.TEXTURE_2D,P.texture.webGLTexture),L.copyTexSubImage2D(L.TEXTURE_2D,0,0,0,R.x,R.y,R.width,R.height),L.bindFramebuffer(L.FRAMEBUFFER,null),L.bindTexture(L.TEXTURE_2D,null),this.onBatch(t),this.currentShader=this.copyShader,this.onDraw(P,this.manager.getSwapRenderTarget(),this.manager.getAltSwapRenderTarget()),!0},onDrawSprite:function(){},onCopySprite:function(){},copySprite:function(t,e,i,n,r,o,a){void 0===i&&(i=!0),void 0===n&&(n=!0),void 0===r&&(r=!1),void 0===a&&(a=this.copyShader);var h=this.gl,l=this.tempSprite;o&&(a=this.colorMatrixShader),this.currentShader=a;var u=this.setVertexBuffer(this.quadVertexBuffer);a.bind(u,!1);var c=this.renderer;if(this.set1i("uMainSampler",0),this.set2f("uResolution",c.width,c.height),l.preFX.onFXCopy(this),this.onCopySprite(t,e,l),o&&(this.set1fv("uColorMatrix",o.getData()),this.set1f("uAlpha",o.alpha)),h.activeTexture(h.TEXTURE0),h.bindTexture(h.TEXTURE_2D,t.texture.webGLTexture),t.height>e.height)h.viewport(0,0,t.width,t.height),this.setTargetUVs(t,e);else{var d=e.height-t.height;h.viewport(0,d,t.width,t.height),this.resetUVs()}if(h.bindFramebuffer(h.FRAMEBUFFER,e.framebuffer.webGLFramebuffer),h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,e.texture.webGLTexture,0),i&&(h.clearColor(0,0,0,Number(!n)),h.clear(h.COLOR_BUFFER_BIT)),r){var f=this.renderer.currentBlendMode;this.renderer.setBlendMode(s.ERASE)}h.bufferData(h.ARRAY_BUFFER,this.quadVertexData,h.STATIC_DRAW),h.drawArrays(h.TRIANGLES,0,6),r&&this.renderer.setBlendMode(f),h.bindFramebuffer(h.FRAMEBUFFER,null)},copy:function(t,e){var i=this.gl;this.set1i("uMainSampler",0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.texture.webGLTexture),i.viewport(0,0,t.width,t.height),this.setUVs(0,0,0,1,1,1,1,0),i.bindFramebuffer(i.FRAMEBUFFER,e.framebuffer.webGLFramebuffer),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,e.texture.webGLTexture,0),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT),i.bufferData(i.ARRAY_BUFFER,this.quadVertexData,i.STATIC_DRAW),i.drawArrays(i.TRIANGLES,0,6),i.bindFramebuffer(i.FRAMEBUFFER,null)},blendFrames:function(t,e,i,s,n){this.manager.blendFrames(t,e,i,s,n)},blendFramesAdditive:function(t,e,i,s,n){this.manager.blendFramesAdditive(t,e,i,s,n)},drawToGame:function(t){this.currentShader=null,this.setShader(this.copyShader),this.bindAndDraw(t)},copyToGame:function(t){this.currentShader=null,this.setShader(this.gameShader),this.bindAndDraw(t)},bindAndDraw:function(t){var e=this.gl,i=this.renderer;this.set1i("uMainSampler",0),this.customMainSampler?this.setTexture2D(this.customMainSampler):this.setTexture2D(t.texture);var s=this._tempMatrix1.loadIdentity(),n=this.targetBounds.x,r=this.targetBounds.y,o=n+t.width,a=r+t.height,h=s.getX(n,r),l=s.getX(n,a),u=s.getX(o,a),c=s.getX(o,r),d=s.getY(n,r),f=s.getY(n,a),p=s.getY(o,a),v=s.getY(o,r),g=16777215;this.batchVert(h,d,0,0,0,0,g),this.batchVert(l,f,0,1,0,0,g),this.batchVert(u,p,1,1,0,0,g),this.batchVert(h,d,0,0,0,0,g),this.batchVert(u,p,1,1,0,0,g),this.batchVert(c,v,1,0,0,0,g),i.restoreFramebuffer(!1,!0),i.currentFramebuffer||e.viewport(0,0,i.width,i.height),i.restoreStencilMask(),this.flush(),this.tempSprite=null},onDraw:function(t){this.drawToGame(t)},setUVs:function(t,e,i,s,n,r,o,a){var h=this.quadVertexViewF32;h[2]=t,h[3]=e,h[9]=i,h[10]=s,h[16]=n,h[17]=r,h[23]=t,h[24]=e,h[30]=n,h[31]=r,h[37]=o,h[38]=a},setTargetUVs:function(t,e){var i=e.height/t.height;i=i>.5?.5-(i-.5):.5-i+.5,this.setUVs(0,i,0,1+i,1,1+i,1,i)},resetUVs:function(){this.setUVs(0,0,0,1,1,1,1,0)},destroy:function(){return this.renderer.deleteBuffer(this.quadVertexBuffer),this.drawSpriteShader=null,this.copyShader=null,this.gameShader=null,this.colorMatrixShader=null,this.quadVertexData=null,this.quadVertexBuffer=null,this.quadVertexViewF32=null,this.fsTarget=null,this.tempSprite=null,h.prototype.destroy.call(this),this}});t.exports=v},81041:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(57516),o=new s({Extends:r,initialize:function(t){t.topology=5,t.batchSize=n(t,"batchSize",256),r.call(this,t)}});t.exports=o},12385:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(57516),o=i(45561),a=i(60722),h=i(29100),l=new s({Extends:r,initialize:function(t){t.fragShader=n(t,"fragShader",o),t.vertShader=n(t,"vertShader",a),t.forceZero=!0,r.call(this,t)},boot:function(){h.prototype.boot.call(this);var t=this.renderer;this.set1i("uMainSampler",0),this.set2f("uResolution",t.width,t.height)}});t.exports=l},7589:(t,e,i)=>{var s=i(35407),n=i(10312),r=i(83419),o=i(89422),a=i(96293),h=i(36682),l=i(95540),u=i(48247),c=i(49627),d=i(29100),f=new r({Extends:d,initialize:function(t){t.renderTarget=l(t,"renderTarget",[{scale:1,autoResize:!0},{scale:1,autoResize:!0},{scale:.5,autoResize:!0},{scale:.5,autoResize:!0}]),t.vertShader=l(t,"vertShader",c),t.shaders=l(t,"shaders",[{name:"Copy",fragShader:h},{name:"AddBlend",fragShader:s},{name:"LinearBlend",fragShader:u},{name:"ColorMatrix",fragShader:a}]),t.attributes=l(t,"attributes",[{name:"inPosition",size:2},{name:"inTexCoord",size:2}]),t.vertices=[-1,-1,0,0,-1,1,0,1,1,1,1,1,-1,-1,0,0,1,1,1,1,1,-1,1,0],t.batchSize=1,d.call(this,t),this.colorMatrix=new o,this.copyShader,this.addShader,this.linearShader,this.colorMatrixShader,this.fullFrame1,this.fullFrame2,this.halfFrame1,this.halfFrame2},boot:function(){d.prototype.boot.call(this);var t=this.shaders,e=this.renderTargets;this.copyShader=t[0],this.addShader=t[1],this.linearShader=t[2],this.colorMatrixShader=t[3],this.fullFrame1=e[0],this.fullFrame2=e[1],this.halfFrame1=e[2],this.halfFrame2=e[3]},copyFrame:function(t,e,i,s,n){void 0===i&&(i=1),void 0===s&&(s=!0),void 0===n&&(n=!0);var r=this.gl;this.setShader(this.copyShader),this.set1i("uMainSampler",0),this.set1f("uBrightness",i),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,t.texture.webGLTexture),e?(r.viewport(0,0,e.width,e.height),r.bindFramebuffer(r.FRAMEBUFFER,e.framebuffer.webGLFramebuffer),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,e.texture.webGLTexture,0)):r.viewport(0,0,t.width,t.height),s&&(n?r.clearColor(0,0,0,0):r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT)),r.bufferData(r.ARRAY_BUFFER,this.vertexData,r.STATIC_DRAW),r.drawArrays(r.TRIANGLES,0,6),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null)},blitFrame:function(t,e,i,s,r,o,a){void 0===i&&(i=1),void 0===s&&(s=!0),void 0===r&&(r=!0),void 0===o&&(o=!1),void 0===a&&(a=!1);var h=this.gl;if(this.setShader(this.copyShader),this.set1i("uMainSampler",0),this.set1f("uBrightness",i),h.activeTexture(h.TEXTURE0),h.bindTexture(h.TEXTURE_2D,t.texture.webGLTexture),t.height>e.height)h.viewport(0,0,t.width,t.height),this.setTargetUVs(t,e);else{var l=e.height-t.height;h.viewport(0,l,t.width,t.height)}if(h.bindFramebuffer(h.FRAMEBUFFER,e.framebuffer.webGLFramebuffer),h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,e.texture.webGLTexture,0),s&&(r?h.clearColor(0,0,0,0):h.clearColor(0,0,0,1),h.clear(h.COLOR_BUFFER_BIT)),o){var u=this.renderer.currentBlendMode;this.renderer.setBlendMode(n.ERASE)}a&&this.flipY(),h.bufferData(h.ARRAY_BUFFER,this.vertexData,h.STATIC_DRAW),h.drawArrays(h.TRIANGLES,0,6),o&&this.renderer.setBlendMode(u),h.bindFramebuffer(h.FRAMEBUFFER,null),h.bindTexture(h.TEXTURE_2D,null),this.resetUVs()},copyFrameRect:function(t,e,i,s,n,r,o,a){void 0===o&&(o=!0),void 0===a&&(a=!0);var h=this.gl;h.bindFramebuffer(h.FRAMEBUFFER,t.framebuffer.webGLFramebuffer),h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,t.texture.webGLTexture,0),o&&(a?h.clearColor(0,0,0,0):h.clearColor(0,0,0,1),h.clear(h.COLOR_BUFFER_BIT)),h.activeTexture(h.TEXTURE0),h.bindTexture(h.TEXTURE_2D,e.texture.webGLTexture),h.copyTexSubImage2D(h.TEXTURE_2D,0,0,0,i,s,n,r),h.bindFramebuffer(h.FRAMEBUFFER,null),h.bindTexture(h.TEXTURE_2D,null)},copyToGame:function(t){var e=this.gl;this.setShader(this.copyShader),this.set1i("uMainSampler",0),this.set1f("uBrightness",1),this.renderer.popFramebuffer(),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.webGLTexture),e.bufferData(e.ARRAY_BUFFER,this.vertexData,e.STATIC_DRAW),e.drawArrays(e.TRIANGLES,0,6)},drawFrame:function(t,e,i,s){void 0===i&&(i=!0),void 0===s&&(s=this.colorMatrix);var n=this.gl;this.setShader(this.colorMatrixShader),this.set1i("uMainSampler",0),this.set1fv("uColorMatrix",s.getData()),this.set1f("uAlpha",s.alpha),n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,t.texture.webGLTexture),e?(n.viewport(0,0,e.width,e.height),n.bindFramebuffer(n.FRAMEBUFFER,e.framebuffer.webGLFramebuffer),n.framebufferTexture2D(n.FRAMEBUFFER,n.COLOR_ATTACHMENT0,n.TEXTURE_2D,e.texture.webGLTexture,0)):n.viewport(0,0,t.width,t.height),i?n.clearColor(0,0,0,0):n.clearColor(0,0,0,1),n.clear(n.COLOR_BUFFER_BIT),n.bufferData(n.ARRAY_BUFFER,this.vertexData,n.STATIC_DRAW),n.drawArrays(n.TRIANGLES,0,6),n.bindFramebuffer(n.FRAMEBUFFER,null),n.bindTexture(n.TEXTURE_2D,null)},blendFrames:function(t,e,i,s,n,r){void 0===s&&(s=1),void 0===n&&(n=!0),void 0===r&&(r=this.linearShader);var o=this.gl;this.setShader(r),this.set1i("uMainSampler1",0),this.set1i("uMainSampler2",1),this.set1f("uStrength",s),o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,t.texture.webGLTexture),o.activeTexture(o.TEXTURE1),o.bindTexture(o.TEXTURE_2D,e.texture.webGLTexture),i?(o.bindFramebuffer(o.FRAMEBUFFER,i.framebuffer.webGLFramebuffer),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,i.texture.webGLTexture,0),o.viewport(0,0,i.width,i.height)):o.viewport(0,0,t.width,t.height),n?o.clearColor(0,0,0,0):o.clearColor(0,0,0,1),o.clear(o.COLOR_BUFFER_BIT),o.bufferData(o.ARRAY_BUFFER,this.vertexData,o.STATIC_DRAW),o.drawArrays(o.TRIANGLES,0,6),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null)},blendFramesAdditive:function(t,e,i,s,n){this.blendFrames(t,e,i,s,n,this.addShader)},clearFrame:function(t,e){void 0===e&&(e=!0);var i=this.gl;i.viewport(0,0,t.width,t.height),i.bindFramebuffer(i.FRAMEBUFFER,t.framebuffer.webGLFramebuffer),e?i.clearColor(0,0,0,0):i.clearColor(0,0,0,1),i.clear(i.COLOR_BUFFER_BIT);var s=this.renderer.currentFramebuffer;i.bindFramebuffer(i.FRAMEBUFFER,s.webGLFramebuffer)},setUVs:function(t,e,i,s,n,r,o,a){var h=this.vertexViewF32;h[2]=t,h[3]=e,h[6]=i,h[7]=s,h[10]=n,h[11]=r,h[14]=t,h[15]=e,h[18]=n,h[19]=r,h[22]=o,h[23]=a},setTargetUVs:function(t,e){var i=e.height/t.height;i=i>.5?.5-(i-.5):.5-i+.5,this.setUVs(0,i,0,1+i,1,1+i,1,i)},flipX:function(){this.setUVs(1,0,1,1,0,1,0,0)},flipY:function(){this.setUVs(0,1,0,0,1,0,1,1)},resetUVs:function(){this.setUVs(0,0,0,1,1,1,1,0)}});t.exports=f},36060:t=>{t.exports={BITMAPMASK_PIPELINE:"BitmapMaskPipeline",LIGHT_PIPELINE:"Light2D",POINTLIGHT_PIPELINE:"PointLightPipeline",SINGLE_PIPELINE:"SinglePipeline",MULTI_PIPELINE:"MultiPipeline",ROPE_PIPELINE:"RopePipeline",GRAPHICS_PIPELINE:"GraphicsPipeline",POSTFX_PIPELINE:"PostFXPipeline",UTILITY_PIPELINE:"UtilityPipeline",MOBILE_PIPELINE:"MobilePipeline",FX_PIPELINE:"FxPipeline"}},84817:t=>{t.exports="pipelineafterflush"},36712:t=>{t.exports="pipelinebeforeflush"},40285:t=>{t.exports="pipelinebind"},65918:t=>{t.exports="pipelineboot"},92852:t=>{t.exports="pipelinedestroy"},56072:t=>{t.exports="pipelinerebind"},57566:t=>{t.exports="pipelineresize"},77085:(t,e,i)=>{t.exports={AFTER_FLUSH:i(84817),BEFORE_FLUSH:i(36712),BIND:i(40285),BOOT:i(65918),DESTROY:i(92852),REBIND:i(56072),RESIZE:i(57566)}},54812:(t,e,i)=>{var s=i(83419),n=i(99155),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.amount=1},onPreRender:function(t,e){t=this.getController(t),this.set1f("amount",t.amount,e)}});t.exports=o},67329:(t,e,i)=>{var s=i(83419),n=i(24400),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.steps=4,this.offsetX=1,this.offsetY=1,this.blurStrength=1,this.strength=1,this.glcolor=[1,1,1]},onPreRender:function(t){t=this.getController(t),this.set1f("strength",t.blurStrength),this.set3fv("color",t.glcolor)},onDraw:function(t){var e=this.getController(),i=this.fullFrame1,s=this.fullFrame2;this.copyFrame(t,s);for(var n=2/t.width*e.offsetX,r=2/t.height*e.offsetY,o=0;o{var s=i(83419),n=i(41514),r=i(51078),o=i(94328),a=i(84057),h=new s({Extends:a,initialize:function(t){a.call(this,{game:t,shaders:[{name:"Gaussian5",fragShader:n},{name:"Gaussian9",fragShader:r},{name:"Gaussian13",fragShader:o}]}),this.activeShader=this.shaders[0],this.x=2,this.y=2,this.steps=4,this.strength=1,this.glcolor=[1,1,1]},setQualityLow:function(){return this.activeShader=this.shaders[0],this},setQualityMedium:function(){return this.activeShader=this.shaders[1],this},setQualityHigh:function(){return this.activeShader=this.shaders[2],this},onDraw:function(t){var e=this.getController(),i=this.gl,s=this.fullFrame1,n=i.getParameter(i.FRAMEBUFFER_BINDING);this.bind(this.shaders[e.quality]),i.activeTexture(i.TEXTURE0),i.viewport(0,0,t.width,t.height),this.set1i("uMainSampler",0),this.set2f("resolution",t.width,t.height),this.set1f("strength",e.strength),this.set3fv("color",e.glcolor);for(var r=0;r{var s=i(83419),n=i(90610),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.isTiltShift=!1,this.strength=1,this.blurX=1,this.blurY=1,this.radius=.5,this.amount=1,this.contrast=.2},onPreRender:function(t,e,i,s){t=this.getController(t),this.set1f("radius",t.radius,e),this.set1f("amount",t.amount,e),this.set1f("contrast",t.contrast,e),this.set1f("strength",t.strength,e),this.set2f("blur",t.blurX,t.blurY,e),this.setBoolean("isTiltShift",t.isTiltShift,e),i&&s&&this.set2f("resolution",i,s,e)},onDraw:function(t){this.set2f("resolution",t.width,t.height),this.bindAndDraw(t)}});t.exports=o},89428:(t,e,i)=>{var s=i(83419),n=i(91899),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.scale=1,this.feather=.005,this.thickness=8,this.glcolor=[1,.2,.7],this.glcolor2=[1,0,0,.4]},onPreRender:function(t,e,i,s){t=this.getController(t),this.set1f("scale",t.scale,e),this.set1f("feather",t.feather,e),this.set1f("thickness",t.thickness,e),this.set3fv("color",t.glcolor,e),this.set4fv("backgroundColor",t.glcolor2,e),i&&s&&this.set2f("resolution",i,s,e)},onDraw:function(t){this.set2f("resolution",t.width,t.height),this.bindAndDraw(t)}});t.exports=o},88904:(t,e,i)=>{var s=i(83419),n=i(84057),r=new s({Extends:n,initialize:function(t){n.call(this,{game:t})},onDraw:function(t){var e=this.fullFrame1;this.controller?this.manager.drawFrame(t,e,!0,this.controller):this.drawFrame(t,e),this.copyToGame(e)}});t.exports=r},63563:(t,e,i)=>{var s=i(83419),n=i(47838),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.x=.005,this.y=.005,this.glTexture},onBoot:function(){this.setTexture("__WHITE")},setTexture:function(t){var e=this.game.textures.getFrame(t);e&&(this.glTexture=e.glTexture)},onDraw:function(t){var e=this.getController(),i=this.fullFrame1;this.bind(),this.set1i("uMainSampler",0),this.set1i("uDisplacementSampler",1),this.set2f("amount",e.x,e.y),this.bindTexture(e.glTexture,1),this.copySprite(t,i),this.copyToGame(i)}});t.exports=o},94045:(t,e,i)=>{var s=i(83419),n=i(95540),r=i(98656),o=i(84057),a=i(70554),h=new s({Extends:o,initialize:function(t,e){var i=n(e,"quality",.1),s=n(e,"distance",10);o.call(this,{game:t,fragShader:a.setGlowQuality(r,t,i,s)}),this.outerStrength=4,this.innerStrength=0,this.knockout=!1,this.glcolor=[1,1,1,1]},onPreRender:function(t,e,i,s){t=this.getController(t),this.set1f("outerStrength",t.outerStrength,e),this.set1f("innerStrength",t.innerStrength,e),this.set4fv("glowColor",t.glcolor,e),this.setBoolean("knockout",t.knockout,e),i&&s&&this.set2f("resolution",i,s,e)},onDraw:function(t){this.set2f("resolution",t.width,t.height),this.bindAndDraw(t)}});t.exports=h},74088:(t,e,i)=>{var s=i(83419),n=i(70463),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.alpha=.2,this.size=0,this.fromX=0,this.fromY=0,this.toX=0,this.toY=1,this.glcolor1=[255,0,0],this.glcolor2=[0,255,0]},onPreRender:function(t,e){t=this.getController(t),this.set1f("alpha",t.alpha,e),this.set1i("size",t.size,e),this.set3fv("color1",t.glcolor1,e),this.set3fv("color2",t.glcolor2,e),this.set2f("positionFrom",t.fromX,t.fromY,e),this.set2f("positionTo",t.toX,t.toY,e)}});t.exports=o},99636:(t,e,i)=>{var s=i(83419),n=i(50831),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.amount=1},onPreRender:function(t,e,i,s){t=this.getController(t),this.set1f("amount",t.amount,e),i&&s&&this.set2f("resolution",i,s,e)},onDraw:function(t){this.set2f("resolution",t.width,t.height),this.bindAndDraw(t)}});t.exports=o},34700:(t,e,i)=>{var s=i(83419),n=i(92595),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.x=0,this.y=0,this.decay=.1,this.power=1,this.glcolor=[0,0,0,1],this.samples=6,this.intensity=1},onPreRender:function(t,e){var i=(t=this.getController(t)).samples;this.set1i("samples",i,e),this.set1f("intensity",t.intensity,e),this.set1f("decay",t.decay,e),this.set1f("power",t.power/i,e),this.set2f("lightPosition",t.x,t.y,e),this.set4fv("color",t.glcolor,e)}});t.exports=o},91157:(t,e,i)=>{var s=i(83419),n=i(72464),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.speed=.5,this.lineWidth=.5,this.gradient=3,this.reveal=!1},onPreRender:function(t,e,i,s){t=this.getController(t),this.setTime("time",e),this.set1f("speed",t.speed,e),this.set1f("lineWidth",t.lineWidth,e),this.set1f("gradient",t.gradient,e),this.setBoolean("reveal",t.reveal,e),i&&s&&this.set2f("resolution",i,s,e)},onDraw:function(t){this.set2f("resolution",t.width,t.height),this.bindAndDraw(t)}});t.exports=o},27797:(t,e,i)=>{var s=i(83419),n=i(39249),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.x=.5,this.y=.5,this.radius=.5,this.strength=.5},onPreRender:function(t,e){t=this.getController(t),this.set1f("radius",t.radius,e),this.set1f("strength",t.strength,e),this.set2f("position",t.x,t.y,e)}});t.exports=o},67603:(t,e,i)=>{var s=i(83419),n=i(2878),r=i(84057),o=new s({Extends:r,initialize:function(t){r.call(this,{game:t,fragShader:n}),this.progress=0,this.wipeWidth=.1,this.direction=0,this.axis=0,this.reveal=!1},onPreRender:function(t,e){var i=(t=this.getController(t)).progress,s=t.wipeWidth,n=t.direction,r=t.axis;this.set4f("config",i,s,n,r,e),this.setBoolean("reveal",t.reveal,e)}});t.exports=o},58918:(t,e,i)=>{var s={Barrel:i(54812),Bloom:i(67329),Blur:i(8861),Bokeh:i(51051),Circle:i(89428),ColorMatrix:i(88904),Displacement:i(63563),Glow:i(94045),Gradient:i(74088),Pixelate:i(99636),Shadow:i(34700),Shine:i(91157),Vignette:i(27797),Wipe:i(67603)};t.exports=s},96615:(t,e,i)=>{var s=i(36060),n=i(79291),r={FX:i(58918),BitmapMaskPipeline:i(31302),Events:i(77085),FXPipeline:i(92651),LightPipeline:i(96569),MobilePipeline:i(56527),MultiPipeline:i(57516),PointLightPipeline:i(43439),PostFXPipeline:i(84057),PreFXPipeline:i(43558),RopePipeline:i(81041),SinglePipeline:i(12385),UtilityPipeline:i(7589)};r=n(!1,r,s),t.exports=r},35407:t=>{t.exports=["#define SHADER_NAME PHASER_ADD_BLEND_FS","precision mediump float;","uniform sampler2D uMainSampler1;","uniform sampler2D uMainSampler2;","uniform float uStrength;","varying vec2 outTexCoord;","void main ()","{"," vec4 frame1 = texture2D(uMainSampler1, outTexCoord);"," vec4 frame2 = texture2D(uMainSampler2, outTexCoord);"," gl_FragColor = frame1 + frame2 * uStrength;","}"].join("\n")},78908:t=>{t.exports=["#define SHADER_NAME PHASER_BITMAP_MASK_FS","precision mediump float;","uniform vec2 uResolution;","uniform sampler2D uMainSampler;","uniform sampler2D uMaskSampler;","uniform bool uInvertMaskAlpha;","void main ()","{"," vec2 uv = gl_FragCoord.xy / uResolution;"," vec4 mainColor = texture2D(uMainSampler, uv);"," vec4 maskColor = texture2D(uMaskSampler, uv);"," if (!uInvertMaskAlpha)"," {"," mainColor *= maskColor.a;"," }"," else"," {"," mainColor *= (1.0 - maskColor.a);"," }"," gl_FragColor = mainColor;","}"].join("\n")},85191:t=>{t.exports=["#define SHADER_NAME PHASER_BITMAP_MASK_VS","precision mediump float;","attribute vec2 inPosition;","void main ()","{"," gl_Position = vec4(inPosition, 0.0, 1.0);","}"].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];"," vec3 rgb = mix(c.rgb, result.rgb, uAlpha);"," rgb *= result.a;"," gl_FragColor = vec4(rgb, result.a);","}"].join("\n")},36682:t=>{t.exports=["#define SHADER_NAME PHASER_COPY_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform float uBrightness;","varying vec2 outTexCoord;","void main ()","{"," gl_FragColor = texture2D(uMainSampler, outTexCoord) * uBrightness;","}"].join("\n")},99155:t=>{t.exports=["#define SHADER_NAME BARREL_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform float amount;","varying vec2 outTexCoord;","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 = texture2D(uMainSampler, texCoord);","}"].join("\n")},24400:t=>{t.exports=["#define SHADER_NAME BLOOM_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","void main ()","{"," vec4 sum = texture2D(uMainSampler, outTexCoord) * 0.204164 * strength;"," sum = sum + texture2D(uMainSampler, outTexCoord + offset * 1.407333) * 0.304005;"," sum = sum + texture2D(uMainSampler, outTexCoord - offset * 1.407333) * 0.304005;"," sum = sum + texture2D(uMainSampler, outTexCoord + offset * 3.294215) * 0.093913;"," gl_FragColor = (sum + texture2D(uMainSampler, outTexCoord - offset * 3.294215) * 0.093913) * vec4(color, 1);","}"].join("\n")},94328:t=>{t.exports=["#define SHADER_NAME BLUR_HIGH_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","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 += texture2D(uMainSampler, uv) * 0.1964825501511404;"," col += texture2D(uMainSampler, uv + (off1 / resolution)) * 0.2969069646728344;"," col += texture2D(uMainSampler, uv - (off1 / resolution)) * 0.2969069646728344;"," col += texture2D(uMainSampler, uv + (off2 / resolution)) * 0.09447039785044732;"," col += texture2D(uMainSampler, uv - (off2 / resolution)) * 0.09447039785044732;"," col += texture2D(uMainSampler, uv + (off3 / resolution)) * 0.010381362401148057;"," col += texture2D(uMainSampler, uv - (off3 / resolution)) * 0.010381362401148057;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},41514:t=>{t.exports=["#define SHADER_NAME BLUR_LOW_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","void main ()","{"," vec2 uv = outTexCoord;"," vec4 col = vec4(0.0);"," vec2 offset = vec2(1.333) * offset * strength;"," col += texture2D(uMainSampler, uv) * 0.29411764705882354;"," col += texture2D(uMainSampler, uv + (offset / resolution)) * 0.35294117647058826;"," col += texture2D(uMainSampler, uv - (offset / resolution)) * 0.35294117647058826;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},51078:t=>{t.exports=["#define SHADER_NAME BLUR_MED_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","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 += texture2D(uMainSampler, uv) * 0.2270270270;"," col += texture2D(uMainSampler, uv + (off1 / resolution)) * 0.3162162162;"," col += texture2D(uMainSampler, uv - (off1 / resolution)) * 0.3162162162;"," col += texture2D(uMainSampler, uv + (off2 / resolution)) * 0.0702702703;"," col += texture2D(uMainSampler, uv - (off2 / resolution)) * 0.0702702703;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},90610:t=>{t.exports=["#define SHADER_NAME BOKEH_FS","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;","}","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 = texture2D(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")},91899:t=>{t.exports=["#define SHADER_NAME CIRCLE_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec3 color;","uniform vec4 backgroundColor;","uniform float thickness;","uniform float scale;","uniform float feather;","varying vec2 outTexCoord;","void main ()","{"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," vec2 position = (gl_FragCoord.xy / resolution.xy) * 2.0 - 1.0;"," float aspectRatio = resolution.x / resolution.y;"," position.x *= aspectRatio;"," float grad = length(position);"," float outer = aspectRatio;"," float inner = outer - (thickness * 2.0 / resolution.y);"," if (aspectRatio >= 1.0)"," {"," float f = 2.0 + (resolution.y / resolution.x);"," outer = 1.0;"," inner = 1.0 - (thickness * f / resolution.x);"," }"," outer *= scale;"," inner *= scale;"," float circle = smoothstep(outer, outer - 0.01, grad);"," float ring = circle - smoothstep(inner, inner - feather, grad);"," texture = mix(backgroundColor * backgroundColor.a, texture, texture.a);"," texture = (texture * (circle - ring));"," gl_FragColor = vec4(texture.rgb + (ring * color), texture.a);","}"].join("\n")},47838:t=>{t.exports=["#define SHADER_NAME DISPLACEMENT_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uDisplacementSampler;","uniform vec2 amount;","varying vec2 outTexCoord;","void main ()","{"," vec2 disp = (-vec2(0.5, 0.5) + texture2D(uDisplacementSampler, outTexCoord).rr) * amount;"," gl_FragColor = texture2D(uMainSampler, outTexCoord + disp).rgba;","}"].join("\n")},98656:t=>{t.exports=["#define SHADER_NAME GLOW_FS","precision mediump float;","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","uniform float outerStrength;","uniform float innerStrength;","uniform vec2 resolution;","uniform vec4 glowColor;","uniform bool knockout;","const float PI = 3.14159265358979323846264;","const float DIST = __DIST__;","const float SIZE = min(__SIZE__, PI * 2.0);","const float STEP = ceil(PI * 2.0 / SIZE);","const float MAX_ALPHA = STEP * DIST * (DIST + 1.0) / 2.0;","void main ()","{"," vec2 px = vec2(1.0 / resolution.x, 1.0 / resolution.y);"," float totalAlpha = 0.0;"," vec2 direction;"," vec2 displaced;"," vec4 color;"," for (float angle = 0.0; angle < PI * 2.0; angle += SIZE)"," {"," direction = vec2(cos(angle), sin(angle)) * px;"," for (float curDistance = 0.0; curDistance < DIST; curDistance++)"," {"," displaced = outTexCoord + direction * (curDistance + 1.0);"," color = texture2D(uMainSampler, displaced);"," totalAlpha += (DIST - curDistance) * color.a;"," }"," }"," color = texture2D(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);"," vec4 outerGlowColor = outerGlowStrength * glowColor.rgba;"," if (knockout)"," {"," float resultAlpha = outerGlowAlpha + innerGlowAlpha;"," gl_FragColor = vec4(glowColor.rgb * resultAlpha, resultAlpha);"," }"," else"," {"," gl_FragColor = innerColor + outerGlowColor;"," }","}"].join("\n")},70463:t=>{t.exports=["#define SHADER_NAME GRADIENT_FS","#define SRGB_TO_LINEAR(c) pow((c), vec3(2.2))","#define LINEAR_TO_SRGB(c) pow((c), vec3(1.0 / 2.2))","#define SRGB(r, g, b) SRGB_TO_LINEAR(vec3(float(r), float(g), float(b)) / 255.0)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 positionFrom;","uniform vec2 positionTo;","uniform vec3 color1;","uniform vec3 color2;","uniform float alpha;","uniform int size;","varying vec2 outTexCoord;","float gradientNoise(in vec2 uv)","{"," const vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189);"," return fract(magic.z * fract(dot(uv, magic.xy)));","}","float stepped (in float s, in float scale, in int steps)","{"," return steps > 0 ? floor( s / ((1.0 * scale) / float(steps))) * 1.0 / float(steps - 1) : s;","}","void main ()","{"," vec2 a = positionFrom;"," vec2 b = positionTo;"," vec2 ba = b - a;"," float d = dot(outTexCoord - a, ba) / dot(ba, ba);"," float t = size > 0 ? stepped(d, 1.0, size) : d;"," t = smoothstep(0.0, 1.0, clamp(t, 0.0, 1.0));"," vec3 color = mix(SRGB(color1.r, color1.g, color1.b), SRGB(color2.r, color2.g, color2.b), t);"," color = LINEAR_TO_SRGB(color);"," color += (1.0 / 255.0) * gradientNoise(outTexCoord) - (0.5 / 255.0);"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," gl_FragColor = vec4(mix(color.rgb, texture.rgb, alpha), 1.0) * texture.a;","}"].join("\n")},50831:t=>{t.exports=["#define SHADER_NAME PIXELATE_FS","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")},92595:t=>{t.exports=["#define SHADER_NAME SHADOW_FS","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;","void main ()","{"," vec4 texture = texture2D(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 += texture2D(uMainSampler, outTexCoord + float(i) * decay / limit * pc).a * power;"," }"," float mask = 1.0 - texture.a;"," gl_FragColor = mix(texture, color, shadow * mask);","}"].join("\n")},72464:t=>{t.exports=["#define SHADER_NAME SHINE_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform bool reveal;","uniform float speed;","uniform float time;","uniform float lineWidth;","uniform float gradient;","varying vec2 outTexCoord;","void main ()","{","\tvec2 uv = gl_FragCoord.xy / resolution.xy;"," vec4 tex = texture2D(uMainSampler, outTexCoord);"," vec4 col1 = vec4(0.3, 0.0, 0.0, 1.0);"," vec4 col2 = vec4(0.85, 0.85, 0.85, 1.0);"," uv.x = uv.x - mod(time * speed, 2.0) + 0.5;"," float y = uv.x * gradient;"," float s = smoothstep(y - lineWidth, y, uv.y) - smoothstep(y, y + lineWidth, uv.y);"," gl_FragColor = (((s * col1) + (s * col2)) * tex);"," if (!reveal)"," {"," gl_FragColor += tex;"," }","}"].join("\n")},39249:t=>{t.exports=["#define SHADER_NAME VIGNETTE_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform float radius;","uniform float strength;","uniform vec2 position;","varying vec2 outTexCoord;","void main ()","{"," vec4 col = vec4(1.0);"," float d = length(outTexCoord - position);"," if (d <= radius)"," {"," float g = d / radius;"," g = sin(g * 3.14 * strength);"," \tcol = vec4(g * g * g);"," }"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," gl_FragColor = texture * (1.0 - col);","}"].join("\n")},2878:t=>{t.exports=["#define SHADER_NAME WIPE_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec4 config;","uniform bool reveal;","varying vec2 outTexCoord;","void main ()","{"," vec2 uv = outTexCoord;"," vec4 color0;"," vec4 color1;"," if (reveal)"," {"," color0 = vec4(0);"," color1 = texture2D(uMainSampler, uv);"," }"," else"," {"," color0 = texture2D(uMainSampler, uv);"," color1 = vec4(0);"," }"," float distance = config.x;"," float width = config.y;"," float direction = config.z;"," float axis = uv.x;"," if (config.w == 1.0)"," {"," axis = uv.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")},31063:t=>{t.exports=["#define SHADER_NAME PHASER_LIGHT_FS","precision mediump float;","struct Light","{"," vec2 position;"," vec3 color;"," float intensity;"," float radius;","};","const int kMaxLights = %LIGHT_COUNT%;","uniform vec4 uCamera; /* x, y, rotation, zoom */","uniform vec2 uResolution;","uniform sampler2D uMainSampler;","uniform sampler2D uNormSampler;","uniform vec3 uAmbientLightColor;","uniform Light uLights[kMaxLights];","uniform mat3 uInverseRotationMatrix;","uniform int uLightCount;","varying vec2 outTexCoord;","varying float outTexId;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," vec3 finalColor = vec3(0.0, 0.0, 0.0);"," vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a);"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," vec4 color = texture * texel;"," if (outTintEffect == 1.0)"," {"," color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a);"," }"," else if (outTintEffect == 2.0)"," {"," color = texel;"," }"," vec3 normalMap = texture2D(uNormSampler, outTexCoord).rgb;"," vec3 normal = normalize(uInverseRotationMatrix * vec3(normalMap * 2.0 - 1.0));"," vec2 res = vec2(min(uResolution.x, uResolution.y)) * uCamera.w;"," 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), 0.1);"," 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);"," vec3 diffuse = light.color * diffuseFactor;"," finalColor += (attenuation * diffuse) * light.intensity;"," }"," }"," vec4 colorOutput = vec4(uAmbientLightColor + finalColor, 1.0);"," gl_FragColor = color * vec4(colorOutput.rgb * colorOutput.a, colorOutput.a);","}"].join("\n")},48247:t=>{t.exports=["#define SHADER_NAME PHASER_LINEAR_BLEND_FS","precision mediump float;","uniform sampler2D uMainSampler1;","uniform sampler2D uMainSampler2;","uniform float uStrength;","varying vec2 outTexCoord;","void main ()","{"," vec4 frame1 = texture2D(uMainSampler1, outTexCoord);"," vec4 frame2 = texture2D(uMainSampler2, outTexCoord);"," gl_FragColor = mix(frame1, frame2 * uStrength, 0.5);","}"].join("\n")},41214:t=>{t.exports=["#define SHADER_NAME PHASER_MESH_FS","precision mediump float;","uniform vec3 uLightPosition;","uniform vec3 uLightAmbient;","uniform vec3 uLightDiffuse;","uniform vec3 uLightSpecular;","uniform vec3 uFogColor;","uniform float uFogNear;","uniform float uFogFar;","uniform vec3 uMaterialAmbient;","uniform vec3 uMaterialDiffuse;","uniform vec3 uMaterialSpecular;","uniform float uMaterialShine;","uniform vec3 uCameraPosition;","uniform sampler2D uTexture;","varying vec2 vTextureCoord;","varying vec3 vNormal;","varying vec3 vPosition;","void main (void)","{"," vec4 color = texture2D(uTexture, vTextureCoord);"," vec3 ambient = uLightAmbient * uMaterialAmbient;"," vec3 norm = normalize(vNormal);"," vec3 lightDir = normalize(uLightPosition - vPosition);"," float diff = max(dot(norm, lightDir), 0.0);"," vec3 diffuse = uLightDiffuse * (diff * uMaterialDiffuse);"," vec3 viewDir = normalize(uCameraPosition - vPosition);"," vec3 reflectDir = reflect(-lightDir, norm);"," float spec = pow(max(dot(viewDir, reflectDir), 0.0), uMaterialShine);"," vec3 specular = uLightSpecular * (spec * uMaterialSpecular);"," vec3 result = (ambient + diffuse + specular) * color.rgb;"," float depth = gl_FragCoord.z / gl_FragCoord.w;"," float fogFactor = smoothstep(uFogNear, uFogFar, depth);"," gl_FragColor.rgb = mix(result.rgb, uFogColor, fogFactor);"," gl_FragColor.a = color.a;","}"].join("\n")},39653:t=>{t.exports=["#define SHADER_NAME PHASER_MESH_VS","precision mediump float;","attribute vec3 aVertexPosition;","attribute vec3 aVertexNormal;","attribute vec2 aTextureCoord;","uniform mat4 uViewProjectionMatrix;","uniform mat4 uModelMatrix;","uniform mat4 uNormalMatrix;","varying vec2 vTextureCoord;","varying vec3 vNormal;","varying vec3 vPosition;","void main ()","{"," vTextureCoord = aTextureCoord;"," vPosition = vec3(uModelMatrix * vec4(aVertexPosition, 1.0));"," vNormal = vec3(uNormalMatrix * vec4(aVertexNormal, 1.0));"," gl_Position = uViewProjectionMatrix * uModelMatrix * vec4(aVertexPosition, 1.0);","}"].join("\n")},62143:t=>{t.exports=["#define SHADER_NAME PHASER_MOBILE_FS","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a);"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," vec4 color = texture * texel;"," if (outTintEffect == 1.0)"," {"," color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a);"," }"," else if (outTintEffect == 2.0)"," {"," color = texel;"," }"," gl_FragColor = color;","}"].join("\n")},47940:t=>{t.exports=["#define SHADER_NAME PHASER_MOBILE_VS","precision mediump float;","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","attribute float inTexId;","attribute float inTintEffect;","attribute vec4 inTint;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," outTint = inTint;"," outTintEffect = inTintEffect;","}"].join("\n")},98840:t=>{t.exports=["#define SHADER_NAME PHASER_MULTI_FS","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform sampler2D uMainSampler[%count%];","varying vec2 outTexCoord;","varying float outTexId;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," vec4 texture;"," %forloop%"," vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a);"," vec4 color = texture * texel;"," if (outTintEffect == 1.0)"," {"," color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a);"," }"," else if (outTintEffect == 2.0)"," {"," color = texel;"," }"," gl_FragColor = color;","}"].join("\n")},44667:t=>{t.exports=["#define SHADER_NAME PHASER_MULTI_VS","precision mediump float;","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","attribute float inTexId;","attribute float inTintEffect;","attribute vec4 inTint;","varying vec2 outTexCoord;","varying float outTexId;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," outTexId = inTexId;"," outTint = inTint;"," outTintEffect = inTintEffect;","}"].join("\n")},4127:t=>{t.exports=["#define SHADER_NAME PHASER_POINTLIGHT_FS","precision mediump float;","uniform vec2 uResolution;","uniform float uCameraZoom;","varying vec4 lightPosition;","varying vec4 lightColor;","varying float lightRadius;","varying float lightAttenuation;","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;"," gl_FragColor = vec4(color.rgb * lightColor.a, color.a);","}"].join("\n")},89924:t=>{t.exports=["#define SHADER_NAME PHASER_POINTLIGHT_VS","precision mediump float;","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;","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);","}"].join("\n")},27681:t=>{t.exports=["#define SHADER_NAME PHASER_POSTFX_FS","precision mediump float;","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","void main ()","{"," gl_FragColor = texture2D(uMainSampler, outTexCoord);","}"].join("\n")},49627:t=>{t.exports=["#define SHADER_NAME PHASER_QUAD_VS","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")},45561:t=>{t.exports=["#define SHADER_NAME PHASER_SINGLE_FS","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a);"," vec4 color = texture * texel;"," if (outTintEffect == 1.0)"," {"," color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a);"," }"," else if (outTintEffect == 2.0)"," {"," color = texel;"," }"," gl_FragColor = color;","}"].join("\n")},60722:t=>{t.exports=["#define SHADER_NAME PHASER_SINGLE_VS","precision mediump float;","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","attribute float inTexId;","attribute float inTintEffect;","attribute vec4 inTint;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," outTint = inTint;"," outTintEffect = inTintEffect;","}"].join("\n")},89350:(t,e,i)=>{t.exports={AddBlendFrag:i(35407),BitmapMaskFrag:i(78908),BitmapMaskVert:i(85191),ColorMatrixFrag:i(96293),CopyFrag:i(36682),FXBarrelFrag:i(99155),FXBloomFrag:i(24400),FXBlurHighFrag:i(94328),FXBlurLowFrag:i(41514),FXBlurMedFrag:i(51078),FXBokehFrag:i(90610),FXCircleFrag:i(91899),FXDisplacementFrag:i(47838),FXGlowFrag:i(98656),FXGradientFrag:i(70463),FXPixelateFrag:i(50831),FXShadowFrag:i(92595),FXShineFrag:i(72464),FXVignetteFrag:i(39249),FXWipeFrag:i(2878),LightFrag:i(31063),LinearBlendFrag:i(48247),MeshFrag:i(41214),MeshVert:i(39653),MobileFrag:i(62143),MobileVert:i(47940),MultiFrag:i(98840),MultiVert:i(44667),PointLightFrag:i(4127),PointLightVert:i(89924),PostFXFrag:i(27681),QuadVert:i(49627),SingleFrag:i(45561),SingleVert:i(60722)}},93567:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i){this.webGLAttribLocation=-1,this.gl=t,this.program=e,this.name=i,this.createResource()},createResource:function(){if(null!==this.program.webGLProgram){var t=this.gl;t.isContextLost()||(this.webGLAttribLocation=t.getAttribLocation(this.program.webGLProgram,this.name))}else this.webGLAttribLocation=-1},destroy:function(){this.gl=null,this.program=null,this.name=null,this.webGLAttribLocation=-1}});t.exports=s},26128:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i,s){this.webGLBuffer=null,this.gl=t,this.initialDataOrSize=e,this.bufferType=i,this.bufferUsage=s,this.createResource()},createResource:function(){if(null!==this.initialDataOrSize){var t=this.gl;if(!t.isContextLost()){var e=this.bufferType,i=t.createBuffer();this.webGLBuffer=i,t.bindBuffer(e,this.webGLBuffer),t.bufferData(e,this.initialDataOrSize,this.bufferUsage),t.bindBuffer(e,null)}}},destroy:function(){var t=this.gl;t.isContextLost()||t.deleteBuffer(this.webGLBuffer),this.webGLBuffer=null,this.initialDataOrSize=null,this.gl=null}});t.exports=s},84387:(t,e,i)=>{var s=i(83419),n={36054:"Incomplete Attachment",36055:"Missing Attachment",36057:"Incomplete Dimensions",36061:"Framebuffer Unsupported"},r=new s({initialize:function(t,e,i,s,n){this.webGLFramebuffer=null,this.gl=t,this.width=e,this.height=i,this.renderTexture=s,this.addDepthStencilBuffer=!!n,this.createResource()},createResource:function(){var t=this.gl;if(!t.isContextLost()){var e,i=this.renderTexture,s=t.createFramebuffer();if(this.webGLFramebuffer=s,t.bindFramebuffer(t.FRAMEBUFFER,s),i.isRenderTexture=!0,i.isAlphaPremultiplied=!1,t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,i.webGLTexture,0),(e=t.checkFramebufferStatus(t.FRAMEBUFFER))!==t.FRAMEBUFFER_COMPLETE)throw new Error("Framebuffer status: "+(n[e]||e));if(this.addDepthStencilBuffer){var r=t.createRenderbuffer();t.bindRenderbuffer(t.RENDERBUFFER,r),t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,this.width,this.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,r)}t.bindFramebuffer(t.FRAMEBUFFER,null)}},destroy:function(){if(null!==this.webGLFramebuffer){var t=this.gl;if(!t.isContextLost()){t.bindFramebuffer(t.FRAMEBUFFER,this.webGLFramebuffer);var e=t.getFramebufferAttachmentParameter(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);null!==e&&(t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.deleteTexture(e));var i=t.getFramebufferAttachmentParameter(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);null!==i&&t.deleteRenderbuffer(i),t.bindFramebuffer(t.FRAMEBUFFER,null),t.deleteFramebuffer(this.webGLFramebuffer)}this.renderTexture=null,this.webGLFramebuffer=null,this.gl=null}}});t.exports=r},1482:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i){this.webGLProgram=null,this.gl=t,this.vertexSource=e,this.fragmentSource=i,this.createResource()},createResource:function(){var t=this.gl;if(!t.isContextLost()){var e=t.createProgram(),i=t.createShader(t.VERTEX_SHADER),s=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(i,this.vertexSource),t.shaderSource(s,this.fragmentSource),t.compileShader(i),t.compileShader(s);var n="Shader failed:\n";if(!t.getShaderParameter(i,t.COMPILE_STATUS))throw new Error("Vertex "+n+t.getShaderInfoLog(i));if(!t.getShaderParameter(s,t.COMPILE_STATUS))throw new Error("Fragment "+n+t.getShaderInfoLog(s));if(t.attachShader(e,i),t.attachShader(e,s),t.linkProgram(e),!t.getProgramParameter(e,t.LINK_STATUS))throw new Error("Link "+n+t.getProgramInfoLog(e));t.useProgram(e),this.webGLProgram=e}},destroy:function(){this.webGLProgram&&(this.gl.isContextLost()||this.gl.deleteProgram(this.webGLProgram),this.webGLProgram=null,this.gl=null)}});t.exports=s},82751:(t,e,i)=>{var s=i(83419),n=i(50030),r=new s({initialize:function(t,e,i,s,n,r,o,a,h,l,u,c,d){this.webGLTexture=null,this.isRenderTexture=!1,this.gl=t,this.mipLevel=e,this.minFilter=i,this.magFilter=s,this.wrapT=n,this.wrapS=r,this.format=o,this.pixels=a,this.width=h,this.height=l,this.pma=null==u||u,this.forceSize=!!c,this.flipY=!!d,this.__SPECTOR_Metadata={},this.createResource()},createResource:function(){var t=this.gl;if(!t.isContextLost())if(this.pixels instanceof r)this.webGLTexture=this.pixels.webGLTexture;else{var e=t.createTexture();e.__SPECTOR_Metadata=this.__SPECTOR_Metadata,this.webGLTexture=e,this._processTexture()}},update:function(t,e,i,s,n,r,o,a,h){0!==e&&0!==i&&(this.pixels=t,this.width=e,this.height=i,this.flipY=s,this.wrapS=n,this.wrapT=r,this.minFilter=o,this.magFilter=a,this.format=h,this.gl.isContextLost()||this._processTexture())},_processTexture:function(){var t=this.gl;t.activeTexture(t.TEXTURE0);var e=t.getParameter(t.TEXTURE_BINDING_2D);t.bindTexture(t.TEXTURE_2D,this.webGLTexture),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),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.pma),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,this.flipY);var i=this.pixels,s=this.mipLevel,r=this.width,o=this.height,a=this.format,h=!1;if(null==i)t.texImage2D(t.TEXTURE_2D,s,a,r,o,0,a,t.UNSIGNED_BYTE,null),h=n(r,o);else if(i.compressed){r=i.width,o=i.height,h=i.generateMipmap;for(var l=0;l{var s=new(i(83419))({initialize:function(t,e,i){this.webGLUniformLocation=null,this.gl=t,this.program=e,this.name=i,this.createResource()},createResource:function(){if(null!==this.program.webGLProgram){var t=this.gl;t.isContextLost()||(this.webGLUniformLocation=t.getUniformLocation(this.program.webGLProgram,this.name))}else this.webGLUniformLocation=null},destroy:function(){this.gl=null,this.program=null,this.name=null,this.webGLUniformLocation=null}});t.exports=s},9503:(t,e,i)=>{var s={WebGLAttribLocationWrapper:i(93567),WebGLBufferWrapper:i(26128),WebGLProgramWrapper:i(1482),WebGLTextureWrapper:i(82751),WebGLFramebufferWrapper:i(84387),WebGLUniformLocationWrapper:i(57183)};t.exports=s},76531:(t,e,i)=>{var s=i(13560),n=i(83419),r=i(45319),o=i(50792),a=i(97480),h=i(8443),l=i(57811),u=i(74403),c=i(45818),d=i(29747),f=i(87841),p=i(86555),v=i(56583),g=i(26099),m=i(38058),y=new n({Extends:o,initialize:function(t){o.call(this),this.game=t,this.canvas,this.canvasBounds=new f,this.parent=null,this.parentIsWindow=!1,this.parentSize=new p,this.gameSize=new p,this.baseSize=new p,this.displaySize=new p,this.scaleMode=s.SCALE_MODE.NONE,this.zoom=1,this._resetZoom=!1,this.displayScale=new g(1,1),this.autoRound=!1,this.autoCenter=s.CENTER.NO_CENTER,this.orientation=s.ORIENTATION.LANDSCAPE,this.fullscreen,this.fullscreenTarget=null,this._createdFullscreenTarget=!1,this.dirty=!1,this.resizeInterval=500,this._lastCheck=0,this._checkOrientation=!1,this.domlisteners={orientationChange:d,windowResize:d,fullScreenChange:d,fullScreenError:d}},preBoot:function(){this.parseConfig(this.game.config),this.game.events.once(h.BOOT,this.boot,this)},boot:function(){var t=this.game;this.canvas=t.canvas,this.fullscreen=t.device.fullscreen;var e=this.scaleMode;e!==s.SCALE_MODE.RESIZE&&e!==s.SCALE_MODE.EXPAND&&this.displaySize.setAspectMode(e),e===s.SCALE_MODE.NONE?this.resize(this.width,this.height):(this.getParentBounds(),this.parentSize.width>0&&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,n=t.scaleMode,r=t.zoom,o=t.autoRound;if("string"==typeof e)if("%"!==e.substr(-1))e=parseInt(e,10);else{var a=this.parentSize.width;0===a&&(a=window.innerWidth);var h=parseInt(e,10)/100;e=Math.floor(a*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=n,this.autoRound=o,this.autoCenter=t.autoCenter,this.resizeInterval=t.resizeInterval,o&&(e=Math.floor(e),i=Math.floor(i)),this.gameSize.setSize(e,i),r===s.ZOOM.MAX_ZOOM&&(r=this.getMaxZoom()),this.zoom=r,1!==r&&(this._resetZoom=!0),this.baseSize.setSize(e,i),o&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),t.minWidth>0&&this.displaySize.setMin(t.minWidth*r,t.minHeight*r),t.maxWidth>0&&this.displaySize.setMax(t.maxWidth*r,t.maxHeight*r),this.displaySize.setSize(e,i),(t.snapWidth>0||t.snapHeight>0)&&this.displaySize.setSnap(t.snapWidth,t.snapHeight),this.orientation=c(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 n=this.canvasBounds,r=this.canvas.getBoundingClientRect();if(r.x!==n.x||r.y!==n.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,n=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,n)},resize:function(t,e){var i=this.zoom,s=this.autoRound;s&&(t=Math.floor(t),e=Math.floor(e));var n=this.width,r=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 o=this.canvas.style,a=t*i,h=e*i;return s&&(a=Math.floor(a),h=Math.floor(h)),a===t&&h===e||(o.width=a+"px",o.height=h+"px"),this.refresh(n,r)},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,n=i.style;n.transform="scale("+this.displaySize.width/this.baseSize.width+","+this.displaySize.height/this.baseSize.height+")",n.marginLeft=s.marginLeft,n.marginTop=s.marginTop}return this.emit(a.RESIZE,this.gameSize,this.baseSize,this.displaySize,t,e),this},updateOrientation:function(){if(this._checkOrientation){this._checkOrientation=!1;var t=c(this.width,this.height);t!==this.orientation&&(this.orientation=t,this.emit(a.ORIENTATION_CHANGE,t))}},updateScale:function(){var t,e,i=this.canvas.style,n=this.gameSize.width,o=this.gameSize.height,a=this.zoom,h=this.autoRound;if(this.scaleMode===s.SCALE_MODE.NONE)this.displaySize.setSize(n*a,o*a),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,c=this.game.config.width,d=this.game.config.height,f=this.parentSize.width,p=this.parentSize.height,v=f/c,g=p/d;v=0?0:-o.x*a.x,l=o.y>=0?0:-o.y*a.y;return i=r.width>=o.width?n.width:n.width-(o.width-r.width)*a.x,s=r.height>=o.height?n.height:n.height-(o.height-r.height)*a.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),n=i(13560),r={Center:i(64743),Events:i(97480),Orientation:i(39218),ScaleManager:i(76531),ScaleModes:i(81050),Zoom:i(80805)};r=s(!1,r,n.CENTER),r=s(!1,r,n.ORIENTATION),r=s(!1,r,n.SCALE_MODE),r=s(!1,r,n.ZOOM),t.exports=r},27397:(t,e,i)=>{var s=i(95540),n=i(35355);t.exports=function(t){var e=t.game.config.defaultPhysicsSystem,i=s(t.settings,"physics",!1);if(e||i){var r=[];if(e&&r.push(n(e+"Physics")),i)for(var o in i)o=n(o.concat("Physics")),-1===r.indexOf(o)&&r.push(o);return r}}},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",impactPhysics:"impact",matterPhysics:"matter"}},97482:(t,e,i)=>{var s=i(83419),n=i(2368),r=new s({initialize:function(t){this.sys=new n(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=r},60903:(t,e,i)=>{var s=i(83419),n=i(89993),r=i(44594),o=i(8443),a=i(35154),h=i(54899),l=i(29747),u=i(97482),c=i(2368),d=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=n.INIT,s.isTransition&&i.events.emit(r.TRANSITION_INIT,s.transitionFrom,s.transitionDuration)),i.load&&(e=i.load).reset(),e&&t.preload?(t.preload.call(t),s.status=n.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>n.START&&s.settings.status<=n.RUNNING&&s.step(t,e),s.scenePlugin&&s.scenePlugin._target&&s.scenePlugin.step(t,e)}},render:function(t){for(var e=0;e=n.LOADING&&i.settings.status=n.START&&o<=n.CREATING)return this;if(o>=n.RUNNING&&o<=n.SLEEPING)r.shutdown(),r.sceneUpdate=l,r.start(e);else if(r.sceneUpdate=l,r.start(e),r.load&&(s=r.load),s&&r.settings.hasOwnProperty("pack")&&(s.reset(),s.addPack({payload:r.settings.pack})))return r.settings.status=n.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!==n.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),n=this.getScene(e);return s&&n&&s!==n&&(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),n=this.getAt(i);this.scenes[e]=n,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,n)}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 n=this.getAt(s);this.scenes.splice(s,1),0===i?this.scenes.unshift(n):this.scenes.splice(i-(s{var s=i(45319),n=i(83419),r=i(44594),o=i(95540),a=i(37277),h=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.settings=t.sys.settings,this.key=t.sys.settings.key,this.manager=t.sys.game.scene,this.transitionProgress=0,this._elapsed=0,this._target=null,this._duration=0,this._onUpdate,this._onUpdateScope,this._willSleep=!1,this._willRemove=!1,t.sys.events.once(r.BOOT,this.boot,this),t.sys.events.on(r.START,this.pluginStart,this)},boot:function(){this.systems.events.once(r.DESTROY,this.destroy,this)},pluginStart:function(){this._target=null,this.systems.events.once(r.SHUTDOWN,this.shutdown,this)},start:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("stop",this.key),this.manager.queueOp("start",t,e),this},restart:function(t){var e=this.key;return this.manager.queueOp("stop",e),this.manager.queueOp("start",e,t),this},transition:function(t){void 0===t&&(t={});var e=o(t,"target",!1),i=this.manager.getScene(e);if(!e||!this.checkValidTransition(i))return!1;var s=o(t,"duration",1e3);this._elapsed=0,this._target=i,this._duration=s,this._willSleep=o(t,"sleep",!1),this._willRemove=o(t,"remove",!1);var n=o(t,"onUpdate",null);n&&(this._onUpdate=n,this._onUpdateScope=o(t,"onUpdateScope",this.scene));var a=o(t,"allowInput",!1);this.settings.transitionAllowInput=a;var h=i.sys.settings;h.isTransition=!0,h.transitionFrom=this.scene,h.transitionDuration=s,h.transitionAllowInput=a,o(t,"moveAbove",!1)?this.manager.moveAbove(this.key,e):o(t,"moveBelow",!1)&&this.manager.moveBelow(this.key,e),i.sys.isSleeping()?i.sys.wake(o(t,"data")):this.manager.start(e,o(t,"data"));var l=o(t,"onStart",null),u=o(t,"onStartScope",this.scene);return l&&l.call(u,this.scene,i,s),this.systems.events.emit(r.TRANSITION_OUT,i,s),!0},checkValidTransition:function(t){return!(!t||t.sys.isActive()||t.sys.isTransitioning()||t===this.scene||this.systems.isTransitioning())},step:function(t,e){this._elapsed+=e,this.transitionProgress=s(this._elapsed/this._duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.transitionProgress),this._elapsed>=this._duration&&this.transitionComplete()},transitionComplete:function(){var t=this._target.sys,e=this._target.sys.settings;t.events.emit(r.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(r.SHUTDOWN,this.shutdown,this),t.off(r.TRANSITION_OUT)},destroy:function(){this.shutdown(),this.scene.sys.events.off(r.START,this.start,this),this.scene=null,this.systems=null,this.settings=null,this.manager=null}});a.register("ScenePlugin",h,"scenePlugin"),t.exports=h},55681:(t,e,i)=>{var s=i(89993),n=i(35154),r=i(46975),o=i(87033),a={create:function(t){return"string"==typeof t?t={key:t}:void 0===t&&(t={}),{status:s.PENDING,key:n(t,"key",""),active:n(t,"active",!1),visible:n(t,"visible",!0),isBooted:!1,isTransition:!1,transitionFrom:null,transitionDuration:0,transitionAllowInput:!0,data:{},pack:n(t,"pack",!1),cameras:n(t,"cameras",null),map:n(t,"map",r(o,n(t,"mapAdd",{}))),physics:n(t,"physics",{}),loader:n(t,"loader",{}),plugins:n(t,"plugins",!1),input:n(t,"input",{})}}};t.exports=a},2368:(t,e,i)=>{var s=i(83419),n=i(89993),r=i(42363),o=i(44594),a=i(27397),h=i(52106),l=i(29747),u=i(55681),c=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=n.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,r.Global,[r.CoreScene,h(this),a(this)]),this.events.emit(o.BOOT,this),this.settings.isBooted=!0},step:function(t,e){var i=this.events;i.emit(o.PRE_UPDATE,t,e),i.emit(o.UPDATE,t,e),this.sceneUpdate.call(this.scene,t,e),i.emit(o.POST_UPDATE,t,e)},render:function(t){var e=this.displayList;e.depthSort(),this.events.emit(o.PRE_RENDER,t),this.cameras.render(t,e),this.events.emit(o.RENDER,t)},queueDepthSort:function(){this.displayList.queueDepthSort()},depthSort:function(){this.displayList.depthSort()},pause:function(t){var e=this.settings,i=this.getStatus();return i!==n.CREATING&&i!==n.RUNNING?console.warn("Cannot pause non-running Scene",e.key):this.settings.active&&(e.status=n.PAUSED,e.active=!1,this.events.emit(o.PAUSE,this,t)),this},resume:function(t){var e=this.events,i=this.settings;return this.settings.active||(i.status=n.RUNNING,i.active=!0,e.emit(o.RESUME,this,t)),this},sleep:function(t){var e=this.settings,i=this.getStatus();return i!==n.CREATING&&i!==n.RUNNING?console.warn("Cannot sleep non-running Scene",e.key):(e.status=n.SLEEPING,e.active=!1,e.visible=!1,this.events.emit(o.SLEEP,this,t)),this},wake:function(t){var e=this.events,i=this.settings;return i.status=n.RUNNING,i.active=!0,i.visible=!0,e.emit(o.WAKE,this,t),i.isTransition&&e.emit(o.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>n.PENDING&&t<=n.RUNNING},isSleeping:function(){return this.settings.status===n.SLEEPING},isActive:function(){return this.settings.status===n.RUNNING},isPaused:function(){return this.settings.status===n.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=n.START,i.active=!0,i.visible=!0,e.emit(o.START,this),e.emit(o.READY,this,t)},shutdown:function(t){var e=this.events,i=this.settings;e.off(o.TRANSITION_INIT),e.off(o.TRANSITION_START),e.off(o.TRANSITION_COMPLETE),e.off(o.TRANSITION_OUT),i.status=n.SHUTDOWN,i.active=!1,i.visible=!1,e.emit(o.SHUTDOWN,this,t)},destroy:function(){var t=this.events,e=this.settings;e.status=n.DESTROYED,e.active=!1,e.visible=!1,t.emit(o.DESTROY,this),t.removeAllListeners();for(var i=["scene","game","anims","cache","plugins","registry","sound","textures","add","camera","displayList","events","make","scenePlugin","updateList"],s=0;s{t.exports={PENDING:0,INIT:1,START:2,LOADING:3,CREATING:4,RUNNING:5,PAUSED:6,SLEEPING:7,SHUTDOWN:8,DESTROYED:9}},69830:t=>{t.exports="addedtoscene"},7919:t=>{t.exports="boot"},46763:t=>{t.exports="create"},11763:t=>{t.exports="destroy"},71555:t=>{t.exports="pause"},36735:t=>{t.exports="postupdate"},3809:t=>{t.exports="prerender"},90716:t=>{t.exports="preupdate"},58262:t=>{t.exports="ready"},91633:t=>{t.exports="removedfromscene"},10319:t=>{t.exports="render"},87132:t=>{t.exports="resume"},81961:t=>{t.exports="shutdown"},90194:t=>{t.exports="sleep"},6265:t=>{t.exports="start"},33178:t=>{t.exports="transitioncomplete"},43063:t=>{t.exports="transitioninit"},11259:t=>{t.exports="transitionout"},61611:t=>{t.exports="transitionstart"},45209:t=>{t.exports="transitionwake"},22966:t=>{t.exports="update"},21747:t=>{t.exports="wake"},44594:(t,e,i)=>{t.exports={ADDED_TO_SCENE:i(69830),BOOT:i(7919),CREATE:i(46763),DESTROY:i(11763),PAUSE:i(71555),POST_UPDATE:i(36735),PRE_RENDER:i(3809),PRE_UPDATE:i(90716),READY:i(58262),REMOVED_FROM_SCENE:i(91633),RENDER:i(10319),RESUME:i(87132),SHUTDOWN:i(81961),SLEEP:i(90194),START:i(6265),TRANSITION_COMPLETE:i(33178),TRANSITION_INIT:i(43063),TRANSITION_OUT:i(11259),TRANSITION_START:i(61611),TRANSITION_WAKE:i(45209),UPDATE:i(22966),WAKE:i(21747)}},62194:(t,e,i)=>{var s=i(89993),n=i(79291),r={Events:i(44594),GetPhysicsPlugins:i(27397),GetScenePlugins:i(52106),SceneManager:i(60903),ScenePlugin:i(52209),Settings:i(55681),Systems:i(2368)};r=n(!1,r,s),t.exports=r},30341:(t,e,i)=>{var s=i(83419),n=i(50792),r=i(14463),o=i(79291),a=i(29747),h=new s({Extends:n,initialize:function(t,e,i){n.call(this),this.manager=t,this.key=e,this.isPlaying=!1,this.isPaused=!1,this.totalRate=1,this.duration=this.duration||0,this.totalDuration=this.totalDuration||0,this.config={mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0,pan:0},this.currentConfig=this.config,this.config=o(this.config,i),this.markers={},this.currentMarker=null,this.pendingRemove=!1},addMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(console.error("addMarker "+t.name+" already exists in Sound"),!1):(t=o(!0,{name:"",start:0,duration:this.totalDuration-(t.start||0),config:{mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0,pan:0}},t),this.markers[t.name]=t,!0))},updateMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(this.markers[t.name]=o(!0,this.markers[t.name],t),!0):(console.warn("Audio Marker: "+t.name+" missing in Sound: "+this.key),!1))},removeMarker:function(t){var e=this.markers[t];return e?(this.markers[t]=null,e):null},play:function(t,e){if(void 0===t&&(t=""),"object"==typeof t&&(e=t,t=""),"string"!=typeof t)return!1;if(t){if(!this.markers[t])return console.warn("Marker: "+t+" missing in Sound: "+this.key),!1;this.currentMarker=this.markers[t],this.currentConfig=this.currentMarker.config,this.duration=this.currentMarker.duration}else this.currentMarker=null,this.currentConfig=this.config,this.duration=this.totalDuration;return this.resetConfig(),this.currentConfig=o(this.currentConfig,e),this.isPlaying=!0,this.isPaused=!1,!0},pause:function(){return!(this.isPaused||!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!0,!0)},resume:function(){return!(!this.isPaused||this.isPlaying)&&(this.isPlaying=!0,this.isPaused=!1,!0)},stop:function(){return!(!this.isPaused&&!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!1,this.resetConfig(),!0)},applyConfig:function(){this.mute=this.currentConfig.mute,this.volume=this.currentConfig.volume,this.rate=this.currentConfig.rate,this.detune=this.currentConfig.detune,this.loop=this.currentConfig.loop,this.pan=this.currentConfig.pan},resetConfig:function(){this.currentConfig.seek=0,this.currentConfig.delay=0},update:a,calculateRate:function(){var t=this.currentConfig.detune+this.manager.detune,e=Math.pow(1.0005777895065548,t);this.totalRate=this.currentConfig.rate*this.manager.rate*e},destroy:function(){this.pendingRemove||(this.stop(),this.emit(r.DESTROY,this),this.removeAllListeners(),this.pendingRemove=!0,this.manager=null,this.config=null,this.currentConfig=null,this.markers=null,this.currentMarker=null)}});t.exports=h},85034:(t,e,i)=>{var s=i(83419),n=i(41786),r=i(50792),o=i(14463),a=i(8443),h=i(46710),l=i(58731),u=i(29747),c=i(26099),d=new s({Extends:r,initialize:function(t){r.call(this),this.game=t,this.jsonCache=t.cache.json,this.sounds=[],this.mute=!1,this.volume=1,this.pauseOnBlur=!0,this._rate=1,this._detune=0,this.locked=this.locked||!1,this.unlocked=!1,this.gameLostFocus=!1,this.listenerPosition=new c;var e=t.events;e.on(a.BLUR,this.onGameBlur,this),e.on(a.FOCUS,this.onGameFocus,this),e.on(a.PRE_STEP,this.update,this),e.once(a.DESTROY,this.destroy,this)},add:u,addAudioSprite:function(t,e){void 0===e&&(e={});var i=this.add(t,e);for(var s in i.spritemap=this.jsonCache.get(t).spritemap,i.spritemap)if(i.spritemap.hasOwnProperty(s)){var r=n(e),o=i.spritemap[s];r.loop=!!o.hasOwnProperty("loop")&&o.loop,i.addMarker({name:s,start:o.start,duration:o.end-o.start,config:r})}return i},get:function(t){return l(this.sounds,"key",t)},getAll:function(t){return t?h(this.sounds,"key",t):h(this.sounds)},getAllPlaying:function(){return h(this.sounds,"isPlaying",!0)},play:function(t,e){var i=this.add(t);return i.once(o.COMPLETE,i.destroy,i),e?e.name?(i.addMarker(e),i.play(e.name)):i.play(e):i.play()},playAudioSprite:function(t,e,i){var s=this.addAudioSprite(t);return s.once(o.COMPLETE,s.destroy,s),s.play(e,i)},remove:function(t){var e=this.sounds.indexOf(t);return-1!==e&&(t.destroy(),this.sounds.splice(e,1),!0)},removeAll:function(){this.sounds.forEach((function(t){t.destroy()})),this.sounds.length=0},removeByKey:function(t){for(var e=0,i=this.sounds.length-1;i>=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(o.PAUSE_ALL,this)},resumeAll:function(){this.forEachActiveSound((function(t){t.resume()})),this.emit(o.RESUME_ALL,this)},setListenerPosition:u,stopAll:function(){this.forEachActiveSound((function(t){t.stop()})),this.emit(o.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(o.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(a.BLUR,this.onGameBlur,this),this.game.events.off(a.FOCUS,this.onGameFocus,this),this.game.events.off(a.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,n){s&&!s.pendingRemove&&t.call(e||i,s,n,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(o.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(o.GLOBAL_DETUNE,this,t)}}});t.exports=d},14747:(t,e,i)=>{var s=i(33684),n=i(25960),r=i(57490),o={create:function(t){var e=t.config.audio,i=t.device.audio;return e.noAudio||!i.webAudio&&!i.audioData?new n(t):i.webAudio&&!e.disableWebAudio?new r(t):new s(t)}};t.exports=o},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),n=i(83419),r=i(14463),o=i(45319),a=new n({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(r.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(r.PAUSE,this),!0)))},resume:function(){return!this.manager.isLocked(this,"resume")&&(!(this.startTime>0)&&(!!s.prototype.resume.call(this)&&(!!this.pickAndPlayAudioTag()&&(this.emit(r.RESUME,this),!0))))},stop:function(){return!this.manager.isLocked(this,"stop")&&(!!s.prototype.stop.call(this)&&(this.stopAndReleaseAudioTag(),this.emit(r.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(r.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=o(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(r.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(r.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,r.RATE,t)||(this.calculateRate(),this.emit(r.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,r.DETUNE,t)||(this.calculateRate(),this.emit(r.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(r.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(r.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(r.PAN,this,t)}},setPan:function(t){return this.pan=t,this}});t.exports=a},33684:(t,e,i)=>{var s=i(85034),n=i(83419),r=i(14463),o=i(64895),a=new n({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 o(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{t.exports={SoundManagerCreator:i(14747),Events:i(14463),BaseSound:i(30341),BaseSoundManager:i(85034),WebAudioSound:i(71741),WebAudioSoundManager:i(57490),HTML5AudioSound:i(64895),HTML5AudioSoundManager:i(33684),NoAudioSound:i(4603),NoAudioSoundManager:i(25960)}},4603:(t,e,i)=>{var s=i(30341),n=i(83419),r=i(50792),o=i(79291),a=i(29747),h=function(){return!1},l=function(){return null},u=function(){return this},c=new n({Extends:r,initialize:function(t,e,i){void 0===i&&(i={}),r.call(this),this.manager=t,this.key=e,this.isPlaying=!1,this.isPaused=!1,this.totalRate=1,this.duration=0,this.totalDuration=0,this.config=o({mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0,pan:0},i),this.currentConfig=this.config,this.mute=!1,this.volume=1,this.rate=1,this.detune=0,this.seek=0,this.loop=!1,this.pan=0,this.markers={},this.currentMarker=null,this.pendingRemove=!1},addMarker:h,updateMarker:h,removeMarker:l,play:h,pause:h,resume:h,stop:h,setMute:u,setVolume:u,setRate:u,setDetune:u,setSeek:u,setLoop:u,setPan:u,applyConfig:l,resetConfig:l,update:a,calculateRate:l,destroy:function(){s.prototype.destroy.call(this)}});t.exports=c},25960:(t,e,i)=>{var s=i(85034),n=i(83419),r=i(50792),o=i(4603),a=i(29747),h=new n({Extends:r,initialize:function(t){r.call(this),this.game=t,this.sounds=[],this.mute=!1,this.volume=1,this.rate=1,this.detune=0,this.pauseOnBlur=!0,this.locked=!1},add:function(t,e){var i=new o(this,t,e);return this.sounds.push(i),i},addAudioSprite:function(t,e){var i=this.add(t,e);return i.spritemap={},i},get:function(t){return s.prototype.get.call(this,t)},getAll:function(t){return s.prototype.getAll.call(this,t)},play:function(t,e){return!1},playAudioSprite:function(t,e,i){return!1},remove:function(t){return s.prototype.remove.call(this,t)},removeAll:function(){return s.prototype.removeAll.call(this)},removeByKey:function(t){return s.prototype.removeByKey.call(this,t)},stopByKey:function(t){return s.prototype.stopByKey.call(this,t)},onBlur:a,onFocus:a,onGameBlur:a,onGameFocus:a,pauseAll:a,resumeAll:a,stopAll:a,update:a,setRate:a,setDetune:a,setMute:a,setVolume:a,unlock:a,forEachActiveSound:function(t,e){s.prototype.forEachActiveSound.call(this,t,e)},destroy:function(){s.prototype.destroy.call(this)}});t.exports=h},71741:(t,e,i)=>{var s=i(30341),n=i(83419),r=i(14463),o=i(95540),a=new n({Extends:s,initialize:function(t,e,i){if(void 0===i&&(i={}),this.audioBuffer=t.game.cache.audio.get(e),!this.audioBuffer)throw new Error('Audio key "'+e+'" not found in cache');this.source=null,this.loopSource=null,this.muteNode=t.context.createGain(),this.volumeNode=t.context.createGain(),this.pannerNode=null,this.spatialNode=null,this.spatialSource=null,this.playTime=0,this.startTime=0,this.loopTime=0,this.rateUpdates=[],this.hasEnded=!1,this.hasLooped=!1,this.muteNode.connect(this.volumeNode),t.context.createPanner&&(this.spatialNode=t.context.createPanner(),this.volumeNode.connect(this.spatialNode)),t.context.createStereoPanner?(this.pannerNode=t.context.createStereoPanner(),t.context.createPanner?this.spatialNode.connect(this.pannerNode):this.volumeNode.connect(this.pannerNode),this.pannerNode.connect(t.destination)):t.context.createPanner?this.spatialNode.connect(t.destination):this.volumeNode.connect(t.destination),this.duration=this.audioBuffer.duration,this.totalDuration=this.audioBuffer.duration,s.call(this,t,e,i)},play:function(t,e){return!!s.prototype.play.call(this,t,e)&&(this.stopAndRemoveBufferSource(),this.createAndStartBufferSource(),this.emit(r.PLAY,this),!0)},pause:function(){return!(this.manager.context.currentTime{var s=i(53134),n=i(85034),r=i(83419),o=i(14463),a=i(8443),h=i(71741),l=i(95540),u=new r({Extends:n,initialize:function(t){this.context=this.createAudioContext(t),this.masterMuteNode=this.context.createGain(),this.masterVolumeNode=this.context.createGain(),this.masterMuteNode.connect(this.masterVolumeNode),this.masterVolumeNode.connect(this.context.destination),this.destination=this.masterMuteNode,this.locked="suspended"===this.context.state,n.call(this,t),this.locked&&(t.isBooted?this.unlock():t.events.once(a.BOOT,this.unlock,this)),t.events.on(a.VISIBLE,this.onGameVisible,this)},onGameVisible:function(){var t=this.context;window.setTimeout((function(){t&&(t.suspend(),t.resume())}),100)},createAudioContext:function(t){var e=t.config.audio;return e.context?(e.context.resume(),e.context):window.hasOwnProperty("AudioContext")?new AudioContext:window.hasOwnProperty("webkitAudioContext")?new window.webkitAudioContext:void 0},setAudioContext:function(t){return this.context&&this.context.close(),this.masterMuteNode&&this.masterMuteNode.disconnect(),this.masterVolumeNode&&this.masterVolumeNode.disconnect(),this.context=t,this.masterMuteNode=t.createGain(),this.masterVolumeNode=t.createGain(),this.masterMuteNode.connect(this.masterVolumeNode),this.masterVolumeNode.connect(t.destination),this.destination=this.masterMuteNode,this},add:function(t,e){var i=new h(this,t,e);return this.sounds.push(i),i},decodeAudio:function(t,e){var i;i=Array.isArray(t)?t:[{key:t,data:e}];for(var n=this.game.cache.audio,r=i.length,a=0;a{var s=i(37105),n=i(83419),r=i(29747),o=i(19186),a=new n({initialize:function(t){this.parent=t,this.list=[],this.position=0,this.addCallback=r,this.removeCallback=r,this._sortKey=""},add:function(t,e){return e?s.Add(this.list,t):s.Add(this.list,t,0,this.addCallback,this)},addAt:function(t,e,i){return i?s.AddAt(this.list,t,e):s.AddAt(this.list,t,e,0,this.addCallback,this)},getAt:function(t){return this.list[t]},getIndex:function(t){return this.list.indexOf(t)},sort:function(t,e){return t?(void 0===e&&(e=function(e,i){return e[t]-i[t]}),o(this.list,e),this):this},getByName:function(t){return s.GetFirst(this.list,"name",t)},getRandom:function(t,e){return s.GetRandom(this.list,t,e)},getFirst:function(t,e,i,n){return s.GetFirst(this.list,t,e,i,n)},getAll:function(t,e,i,n){return s.GetAll(this.list,t,e,i,n)},count:function(t,e){return s.CountAllMatching(this.list,t,e)},swap:function(t,e){s.Swap(this.list,t,e)},moveTo:function(t,e){return s.MoveTo(this.list,t,e)},moveAbove:function(t,e){return s.MoveAbove(this.list,t,e)},moveBelow:function(t,e){return s.MoveBelow(this.list,t,e)},remove:function(t,e){return e?s.Remove(this.list,t):s.Remove(this.list,t,this.removeCallback,this)},removeAt:function(t,e){return e?s.RemoveAt(this.list,t):s.RemoveAt(this.list,t,this.removeCallback,this)},removeBetween:function(t,e,i){return i?s.RemoveBetween(this.list,t,e):s.RemoveBetween(this.list,t,e,this.removeCallback,this)},removeAll:function(t){for(var e=this.list.length;e--;)this.remove(this.list[e],t);return this},bringToTop:function(t){return s.BringToTop(this.list,t)},sendToBack:function(t){return s.SendToBack(this.list,t)},moveUp:function(t){return s.MoveUp(this.list,t),t},moveDown:function(t){return s.MoveDown(this.list,t),t},reverse:function(){return this.list.reverse(),this},shuffle:function(){return s.Shuffle(this.list),this},replace:function(t,e){return s.Replace(this.list,t,e)},exists:function(t){return this.list.indexOf(t)>-1},setAll:function(t,e,i,n){return s.SetAll(this.list,t,e,i,n),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=a},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{var s=i(83419),n=i(50792),r=i(82348),o=new s({Extends:n,initialize:function(){n.call(this),this._pending=[],this._active=[],this._destroy=[],this._toProcess=0,this.checkQueue=!1},isActive:function(t){return this._active.indexOf(t)>-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{var s=i(43886);function n(t){if(!(this instanceof n))return new n(t,[".left",".top",".right",".bottom"]);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}function r(t,e,i){if(!i)return e.indexOf(t);for(var s=0;s=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 g(t,e,i,n,r){for(var o,a=[e,i];a.length;)(i=a.pop())-(e=a.pop())<=n||(o=e+Math.ceil((i-e)/n/2)*n,s(t,o,e,i,r),a.push(e,o,o,i))}n.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,i=[],s=this.toBBox;if(!p(t,e))return i;for(var n,r,o,a,h=[];e;){for(n=0,r=e.children.length;n=0&&r[e].children.length>this._maxEntries;)this._split(r,e),e--;this._adjustParentBBoxes(n,r,e)},_split:function(t,e){var i=t[e],s=i.children.length,n=this._minEntries;this._chooseSplitAxis(i,n,s);var r=this._chooseSplitIndex(i,n,s),a=v(i.children.splice(r,i.children.length-r));a.height=i.height,a.leaf=i.leaf,o(i,this.toBBox),o(a,this.toBBox),e?t[e-1].children.push(a):this._splitRoot(i,a)},_splitRoot:function(t,e){this.data=v([t,e]),this.data.height=t.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,i){var s,n,r,o,h,l,u,d,f,p,v,g,m,y;for(l=u=1/0,s=e;s<=i-e;s++)n=a(t,0,s,this.toBBox),r=a(t,s,i,this.toBBox),f=n,p=r,v=void 0,g=void 0,m=void 0,y=void 0,v=Math.max(f.minX,p.minX),g=Math.max(f.minY,p.minY),m=Math.min(f.maxX,p.maxX),y=Math.min(f.maxY,p.maxY),o=Math.max(0,m-v)*Math.max(0,y-g),h=c(n)+c(r),o=e;n--)r=t.children[n],h(u,t.leaf?o(r):r),c+=d(u);return c},_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():o(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=n},35072:(t,e,i)=>{var s=new(i(83419))({initialize:function(t){if(this.entries=[],Array.isArray(t))for(var e=0;e-1&&this.entries.splice(e,1),this},dump:function(){console.group("Set");for(var t=0;t-1},union:function(t){var e=new s;return t.entries.forEach((function(t){e.set(t)})),this.entries.forEach((function(t){e.set(t)})),e},intersect:function(t){var e=new s;return this.entries.forEach((function(i){t.contains(i)&&e.set(i)})),e},difference:function(t){var e=new s;return this.entries.forEach((function(i){t.contains(i)||e.set(i)})),e},size:{get:function(){return this.entries.length},set:function(t){return t{var s=i(45319),n=i(83419),r=i(56583),o=i(26099),a=new n({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 o},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 a.NONE:this._width=this.getNewWidth(r(t,this.snapTo.x)),this._height=this.getNewHeight(r(e,this.snapTo.y)),this.aspectRatio=0===this._height?1:this._width/this._height;break;case a.WIDTH_CONTROLS_HEIGHT:this._width=this.getNewWidth(r(t,this.snapTo.x)),this._height=this.getNewHeight(this._width*(1/this.aspectRatio),!1);break;case a.HEIGHT_CONTROLS_WIDTH:this._height=this.getNewHeight(r(e,this.snapTo.y)),this._width=this.getNewWidth(this._height*this.aspectRatio,!1);break;case a.FIT:this.constrain(t,e,!0);break;case a.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(r(t,this.snapTo.x)),this._height=this.getNewHeight(r(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,n=0===e?1:t/e;return i&&this.aspectRatio>n||!i&&this.aspectRatio0&&(t=(e=r(e,s.y))*this.aspectRatio)):(i&&this.aspectRation)&&(t=(e=r(e,s.y))*this.aspectRatio,s.x>0&&(e=(t=r(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)}}});a.NONE=0,a.WIDTH_CONTROLS_HEIGHT=1,a.HEIGHT_CONTROLS_WIDTH=2,a.FIT=3,a.ENVELOP=4,t.exports=a},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),Set:i(35072),Size:i(86555)}},57382:(t,e,i)=>{var s=i(83419),n=i(45319),r=i(40987),o=i(8054),a=i(50030),h=i(79237),l=new s({Extends:h,initialize:function(t,e,i,s,n){h.call(this,t,e,i,s,n),this.add("__BASE",0,0,0,s,n),this._source=this.frames.__BASE.source,this.canvas=this._source.image,this.context=this.canvas.getContext("2d",{willReadFrequently:!0}),this.width=s,this.height=n,this.imageData=this.context.getImageData(0,0,s,n),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===o.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,n){void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=!0);var r=this.manager.getFrame(t,e);if(r){var o=r.canvasData,a=r.cutWidth,h=r.cutHeight,l=r.source.resolution;this.context.drawImage(r.source.image,o.x,o.y,a,h,i,s,a/l,h/l),n&&this.update()}return this},setPixel:function(t,e,i,s,n,r){if(void 0===r&&(r=255),t=Math.abs(Math.floor(t)),e=Math.abs(Math.floor(e)),this.getIndex(t,e)>-1){var o=this.context.getImageData(t,e,1,1);o.data[0]=i,o.data[1]=s,o.data[2]=n,o.data[3]=r,this.context.putImageData(o,t,e)}return this},putData:function(t,e,i,s,n,r,o){return void 0===s&&(s=0),void 0===n&&(n=0),void 0===r&&(r=t.width),void 0===o&&(o=t.height),this.context.putImageData(t,e,i,s,n,r,o),this},getData:function(t,e,i,s){return t=n(Math.floor(t),0,this.width-1),e=n(Math.floor(e),0,this.height-1),i=n(i,1,this.width-t),s=n(s,1,this.height-e),this.context.getImageData(t,e,i,s)},getPixel:function(t,e,i){i||(i=new r);var s=this.getIndex(t,e);if(s>-1){var n=this.data,o=n[s+0],a=n[s+1],h=n[s+2],l=n[s+3];i.setTo(o,a,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 o=n(t,0,this.width),a=n(t+i,0,this.width),h=n(e,0,this.height),l=n(e+s,0,this.height),u=new r,c=[],d=h;d{var s=i(10312),n=i(38058),r=i(27919),o=i(83419),a=i(8054),h=i(4327),l=i(95540),u=i(36060),c=i(32302),d=i(79237),f=i(70554),p=new o({Extends:d,initialize:function(t,e,i,s,o){void 0===i&&(i=256),void 0===s&&(s=256),void 0===o&&(o=!0),this.type="DynamicTexture";var h=t.game.renderer,l=h&&h.type===a.CANVAS,f=l?r.create2D(this,i,s):[this];d.call(this,t,e,f,i,s),this.add("__BASE",0,0,0,i,s),this.renderer=h,this.width=-1,this.height=-1,this.isDrawing=!1,this.canvas=l?f:null,this.context=l?f.getContext("2d",{willReadFrequently:!0}):null,this.dirty=!1,this.isSpriteTexture=!0,this._eraseMode=!1,this.camera=new n(0,0,i,s).setScene(t.game.scene.systemScene,!1),this.renderTarget=l?null:new c(h,i,s,1,0,!1,!1,!0,!1),this.pipeline=l?null:h.pipelines.get(u.SINGLE_PIPELINE),this.setSize(i,s,o)},setSize:function(t,e,i){void 0===e&&(e=t),void 0===i&&(i=!0),i&&((t=Math.floor(t))%2!=0&&t++,(e=Math.floor(e))%2!=0&&e++);var s=this.get(),n=s.source;if(t!==this.width||e!==this.height){this.canvas&&(this.canvas.width=t,this.canvas.height=e);var r=this.renderTarget;r&&(r.willResize(t,e)&&r.resize(t,e),r.texture!==n.glTexture&&this.renderer.deleteTexture(n.glTexture),this.setFromRenderTarget()),this.camera.setSize(t,e),n.width=t,n.height=e,s.setSize(t,e),this.width=t,this.height=e}else{var o=this.getSourceImage();s.cutX+t>o.width&&(t=o.width-s.cutX),s.cutY+e>o.height&&(e=o.height-s.cutY),s.setSize(t,e,s.cutX,s.cutY)}return this},setFromRenderTarget:function(){var t=this.get().source,e=this.renderTarget;return t.isRenderTexture=!0,t.isGLTexture=!0,t.glTexture=e.texture,this},setIsSpriteTexture:function(t){return this.isSpriteTexture=t,this},fill:function(t,e,i,s,n,r){var o=this.camera,a=this.renderer;void 0===e&&(e=1),void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=this.width),void 0===r&&(r=this.height);var h=t>>16&255,l=t>>8&255,u=255&t,c=this.renderTarget;if(o.preRender(),c){c.bind(!0);var d=this.pipeline.manager.set(this.pipeline),p=a.width/c.width,v=a.height/c.height,g=c.height-(s+r);d.drawFillRect(i*p,g*v,n*p,r*v,f.getTintFromFloats(u/255,l/255,h/255,1),e),c.unbind(!0)}else{var m=this.context;a.setContext(m),m.globalCompositeOperation="source-over",m.fillStyle="rgba("+h+","+l+","+u+","+e+")",m.fillRect(i,s,n,r),a.setContext()}return this.dirty=!0,this},clear:function(t,e,i,s){if(this.dirty){var n=this.context,r=this.renderTarget;r?r.clear(t,e,i,s):n&&(void 0!==t&&void 0!==e&&void 0!==i&&void 0!==s?n.clearRect(t,e,i,s):(n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,this.width,this.height),n.restore())),this.dirty=!1}return this},stamp:function(t,e,i,s,n){void 0===i&&(i=0),void 0===s&&(s=0);var r=l(n,"alpha",1),o=l(n,"tint",16777215),a=l(n,"angle",0),h=l(n,"rotation",0),u=l(n,"scale",1),c=l(n,"scaleX",u),d=l(n,"scaleY",u),f=l(n,"originX",.5),p=l(n,"originY",.5),v=l(n,"blendMode",0),g=l(n,"erase",!1),m=l(n,"skipBatch",!1),y=this.manager.resetStamp(r,o);return y.setAngle(0),0!==a?y.setAngle(a):0!==h&&y.setRotation(h),y.setScale(c,d),y.setTexture(t,e),y.setOrigin(f,p),y.setBlendMode(v),g&&(this._eraseMode=!0),m?this.batchGameObject(y,i,s):this.draw(y,i,s),g&&(this._eraseMode=!1),this},erase:function(t,e,i){return this._eraseMode=!0,this.draw(t,e,i),this._eraseMode=!1,this},draw:function(t,e,i,s,n){return this.beginDraw(),this.batchDraw(t,e,i,s,n),this.endDraw(),this},drawFrame:function(t,e,i,s,n,r){return this.beginDraw(),this.batchDrawFrame(t,e,i,s,n,r),this.endDraw(),this},repeat:function(t,e,i,s,n,r,o,a,l){if(void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=this.width),void 0===r&&(r=this.height),void 0===o&&(o=1),void 0===a&&(a=16777215),void 0===l&&(l=!1),!(e=t instanceof h?t:this.manager.getFrame(t,e)))return this;var u=this.manager.resetStamp(o,a);u.setFrame(e),u.setOrigin(0);var c=e.width,d=e.height;n=Math.floor(n),r=Math.floor(r);var f=Math.ceil(n/c),p=Math.ceil(r/d),v=f*c-n,g=p*d-r;v>0&&(v=c-v),g>0&&(g=d-g),i<0&&(f+=Math.ceil(Math.abs(i)/c)),s<0&&(p+=Math.ceil(Math.abs(s)/d));var m=i,y=s,x=!1,T=this.manager.stampCrop.setTo(0,0,c,d);l||this.beginDraw();for(var w=0;w0&&b===f-1&&(x=!0,T.width=v),g>0&&w===p-1&&(x=!0,T.height=g),x&&u.setCrop(T),this.batchGameObject(u,m,y),u.isCropped=!1,T.setTo(0,0,c,d)),m+=c;m=i,y+=d}return l||this.endDraw(),this},beginDraw:function(){if(!this.isDrawing){var t=this.camera,e=this.renderer,i=this.renderTarget;t.preRender(),i?e.beginCapture(i.width,i.height):e.setContext(this.context),this.isDrawing=!0}return this},batchDraw:function(t,e,i,s,n){return Array.isArray(t)||(t=[t]),this.batchList(t,e,i,s,n),this},batchDrawFrame:function(t,e,i,s,n,r){void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=1),void 0===r&&(r=16777215);var o=this.manager.getFrame(t,e);return o&&(this.renderTarget?this.pipeline.batchTextureFrame(o,i,s,r,n,this.camera.matrix,null):this.batchTextureFrame(o,i,s,n,r)),this},endDraw:function(t){if(void 0===t&&(t=this._eraseMode),this.isDrawing){var e=this.renderer,i=this.renderTarget;if(i){var s=e.endCapture();e.pipelines.setUtility().blitFrame(s,i,1,!1,!1,t,this.isSpriteTexture),e.resetScissor(),e.resetViewport()}else e.setContext();this.dirty=!0,this.isDrawing=!1}return this},batchList:function(t,e,i,s,n){var r=t.length;if(0!==r)for(var o=0;o0&&a.height>0&&o.drawImage(h,a.x,a.y,a.width,a.height,e,i,a.width,a.height),o.restore()}},snapshotArea:function(t,e,i,s,n,r,o){return this.renderTarget?this.renderer.snapshotFramebuffer(this.renderTarget.framebuffer,this.width,this.height,n,!1,t,e,i,s,r,o):this.renderer.snapshotCanvas(this.canvas,n,!1,t,e,i,s,r,o),this},snapshot:function(t,e,i){return this.snapshotArea(0,0,this.width,this.height,t,e,i)},snapshotPixel:function(t,e,i){return this.snapshotArea(t,e,1,1,i,"pixel")},getWebGLTexture:function(){if(this.renderTarget)return this.renderTarget.texture},renderWebGL:function(t,e,i,s){var n=this.manager.resetStamp();n.setTexture(this),n.setOrigin(0),n.renderWebGL(t,n,i,s)},renderCanvas:function(){},destroy:function(){var t=this.manager.stamp;t&&t.texture===this&&this.manager.resetStamp(),d.prototype.destroy.call(this),r.remove(this.canvas),this.renderTarget&&this.renderTarget.destroy(),this.camera.destroy(),this.canvas=null,this.context=null,this.renderer=null}});t.exports=p},4327:(t,e,i)=>{var s=i(83419),n=i(45319),r=i(79291),o=new s({initialize:function(t,e,i,s,n,r,o){this.texture=t,this.name=e,this.source=t.source[i],this.sourceIndex=i,this.cutX,this.cutY,this.cutWidth,this.cutHeight,this.x=0,this.y=0,this.width,this.height,this.halfWidth,this.halfHeight,this.centerX,this.centerY,this.pivotX=0,this.pivotY=0,this.customPivot=!1,this.rotated=!1,this.autoRound=-1,this.customData={},this.u0=0,this.v0=0,this.u1=0,this.v1=0,this.data={cut:{x:0,y:0,w:0,h:0,r:0,b:0},trim:!1,sourceSize:{w:0,h:0},spriteSourceSize:{x:0,y:0,w:0,h:0,r:0,b:0},radius:0,drawImage:{x:0,y:0,width:0,height:0},is3Slice:!1,scale9:!1,scale9Borders:{x:0,y:0,w:0,h:0}},this.setSize(r,o,s,n)},setCutPosition:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=0),this.cutX=t,this.cutY=e,this.updateUVs()},setCutSize:function(t,e){return this.cutWidth=t,this.cutHeight=e,this.updateUVs()},setSize:function(t,e,i,s){void 0===i&&(i=0),void 0===s&&(s=0),this.setCutPosition(i,s),this.setCutSize(t,e),this.width=t,this.height=e,this.halfWidth=Math.floor(.5*t),this.halfHeight=Math.floor(.5*e),this.centerX=Math.floor(t/2),this.centerY=Math.floor(e/2);var n=this.data,r=n.cut;r.x=i,r.y=s,r.w=t,r.h=e,r.r=i+t,r.b=s+e,n.sourceSize.w=t,n.sourceSize.h=e,n.spriteSourceSize.w=t,n.spriteSourceSize.h=e,n.radius=.5*Math.sqrt(t*t+e*e);var o=n.drawImage;return o.x=i,o.y=s,o.width=t,o.height=e,this.updateUVs()},setTrim:function(t,e,i,s,n,r){var o=this.data,a=o.spriteSourceSize;return o.trim=!0,o.sourceSize.w=t,o.sourceSize.h=e,a.x=i,a.y=s,a.w=n,a.h=r,a.r=i+n,a.b=s+r,this.x=i,this.y=s,this.width=n,this.height=r,this.halfWidth=.5*n,this.halfHeight=.5*r,this.centerX=Math.floor(n/2),this.centerY=Math.floor(r/2),this.updateUVs()},setScale9:function(t,e,i,s){var n=this.data;return n.scale9=!0,n.is3Slice=0===e&&s===this.height,n.scale9Borders.x=t,n.scale9Borders.y=e,n.scale9Borders.w=i,n.scale9Borders.h=s,this},setCropUVs:function(t,e,i,s,r,o,a){var h=this.cutX,l=this.cutY,u=this.cutWidth,c=this.cutHeight,d=this.realWidth,f=this.realHeight,p=h+(e=n(e,0,d)),v=l+(i=n(i,0,f)),g=s=n(s,0,d-e),m=r=n(r,0,f-i),y=this.data;if(y.trim){var x=y.spriteSourceSize,T=e+(s=n(s,0,x.x+u-e)),w=i+(r=n(r,0,x.y+c-i));if(!(x.rT||x.y>w)){var b=Math.max(x.x,e),S=Math.max(x.y,i),E=Math.min(x.r,T)-b,A=Math.min(x.b,w)-S;g=E,m=A,p=o?h+(u-(b-x.x)-E):h+(b-x.x),v=a?l+(c-(S-x.y)-A):l+(S-x.y),e=b,i=S,s=E,r=A}else p=0,v=0,g=0,m=0}else o&&(p=h+(u-e-s)),a&&(v=l+(c-i-r));var C=this.source.width,_=this.source.height;return t.u0=Math.max(0,p/C),t.v0=Math.max(0,v/_),t.u1=Math.min(1,(p+g)/C),t.v1=Math.min(1,(v+m)/_),t.x=e,t.y=i,t.cx=p,t.cy=v,t.cw=g,t.ch=m,t.width=s,t.height=r,t.flipX=o,t.flipY=a,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,n,r){var o=this.data.drawImage;return o.width=t,o.height=e,this.u0=i,this.v0=s,this.u1=n,this.v1=r,this},updateUVs:function(){var t=this.cutX,e=this.cutY,i=this.cutWidth,s=this.cutHeight,n=this.data.drawImage;n.width=i,n.height=s;var r=this.source.width,o=this.source.height;return this.u0=t/r,this.v0=e/o,this.u1=(t+i)/r,this.v1=(e+s)/o,this},updateUVsInverted:function(){var t=this.source.width,e=this.source.height;return this.u0=(this.cutX+this.cutHeight)/t,this.v0=this.cutY/e,this.u1=this.cutX/t,this.v1=(this.cutY+this.cutWidth)/e,this},clone:function(){var t=new o(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=r(!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=o},79237:(t,e,i)=>{var s=i(83419),n=i(4327),r=i(11876),o='Texture "%s" has no frame "%s"',a=new s({initialize:function(t,e,i,s,n){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;for(var o=0;or&&(r=h.cutX+h.cutWidth),h.cutY+h.cutHeight>o&&(o=h.cutY+h.cutHeight)}return{x:s,y:n,width:r-s,height:o-n}},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(o,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(o,this.key,t),e=this.frames.__BASE.sourceIndex),this.dataSource[e].image},setDataSource:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e{var s=i(27919),n=i(57382),r=i(83419),o=i(40987),a=i(8054),h=i(81320),l=i(50792),u=i(69442),c=i(4327),d=i(8443),f=i(99584),p=i(35154),v=i(88571),g=i(41212),m=i(61309),y=i(87841),x=i(79237),T=new r({Extends:l,initialize:function(t){l.call(this),this.game=t,this.name="TextureManager",this.list={},this._tempCanvas=s.create2D(this),this._tempContext=this._tempCanvas.getContext("2d",{willReadFrequently:!0}),this._pending=0,this.stamp,this.stampCrop=new y,this.silentWarnings=!1,t.events.once(d.BOOT,this.boot,this)},boot:function(){this._pending=3,this.on(u.LOAD,this.updatePending,this),this.on(u.ERROR,this.updatePending,this);var t=this.game.config;null!==t.defaultImage&&this.addBase64("__DEFAULT",t.defaultImage),null!==t.missingImage&&this.addBase64("__MISSING",t.missingImage),null!==t.whiteImage&&this.addBase64("__WHITE",t.whiteImage),this.game.renderer&&this.game.renderer.gl&&this.addUint8Array("__NORMAL",new Uint8Array([127,127,255,255]),1,1),this.game.events.once(d.DESTROY,this.destroy,this),this.game.events.once(d.SYSTEM_READY,(function(t){this.stamp=new v(t).setOrigin(0)}),this)},updatePending:function(){this._pending--,0===this._pending&&(this.off(u.LOAD),this.off(u.ERROR),this.emit(u.READY))},checkKey:function(t){return!(!t||"string"!=typeof t||this.exists(t))||(this.silentWarnings||console.error("Texture key already in use: "+t),!1)},remove:function(t){if("string"==typeof t){if(!this.exists(t))return this.silentWarnings||console.warn("No texture found matching key: "+t),this;t=this.get(t)}var e=t.key;return this.list.hasOwnProperty(e)&&(t.destroy(),this.emit(u.REMOVE,e),this.emit(u.REMOVE_KEY+e)),this},removeKey:function(t){return this.list.hasOwnProperty(t)&&delete this.list[t],this},addBase64:function(t,e){if(this.checkKey(t)){var i=this,s=new Image;s.onerror=function(){i.emit(u.ERROR,t)},s.onload=function(){var e=i.create(t,s);e&&(m.Image(e,0),i.emit(u.ADD,t,e),i.emit(u.ADD_KEY+t,e),i.emit(u.LOAD,t,e))},s.src=e}return this},getBase64:function(t,e,i,n){void 0===i&&(i="image/png"),void 0===n&&(n=.92);var r="",o=this.getFrame(t,e);if(o&&(o.source.isRenderTexture||o.source.isGLTexture))this.silentWarnings||console.warn("Cannot getBase64 from WebGL Texture");else if(o){var a=o.canvasData,h=s.create2D(this,a.width,a.height),l=h.getContext("2d",{willReadFrequently:!0});a.width>0&&a.height>0&&l.drawImage(o.source.image,a.x,a.y,a.width,a.height,0,0,a.width,a.height),r=h.toDataURL(i,n),s.remove(h)}return r},addImage:function(t,e,i){var s=null;return this.checkKey(t)&&(s=this.create(t,e),m.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,n=e.height;(i=this.create(t,e,s,n)).add("__BASE",0,0,0,s,n),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 n=function(t,e,i){Array.isArray(i.textures)||Array.isArray(i.frames)?m.JSONArray(t,e,i):m.JSONHash(t,e,i)};if(Array.isArray(i))for(var r=0;r=r.x&&t=r.y&&e=r.x&&t=r.y&&e{var s=i(27919),n=i(83419),r=i(50030),o=i(29795),a=i(82751),h=new n({initialize:function(t,e,i,s,n){void 0===n&&(n=!1);var h=t.manager.game;this.renderer=h.renderer,this.texture=t,this.source=e,this.image=e.compressed?null:e,this.compressionAlgorithm=e.compressed?e.format:null,this.resolution=1,this.width=i||e.naturalWidth||e.videoWidth||e.width||0,this.height=s||e.naturalHeight||e.videoHeight||e.height||0,this.scaleMode=o.DEFAULT,this.isCanvas=e instanceof HTMLCanvasElement,this.isVideo=window.hasOwnProperty("HTMLVideoElement")&&e instanceof HTMLVideoElement,this.isRenderTexture="RenderTexture"===e.type||"DynamicTexture"===e.type,this.isGLTexture=e instanceof a,this.isPowerOf2=r(this.width,this.height),this.glTexture=null,this.flipY=n,this.init(h)},init:function(t){var e=this.renderer;if(e){var i=this.source;if(e.gl){var s=this.image,n=this.flipY,r=this.width,o=this.height,a=this.scaleMode;this.isCanvas?this.glTexture=e.createCanvasTexture(s,!1,n):this.isVideo?this.glTexture=e.createVideoTexture(s,!1,n):this.isRenderTexture?this.glTexture=e.createTextureFromSource(null,r,o,a):this.isGLTexture?this.glTexture=i:this.compressionAlgorithm?this.glTexture=e.createTextureFromSource(i,void 0,void 0,a):i instanceof Uint8Array?this.glTexture=e.createUint8ArrayTexture(i,r,o,a):this.glTexture=e.createTextureFromSource(s,r,o,a)}else this.isRenderTexture&&(this.image=i.canvas)}t.config.antialias||this.setFilter(1)},setFilter:function(t){this.renderer&&this.renderer.gl&&this.renderer.setTextureFilter(this.glTexture,t),this.scaleMode=t},setFlipY:function(t){return void 0===t&&(t=!0),t===this.flipY||(this.flipY=t,this.update()),this},update:function(){var t=this.renderer,e=this.image,i=this.flipY,s=t.gl;s&&this.isCanvas?t.updateCanvasTexture(e,this.glTexture,i):s&&this.isVideo&&t.updateVideoTexture(e,this.glTexture,i)},destroy:function(){this.glTexture&&this.renderer.deleteTexture(this.glTexture),this.isCanvas&&s.remove(this.image),this.renderer=null,this.texture=null,this.source=null,this.image=null,this.glTexture=null}});t.exports=h},19673:t=>{t.exports={LINEAR:0,NEAREST:1}},44538:t=>{t.exports="addtexture"},63486:t=>{t.exports="addtexture-"},94851:t=>{t.exports="onerror"},29099:t=>{t.exports="onload"},8678:t=>{t.exports="ready"},86415:t=>{t.exports="removetexture"},30879:t=>{t.exports="removetexture-"},69442:(t,e,i)=>{t.exports={ADD:i(44538),ADD_KEY:i(63486),ERROR:i(94851),LOAD:i(29099),READY:i(8678),REMOVE:i(86415),REMOVE_KEY:i(30879)}},27458:(t,e,i)=>{var s=i(79291),n=i(19673),r={CanvasTexture:i(57382),DynamicTexture:i(81320),Events:i(69442),FilterMode:n,Frame:i(4327),Parsers:i(61309),Texture:i(79237),TextureManager:i(17130),TextureSource:i(11876)};r=s(!1,r,n),t.exports=r},89905:t=>{t.exports=function(t,e,i){if(i.getElementsByTagName("TextureAtlas")){var s=t.source[e];t.add("__BASE",e,0,0,s.width,s.height);for(var n,r=i.getElementsByTagName("SubTexture"),o=0;o{t.exports=function(t,e){var i=t.source[e];return t.add("__BASE",e,0,0,i.width,i.height),t}},4832:t=>{t.exports=function(t,e){var i=t.source[e];return t.add("__BASE",e,0,0,i.width,i.height),t}},78566:(t,e,i)=>{var s=i(41786);t.exports=function(t,e,i){if(i.frames||i.textures){var n=t.source[e];t.add("__BASE",e,0,0,n.width,n.height);for(var r,o=Array.isArray(i.textures)?i.textures[e].frames:i.frames,a=0;a{var s=i(41786);t.exports=function(t,e,i){if(i.frames){var n=t.source[e];t.add("__BASE",e,0,0,n.width,n.height);var r,o=i.frames;for(var a in o)if(o.hasOwnProperty(a)){var h=o[a];if(r=t.add(a,e,h.frame.x,h.frame.y,h.frame.w,h.frame.h)){h.trimmed&&r.setTrim(h.sourceSize.w,h.sourceSize.h,h.spriteSourceSize.x,h.spriteSourceSize.y,h.spriteSourceSize.w,h.spriteSourceSize.h),h.rotated&&(r.rotated=!0,r.updateUVsInverted());var l=h.anchor||h.pivot;l&&(r.customPivot=!0,r.pivotX=l.x,r.pivotY=l.y),h.scale9Borders&&r.setScale9(h.scale9Borders.x,h.scale9Borders.y,h.scale9Borders.w,h.scale9Borders.h),r.customData=s(h)}else console.warn("Invalid atlas json, frame already exists: "+a)}for(var u in i)"frames"!==u&&(Array.isArray(i[u])?t.customData[u]=i[u].slice(0):t.customData[u]=i[u]);return t}console.warn("Invalid Texture Atlas JSON Hash given, missing 'frames' Object")}},31403:t=>{t.exports=function(t){var e,i=[171,75,84,88,32,49,49,187,13,10,26,10],s=new Uint8Array(t,0,12);for(e=0;e>1),v=Math.max(1,v>>1),f+=g}return{mipmaps:d,width:h,height:l,internalFormat:a,compressed:!0,generateMipmap:!1}}console.warn("KTXParser - Only compressed formats supported")}},82038:t=>{function e(t,e,i,s,n,r,o){return void 0===o&&(o=16),Math.floor((t+i)/n)*Math.floor((e+s)/r)*o}function i(t,e){return(t=Math.max(t,16))*(e=Math.max(e,8))/4}function s(t,e){return(t=Math.max(t,8))*(e=Math.max(e,8))/2}function n(t,e){return Math.ceil(t/4)*Math.ceil(e/4)*16}function r(t,i){return e(t,i,3,3,4,4,8)}function o(t,i){return e(t,i,3,3,4,4)}var a={0:{sizeFunc:i,glFormat:[35841]},1:{sizeFunc:i,glFormat:[35843]},2:{sizeFunc:s,glFormat:[35840]},3:{sizeFunc:s,glFormat:[35842]},6:{sizeFunc:r,glFormat:[36196]},7:{sizeFunc:r,glFormat:[33776,35916]},8:{sizeFunc:o,glFormat:[33777,35917]},9:{sizeFunc:o,glFormat:[33778,35918]},11:{sizeFunc:o,glFormat:[33779,35919]},14:{sizeFunc:n,glFormat:[36494,36495]},15:{sizeFunc:n,glFormat:[36492,36493]},22:{sizeFunc:r,glFormat:[37492,37493]},23:{sizeFunc:o,glFormat:[37496,37497]},24:{sizeFunc:r,glFormat:[37494,37495]},25:{sizeFunc:r,glFormat:[37488]},26:{sizeFunc:o,glFormat:[37490]},27:{sizeFunc:o,glFormat:[37808,37840]},28:{sizeFunc:function(t,i){return e(t,i,4,3,5,4)},glFormat:[37809,37841]},29:{sizeFunc:function(t,i){return e(t,i,4,4,5,5)},glFormat:[37810,37842]},30:{sizeFunc:function(t,i){return e(t,i,5,4,6,5)},glFormat:[37811,37843]},31:{sizeFunc:function(t,i){return e(t,i,5,5,6,6)},glFormat:[37812,37844]},32:{sizeFunc:function(t,i){return e(t,i,7,4,8,5)},glFormat:[37813,37845]},33:{sizeFunc:function(t,i){return e(t,i,7,5,8,6)},glFormat:[37814,37846]},34:{sizeFunc:function(t,i){return e(t,i,7,7,8,8)},glFormat:[37815,37847]},35:{sizeFunc:function(t,i){return e(t,i,9,4,10,5)},glFormat:[37816,37848]},36:{sizeFunc:function(t,i){return e(t,i,9,5,10,6)},glFormat:[37817,37849]},37:{sizeFunc:function(t,i){return e(t,i,9,7,10,8)},glFormat:[37818,37850]},38:{sizeFunc:function(t,i){return e(t,i,9,9,10,10)},glFormat:[37819,37851]},39:{sizeFunc:function(t,i){return e(t,i,11,9,12,10)},glFormat:[37820,37852]},40:{sizeFunc:function(t,i){return e(t,i,11,11,12,12)},glFormat:[37821,37853]}};t.exports=function(t){for(var e=new Uint32Array(t,0,13),i=55727696===e[0]?e[2]:e[3],s=e[4],n=a[i].glFormat[s],r=a[i].sizeFunc,o=e[11],h=e[7],l=e[6],u=52+e[12],c=new Uint8Array(t,u),d=new Array(o),f=0,p=h,v=l,g=0;g>1),v=Math.max(1,v>>1),f+=m}return{mipmaps:d,width:h,height:l,internalFormat:n,compressed:!0,generateMipmap:!1}}},75549:(t,e,i)=>{var s=i(95540);t.exports=function(t,e,i,n,r,o,a){var h=s(a,"frameWidth",null),l=s(a,"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 c=s(a,"startFrame",0),d=s(a,"endFrame",-1),f=s(a,"margin",0),p=s(a,"spacing",0),v=Math.floor((r-f+p)/(h+p))*Math.floor((o-f+p)/(l+p));0===v&&console.warn("SpriteSheet frame dimensions will result in zero frames for texture:",t.key),(c>v||c<-v)&&(c=0),c<0&&(c=v+c),(-1===d||d>v||dr&&(y=b-r),S>o&&(x=S-o),w>=c&&w<=d&&(t.add(T,e,i+g,n+m,h-y,l-x),T++),(g+=h+p)+h>r&&(g=f,m+=l+p)}return t}},47534:(t,e,i)=>{var s=i(95540);t.exports=function(t,e,i){var n=s(i,"frameWidth",null),r=s(i,"frameHeight",n);if(!n)throw new Error("TextureManager.SpriteSheetFromAtlas: Invalid frameWidth given.");var o=t.source[0];t.add("__BASE",0,0,0,o.width,o.height);var a,h=s(i,"startFrame",0),l=s(i,"endFrame",-1),u=s(i,"margin",0),c=s(i,"spacing",0),d=e.cutX,f=e.cutY,p=e.cutWidth,v=e.cutHeight,g=e.realWidth,m=e.realHeight,y=Math.floor((g-u+c)/(n+c)),x=Math.floor((m-u+c)/(r+c)),T=y*x,w=e.x,b=n-w,S=n-(g-p-w),E=e.y,A=r-E,C=r-(m-v-E);(h>T||h<-T)&&(h=0),h<0&&(h=T+h),-1!==l&&(T=h+(l+1));for(var _=u,M=u,P=0,R=0;R{var e=0,i=function(t,i,s,n){var r=e-n.y-n.height;t.add(s,i,n.x,r,n.width,n.height)};t.exports=function(t,s,n){var r=t.source[s];t.add("__BASE",s,0,0,r.width,r.height),e=r.height;for(var o=n.split("\n"),a=/^[ ]*(- )*(\w+)+[: ]+(.*)/,h="",l="",u={x:0,y:0,width:0,height:0},c=0;c{var s=i(50030);function n(t){for(var e=t.mipmaps,i=0;i{t.exports={AtlasXML:i(89905),Canvas:i(72893),Image:i(4832),JSONArray:i(78566),JSONHash:i(39711),KTXParser:i(31403),PVRParser:i(82038),SpriteSheet:i(75549),SpriteSheetFromAtlas:i(47534),UnityYAML:i(86147)}},80341:t=>{t.exports={CSV:0,TILED_JSON:1,ARRAY_2D:2,WELTMEISTER:3}},16536:(t,e,i)=>{var s=new(i(83419))({initialize:function(t,e,i,s,n,r,o){(void 0===i||i<=0)&&(i=32),(void 0===s||s<=0)&&(s=32),void 0===n&&(n=0),void 0===r&&(r=0),this.name=t,this.firstgid=0|e,this.imageWidth=0|i,this.imageHeight=0|s,this.imageMargin=0|n,this.imageSpacing=0|r,this.properties=o||{},this.images=[],this.total=0},containsImageIndex:function(t){return t>=this.firstgid&&t{var s=new(i(83419))({initialize:function(t){if(this.gids=[],void 0!==t)for(var e=0;e{var s=i(80341),n=i(87010),r=i(46177),o=i(49075);t.exports=function(t,e,i,a,h,l,u,c){void 0===i&&(i=32),void 0===a&&(a=32),void 0===h&&(h=10),void 0===l&&(l=10),void 0===c&&(c=!1);var d=null;if(Array.isArray(u))d=r(void 0!==e?e:"map",s.ARRAY_2D,u,i,a,c);else if(void 0!==e){var f=t.cache.tilemap.get(e);f?d=r(e,f.format,f.data,i,a,c):console.warn("No map data found for key "+e)}return null===d&&(d=new n({tileWidth:i,tileHeight:a,width:h,height:l})),new o(t,d)}},23029:(t,e,i)=>{var s=i(83419),n=i(31401),r=i(91907),o=i(62644),a=i(93232),h=new s({Mixins:[n.AlphaSingle,n.Flip,n.Visible],initialize:function(t,e,i,s,n,r,o,a){this.layer=t,this.index=e,this.x=i,this.y=s,this.width=n,this.height=r,this.right,this.bottom,this.baseWidth=void 0!==o?o:n,this.baseHeight=void 0!==a?a:r,this.pixelX=0,this.pixelY=0,this.updatePixelXY(),this.properties={},this.rotation=0,this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceLeft=!1,this.faceRight=!1,this.faceTop=!1,this.faceBottom=!1,this.collisionCallback=void 0,this.collisionCallbackContext=this,this.tint=16777215,this.tintFill=!1,this.physics={}},containsPoint:function(t,e){return!(tthis.right||e>this.bottom)},copy:function(t){return this.index=t.index,this.alpha=t.alpha,this.properties=o(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 a),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,n){(void 0===e&&(e=t),void 0===i&&(i=t),void 0===s&&(s=t),void 0===n&&(n=!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,n)&&(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===r.ORTHOGONAL)this.pixelX=this.x*this.baseWidth,this.pixelY=this.y*this.baseHeight;else if(t===r.ISOMETRIC)this.pixelX=(this.x-this.y)*this.baseWidth*.5,this.pixelY=(this.x+this.y)*this.baseHeight*.5;else if(t===r.STAGGERED)this.pixelX=this.x*this.baseWidth+this.y%2*(this.baseWidth/2),this.pixelY=this.y*(this.baseHeight/2);else if(t===r.HEXAGONAL){var e,i,s=this.layer.staggerAxis,n=this.layer.staggerIndex,o=this.layer.hexSideLength;"y"===s?(i=(this.baseHeight-o)/2+o,this.pixelX="odd"===n?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-o)/2+o,this.pixelX=this.x*e,this.pixelY="odd"===n?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=h},49075:(t,e,i)=>{var s=i(84101),n=i(83419),r=i(39506),o=i(80341),a=i(95540),h=i(14977),l=i(27462),u=i(91907),c=i(36305),d=i(19133),f=i(68287),p=i(23029),v=i(81086),g=i(20442),m=i(33629),y=new n({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:v.GetWorldToTileXYFunction(i),WorldToTileX:v.GetWorldToTileXFunction(i),WorldToTileY:v.GetWorldToTileYFunction(i),TileToWorldXY:v.GetTileToWorldXYFunction(i),TileToWorldX:v.GetTileToWorldXFunction(i),TileToWorldY:v.GetTileToWorldYFunction(i),GetTileCorners:v.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,n,r,a,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 c=u.get(e),d=this.getTilesetIndex(t);if(null===d&&this.format===o.TILED_JSON)return console.warn('Tilemap has no tileset "%s". Its tilesets are %o',t,this.tilesets),null;var f=this.tilesets[d];return f?((i||n)&&f.setTileSize(i,n),(r||a)&&f.setSpacing(r,a),f.setImage(c),f):(void 0===i&&(i=this.tileWidth),void 0===n&&(n=this.tileHeight),void 0===r&&(r=0),void 0===a&&(a=0),void 0===h&&(h=0),void 0===l&&(l={x:0,y:0}),(f=new m(t,h,i,n,r,a,void 0,void 0,l)).setImage(c),this.tilesets.push(f),this.tiles=s(this),f)},copy:function(t,e,i,s,n,r,o,a){return null!==(a=this.getLayer(a))?(v.Copy(t,e,i,s,n,r,o,a),this):null},createBlankLayer:function(t,e,i,s,n,r,o,a){if(void 0===i&&(i=0),void 0===s&&(s=0),void 0===n&&(n=this.width),void 0===r&&(r=this.height),void 0===o&&(o=this.tileWidth),void 0===a&&(a=this.tileHeight),null!==this.getLayerIndex(t))return console.warn("Invalid Tilemap Layer ID: "+t),null;for(var l,u=new h({name:t,tileWidth:o,tileHeight:a,width:n,height:r,orientation:this.orientation,hexSideLength:this.hexSideLength}),c=0;c-1&&this.putTileAt(e,r.x,r.y,i,r.tilemapLayer)}return s},removeTileAt:function(t,e,i,s,n){return void 0===i&&(i=!0),void 0===s&&(s=!0),null===(n=this.getLayer(n))?null:v.RemoveTileAt(t,e,i,s,n)},removeTileAtWorldXY:function(t,e,i,s,n,r){return void 0===i&&(i=!0),void 0===s&&(s=!0),null===(r=this.getLayer(r))?null:v.RemoveTileAtWorldXY(t,e,i,s,n,r)},renderDebug:function(t,e,i){return null===(i=this.getLayer(i))?null:(this.orientation===u.ORTHOGONAL&&v.RenderDebug(t,e,i),this)},renderDebugFull:function(t,e){for(var i=this.layers,s=0;s{var s=i(44603),n=i(31989);s.register("tilemap",(function(t){var e=void 0!==t?t:{};return n(this.scene,e.key,e.tileWidth,e.tileHeight,e.width,e.height,e.data,e.insertNull)}))},46029:(t,e,i)=>{var s=i(39429),n=i(31989);s.register("tilemap",(function(t,e,i,s,r,o,a){return null===t&&(t=void 0),null===e&&(e=void 0),null===i&&(i=void 0),null===s&&(s=void 0),null===r&&(r=void 0),n(this.scene,t,e,i,s,r,o,a)}))},20442:(t,e,i)=>{var s=i(83419),n=i(78389),r=i(31401),o=i(95643),a=i(81086),h=i(19218),l=i(26099),u=new s({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.ComputedSize,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.PostPipeline,r.Transform,r.Visible,r.ScrollFactor,n,h],initialize:function(t,e,i,s,n,r){o.call(this,t,"TilemapLayer"),this.isTilemap=!0,this.tilemap=e,this.layerIndex=i,this.layer=e.layers[i],this.layer.tilemapLayer=this,this.tileset=[],this.tilesDrawn=0,this.tilesTotal=this.layer.width*this.layer.height,this.culledTiles=[],this.skipCull=!1,this.cullPaddingX=1,this.cullPaddingY=1,this.cullCallback=a.GetCullTilesFunction(this.layer.orientation),this._renderOrder=0,this.gidMap=[],this.tempVec=new l,this.collisionCategory=1,this.collisionMask=1,this.setTilesets(s),this.setAlpha(this.layer.alpha),this.setPosition(n,r),this.setOrigin(0,0),this.setSize(e.tileWidth*this.layer.width,e.tileHeight*this.layer.height),this.initPipeline(),this.initPostPipeline(!1)},setTilesets:function(t){var e=[],i=[],s=this.tilemap;Array.isArray(t)||(t=[t]);for(var n=0;n=0&&t<4&&(this._renderOrder=t),this},calculateFacesAt:function(t,e){return a.CalculateFacesAt(t,e,this.layer),this},calculateFacesWithin:function(t,e,i,s){return a.CalculateFacesWithin(t,e,i,s,this.layer),this},createFromTiles:function(t,e,i,s,n){return a.CreateFromTiles(t,e,i,s,n,this.layer)},cull:function(t){return this.cullCallback(this.layer,t,this.culledTiles,this._renderOrder)},copy:function(t,e,i,s,n,r,o){return a.Copy(t,e,i,s,n,r,o,this.layer),this},fill:function(t,e,i,s,n,r){return a.Fill(t,e,i,s,n,r,this.layer),this},filterTiles:function(t,e,i,s,n,r,o){return a.FilterTiles(t,e,i,s,n,r,o,this.layer)},findByIndex:function(t,e,i){return a.FindByIndex(t,e,i,this.layer)},findTile:function(t,e,i,s,n,r,o){return a.FindTile(t,e,i,s,n,r,o,this.layer)},forEachTile:function(t,e,i,s,n,r,o){return a.ForEachTile(t,e,i,s,n,r,o,this.layer),this},setTint:function(t,e,i,s,n,r){void 0===t&&(t=16777215);return this.forEachTile((function(e){e.tint=t,e.tintFill=!1}),this,e,i,s,n,r)},setTintFill:function(t,e,i,s,n,r){void 0===t&&(t=16777215);return this.forEachTile((function(e){e.tint=t,e.tintFill=!0}),this,e,i,s,n,r)},getTileAt:function(t,e,i){return a.GetTileAt(t,e,i,this.layer)},getTileAtWorldXY:function(t,e,i,s){return a.GetTileAtWorldXY(t,e,i,s,this.layer)},getIsoTileAtWorldXY:function(t,e,i,s,n){void 0===i&&(i=!0);var r=this.tempVec;return a.IsometricWorldToTileXY(t,e,!0,r,n,this.layer,i),this.getTileAt(r.x,r.y,s)},getTilesWithin:function(t,e,i,s,n){return a.GetTilesWithin(t,e,i,s,n,this.layer)},getTilesWithinShape:function(t,e,i){return a.GetTilesWithinShape(t,e,i,this.layer)},getTilesWithinWorldXY:function(t,e,i,s,n,r){return a.GetTilesWithinWorldXY(t,e,i,s,n,r,this.layer)},hasTileAt:function(t,e){return a.HasTileAt(t,e,this.layer)},hasTileAtWorldXY:function(t,e,i){return a.HasTileAtWorldXY(t,e,i,this.layer)},putTileAt:function(t,e,i,s){return a.PutTileAt(t,e,i,s,this.layer)},putTileAtWorldXY:function(t,e,i,s,n){return a.PutTileAtWorldXY(t,e,i,s,n,this.layer)},putTilesAt:function(t,e,i,s){return a.PutTilesAt(t,e,i,s,this.layer),this},randomize:function(t,e,i,s,n){return a.Randomize(t,e,i,s,n,this.layer),this},removeTileAt:function(t,e,i,s){return a.RemoveTileAt(t,e,i,s,this.layer)},removeTileAtWorldXY:function(t,e,i,s,n){return a.RemoveTileAtWorldXY(t,e,i,s,n,this.layer)},renderDebug:function(t,e){return a.RenderDebug(t,e,this.layer),this},replaceByIndex:function(t,e,i,s,n,r){return a.ReplaceByIndex(t,e,i,s,n,r,this.layer),this},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},setCollision:function(t,e,i,s){return a.SetCollision(t,e,i,this.layer,s),this},setCollisionBetween:function(t,e,i,s){return a.SetCollisionBetween(t,e,i,s,this.layer),this},setCollisionByProperty:function(t,e,i){return a.SetCollisionByProperty(t,e,i,this.layer),this},setCollisionByExclusion:function(t,e,i){return a.SetCollisionByExclusion(t,e,i,this.layer),this},setCollisionFromCollisionGroup:function(t,e){return a.SetCollisionFromCollisionGroup(t,e,this.layer),this},setTileIndexCallback:function(t,e,i){return a.SetTileIndexCallback(t,e,i,this.layer),this},setTileLocationCallback:function(t,e,i,s,n,r){return a.SetTileLocationCallback(t,e,i,s,n,r,this.layer),this},shuffle:function(t,e,i,s){return a.Shuffle(t,e,i,s,this.layer),this},swapByIndex:function(t,e,i,s,n,r){return a.SwapByIndex(t,e,i,s,n,r,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,n){return a.WeightedRandomize(e,i,s,n,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,n){return this.tilemap.worldToTileXY(t,e,i,s,n,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.culledTiles.length=0,this.cullCallback=null,this.gidMap=[],this.tileset=[],o.prototype.destroy.call(this))}});t.exports=u},16153:(t,e,i)=>{var s=i(61340),n=new s,r=new s,o=new s;t.exports=function(t,e,i,s){var a=e.cull(i),h=a.length,l=i.alpha*e.alpha;if(!(0===h||l<=0)){var u=n,c=r,d=o;c.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),u.copyFrom(i.matrix);var f=t.currentContext,p=e.gidMap;f.save(),s?(u.multiplyWithOffset(s,-i.scrollX*e.scrollFactorX,-i.scrollY*e.scrollFactorY),c.e=e.x,c.f=e.y,u.multiply(c,d),d.copyToContext(f)):(c.e-=i.scrollX*e.scrollFactorX,c.f-=i.scrollY*e.scrollFactorY,c.copyToContext(f)),(!t.antialias||e.scaleX>1||e.scaleY>1)&&(f.imageSmoothingEnabled=!1);for(var v=0;v{var s=i(29747),n=s,r=s;n=i(99558),r=i(16153),t.exports={renderWebGL:n,renderCanvas:r}},99558:(t,e,i)=>{var s=i(70554);t.exports=function(t,e,i){var n=e.cull(i),r=n.length,o=i.alpha*e.alpha;if(!(0===r||o<=0)){var a=e.gidMap,h=t.pipelines.set(e.pipeline,e),l=s.getTintAppendFloatAlpha,u=e.scrollFactorX,c=e.scrollFactorY,d=e.x,f=e.y,p=e.scaleX,v=e.scaleY;t.pipelines.preBatch(e);for(var g=0;g{var s=i(83419),n=i(26099),r=new s({initialize:function(t,e,i,s,r,o,a,h,l){(void 0===i||i<=0)&&(i=32),(void 0===s||s<=0)&&(s=32),void 0===r&&(r=0),void 0===o&&(o=0),void 0===a&&(a={}),void 0===h&&(h={}),this.name=t,this.firstgid=e,this.tileWidth=i,this.tileHeight=s,this.tileMargin=r,this.tileSpacing=o,this.tileProperties=a,this.tileData=h,this.tileOffset=new n,void 0!==l&&this.tileOffset.set(l.x,l.y),this.image=null,this.glTexture=null,this.rows=0,this.columns=0,this.total=0,this.texCoordinates=[]},getTileProperties:function(t){return this.containsTileIndex(t)?this.tileProperties[t-this.firstgid]:null},getTileData:function(t){return this.containsTileIndex(t)?this.tileData[t-this.firstgid]:null},getTileCollisionGroup:function(t){var e=this.getTileData(t);return e&&e.objectgroup?e.objectgroup:null},containsTileIndex:function(t){return t>=this.firstgid&&ti.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 n=(e-2*this.tileMargin+this.tileSpacing)/(this.tileHeight+this.tileSpacing),r=(t-2*this.tileMargin+this.tileSpacing)/(this.tileWidth+this.tileSpacing);n%1==0&&r%1==0||console.warn("Image tile area not tile size multiple in: "+this.name),n=Math.floor(n),r=Math.floor(r),this.rows=n,this.columns=r,this.total=n*r,this.texCoordinates.length=0;for(var o=this.tileMargin+i,a=this.tileMargin+s,h=0;h{var s=i(7423);t.exports=function(t,e,i){var n=s(t,e,!0,i),r=s(t,e-1,!0,i),o=s(t,e+1,!0,i),a=s(t-1,e,!0,i),h=s(t+1,e,!0,i),l=n&&n.collides;return l&&(n.faceTop=!0,n.faceBottom=!0,n.faceLeft=!0,n.faceRight=!0),r&&r.collides&&(l&&(n.faceTop=!1),r.faceBottom=!l),o&&o.collides&&(l&&(n.faceBottom=!1),o.faceTop=!l),a&&a.collides&&(l&&(n.faceLeft=!1),a.faceRight=!l),h&&h.collides&&(l&&(n.faceRight=!1),h.faceLeft=!l),n&&!n.collides&&n.resetFaces(),n}},42573:(t,e,i)=>{var s=i(7423),n=i(7386);t.exports=function(t,e,i,r,o){for(var a=null,h=null,l=null,u=null,c=n(t,e,i,r,null,o),d=0;d{var s=new(i(26099));t.exports=function(t,e,i,n){var r=i.tilemapLayer,o=r.cullPaddingX,a=r.cullPaddingY,h=r.tilemap.tileToWorldXY(t,e,s,n,r);return h.x>n.worldView.x+r.scaleX*i.tileWidth*(-o-.5)&&h.xn.worldView.y+r.scaleY*i.tileHeight*(-a-1)&&h.y{var s=i(42573),n=i(7386),r=i(62991),o=i(23029);t.exports=function(t,e,i,a,h,l,u,c){void 0===u&&(u=!0);var d=n(t,e,i,a,null,c),f=[];d.forEach((function(t){var e=new o(t.layer,t.index,t.x,t.y,t.width,t.height,t.baseWidth,t.baseHeight);e.copy(t),f.push(e)}));for(var p=h-t,v=l-e,g=0;g{var s=i(62644),n=i(7386),r=i(27987);t.exports=function(t,e,i,o,a,h){i||(i={}),Array.isArray(t)||(t=[t]);var l=h.tilemapLayer;o||(o=l.scene),a||(a=o.cameras.main);var u,c=h.width,d=h.height,f=n(0,0,c,d,null,h),p=[],v=function(t,e,i){for(var s=0;s{var s=i(87841),n=i(63448),r=i(56583),o=new s;t.exports=function(t,e){var i=t.tilemapLayer.tilemap,s=t.tilemapLayer,a=Math.floor(i.tileWidth*s.scaleX),h=Math.floor(i.tileHeight*s.scaleY),l=r(e.worldView.x-s.x,a,0,!0)-s.cullPaddingX,u=n(e.worldView.right-s.x,a,0,!0)+s.cullPaddingX,c=r(e.worldView.y-s.y,h,0,!0)-s.cullPaddingY,d=n(e.worldView.bottom-s.y,h,0,!0)+s.cullPaddingY;return o.setTo(l,c,u-l,d-c)}},30003:(t,e,i)=>{var s=i(19545),n=i(32483);t.exports=function(t,e,i,r){void 0===i&&(i=[]),void 0===r&&(r=0),i.length=0;var o=t.tilemapLayer,a=s(t,e);return(o.skipCull||1!==o.scrollFactorX||1!==o.scrollFactorY)&&(a.left=0,a.right=t.width,a.top=0,a.bottom=t.height),n(t,a,r,i),i}},35137:(t,e,i)=>{var s=i(7386),n=i(42573),r=i(20576);t.exports=function(t,e,i,o,a,h,l){for(var u=-1!==l.collideIndexes.indexOf(t),c=s(e,i,o,a,null,l),d=0;d{var s=i(7386);t.exports=function(t,e,i,n,r,o,a,h){return s(i,n,r,o,a,h).filter(t,e)}},52692:t=>{t.exports=function(t,e,i,s){void 0===e&&(e=0),void 0===i&&(i=!1);var n,r,o,a=0;if(i){for(r=s.height-1;r>=0;r--)for(n=s.width-1;n>=0;n--)if((o=s.data[r][n])&&o.index===t){if(a===e)return o;a+=1}}else for(r=0;r{var s=i(7386);t.exports=function(t,e,i,n,r,o,a,h){return s(i,n,r,o,a,h).find(t,e)||null}},97560:(t,e,i)=>{var s=i(7386);t.exports=function(t,e,i,n,r,o,a,h){s(i,n,r,o,a,h).forEach(t,e)}},43305:(t,e,i)=>{var s=i(91907),n=i(30003),r=i(9474),o=i(14018),a=i(29747),h=i(54503);t.exports=function(t){return t===s.ORTHOGONAL?n:t===s.HEXAGONAL?r:t===s.STAGGERED?h:t===s.ISOMETRIC?o:a}},7423:(t,e,i)=>{var s=i(62991);t.exports=function(t,e,i,n){if(s(t,e,n)){var r=n.data[e][t]||null;return r?-1===r.index?i?r:null:r:null}return null}},60540:(t,e,i)=>{var s=i(7423),n=new(i(26099));t.exports=function(t,e,i,r,o){return o.tilemapLayer.worldToTileXY(t,e,!0,n,r),s(n.x,n.y,i,o)}},55826:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n){var r=n.baseTileWidth,o=n.baseTileHeight,a=n.tilemapLayer,h=0,l=0;a&&(i||(i=a.scene.cameras.main),h=a.x+i.scrollX*(1-a.scrollFactorX),l=a.y+i.scrollY*(1-a.scrollFactorY),r*=a.scaleX,o*=a.scaleY);var u=h+t*r,c=l+e*o;return[new s(u,c),new s(u+r,c),new s(u+r,c+o),new s(u,c+o)]}},11758:(t,e,i)=>{var s=i(91907),n=i(27229),r=i(29747),o=i(55826);t.exports=function(t){return t===s.ORTHOGONAL?o:t===s.ISOMETRIC?r:t===s.HEXAGONAL?n:(s.STAGGERED,r)}},39167:(t,e,i)=>{var s=i(91907),n=i(29747),r=i(97281);t.exports=function(t){return t===s.ORTHOGONAL?r:n}},62e3:(t,e,i)=>{var s=i(91907),n=i(19951),r=i(14127),o=i(29747),a=i(97202),h=i(70326);t.exports=function(t){return t===s.ORTHOGONAL?h:t===s.ISOMETRIC?r:t===s.HEXAGONAL?n:t===s.STAGGERED?a:o}},5984:(t,e,i)=>{var s=i(91907),n=i(29747),r=i(28054),o=i(29650);t.exports=function(t){return t===s.ORTHOGONAL?o:t===s.STAGGERED?r:n}},7386:(t,e,i)=>{var s=i(95540);t.exports=function(t,e,i,n,r,o){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=o.width),void 0===n&&(n=o.height),r||(r={});var a=s(r,"isNotEmpty",!1),h=s(r,"isColliding",!1),l=s(r,"hasInterestingFace",!1);t<0&&(i+=t,t=0),e<0&&(n+=e,e=0),t+i>o.width&&(i=Math.max(o.width-t,0)),e+n>o.height&&(n=Math.max(o.height-e,0));for(var u=[],c=e;c{var s=i(55738),n=i(7386),r=i(91865),o=i(29747),a=i(26099),h=i(91907),l=function(t,e){return r.RectangleToTriangle(e,t)},u=new a,c=new a,d=new a;t.exports=function(t,e,i,a){if(a.orientation!==h.ORTHOGONAL)return console.warn("GetTilesWithinShape only works with orthogonal tilemaps"),[];if(void 0===t)return[];var f=o;t instanceof s.Circle?f=r.CircleToRectangle:t instanceof s.Rectangle?f=r.RectangleToRectangle:t instanceof s.Triangle?f=l:t instanceof s.Line&&(f=r.LineToRectangle),a.tilemapLayer.worldToTileXY(t.left,t.top,!0,c,i);var p=c.x,v=c.y;a.tilemapLayer.worldToTileXY(t.right,t.bottom,!1,d,i);var g=Math.ceil(d.x),m=Math.ceil(d.y),y=Math.max(g-p,1),x=Math.max(m-v,1),T=n(p,v,y,x,e,a),w=a.tileWidth,b=a.tileHeight;a.tilemapLayer&&(w*=a.tilemapLayer.scaleX,b*=a.tilemapLayer.scaleY);for(var S=[],E=new s.Rectangle(0,0,w,b),A=0;A{var s=i(7386),n=i(26099),r=new n,o=new n;t.exports=function(t,e,i,n,a,h,l){var u=l.tilemapLayer.tilemap._convert.WorldToTileXY;u(t,e,!0,r,h,l);var c=r.x,d=r.y;u(t+i,e+n,!1,o,h,l);var f=Math.ceil(o.x),p=Math.ceil(o.y);return s(c,d,f-c,p-d,a,l)}},96113:(t,e,i)=>{var s=i(91907),n=i(20242),r=i(10095);t.exports=function(t){return t===s.ORTHOGONAL?r:n}},16926:(t,e,i)=>{var s=i(91907),n=i(86625),r=i(96897),o=i(29747),a=i(15108),h=i(85896);t.exports=function(t){return t===s.ORTHOGONAL?h:t===s.ISOMETRIC?r:t===s.HEXAGONAL?n:t===s.STAGGERED?a:o}},55762:(t,e,i)=>{var s=i(91907),n=i(20242),r=i(51900),o=i(63288);t.exports=function(t){return t===s.ORTHOGONAL?o:t===s.STAGGERED?r:n}},45091:(t,e,i)=>{var s=i(62991);t.exports=function(t,e,i){if(s(t,e,i)){var n=i.data[e][t];return null!==n&&n.index>-1}return!1}},24152:(t,e,i)=>{var s=i(45091),n=new(i(26099));t.exports=function(t,e,i,r){r.tilemapLayer.worldToTileXY(t,e,!0,n,i);var o=n.x,a=n.y;return s(o,a,r)}},90454:(t,e,i)=>{var s=i(63448),n=i(56583);t.exports=function(t,e){var i,r,o,a,h=t.tilemapLayer.tilemap,l=t.tilemapLayer,u=Math.floor(h.tileWidth*l.scaleX),c=Math.floor(h.tileHeight*l.scaleY),d=t.hexSideLength;if("y"===t.staggerAxis){var f=(c-d)/2+d;i=n(e.worldView.x-l.x,u,0,!0)-l.cullPaddingX,r=s(e.worldView.right-l.x,u,0,!0)+l.cullPaddingX,o=n(e.worldView.y-l.y,f,0,!0)-l.cullPaddingY,a=s(e.worldView.bottom-l.y,f,0,!0)+l.cullPaddingY}else{var p=(u-d)/2+d;i=n(e.worldView.x-l.x,p,0,!0)-l.cullPaddingX,r=s(e.worldView.right-l.x,p,0,!0)+l.cullPaddingX,o=n(e.worldView.y-l.y,c,0,!0)-l.cullPaddingY,a=s(e.worldView.bottom-l.y,c,0,!0)+l.cullPaddingY}return{left:i,right:r,top:o,bottom:a}}},9474:(t,e,i)=>{var s=i(90454),n=i(32483);t.exports=function(t,e,i,r){void 0===i&&(i=[]),void 0===r&&(r=0),i.length=0;var o=t.tilemapLayer,a=s(t,e);return o.skipCull&&1===o.scrollFactorX&&1===o.scrollFactorY&&(a.left=0,a.right=t.width,a.top=0,a.bottom=t.height),n(t,a,r,i),i}},27229:(t,e,i)=>{var s=i(19951),n=i(26099),r=new n;t.exports=function(t,e,i,o){var a=o.baseTileWidth,h=o.baseTileHeight,l=o.tilemapLayer;l&&(a*=l.scaleX,h*=l.scaleY);var u,c,d=s(t,e,r,i,o),f=[],p=.5773502691896257;"y"===o.staggerAxis?(u=p*a,c=h/2):(u=a/2,c=p*h);for(var v=0;v<6;v++){var g=2*Math.PI*(.5-v)/6;f.push(new n(d.x+u*Math.cos(g),d.y+c*Math.sin(g)))}return f}},19951:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r){i||(i=new s);var o=r.baseTileWidth,a=r.baseTileHeight,h=r.tilemapLayer,l=0,u=0;h&&(n||(n=h.scene.cameras.main),l=h.x+n.scrollX*(1-h.scrollFactorX),u=h.y+n.scrollY*(1-h.scrollFactorY),o*=h.scaleX,a*=h.scaleY);var c,d,f=o/2,p=a/2,v=r.staggerAxis,g=r.staggerIndex;return"y"===v?(c=l+o*t+o,d=u+1.5*e*p+p,e%2==0&&("odd"===g?c-=f:c+=f)):"x"===v&&"odd"===g&&(c=l+1.5*t*f+f,d=u+a*t+a,t%2==0&&("odd"===g?d-=p:d+=p)),i.set(c,d)}},86625:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r,o){n||(n=new s);var a=o.baseTileWidth,h=o.baseTileHeight,l=o.tilemapLayer;l&&(r||(r=l.scene.cameras.main),t-=l.x+r.scrollX*(1-l.scrollFactorX),e-=l.y+r.scrollY*(1-l.scrollFactorY),a*=l.scaleX,h*=l.scaleY);var u,c,d,f,p,v=.5773502691896257,g=-.3333333333333333,m=.6666666666666666,y=a/2,x=h/2;"y"===o.staggerAxis?(d=v*(u=(t-y)/(v*a))+g*(c=(e-x)/x),f=0*u+m*c):(d=g*(u=(t-y)/y)+v*(c=(e-x)/(v*h)),f=m*u+0*c),p=-d-f;var T,w=Math.round(d),b=Math.round(f),S=Math.round(p),E=Math.abs(w-d),A=Math.abs(b-f),C=Math.abs(S-p);E>A&&E>C?w=-b-S:A>C&&(b=-w-S);var _=b;return T="odd"===o.staggerIndex?_%2==0?b/2+w:b/2+w-.5:_%2==0?b/2+w:b/2+w+.5,n.set(T,_)}},62991:t=>{t.exports=function(t,e,i){return t>=0&&t=0&&e{var s=i(33528);t.exports=function(t,e,i,n){void 0===i&&(i=[]),void 0===n&&(n=0),i.length=0;var r,o,a,h=t.tilemapLayer,l=t.data,u=t.width,c=t.height,d=h.skipCull,f=u,p=c;if(0===n)for(o=0;o=0;r--)(a=l[o][r])&&-1!==a.index&&a.visible&&0!==a.alpha&&(d||s(r,o,t,e))&&i.push(a);else if(2===n)for(o=p;o>=0;o--)for(r=0;r=0;o--)for(r=f;r>=0;r--)(a=l[o][r])&&-1!==a.index&&a.visible&&0!==a.alpha&&(d||s(r,o,t,e))&&i.push(a);return h.tilesDrawn=i.length,h.tilesTotal=u*c,i}},14127:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r){i||(i=new s);var o=r.baseTileWidth,a=r.baseTileHeight,h=r.tilemapLayer,l=0,u=0;h&&(n||(n=h.scene.cameras.main),l=h.x+n.scrollX*(1-h.scrollFactorX),o*=h.scaleX,u=h.y+n.scrollY*(1-h.scrollFactorY),a*=h.scaleY);var c=l+o/2*(t-e),d=u+(t+e)*(a/2);return i.set(c,d)}},96897:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r,o,a){n||(n=new s);var h=o.baseTileWidth,l=o.baseTileHeight,u=o.tilemapLayer;u&&(r||(r=u.scene.cameras.main),e-=u.y+r.scrollY*(1-u.scrollFactorY),l*=u.scaleY,t-=u.x+r.scrollX*(1-u.scrollFactorX),h*=u.scaleX);var c=h/2,d=l/2;a||(e-=l);var f=.5*((t-=c)/c+e/d),p=.5*(-t/c+e/d);return i&&(f=Math.floor(f),p=Math.floor(p)),n.set(f,p)}},71558:(t,e,i)=>{var s=i(23029),n=i(62991),r=i(72023),o=i(20576);t.exports=function(t,e,i,a,h){if(void 0===a&&(a=!0),!n(e,i,h))return null;var l,u=h.data[i][e],c=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 d=h.data[i][e],f=-1!==h.collideIndexes.indexOf(d.index);if(-1===(l=t instanceof s?t.index:t))d.width=h.tileWidth,d.height=h.tileHeight;else{var p=h.tilemapLayer.tilemap,v=p.tiles[l][2],g=p.tilesets[v];d.width=g.tileWidth,d.height=g.tileHeight}return o(d,f),a&&c!==d.collides&&r(e,i,h),d}},26303:(t,e,i)=>{var s=i(71558),n=new(i(26099));t.exports=function(t,e,i,r,o,a){return a.tilemapLayer.worldToTileXY(e,i,!0,n,o,a),s(t,n.x,n.y,r,a)}},14051:(t,e,i)=>{var s=i(42573),n=i(71558);t.exports=function(t,e,i,r,o){if(void 0===r&&(r=!0),!Array.isArray(t))return null;Array.isArray(t[0])||(t=[t]);for(var a=t.length,h=t[0].length,l=0;l{var s=i(7386),n=i(26546);t.exports=function(t,e,i,r,o,a){var h,l=s(t,e,i,r,{},a);if(!o)for(o=[],h=0;h{var s=i(23029),n=i(62991),r=i(72023);t.exports=function(t,e,i,o,a){if(void 0===i&&(i=!0),void 0===o&&(o=!0),!n(t,e,a))return null;var h=a.data[e][t];return h?(a.data[e][t]=i?null:new s(a,-1,t,e,a.tileWidth,a.tileHeight),o&&h&&h.collides&&r(t,e,a),h):null}},94178:(t,e,i)=>{var s=i(63557),n=new(i(26099));t.exports=function(t,e,i,r,o,a){return a.tilemapLayer.worldToTileXY(t,e,!0,n,o,a),s(n.x,n.y,i,r,a)}},15533:(t,e,i)=>{var s=i(7386),n=i(3956),r=new n(105,210,231,150),o=new n(243,134,48,200),a=new n(40,39,37,150);t.exports=function(t,e,i){void 0===e&&(e={});var n=void 0!==e.tileColor?e.tileColor:r,h=void 0!==e.collidingTileColor?e.collidingTileColor:o,l=void 0!==e.faceColor?e.faceColor:a,u=s(0,0,i.width,i.height,null,i);t.translateCanvas(i.tilemapLayer.x,i.tilemapLayer.y),t.scaleCanvas(i.tilemapLayer.scaleX,i.tilemapLayer.scaleY);for(var c=0;c{var s=i(7386);t.exports=function(t,e,i,n,r,o,a){for(var h=s(i,n,r,o,null,a),l=0;l{t.exports=function(t,e,i,s){var n,r,o,a=t.data,h=t.width,l=t.height,u=t.tilemapLayer,c=Math.max(0,e.left),d=Math.min(h,e.right),f=Math.max(0,e.top),p=Math.min(l,e.bottom);if(0===i)for(r=f;r=c;n--)(o=a[r][n])&&-1!==o.index&&o.visible&&0!==o.alpha&&s.push(o);else if(2===i)for(r=p;r>=f;r--)for(n=c;a[r]&&n=f;r--)for(n=d;a[r]&&n>=c;n--)(o=a[r][n])&&-1!==o.index&&o.visible&&0!==o.alpha&&s.push(o);return u.tilesDrawn=s.length,u.tilesTotal=h*l,s}},57068:(t,e,i)=>{var s=i(20576),n=i(42573),r=i(9589);t.exports=function(t,e,i,o,a){void 0===e&&(e=!0),void 0===i&&(i=!0),void 0===a&&(a=!0),Array.isArray(t)||(t=[t]);for(var h=0;h{var s=i(20576),n=i(42573),r=i(9589);t.exports=function(t,e,i,o,a,h){if(void 0===i&&(i=!0),void 0===o&&(o=!0),void 0===h&&(h=!0),!(t>e)){for(var l=t;l<=e;l++)r(l,i,a);if(h)for(var u=0;u=t&&d.index<=e&&s(d,i)}o&&n(0,0,a.width,a.height,a)}}},75661:(t,e,i)=>{var s=i(20576),n=i(42573),r=i(9589);t.exports=function(t,e,i,o){void 0===e&&(e=!0),void 0===i&&(i=!0),Array.isArray(t)||(t=[t]);for(var a=0;a{var s=i(20576),n=i(42573),r=i(97022);t.exports=function(t,e,i,o){void 0===e&&(e=!0),void 0===i&&(i=!0);for(var a=0;a{var s=i(20576),n=i(42573);t.exports=function(t,e,i){void 0===t&&(t=!0),void 0===e&&(e=!0);for(var r=0;r0&&s(a,t)}}e&&n(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 n=0,r=t.length;n{var s=i(7386);t.exports=function(t,e,i,n,r,o,a){for(var h=s(t,e,i,n,null,a),l=0;l{var s=i(7386),n=i(33680);t.exports=function(t,e,i,r,o){var a=s(t,e,i,r,null,o),h=a.map((function(t){return t.index}));n(h);for(var l=0;l{var s=i(63448),n=i(56583);t.exports=function(t,e){var i=t.tilemapLayer.tilemap,r=t.tilemapLayer,o=Math.floor(i.tileWidth*r.scaleX),a=Math.floor(i.tileHeight*r.scaleY);return{left:n(e.worldView.x-r.x,o,0,!0)-r.cullPaddingX,right:s(e.worldView.right-r.x,o,0,!0)+r.cullPaddingX,top:n(e.worldView.y-r.y,a/2,0,!0)-r.cullPaddingY,bottom:s(e.worldView.bottom-r.y,a/2,0,!0)+r.cullPaddingY}}},54503:(t,e,i)=>{var s=i(61325),n=i(32483);t.exports=function(t,e,i,r){void 0===i&&(i=[]),void 0===r&&(r=0),i.length=0;var o=t.tilemapLayer,a=s(t,e);return o.skipCull&&1===o.scrollFactorX&&1===o.scrollFactorY&&(a.left=0,a.right=t.width,a.top=0,a.bottom=t.height),n(t,a,r,i),i}},97202:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r){i||(i=new s);var o=r.baseTileWidth,a=r.baseTileHeight,h=r.tilemapLayer,l=0,u=0;h&&(n||(n=h.scene.cameras.main),l=h.x+n.scrollX*(1-h.scrollFactorX),o*=h.scaleX,u=h.y+n.scrollY*(1-h.scrollFactorY),a*=h.scaleY);var c=l+t*o+e%2*(o/2),d=u+e*(a/2);return i.set(c,d)}},28054:t=>{t.exports=function(t,e,i){var s=i.baseTileHeight,n=i.tilemapLayer,r=0;return n&&(void 0===e&&(e=n.scene.cameras.main),r=n.y+e.scrollY*(1-n.scrollFactorY),s*=n.scaleY),r+t*(s/2)+s}},15108:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r,o){n||(n=new s);var a=o.baseTileWidth,h=o.baseTileHeight,l=o.tilemapLayer;l&&(r||(r=l.scene.cameras.main),e-=l.y+r.scrollY*(1-l.scrollFactorY),h*=l.scaleY,t-=l.x+r.scrollX*(1-l.scrollFactorX),a*=l.scaleX);var u=i?Math.floor(e/(h/2)):e/(h/2),c=i?Math.floor((t+u%2*.5*a)/a):(t+u%2*.5*a)/a;return n.set(c,u)}},51900:t=>{t.exports=function(t,e,i,s){var n=s.baseTileHeight,r=s.tilemapLayer;return r&&(i||(i=r.scene.cameras.main),t-=r.y+i.scrollY*(1-r.scrollFactorY),n*=r.scaleY),e?Math.floor(t/(n/2)):t/(n/2)}},86560:(t,e,i)=>{var s=i(7386);t.exports=function(t,e,i,n,r,o,a){for(var h=s(i,n,r,o,null,a),l=0;l{t.exports=function(t,e,i){var s=i.baseTileWidth,n=i.tilemapLayer,r=0;return n&&(e||(e=n.scene.cameras.main),r=n.x+e.scrollX*(1-n.scrollFactorX),s*=n.scaleX),r+t*s}},70326:(t,e,i)=>{var s=i(97281),n=i(29650),r=i(26099);t.exports=function(t,e,i,o,a){return i||(i=new r(0,0)),i.x=s(t,o,a),i.y=n(e,o,a),i}},29650:t=>{t.exports=function(t,e,i){var s=i.baseTileHeight,n=i.tilemapLayer,r=0;return n&&(e||(e=n.scene.cameras.main),r=n.y+e.scrollY*(1-n.scrollFactorY),s*=n.scaleY),r+t*s}},77366:(t,e,i)=>{var s=i(7386),n=i(75508);t.exports=function(t,e,i,r,o,a){if(o){var h,l=s(t,e,i,r,null,a),u=0;for(h=0;h{var s=i(85896),n=new(i(26099));t.exports=function(t,e,i,r){return s(t,0,e,n,i,r),n.x}},85896:(t,e,i)=>{var s=i(26099);t.exports=function(t,e,i,n,r,o){void 0===i&&(i=!0),n||(n=new s);var a=o.baseTileWidth,h=o.baseTileHeight,l=o.tilemapLayer;l&&(r||(r=l.scene.cameras.main),t-=l.x+r.scrollX*(1-l.scrollFactorX),e-=l.y+r.scrollY*(1-l.scrollFactorY),a*=l.scaleX,h*=l.scaleY);var u=t/a,c=e/h;return i&&(u=Math.floor(u),c=Math.floor(c)),n.set(u,c)}},63288:(t,e,i)=>{var s=i(85896),n=new(i(26099));t.exports=function(t,e,i,r){return s(0,t,e,n,i,r),n.y}},81086:(t,e,i)=>{t.exports={CalculateFacesAt:i(72023),CalculateFacesWithin:i(42573),CheckIsoBounds:i(33528),Copy:i(1785),CreateFromTiles:i(78419),CullBounds:i(19545),CullTiles:i(30003),Fill:i(35137),FilterTiles:i(40253),FindByIndex:i(52692),FindTile:i(66151),ForEachTile:i(97560),GetCullTilesFunction:i(43305),GetTileAt:i(7423),GetTileAtWorldXY:i(60540),GetTileCorners:i(55826),GetTileCornersFunction:i(11758),GetTilesWithin:i(7386),GetTilesWithinShape:i(91141),GetTilesWithinWorldXY:i(96523),GetTileToWorldXFunction:i(39167),GetTileToWorldXYFunction:i(62e3),GetTileToWorldYFunction:i(5984),GetWorldToTileXFunction:i(96113),GetWorldToTileXYFunction:i(16926),GetWorldToTileYFunction:i(55762),HasTileAt:i(45091),HasTileAtWorldXY:i(24152),HexagonalCullBounds:i(90454),HexagonalCullTiles:i(9474),HexagonalGetTileCorners:i(27229),HexagonalTileToWorldXY:i(19951),HexagonalWorldToTileXY:i(86625),IsInLayerBounds:i(62991),IsometricCullTiles:i(14018),IsometricTileToWorldXY:i(14127),IsometricWorldToTileXY:i(96897),PutTileAt:i(71558),PutTileAtWorldXY:i(26303),PutTilesAt:i(14051),Randomize:i(77389),RemoveTileAt:i(63557),RemoveTileAtWorldXY:i(94178),RenderDebug:i(15533),ReplaceByIndex:i(27987),RunCull:i(32483),SetCollision:i(57068),SetCollisionBetween:i(37266),SetCollisionByExclusion:i(75661),SetCollisionByProperty:i(64740),SetCollisionFromCollisionGroup:i(63307),SetLayerCollisionIndex:i(9589),SetTileCollision:i(20576),SetTileIndexCallback:i(79583),SetTileLocationCallback:i(93254),Shuffle:i(32903),StaggeredCullBounds:i(61325),StaggeredCullTiles:i(54503),StaggeredTileToWorldXY:i(97202),StaggeredTileToWorldY:i(28054),StaggeredWorldToTileXY:i(15108),StaggeredWorldToTileY:i(51900),SwapByIndex:i(86560),TileToWorldX:i(97281),TileToWorldXY:i(70326),TileToWorldY:i(29650),WeightedRandomize:i(77366),WorldToTileX:i(10095),WorldToTileXY:i(85896),WorldToTileY:i(63288)}},91907:t=>{t.exports={ORTHOGONAL:0,ISOMETRIC:1,STAGGERED:2,HEXAGONAL:3}},21829:(t,e,i)=>{var s={ORIENTATION:i(91907)};t.exports=s},62501:(t,e,i)=>{var s=i(79291),n=i(21829),r={Components:i(81086),Parsers:i(57442),Formats:i(80341),ImageCollection:i(16536),ParseToTilemap:i(31989),Tile:i(23029),Tilemap:i(49075),TilemapCreator:i(45939),TilemapFactory:i(46029),Tileset:i(33629),TilemapLayer:i(20442),Orientation:i(91907),LayerData:i(14977),MapData:i(87010),ObjectLayer:i(48700)};r=s(!1,r,n.ORIENTATION),t.exports=r},14977:(t,e,i)=>{var s=i(83419),n=i(91907),r=i(95540),o=new s({initialize:function(t){void 0===t&&(t={}),this.name=r(t,"name","layer"),this.id=r(t,"id",0),this.x=r(t,"x",0),this.y=r(t,"y",0),this.width=r(t,"width",0),this.height=r(t,"height",0),this.tileWidth=r(t,"tileWidth",0),this.tileHeight=r(t,"tileHeight",0),this.baseTileWidth=r(t,"baseTileWidth",this.tileWidth),this.baseTileHeight=r(t,"baseTileHeight",this.tileHeight),this.orientation=r(t,"orientation",n.ORTHOGONAL),this.widthInPixels=r(t,"widthInPixels",this.width*this.baseTileWidth),this.heightInPixels=r(t,"heightInPixels",this.height*this.baseTileHeight),this.alpha=r(t,"alpha",1),this.visible=r(t,"visible",!0),this.properties=r(t,"properties",[]),this.indexes=r(t,"indexes",[]),this.collideIndexes=r(t,"collideIndexes",[]),this.callbacks=r(t,"callbacks",[]),this.bodies=r(t,"bodies",[]),this.data=r(t,"data",[]),this.tilemapLayer=r(t,"tilemapLayer",null),this.hexSideLength=r(t,"hexSideLength",0),this.staggerAxis=r(t,"staggerAxis","y"),this.staggerIndex=r(t,"staggerIndex","odd")}});t.exports=o},87010:(t,e,i)=>{var s=i(83419),n=i(91907),r=i(95540),o=new s({initialize:function(t){void 0===t&&(t={}),this.name=r(t,"name","map"),this.width=r(t,"width",0),this.height=r(t,"height",0),this.infinite=r(t,"infinite",!1),this.tileWidth=r(t,"tileWidth",0),this.tileHeight=r(t,"tileHeight",0),this.widthInPixels=r(t,"widthInPixels",this.width*this.tileWidth),this.heightInPixels=r(t,"heightInPixels",this.height*this.tileHeight),this.format=r(t,"format",null),this.orientation=r(t,"orientation",n.ORTHOGONAL),this.renderOrder=r(t,"renderOrder","right-down"),this.version=r(t,"version","1"),this.properties=r(t,"properties",{}),this.layers=r(t,"layers",[]),this.images=r(t,"images",[]),this.objects=r(t,"objects",[]),Array.isArray(this.objects)||(this.objects=[]),this.collision=r(t,"collision",{}),this.tilesets=r(t,"tilesets",[]),this.imageCollections=r(t,"imageCollections",[]),this.tiles=r(t,"tiles",[]),this.hexSideLength=r(t,"hexSideLength",0),this.staggerAxis=r(t,"staggerAxis","y"),this.staggerIndex=r(t,"staggerIndex","odd")}});t.exports=o},48700:(t,e,i)=>{var s=i(83419),n=i(95540),r=new s({initialize:function(t){void 0===t&&(t={}),this.name=n(t,"name","object layer"),this.id=n(t,"id",0),this.opacity=n(t,"opacity",1),this.properties=n(t,"properties",{}),this.propertyTypes=n(t,"propertytypes",{}),this.type=n(t,"type","objectgroup"),this.visible=n(t,"visible",!0),this.objects=n(t,"objects",[]),Array.isArray(this.objects)||(this.objects=[])}});t.exports=r},6641:(t,e,i)=>{var s=i(91907);t.exports=function(t){return"isometric"===(t=t.toLowerCase())?s.ISOMETRIC:"staggered"===t?s.STAGGERED:"hexagonal"===t?s.HEXAGONAL:s.ORTHOGONAL}},46177:(t,e,i)=>{var s=i(80341),n=i(2342),r=i(82593),o=i(46594),a=i(87021);t.exports=function(t,e,i,h,l,u){var c;switch(e){case s.ARRAY_2D:c=n(t,i,h,l,u);break;case s.CSV:c=r(t,i,h,l,u);break;case s.TILED_JSON:c=o(t,i,u);break;case s.WELTMEISTER:c=a(t,i,u);break;default:console.warn("Unrecognized tilemap data format: "+e),c=null}return c}},2342:(t,e,i)=>{var s=i(80341),n=i(14977),r=i(87010),o=i(23029);t.exports=function(t,e,i,a,h){for(var l=new n({tileWidth:i,tileHeight:a}),u=new r({name:t,tileWidth:i,tileHeight:a,format:s.ARRAY_2D,layers:[l]}),c=[],d=e.length,f=0,p=0;p{var s=i(80341),n=i(2342);t.exports=function(t,e,i,r,o){var a=e.trim().split("\n").map((function(t){return t.split(",")})),h=n(t,a,i,r,o);return h.format=s.CSV,h}},6656:(t,e,i)=>{var s=i(14977),n=i(23029);t.exports=function(t,e){for(var i=[],r=0;r-1?new n(a,f,c,u,o.tilesize,o.tilesize):e?null:new n(a,-1,c,u,o.tilesize,o.tilesize),h.push(d)}l.push(h),h=[]}a.data=l,i.push(a)}return i}},96483:(t,e,i)=>{var s=i(33629);t.exports=function(t){for(var e=[],i=[],n=0;n{var s=i(80341),n=i(87010),r=i(6656),o=i(96483);t.exports=function(t,e,i){if(0===e.layer.length)return console.warn("No layers found in the Weltmeister map: "+t),null;for(var a=0,h=0,l=0;la&&(a=e.layer[l].width),e.layer[l].height>h&&(h=e.layer[l].height);var u=new n({width:a,height:h,name:t,tileWidth:e.layer[0].tilesize,tileHeight:e.layer[0].tilesize,format:s.WELTMEISTER});return u.layers=r(e,i),u.tilesets=o(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,n,r,o,a=0;a{t.exports=function(t){for(var e=window.atob(t),i=e.length,s=new Array(i/4),n=0;n>>0;return s}},84101:(t,e,i)=>{var s=i(33629);t.exports=function(t){var e,i,n=[];for(e=0;e{var s=i(95540);t.exports=function(t,e,i){if(!e)return{i:0,layers:t.layers,name:"",opacity:1,visible:!0,x:0,y:0};var n=e.x+s(e,"startx",0)*t.tilewidth+s(e,"offsetx",0),r=e.y+s(e,"starty",0)*t.tileheight+s(e,"offsety",0);return{i:0,layers:e.layers,name:i.name+e.name+"/",opacity:i.opacity*e.opacity,visible:i.visible&&e.visible,x:i.x+n,y:i.y+r}}},29920:t=>{var e=2147483648,i=1073741824,s=536870912;t.exports=function(t){var n=Boolean(t&e),r=Boolean(t&i),o=Boolean(t&s);t&=536870911;var a=0,h=!1;return n&&r&&o?(a=Math.PI/2,h=!0):n&&r&&!o?(a=Math.PI,h=!1):n&&!r&&o?(a=Math.PI/2,h=!1):!n||r||o?!n&&r&&o?(a=3*Math.PI/2,h=!1):n||!r||o?n||r||!o?n||r||o||(a=0,h=!1):(a=3*Math.PI/2,h=!0):(a=Math.PI,h=!0):(a=0,h=!0),{gid:t,flippedHorizontal:n,flippedVertical:r,flippedAntiDiagonal:o,rotation:a,flipped:h}}},12635:(t,e,i)=>{var s=i(95540),n=i(79677);t.exports=function(t){for(var e=[],i=[],r=n(t);r.i0;)if(r.i>=r.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}r=i.pop()}else{var o=r.layers[r.i];if(r.i++,"imagelayer"===o.type){var a=s(o,"offsetx",0)+s(o,"startx",0),h=s(o,"offsety",0)+s(o,"starty",0);e.push({name:r.name+o.name,image:o.image,x:r.x+a+o.x,y:r.y+h+o.y,alpha:r.opacity*o.opacity,visible:r.visible&&o.visible,properties:s(o,"properties",{})})}else if("group"===o.type){var l=n(t,o,r);i.push(r),r=l}}return e}},46594:(t,e,i)=>{var s=i(51233),n=i(84101),r=i(91907),o=i(62644),a=i(80341),h=i(6641),l=i(87010),u=i(12635),c=i(22611),d=i(28200),f=i(24619);t.exports=function(t,e,i){var p=o(e),v=new l({width:p.width,height:p.height,name:t,tileWidth:p.tilewidth,tileHeight:p.tileheight,orientation:h(p.orientation),format:a.TILED_JSON,version:p.version,properties:p.properties,renderOrder:p.renderorder,infinite:p.infinite});if(v.orientation===r.HEXAGONAL)if(v.hexSideLength=p.hexsidelength,v.staggerAxis=p.staggeraxis,v.staggerIndex=p.staggerindex,"y"===v.staggerAxis){var g=(v.tileHeight-v.hexSideLength)/2;v.widthInPixels=v.tileWidth*(v.width+.5),v.heightInPixels=v.height*(v.hexSideLength+g)+g}else{var m=(v.tileWidth-v.hexSideLength)/2;v.widthInPixels=v.width*(v.hexSideLength+m)+m,v.heightInPixels=v.tileHeight*(v.height+.5)}v.layers=d(p,i),v.images=u(p);var y=f(p);return v.tilesets=y.tilesets,v.imageCollections=y.imageCollections,v.objects=c(p),v.tiles=n(v),s(v),v}},52205:(t,e,i)=>{var s=i(18254),n=i(29920),r=function(t){return{x:t.x,y:t.y}},o=["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 a=s(t,o);if(a.x+=e,a.y+=i,t.gid){var h=n(t.gid);a.gid=h.gid,a.flippedHorizontal=h.flippedHorizontal,a.flippedVertical=h.flippedVertical,a.flippedAntiDiagonal=h.flippedAntiDiagonal}else t.polyline?a.polyline=t.polyline.map(r):t.polygon?a.polygon=t.polygon.map(r):t.ellipse?a.ellipse=t.ellipse:t.text?a.text=t.text:t.point?a.point=!0:a.rectangle=!0;return a}},22611:(t,e,i)=>{var s=i(95540),n=i(52205),r=i(48700),o=i(79677);t.exports=function(t){for(var e=[],i=[],a=o(t);a.i0;)if(a.i>=a.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}a=i.pop()}else{var h=a.layers[a.i];if(a.i++,h.opacity*=a.opacity,h.visible=a.visible&&h.visible,"objectgroup"===h.type){h.name=a.name+h.name;for(var l=a.x+s(h,"startx",0)+s(h,"offsetx",0),u=a.y+s(h,"starty",0)+s(h,"offsety",0),c=[],d=0;d{var s=i(41868),n=i(91907),r=i(79677),o=i(6641),a=i(95540),h=i(14977),l=i(29920),u=i(23029);t.exports=function(t,e){for(var i=a(t,"infinite",!1),c=[],d=[],f=r(t);f.i0;)if(f.i>=f.layers.length){if(d.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}f=d.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 v=0;v0?((y=new u(g,m.gid,D,I,t.tilewidth,t.tileheight)).rotation=m.rotation,y.flipX=m.flipped,b[I][D]=y):(x=e?null:new u(g,-1,D,I,t.tilewidth,t.tileheight),b[I][D]=x),++S===M.width&&(L++,S=0)}}else{(g=new h({name:f.name+p.name,id:p.id,x:f.x+a(p,"offsetx",0)+p.x,y:f.y+a(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:a(p,"properties",[]),orientation:o(t.orientation)})).orientation===n.HEXAGONAL&&(g.hexSideLength=t.hexsidelength,g.staggerAxis=t.staggeraxis,g.staggerIndex=t.staggerindex,"y"===g.staggerAxis?(T=(g.tileHeight-g.hexSideLength)/2,g.widthInPixels=g.tileWidth*(g.width+.5),g.heightInPixels=g.height*(g.hexSideLength+T)+T):(w=(g.tileWidth-g.hexSideLength)/2,g.widthInPixels=g.width*(g.hexSideLength+w)+w,g.heightInPixels=g.tileHeight*(g.height+.5)));for(var k=[],B=0,N=p.data.length;B0?((y=new u(g,m.gid,S,b.length,t.tilewidth,t.tileheight)).rotation=m.rotation,y.flipX=m.flipped,k.push(y)):(x=e?null:new u(g,-1,S,b.length,t.tilewidth,t.tileheight),k.push(x)),++S===p.width&&(b.push(k),S=0,k=[])}g.data=b,c.push(g)}else if("group"===p.type){var U=r(t,p,f);d.push(f),f=U}}return c}},24619:(t,e,i)=>{var s=i(33629),n=i(16536),r=i(52205),o=i(57880);t.exports=function(t){for(var e,i=[],a=[],h=null,l=0;l1){var d=void 0,f=void 0;if(Array.isArray(u.tiles)){d=d||{},f=f||{};for(var p=0;p{t.exports=function(t,e){for(var i=0;i0){var r,o,a,h={},l={};if(Array.isArray(s.edgecolors))for(r=0;r{t.exports={AssignTileProperties:i(51233),Base64Decode:i(41868),BuildTilesetIndex:i(84101),CreateGroupLayer:i(79677),ParseGID:i(29920),ParseImageLayers:i(12635),ParseJSONTiled:i(46594),ParseObject:i(52205),ParseObjectLayers:i(22611),ParseTileLayers:i(28200),ParseTilesets:i(24619)}},33385:(t,e,i)=>{var s=i(83419),n=i(37277),r=i(44594),o=i(94880),a=i(72905),h=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.now=0,this.startTime=0,this.timeScale=1,this.paused=!1,this._active=[],this._pendingInsertion=[],this._pendingRemoval=[],t.sys.events.once(r.BOOT,this.boot,this),t.sys.events.on(r.START,this.start,this)},boot:function(){this.now=this.systems.game.loop.time,this.systems.events.once(r.DESTROY,this.destroy,this)},start:function(){this.startTime=this.systems.game.loop.time;var t=this.systems.events;t.on(r.PRE_UPDATE,this.preUpdate,this),t.on(r.UPDATE,this.update,this),t.once(r.SHUTDOWN,this.shutdown,this)},addEvent:function(t){var e;if(t instanceof o){if(e=t,this.removeEvent(e),e.elapsed=e.startAt,e.hasDispatched=!1,e.repeatCount=-1===e.repeat||e.loop?999999999999:e.repeat,e.delay<=0&&e.repeatCount>0)throw new Error("TimerEvent infinite loop created via zero delay")}else e=new o(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(n,1),s.destroy()}for(i=0;i=s.delay)){var n=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--,n>=s.delay)for(;n>=s.delay&&s.repeatCount>0;)s.callback&&s.callback.apply(s.callbackScope,s.args),n-=s.delay,s.repeatCount--;s.elapsed=n,s.hasDispatched=!1}else s.hasDispatched&&this._pendingRemoval.push(s)}}}},shutdown:function(){var t;for(t=0;t{var s=i(83419),n=i(50792),r=i(39429),o=i(95540),a=i(44594),h=i(89809),l=new s({Extends:n,initialize:function(t,e){n.call(this),this.scene=t,this.systems=t.sys,this.elapsed=0,this.timeScale=1,this.paused=!0,this.complete=!1,this.totalComplete=0,this.loop=0,this.iteration=0,this.events=[];var i=this.systems.events;i.on(a.PRE_UPDATE,this.preUpdate,this),i.on(a.UPDATE,this.update,this),i.once(a.SHUTDOWN,this.destroy,this),e&&this.add(e)},preUpdate:function(t,e){this.paused||(this.elapsed+=e*this.timeScale)},update:function(){if(!this.paused&&!this.complete){var t,e,i=this.events,s=!1,n=this.systems;for(t=0;t=i.length&&(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;s{var s=i(83419),n=i(95540),r=new s({initialize:function(t){this.delay=0,this.repeat=0,this.repeatCount=0,this.loop=!1,this.callback,this.callbackScope,this.args,this.timeScale=1,this.startAt=0,this.elapsed=0,this.paused=!1,this.hasDispatched=!1,this.reset(t)},reset:function(t){if(this.delay=n(t,"delay",0),this.repeat=n(t,"repeat",0),this.loop=n(t,"loop",!1),this.callback=n(t,"callback",void 0),this.callbackScope=n(t,"callbackScope",this),this.args=n(t,"args",[]),this.timeScale=n(t,"timeScale",1),this.startAt=n(t,"startAt",0),this.paused=n(t,"paused",!1),this.elapsed=this.startAt,this.hasDispatched=!1,this.repeatCount=-1===this.repeat||this.loop?999999999999:this.repeat,this.delay<=0&&this.repeatCount>0)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=r},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),n=i(83419),r=i(43491),o=i(88032),a=i(37277),h=i(44594),l=i(93109),u=i(86081),c=i(8357),d=i(43960),f=i(26012),p=new n({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=o(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,n=i-1e3*this.time;return s>0||t?(i/=1e3,this.time=i,this.nextTime+=s+(s>=this.gap?4:this.gap-s)):n=0,n},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 n=[],r=this.tweens;for(i=0;i0){for(i=0;i-1&&(s.isPendingRemove()||s.isDestroyed())&&(r.splice(a,1),s.destroy())}n.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;i{t.exports=function(t,e,i){return t&&t.hasOwnProperty(e)?t[e]:i}},6113:(t,e,i)=>{var s=i(62640),n=i(35355);t.exports=function(t,e){var i=s.Power0;if("string"==typeof t)if(s.hasOwnProperty(t))i=s[t];else{var r="";if(t.indexOf(".")){var o=(r=t.substring(t.indexOf(".")+1)).toLowerCase();"in"===o?r="easeIn":"out"===o?r="easeOut":"inout"===o&&(r="easeInOut")}t=n(t.substring(0,t.indexOf(".")+1)+r),s.hasOwnProperty(t)&&(i=s[t])}else"function"==typeof t&&(i=t);if(!e)return i;var a=e.slice(0);return a.unshift(0),function(t){return a[0]=t,i.apply(this,a)}}},91389:(t,e,i)=>{var s=i(89318),n=i(77259),r={bezier:s,catmull:n,catmullrom:n,linear:i(28392)};t.exports=function(t){if(null===t)return null;var e=r.linear;return"string"==typeof t?r.hasOwnProperty(t)&&(e=r[t]):"function"==typeof t&&(e=t),e}},55292:t=>{t.exports=function(t,e,i){var s;t.hasOwnProperty(e)?s="function"===typeof t[e]?function(i,s,n,r,o,a){return t[e](i,s,n,r,o,a)}:function(){return t[e]}:s="function"==typeof i?i:function(){return i};return s}},82985:(t,e,i)=>{var s=i(81076);t.exports=function(t){var e,i=[];if(t.hasOwnProperty("props"))for(e in t.props)"_"!==e.substring(0,1)&&i.push({key:e,value:t.props[e]});else for(e in t)-1===s.indexOf(e)&&"_"!==e.substring(0,1)&&i.push({key:e,value:t[e]});return i}},62329:(t,e,i)=>{var s=i(35154);t.exports=function(t){var e=s(t,"targets",null);return null===e||("function"==typeof e&&(e=e.call()),Array.isArray(e)||(e=[e])),e}},17777:(t,e,i)=>{var s=i(30976),n=i(99472);function r(t){return!!t.getActive&&"function"==typeof t.getActive}function o(t){return!!t.getStart&&"function"==typeof t.getStart}function a(t){return!!t.getEnd&&"function"==typeof t.getEnd}var h=function(t,e){var i,l,u=function(t,e,i){return i},c=function(t,e,i){return i},d=null,f=typeof e;if("number"===f)u=function(){return e};else if(Array.isArray(e))c=function(){return e[0]},u=function(){return e[e.length-1]};else if("string"===f){var p=e.toLowerCase(),v="random"===p.substring(0,6),g="int"===p.substring(0,3);if(v||g){var m=p.indexOf("("),y=p.indexOf(")"),x=p.indexOf(",");if(!(m&&y&&x))throw new Error("invalid random() format");var T=parseFloat(p.substring(m+1,x)),w=parseFloat(p.substring(x+1,y));u=v?function(){return n(T,w)}:function(){return s(T,w)}}else{p=p[0];var b=parseFloat(e.substr(2));switch(p){case"+":u=function(t,e,i){return i+b};break;case"-":u=function(t,e,i){return i-b};break;case"*":u=function(t,e,i){return i*b};break;case"/":u=function(t,e,i){return i/b};break;default:u=function(){return parseFloat(e)}}}}else if("function"===f)u=e;else if("object"===f)if(o(l=e)||a(l)||r(l))r(e)&&(d=e.getActive),a(e)&&(u=e.getEnd),o(e)&&(c=e.getStart);else if(e.hasOwnProperty("value"))i=h(t,e.value);else{var S=e.hasOwnProperty("to"),E=e.hasOwnProperty("from"),A=e.hasOwnProperty("start");if(S&&(E||A)){if(i=h(t,e.to),A){var C=h(t,e.start);i.getActive=C.getEnd}if(E){var _=h(t,e.from);i.getStart=_.getEnd}}}return i||(i={getActive:d,getEnd:u,getStart:c}),i};t.exports=h},88032:(t,e,i)=>{var s=i(70402),n=i(69902),r=i(23568),o=i(57355),a=i(6113),h=i(95540),l=i(55292),u=i(35154),c=i(17777),d=i(269),f=i(86081);t.exports=function(t,e,i){if(e instanceof f)return e.parent=t,e;i=void 0===i?n:d(n,i);var p=h(e,"from",0),v=h(e,"to",1),g=[{value:p}],m=h(e,"delay",i.delay),y=h(e,"easeParams",i.easeParams),x=h(e,"ease",i.ease),T=c("value",v),w=new f(t,g),b=w.add(0,"value",T.getEnd,T.getStart,T.getActive,a(h(e,"ease",x),h(e,"easeParams",y)),l(e,"delay",m),h(e,"duration",i.duration),o(e,"yoyo",i.yoyo),h(e,"hold",i.hold),h(e,"repeat",i.repeat),h(e,"repeatDelay",i.repeatDelay),!1,!1);b.start=p,b.current=p,w.completeDelay=r(e,"completeDelay",0),w.loop=Math.round(r(e,"loop",0)),w.loopDelay=Math.round(r(e,"loopDelay",0)),w.paused=o(e,"paused",!1),w.persist=o(e,"persist",!1),w.isNumberTween=!0,w.callbackScope=u(e,"callbackScope",w);for(var S=s.TYPES,E=0;E{var s=i(6113),n=i(35154),r=i(36383);t.exports=function(t,e){var i;void 0===e&&(e={});var o=n(e,"start",0),a=n(e,"ease",null),h=n(e,"grid",null),l=n(e,"from",0),u="first"===l,c="center"===l,d="last"===l,f="number"==typeof l,p=Array.isArray(t),v=p?parseFloat(t[0]):parseFloat(t),g=p?parseFloat(t[1]):0,m=Math.max(v,g);if(p&&(o+=v),h){var y=h[0],x=h[1],T=0,w=0,b=0,S=0,E=[];d?(T=y-1,w=x-1):f?(T=l%y,w=Math.floor(l/y)):c&&(T=(y-1)/2,w=(x-1)/2);for(var A=r.MIN_SAFE_INTEGER,C=0;CA&&(A=M),E[C][_]=M}}}var P=a?s(a):null;return i=h?function(t,e,i,s){var n,r=0,a=s%y,h=Math.floor(s/y);if(a>=0&&a=0&&h{var s=i(70402),n=i(69902),r=i(23568),o=i(57355),a=i(6113),h=i(95540),l=i(91389),u=i(55292),c=i(82985),d=i(62329),f=i(35154),p=i(17777),v=i(269),g=i(86081);t.exports=function(t,e,i){if(e instanceof g)return e.parent=t,e;i=void 0===i?n:v(n,i);var m=d(e);!m&&i.targets&&(m=i.targets);for(var y=c(e),x=h(e,"delay",i.delay),T=h(e,"duration",i.duration),w=h(e,"easeParams",i.easeParams),b=h(e,"ease",i.ease),S=h(e,"hold",i.hold),E=h(e,"repeat",i.repeat),A=h(e,"repeatDelay",i.repeatDelay),C=o(e,"yoyo",i.yoyo),_=o(e,"flipX",i.flipX),M=o(e,"flipY",i.flipY),P=h(e,"interpolation",i.interpolation),R=function(t,e,i,s){if("texture"===i){var n=s,r=void 0;Array.isArray(s)?(n=s[0],r=s[1]):s.hasOwnProperty("value")?(n=s.value,Array.isArray(s.value)?(n=s.value[0],r=s.value[1]):"string"==typeof s.value&&(n=s.value)):"string"==typeof s&&(n=s),t.addFrame(e,n,r,u(s,"delay",x),h(s,"duration",T),h(s,"hold",S),h(s,"repeat",E),h(s,"repeatDelay",A),o(s,"flipX",_),o(s,"flipY",M))}else{var c=p(i,s),d=l(h(s,"interpolation",P));t.add(e,i,c.getEnd,c.getStart,c.getActive,a(h(s,"ease",b),h(s,"easeParams",w)),u(s,"delay",x),h(s,"duration",T),o(s,"yoyo",C),h(s,"hold",S),h(s,"repeat",E),h(s,"repeatDelay",A),o(s,"flipX",_),o(s,"flipY",M),d,d?s:null)}},L=new g(t,m),O=0;O{var s=i(70402),n=i(23568),r=i(57355),o=i(62329),a=i(35154),h=i(8357),l=i(43960);t.exports=function(t,e){if(e instanceof l)return e.parent=t,e;var i,u=new l(t);u.startDelay=a(e,"delay",0),u.completeDelay=n(e,"completeDelay",0),u.loop=Math.round(n(e,"loop",a(e,"repeat",0))),u.loopDelay=Math.round(n(e,"loopDelay",a(e,"repeatDelay",0))),u.paused=r(e,"paused",!1),u.persist=r(e,"persist",!1),u.callbackScope=a(e,"callbackScope",u);var c=s.TYPES;for(i=0;i{t.exports={GetBoolean:i(57355),GetEaseFunction:i(6113),GetInterpolationFunction:i(91389),GetNewValue:i(55292),GetProps:i(82985),GetTargets:i(62329),GetValueOp:i(17777),NumberTweenBuilder:i(88032),StaggerBuilder:i(93109),TweenBuilder:i(8357)}},73685:t=>{t.exports="active"},98540:t=>{t.exports="complete"},67233:t=>{t.exports="loop"},2859:t=>{t.exports="pause"},98336:t=>{t.exports="repeat"},25764:t=>{t.exports="resume"},32193:t=>{t.exports="start"},84371:t=>{t.exports="stop"},70766:t=>{t.exports="update"},55659:t=>{t.exports="yoyo"},842:(t,e,i)=>{t.exports={TWEEN_ACTIVE:i(73685),TWEEN_COMPLETE:i(98540),TWEEN_LOOP:i(67233),TWEEN_PAUSE:i(2859),TWEEN_RESUME:i(25764),TWEEN_REPEAT:i(98336),TWEEN_START:i(32193),TWEEN_STOP:i(84371),TWEEN_UPDATE:i(70766),TWEEN_YOYO:i(55659)}},43066:(t,e,i)=>{var s={States:i(86353),Builders:i(30231),Events:i(842),TweenManager:i(40382),Tween:i(86081),TweenData:i(48177),TweenFrameData:i(42220),BaseTween:i(70402),TweenChain:i(43960)};t.exports=s},70402:(t,e,i)=>{var s=i(83419),n=i(50792),r=i(842),o=i(86353),a=new s({Extends:n,initialize:function(t){n.call(this),this.parent=t,this.data=[],this.totalData=0,this.startDelay=0,this.hasStarted=!1,this.timeScale=1,this.loop=0,this.loopDelay=0,this.loopCounter=0,this.completeDelay=0,this.countdown=0,this.state=o.PENDING,this.paused=!1,this.callbacks={onActive:null,onComplete:null,onLoop:null,onPause:null,onRepeat:null,onResume:null,onStart:null,onStop:null,onUpdate:null,onYoyo:null},this.callbackScope,this.persist=!1},setTimeScale:function(t){return this.timeScale=t,this},getTimeScale:function(){return this.timeScale},isPlaying:function(){return!this.paused&&this.isActive()},isPaused:function(){return this.paused},pause:function(){return this.paused||(this.paused=!0,this.dispatchEvent(r.TWEEN_PAUSE,"onPause")),this},resume:function(){return this.paused&&(this.paused=!1,this.dispatchEvent(r.TWEEN_RESUME,"onResume")),this},makeActive:function(){this.parent.makeActive(this),this.dispatchEvent(r.TWEEN_ACTIVE,"onActive")},onCompleteHandler:function(){this.setPendingRemoveState(),this.dispatchEvent(r.TWEEN_COMPLETE,"onComplete")},complete:function(t){return void 0===t&&(t=0),t?(this.setCompleteDelayState(),this.countdown=t):this.onCompleteHandler(),this},completeAfterLoop:function(t){return void 0===t&&(t=0),this.loopCounter>t&&(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(r.TWEEN_STOP,"onStop"),this.setPendingRemoveState()),this},updateLoopCountdown:function(t){this.countdown-=t,this.countdown<=0&&(this.setActiveState(),this.dispatchEvent(r.TWEEN_LOOP,"onLoop"))},updateStartCountdown:function(t){return this.countdown-=t,this.countdown<=0&&(this.hasStarted=!0,this.setActiveState(),this.dispatchEvent(r.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=o.PENDING},setActiveState:function(){this.state=o.ACTIVE,this.hasStarted=!1},setLoopDelayState:function(){this.state=o.LOOP_DELAY},setCompleteDelayState:function(){this.state=o.COMPLETE_DELAY},setStartDelayState:function(){this.state=o.START_DELAY,this.countdown=this.startDelay,this.hasStarted=!1},setPendingRemoveState:function(){this.state=o.PENDING_REMOVE},setRemovedState:function(){this.state=o.REMOVED},setFinishedState:function(){this.state=o.FINISHED},setDestroyedState:function(){this.state=o.DESTROYED},isPending:function(){return this.state===o.PENDING},isActive:function(){return this.state===o.ACTIVE},isLoopDelayed:function(){return this.state===o.LOOP_DELAY},isCompleteDelayed:function(){return this.state===o.COMPLETE_DELAY},isStartDelayed:function(){return this.state===o.START_DELAY},isPendingRemove:function(){return this.state===o.PENDING_REMOVE},isRemoved:function(){return this.state===o.REMOVED},isFinished:function(){return this.state===o.FINISHED},isDestroyed:function(){return this.state===o.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()}});a.TYPES=["onActive","onComplete","onLoop","onPause","onRepeat","onResume","onStart","onStop","onUpdate","onYoyo"],t.exports=a},95042:(t,e,i)=>{var s=i(83419),n=i(842),r=i(86353),o=new s({initialize:function(t,e,i,s,n,r,o,a,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=n,this.hold=r,this.repeat=o,this.repeatDelay=a,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=r.CREATED,this.isCountdown=!1},setDelayState:function(){this.state=r.DELAY,this.isCountdown=!0},setPendingRenderState:function(){this.state=r.PENDING_RENDER,this.isCountdown=!1},setPlayingForwardState:function(){this.state=r.PLAYING_FORWARD,this.isCountdown=!1},setPlayingBackwardState:function(){this.state=r.PLAYING_BACKWARD,this.isCountdown=!1},setHoldState:function(){this.state=r.HOLD_DELAY,this.isCountdown=!0},setRepeatState:function(){this.state=r.REPEAT_DELAY,this.isCountdown=!0},setCompleteState:function(){this.state=r.COMPLETE,this.isCountdown=!1},isCreated:function(){return this.state===r.CREATED},isDelayed:function(){return this.state===r.DELAY},isPendingRender:function(){return this.state===r.PENDING_RENDER},isPlayingForward:function(){return this.state===r.PLAYING_FORWARD},isPlayingBackward:function(){return this.state===r.PLAYING_BACKWARD},isHolding:function(){return this.state===r.HOLD_DELAY},isRepeating:function(){return this.state===r.REPEAT_DELAY},isComplete:function(){return this.state===r.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],n=this.key;this.progress=0,this.elapsed=0,this.delay=this.getDelay(s,n,0,i,e,t),this.repeatCounter=-1===this.repeat?r.MAX:this.repeat,this.setPendingRenderState();var o=this.duration+this.hold;this.yoyo&&(o+=this.duration);var a=o+this.repeatDelay;this.totalDuration=this.delay+o,-1===this.repeat?(this.totalDuration+=a*r.MAX,t.isInfinite=!0):this.repeat>0&&(this.totalDuration+=a*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,r=s.totalTargets,o=this.targetIndex,a=s.targets[o],h=this.key,l="texture"!==h;if(this.elapsed=t,this.progress=t/this.duration,this.flipX&&a.toggleFlipX(),this.flipY&&a.toggleFlipY(),l&&(e||i)&&(this.start=this.getStartValue(a,h,this.start,o,r,s)),i)return this.setPlayingBackwardState(),void this.dispatchEvent(n.TWEEN_YOYO,"onYoyo");this.repeatCounter--,l&&(this.end=this.getEndValue(a,h,this.start,o,r,s)),this.repeatDelay>0?(this.elapsed=this.repeatDelay-t,l&&(this.current=this.start,a[h]=this.current),this.setRepeatState()):(this.setPlayingForwardState(),this.dispatchEvent(n.TWEEN_REPEAT,"onRepeat"))},destroy:function(){this.tween=null,this.getDelay=null,this.setCompleteState()}});t.exports=o},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"]},86081:(t,e,i)=>{var s=i(70402),n=i(83419),r=i(842),o=i(44603),a=i(39429),h=i(36383),l=i(86353),u=i(48177),c=i(42220),d=new n({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,n,r,o,a,h,l,c,d,f,p,v,g){var m=new u(this,t,e,i,s,n,r,o,a,h,l,c,d,f,p,v,g);return this.totalData=this.data.push(m),m},addFrame:function(t,e,i,s,n,r,o,a,h,l){var u=new c(this,t,e,i,s,n,r,o,a,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(r.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(r.TWEEN_ACTIVE,"onActive");var s=this.paused;if(this.paused=!1,t>0){for(var n=Math.floor(t/e),o=t-n*e,a=0;a0&&this.update(o)}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+n+(s+o)*r:s+n},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(r.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(r.TWEEN_START,"onStart"),t=0));var e=!1;if(this.isActive())for(var i=this.data,s=0;s{var s=i(72905),n=i(70402),r=i(83419),o=i(842),a=i(44603),h=i(39429),l=i(86353),u=new r({Extends:n,initialize:function(t){n.call(this,t),this.currentTween=null,this.currentIndex=0},init:function(){return this.loopCounter=-1===this.loop?l.MAX:this.loop,this.setCurrentTween(0),this.startDelay>0&&!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(o.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{var s=i(95042),n=i(45319),r=i(83419),o=i(842),a=new r({Extends:s,initialize:function(t,e,i,n,r,o,a,h,l,u,c,d,f,p,v,g,m){s.call(this,t,e,h,l,u,c,d,f,p,v),this.key=i,this.getActiveValue=o,this.getEndValue=n,this.getStartValue=r,this.ease=a,this.start=0,this.previous=0,this.current=0,this.end=0,this.interpolation=g,this.interpolationData=m},reset:function(t){s.prototype.reset.call(this);var e=this.tween.targets[this.targetIndex],i=this.key;t&&(e[i]=this.start),this.start=0,this.previous=0,this.current=0,this.end=0,this.getActiveValue&&(e[i]=this.getActiveValue(e,i,0))},update:function(t){var e=this.tween,i=e.totalTargets,s=this.targetIndex,r=e.targets[s],a=this.key;if(!r)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(o.TWEEN_REPEAT,"onRepeat")):this.isHolding()&&this.setStateFromEnd(0))),this.isPendingRender())return this.start=this.getStartValue(r,a,r[a],s,i,e),this.end=this.getEndValue(r,a,this.start,s,i,e),this.current=this.start,r[a]=this.start,this.setPlayingForwardState(),!0;var h=this.isPlayingForward(),l=this.isPlayingBackward();if(h||l){var u=this.elapsed,c=this.duration,d=0,f=!1;(u+=t)>=c?(d=u-c,u=c,f=!0):u<0&&(u=0);var p=n(u/c,0,1);this.elapsed=u,this.progress=p,this.previous=this.current,h||(p=1-p);var v=this.ease(p);this.interpolation?this.current=this.interpolation(this.interpolationData,v):this.current=this.start+(this.end-this.start)*v,r[a]=this.current,f&&(h?(e.isNumberTween&&(this.current=this.end,r[a]=this.current),this.hold>0?(this.elapsed=this.hold,this.setHoldState()):this.setStateFromEnd(d)):(e.isNumberTween&&(this.current=this.start,r[a]=this.current),this.setStateFromStart(d))),this.dispatchEvent(o.TWEEN_UPDATE,"onUpdate")}return!this.isComplete()},dispatchEvent:function(t,e){var i=this.tween;if(!i.isSeeking){var s=i.targets[this.targetIndex],n=this.key,r=this.current,o=this.previous;i.emit(t,i,n,s,r,o);var a=i.callbacks[e];a&&a.func.apply(i.callbackScope,[i,s,n,r,o].concat(a.params))}},destroy:function(){s.prototype.destroy.call(this),this.getActiveValue=null,this.getEndValue=null,this.getStartValue=null,this.ease=null}});t.exports=a},42220:(t,e,i)=>{var s=i(95042),n=i(45319),r=i(83419),o=i(842),a=new r({Extends:s,initialize:function(t,e,i,n,r,o,a,h,l,u,c){s.call(this,t,e,r,o,!1,a,h,l,u,c),this.key="texture",this.startTexture=null,this.endTexture=i,this.startFrame=null,this.endFrame=n,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(o.TWEEN_REPEAT,"onRepeat")):this.isHolding()&&this.setStateFromEnd(0))),this.isPendingRender())return this.startTexture&&s.setTexture(this.startTexture,this.startFrame),this.setPlayingForwardState(),!0;var r=this.isPlayingForward(),a=this.isPlayingBackward();if(r||a){var h=this.elapsed,l=this.duration,u=0,c=!1;(h+=t)>=l?(u=h-l,h=l,c=!0):h<0&&(h=0);var d=n(h/l,0,1);this.elapsed=h,this.progress=d,c&&(r?(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(o.TWEEN_UPDATE,"onUpdate")}return!this.isComplete()},dispatchEvent:function(t,e){var i=this.tween;if(!i.isSeeking){var s=i.targets[this.targetIndex],n=this.key;i.emit(t,i,n,s);var r=i.callbacks[e];r&&r.func.apply(i.callbackScope,[i,s,n].concat(r.params))}},destroy:function(){s.prototype.destroy.call(this),this.startTexture=null,this.endTexture=null,this.startFrame=null,this.endFrame=null}});t.exports=a},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,n,o){for(var a in s)if(s.hasOwnProperty(a)){var h=e(s,a,n);if(!1!==h){if(i((o||t).prototype,a)){if(r.ignoreFinals)continue;throw new Error("cannot override final property '"+a+"', set Class.ignoreFinals = true to skip")}Object.defineProperty(t.prototype,a,h)}else t.prototype[a]=s[a]}}function n(t,e){if(e){Array.isArray(e)||(e=[e]);for(var i=0;i{t.exports=function(){}},20242:t=>{t.exports=function(){return null}},71146:t=>{t.exports=function(t,e,i,s,n){if(void 0===n&&(n=t),i>0){var r=i-t.length;if(r<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.push(e),s&&s.call(n,e),e):null;for(var o=e.length-1;o>=0;)-1!==t.indexOf(e[o])&&e.splice(o,1),o--;if(0===(o=e.length))return null;i>0&&o>r&&(e.splice(r),o=r);for(var a=0;a{t.exports=function(t,e,i,s,n,r){if(void 0===i&&(i=0),void 0===r&&(r=t),s>0){var o=s-t.length;if(o<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.splice(i,0,e),n&&n.call(r,e),e):null;for(var a=e.length-1;a>=0;)-1!==t.indexOf(e[a])&&e.pop(),a--;if(0===(a=e.length))return null;s>0&&a>o&&(e.splice(o),a=o);for(var h=a-1;h>=0;h--){var l=e[h];t.splice(i,0,l),n&&n.call(r,l)}return e}},66905:t=>{t.exports=function(t,e){var i=t.indexOf(e);return-1!==i&&i{var s=i(82011);t.exports=function(t,e,i,n,r){void 0===n&&(n=0),void 0===r&&(r=t.length);var o=0;if(s(t,n,r))for(var a=n;a{t.exports=function(t,e,i){var s,n=[null];for(s=3;s{var s=i(82011);t.exports=function(t,e,i,n,r){if(void 0===n&&(n=0),void 0===r&&(r=t.length),s(t,n,r)){var o,a=[null];for(o=5;o{t.exports=function(t,e,i){if(!e.length)return NaN;if(1===e.length)return e[0];var s,n,r=1;if(i){if(te.length&&(r=e.length),i?(s=e[r-1][i],(n=e[r][i])-t<=t-s?e[r]:e[r-1]):(s=e[r-1],(n=e[r])-t<=t-s?n:s)}},43491:t=>{var e=function(t,i){void 0===i&&(i=[]);for(var s=0;s{var s=i(82011);t.exports=function(t,e,i,n,r){void 0===n&&(n=0),void 0===r&&(r=t.length);var o=[];if(s(t,n,r))for(var a=n;a{var s=i(82011);t.exports=function(t,e,i,n,r){if(void 0===n&&(n=0),void 0===r&&(r=t.length),-1!==n){if(s(t,n,r))for(var o=n;o=0;o--){a=t[o];if(!e||e&&void 0===i&&a.hasOwnProperty(e)||e&&void 0!==i&&a[e]===i)return a}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),n=t.indexOf(i);if(s<0||n<0)throw new Error("Supplied items must be elements of the same array");return s>n||(t.splice(s,1),n=t.indexOf(i),t.splice(n+1,0,e)),t}},83371:t=>{t.exports=function(t,e,i){if(e===i)return t;var s=t.indexOf(e),n=t.indexOf(i);if(s<0||n<0)throw new Error("Supplied items must be elements of the same array");return s{t.exports=function(t,e){var i=t.indexOf(e);if(i>0){var s=t[i-1],n=t.indexOf(s);t[i]=s,t[n]=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{t.exports=function(t,e,i,s){var n,r=[],o=!1;if((i||s)&&(o=!0,i||(i=""),s||(s="")),e=e;n--)o?r.push(i+n.toString()+s):r.push(n);else for(n=t;n<=e;n++)o?r.push(i+n.toString()+s):r.push(n);return r}},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 n=[],r=Math.max(s((e-t)/(i||1)),0),o=0;o{function e(t,e,i){var s=t[e];t[e]=t[i],t[i]=s}function i(t,e){return te?1:0}var s=function(t,n,r,o,a){for(void 0===r&&(r=0),void 0===o&&(o=t.length-1),void 0===a&&(a=i);o>r;){if(o-r>600){var h=o-r+1,l=n-r+1,u=Math.log(h),c=.5*Math.exp(2*u/3),d=.5*Math.sqrt(u*c*(h-c)/h)*(l-h/2<0?-1:1),f=Math.max(r,Math.floor(n-l*c/h+d)),p=Math.min(o,Math.floor(n+(h-l)*c/h+d));s(t,n,f,p,a)}var v=t[n],g=r,m=o;for(e(t,r,n),a(t[o],v)>0&&e(t,r,o);g0;)m--}0===a(t[r],v)?e(t,r,m):e(t,++m,o),m<=n&&(r=m+1),n<=m&&(o=m-1)}};t.exports=s},88492:(t,e,i)=>{var s=i(35154),n=i(33680),r=function(t,e,i){for(var s=[],n=0;n{var s=i(19133);t.exports=function(t,e,i,n){var r;if(void 0===n&&(n=t),!Array.isArray(e))return-1!==(r=t.indexOf(e))?(s(t,r),i&&i.call(n,e),e):null;for(var o=e.length-1,a=[];o>=0;){var h=e[o];-1!==(r=t.indexOf(h))&&(s(t,r),a.push(h),i&&i.call(n,h)),o--}return a}},60248:(t,e,i)=>{var s=i(19133);t.exports=function(t,e,i,n){if(void 0===n&&(n=t),e<0||e>t.length-1)throw new Error("Index out of bounds");var r=s(t,e);return i&&i.call(n,r),r}},81409:(t,e,i)=>{var s=i(82011);t.exports=function(t,e,i,n,r){if(void 0===e&&(e=0),void 0===i&&(i=t.length),void 0===r&&(r=t),s(t,e,i)){var o=i-e,a=t.splice(e,o);if(n)for(var h=0;h{var s=i(19133);t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=t.length);var n=e+Math.floor(Math.random()*i);return s(t,n)}},42169:t=>{t.exports=function(t,e,i){var s=t.indexOf(e),n=t.indexOf(i);return-1!==s&&-1===n&&(t[s]=i,!0)}},86003:t=>{t.exports=function(t,e){void 0===e&&(e=1);for(var i=null,s=0;s{t.exports=function(t,e){void 0===e&&(e=1);for(var i=null,s=0;s{t.exports=function(t,e,i,s){var n=t.length;if(e<0||e>=n||e>=i||i>n){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,n,r){if(void 0===n&&(n=0),void 0===r&&(r=t.length),s(t,n,r))for(var o=n;o{t.exports=function(t){for(var e=t.length-1;e>0;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],n=e;n{var s=i(82264);function n(t,e){return String(t).localeCompare(e)}function r(t,e,i,s){var n,r,o,a,h,l=t.length,u=0,c=2*i;for(n=0;nl&&(r=l),o>l&&(o=l),a=n,h=r;;)if(a{t.exports=function(t,e,i){if(e===i)return t;var s=t.indexOf(e),n=t.indexOf(i);if(s<0||n<0)throw new Error("Supplied items must be elements of the same array");return t[s]=i,t[n]=e,t}},37105:(t,e,i)=>{t.exports={Matrix:i(54915),Add:i(71146),AddAt:i(51067),BringToTop:i(66905),CountAllMatching:i(21612),Each:i(95428),EachInRange:i(36914),FindClosestInSorted:i(81957),Flatten:i(43491),GetAll:i(46710),GetFirst:i(58731),GetRandom:i(26546),MoveDown:i(70864),MoveTo:i(69693),MoveUp:i(40853),MoveAbove:i(85835),MoveBelow:i(83371),NumberArray:i(20283),NumberArrayStep:i(593),QuickSelect:i(43886),Range:i(88492),Remove:i(72905),RemoveAt:i(60248),RemoveBetween:i(81409),RemoveRandomElement:i(31856),Replace:i(42169),RotateLeft:i(86003),RotateRight:i(49498),SafeRange:i(82011),SendToBack:i(89545),SetAll:i(17810),Shuffle:i(33680),SortByDigits:i(90126),SpliceOne:i(19133),StableSort:i(19186),Swap:i(25630)}},86922:t=>{t.exports=function(t){if(!Array.isArray(t)||!Array.isArray(t[0]))return!1;for(var e=t[0].length,i=1;i{var s=i(41836),n=i(86922);t.exports=function(t){var e="";if(!n(t))return e;for(var i=0;i{t.exports=function(t){return t.reverse()}},21224:t=>{t.exports=function(t){for(var e=0;e{var s=i(37829);t.exports=function(t){return s(t,180)}},44657:(t,e,i)=>{var s=i(37829);t.exports=function(t,e){void 0===e&&(e=1);for(var i=0;i{var s=i(86922),n=i(2429);t.exports=function(t,e){if(void 0===e&&(e=90),!s(t))return null;if("string"!=typeof e&&(e=(e%360+360)%360),90===e||-270===e||"rotateLeft"===e)(t=n(t)).reverse();else if(-90===e||270===e||"rotateRight"===e)t.reverse(),t=n(t);else if(180===Math.abs(e)||"rotate180"===e){for(var i=0;i{var s=i(37829);t.exports=function(t,e){void 0===e&&(e=1);for(var i=0;i{var s=i(86003),n=i(49498);t.exports=function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),0!==i&&(i<0?s(t,Math.abs(i)):n(t,i)),0!==e)for(var r=0;r{t.exports=function(t){for(var e=t.length,i=t[0].length,s=new Array(i),n=0;n-1;r--)s[n][r]=t[r][n]}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),n=s.length,r=i?"data:"+i+";base64,":"",o=0;o>2],r+=e[(3&s[o])<<4|s[o+1]>>4],r+=e[(15&s[o+1])<<2|s[o+2]>>6],r+=e[63&s[o+2]];return n%3==2?r=r.substring(0,r.length-1)+"=":n%3==1&&(r=r.substring(0,r.length-2)+"=="),r}},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,n,r,o=(t=t.substr(t.indexOf(",")+1)).length,a=.75*o,h=0;"="===t[o-1]&&(a--,"="===t[o-2]&&a--);for(var l=new ArrayBuffer(a),u=new Uint8Array(l),c=0;c>4,u[h++]=(15&s)<<4|n>>2,u[h++]=(3&n)<<6|63&r;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,n;if("object"!=typeof t||null===t)return t;for(n in i=Array.isArray(t)?[]:{},t)s=t[n],i[n]=e(s);return i};t.exports=e},79291:(t,e,i)=>{var s=i(41212),n=function(){var t,e,i,r,o,a,h=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof h&&(c=h,h=arguments[1]||{},l=2),u===l&&(h=this,--l);l{var s=i(75508),n=i(35154);t.exports=function(t,e,i){var r=n(t,e,null);if(null===r)return i;if(Array.isArray(r))return s.RND.pick(r);if("object"==typeof r){if(r.hasOwnProperty("randInt"))return s.RND.integerInRange(r.randInt[0],r.randInt[1]);if(r.hasOwnProperty("randFloat"))return s.RND.realInRange(r.randFloat[0],r.randFloat[1])}else if("function"==typeof r)return r(e);return r}},95540:t=>{t.exports=function(t,e,i){var s=typeof t;return t&&"number"!==s&&"string"!==s&&t.hasOwnProperty(e)&&void 0!==t[e]?t[e]:i}},82840:(t,e,i)=>{var s=i(35154),n=i(45319);t.exports=function(t,e,i,r,o){void 0===o&&(o=i);var a=s(t,e,o);return n(a,i,r)}},35154:t=>{t.exports=function(t,e,i,s){if(!t&&!s||"number"==typeof t)return i;if(t&&t.hasOwnProperty(e))return t[e];if(s&&s.hasOwnProperty(e))return s[e];if(-1!==e.indexOf(".")){for(var n=e.split("."),r=t,o=s,a=i,h=i,l=!0,u=!0,c=0;c{t.exports=function(t,e){for(var i=0;i{t.exports=function(t,e){for(var i=0;i{t.exports=function(t,e){return t.hasOwnProperty(e)}},41212:t=>{t.exports=function(t){if(!t||"object"!=typeof t||t.nodeType||t===t.window)return!1;try{if(t.constructor&&!{}.hasOwnProperty.call(t.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0}},46975:(t,e,i)=>{var s=i(41786);t.exports=function(t,e){var i=s(t);for(var n in e)i.hasOwnProperty(n)||(i[n]=e[n]);return i}},269:(t,e,i)=>{var s=i(41786);t.exports=function(t,e){var i=s(t);for(var n in e)i.hasOwnProperty(n)&&(i[n]=e[n]);return i}},18254:(t,e,i)=>{var s=i(97022);t.exports=function(t,e){for(var i={},n=0;n{t.exports=function(t,e,i){if(!t||"number"==typeof t)return!1;if(t.hasOwnProperty(e))return t[e]=i,!0;if(-1!==e.indexOf(".")){for(var s=e.split("."),n=t,r=t,o=0;o{t.exports={Clone:i(41786),DeepCopy:i(62644),Extend:i(79291),GetAdvancedValue:i(23568),GetFastValue:i(95540),GetMinMaxValue:i(82840),GetValue:i(35154),HasAll:i(69036),HasAny:i(1985),HasValue:i(97022),IsPlainObject:i(41212),Merge:i(46975),MergeRight:i(269),Pick:i(18254),SetValue:i(61622)}},27902:t=>{t.exports=function(t,e){return t.replace(/%([0-9]+)/g,(function(t,i){return e[Number(i)-1]}))}},41836:t=>{t.exports=function(t,e,i,s){void 0===e&&(e=0),void 0===i&&(i=" "),void 0===s&&(s=3);var n=0;if(e+1>=(t=t.toString()).length)switch(s){case 1:t=new Array(e+1-t.length).join(i)+t;break;case 3:var r=Math.ceil((n=e-t.length)/2);t=new Array(n-r+1).join(i)+t+new Array(r+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 n=e[s];if(void 0!==n)return n.exports;var r=e[s]={exports:{}};return t[s](r,r.exports,i),r.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/app/static/js/logic/comboInput.js b/app/static/js/logic/comboInput.js new file mode 100644 index 0000000..0b9eef7 --- /dev/null +++ b/app/static/js/logic/comboInput.js @@ -0,0 +1,132 @@ +/** + * Eingabe der Orbital-Befehle als Richtungsfolge (ohne Phaser). + * + * Solange die Halte-Taste gedrückt ist, sammelt `ComboInput` Richtungen. Nach jeder + * Eingabe wird geprüft, ob der Puffer noch Anfang mindestens eines Befehls ist: + * - passt nichts mehr → „fail“, Puffer wird geleert (man kann direkt neu ansetzen) + * - Folge vollständig → „match“ mit Befehls-ID + * - sonst → „progress“ + * Ob ein Befehl gerade abklingt, entscheidet der Aufrufer – hier geht es nur um Folgen. + * @module logic/comboInput + */ + +/** @typedef {'up'|'down'|'left'|'right'} Direction */ +/** @typedef {{id: string, sequence: readonly Direction[]}} ComboCommand */ + +/** @type {readonly Direction[]} */ +export const DIRECTIONS = Object.freeze(['up', 'down', 'left', 'right']); + +/** + * Physische Tastencodes (KeyboardEvent.code) → Richtung. `code` statt `key`, damit + * WASD auch auf AZERTY- oder QWERTZ-Tastaturen an derselben Stelle liegt. + */ +const CODE_TO_DIRECTION = Object.freeze({ + ArrowUp: 'up', + KeyW: 'up', + ArrowDown: 'down', + KeyS: 'down', + ArrowLeft: 'left', + KeyA: 'left', + ArrowRight: 'right', + KeyD: 'right', +}); + +/** + * @param {string} code KeyboardEvent.code + * @returns {Direction|null} + */ +export function codeToDirection(code) { + return CODE_TO_DIRECTION[code] ?? null; +} + +/** + * @param {readonly string[]} prefix + * @param {readonly string[]} sequence + * @returns {boolean} + */ +export function isPrefix(prefix, sequence) { + if (prefix.length > sequence.length) return false; + return prefix.every((dir, i) => sequence[i] === dir); +} + +/** + * Prüft die Befehlsliste: gültige Richtungen, eindeutige IDs und keine Folge, die + * Anfang einer anderen ist (sonst wäre die längere Folge nie erreichbar). + * @param {readonly ComboCommand[]} commands + * @throws {Error} bei ungültiger Konfiguration. + */ +export function validateCommands(commands) { + const ids = new Set(); + for (const command of commands) { + if (ids.has(command.id)) throw new Error(`Doppelte Befehls-ID: ${command.id}`); + ids.add(command.id); + if (command.sequence.length === 0) throw new Error(`Leere Folge bei ${command.id}`); + for (const dir of command.sequence) { + if (!DIRECTIONS.includes(dir)) throw new Error(`Ungültige Richtung „${dir}“ bei ${command.id}`); + } + } + for (const a of commands) { + for (const b of commands) { + if (a !== b && isPrefix(a.sequence, b.sequence)) { + throw new Error(`Folge von ${a.id} ist Anfang der Folge von ${b.id}`); + } + } + } +} + +export class ComboInput { + /** @param {readonly ComboCommand[]} commands */ + constructor(commands) { + validateCommands(commands); + this.commands = commands; + /** @type {Direction[]} */ + this.buffer = []; + this.active = false; + } + + /** Halte-Taste gedrückt: Eingabe beginnt mit leerem Puffer. */ + begin() { + this.active = true; + this.buffer = []; + } + + /** Halte-Taste losgelassen: halbe Eingaben verfallen. */ + end() { + this.active = false; + this.buffer = []; + } + + /** + * Verarbeitet eine Richtung. + * @param {string} direction + * @returns {{status: 'inactive'|'ignored'|'fail'|'progress'|'match', commandId?: string, candidates?: string[]}} + */ + push(direction) { + if (!this.active) return { status: 'inactive' }; + if (!DIRECTIONS.includes(/** @type {Direction} */ (direction))) return { status: 'ignored' }; + + this.buffer.push(/** @type {Direction} */ (direction)); + const candidates = this.commands.filter((c) => isPrefix(this.buffer, c.sequence)); + if (candidates.length === 0) { + this.buffer = []; + return { status: 'fail' }; + } + const exact = candidates.find((c) => c.sequence.length === this.buffer.length); + if (exact) { + this.buffer = []; + return { status: 'match', commandId: exact.id }; + } + return { status: 'progress', candidates: candidates.map((c) => c.id) }; + } + + /** + * Wie viele Schritte eines Befehls bereits korrekt eingegeben sind (für die HUD-Anzeige). + * @param {string} commandId + * @returns {number} + */ + progressFor(commandId) { + const command = this.commands.find((c) => c.id === commandId); + if (!command || !isPrefix(this.buffer, command.sequence)) return 0; + return this.buffer.length; + } +} diff --git a/app/static/js/logic/cooldowns.js b/app/static/js/logic/cooldowns.js new file mode 100644 index 0000000..747cbcd --- /dev/null +++ b/app/static/js/logic/cooldowns.js @@ -0,0 +1,72 @@ +/** + * Abklingzeiten für Fähigkeiten (Ausweichrolle, Orbital-Befehle) ohne Phaser. + * Arbeitet mit der Spielzeit des GameScene, die während der Pause stillsteht – + * Abklingzeiten laufen in der Pause also nicht heimlich weiter. + * @module logic/cooldowns + */ + +import { clamp } from './math.js'; + +export class CooldownTracker { + constructor() { + /** @type {Map} */ + this.readyAt = new Map(); + /** @type {Map} */ + this.durations = new Map(); + } + + /** + * Startet die Abklingzeit von `id`. + * @param {string} id + * @param {number} durationMs + * @param {number} now Spielzeit in ms. + */ + trigger(id, durationMs, now) { + this.readyAt.set(id, now + durationMs); + this.durations.set(id, durationMs); + } + + /** + * @param {string} id + * @param {number} now + * @returns {boolean} true, wenn die Fähigkeit benutzt werden kann (auch wenn nie ausgelöst). + */ + isReady(id, now) { + return (this.readyAt.get(id) ?? -Infinity) <= now; + } + + /** + * @param {string} id + * @param {number} now + * @returns {number} Restzeit in ms (0 wenn bereit). + */ + remaining(id, now) { + return Math.max(0, (this.readyAt.get(id) ?? now) - now); + } + + /** + * Fortschritt für Ladebalken im HUD. + * @param {string} id + * @param {number} now + * @returns {number} 0 = gerade ausgelöst, 1 = bereit. + */ + progress(id, now) { + const duration = this.durations.get(id); + if (!duration) return 1; + return clamp(1 - this.remaining(id, now) / duration, 0, 1); + } + + /** + * Setzt eine oder alle Abklingzeiten zurück. + * @param {string} [id] + */ + reset(id) { + if (id === undefined) { + this.readyAt.clear(); + this.durations.clear(); + } else { + this.readyAt.delete(id); + this.durations.delete(id); + } + } +} diff --git a/app/static/js/logic/enemyAi.js b/app/static/js/logic/enemyAi.js new file mode 100644 index 0000000..2b335fc --- /dev/null +++ b/app/static/js/logic/enemyAi.js @@ -0,0 +1,225 @@ +/** + * Entscheidungslogik der Gegner (ohne Phaser): Bewegung pro Verhalten, + * Sprungangriff, Schuss-Salven, Brut. Die Entities rufen diese Funktionen jeden + * Frame auf und setzen das Ergebnis in Physik und Grafik um. + * + * Zustände liegen in kleinen, veränderlichen „Brain“-Objekten pro Gegner. Das ist + * bewusst kein unveränderlicher Stil: Bei 60 Gegnern und 60 FPS sollen pro Frame + * keine Objektberge für den Garbage Collector entstehen. + * @module logic/enemyAi + */ + +import { degToRad, distance, normalize, scale, sub } from './math.js'; +import { encirclePoint, flankPoint, keepDistance, seek } from './steering.js'; + +/** @typedef {import('./math.js').Vec2} Vec2 */ + +/** + * @typedef {Object} Brain + * @property {number} slotAngle Anflugwinkel im Schwarm (Bogenmaß). + * @property {1|-1} strafeDirection Richtung beim seitlichen Ausweichen. + * @property {number} nextStrafeSwitchAt + * @property {1|-1} flankSide Seite, von der flankiert wird. + * @property {'chase'|'windup'|'leap'} leapState + * @property {number} leapStateUntil + * @property {number} nextLeapAt + * @property {Vec2} leapDirection + * @property {AttackState} attack + * @property {AttackState} mortar + * @property {number} nextBroodAt + */ + +/** + * @typedef {Object} AttackState + * @property {number} nextAttackAt + * @property {number} burstRemaining + * @property {number} nextShotAt + */ + +/** + * Neuer Angriffszustand. `firstAttackAt` verzögert den ersten Schuss, damit frisch + * gespawnte Gegner nicht sofort und alle gleichzeitig feuern. + * @param {number} firstAttackAt + * @returns {AttackState} + */ +export function createAttackState(firstAttackAt = 0) { + return { nextAttackAt: firstAttackAt, burstRemaining: 0, nextShotAt: 0 }; +} + +/** + * Neues Brain mit zufälligen, aber reproduzierbaren Eigenheiten. + * @param {import('./rng.js').Rng} rng + * @param {number} now + * @param {{firstAttackDelayMs?: number}} [options] + * @returns {Brain} + */ +export function createBrain(rng, now, options = {}) { + const firstAttackAt = now + (options.firstAttackDelayMs ?? 0) * (0.5 + rng()); + return { + slotAngle: rng() * Math.PI * 2, + strafeDirection: rng() < 0.5 ? 1 : -1, + nextStrafeSwitchAt: now, + flankSide: rng() < 0.5 ? 1 : -1, + leapState: 'chase', + leapStateUntil: 0, + nextLeapAt: now, + leapDirection: { x: 0, y: 0 }, + attack: createAttackState(firstAttackAt), + mortar: createAttackState(firstAttackAt + (options.firstAttackDelayMs ?? 0)), + nextBroodAt: now + (options.firstAttackDelayMs ?? 0), + }; +} + +/** + * Wechselt gelegentlich die Ausweichrichtung, damit Fernkämpfer nicht vorhersehbar kreisen. + * @param {Brain} brain + * @param {number} now + * @param {{min: number, max: number}} switchMs + * @param {import('./rng.js').Rng} rng + */ +export function updateStrafe(brain, now, switchMs, rng) { + if (now >= brain.nextStrafeSwitchAt) { + brain.strafeDirection = brain.strafeDirection === 1 ? -1 : 1; + brain.nextStrafeSwitchAt = now + switchMs.min + rng() * (switchMs.max - switchMs.min); + } +} + +/** + * Schwarm: aus der Distanz den eigenen Platz im Umzingelungskreis ansteuern, + * in Reichweite direkt angreifen. So kommt ein Rudel von mehreren Seiten. + * @param {Brain} brain + * @param {Vec2} self + * @param {Vec2} player + * @param {number} speed + * @param {{engageRange: number, encircleRadius: number}} type + * @returns {Vec2} + */ +export function swarmVelocity(brain, self, player, speed, type) { + if (distance(self, player) <= type.engageRange) { + return seek(self, player, speed); + } + return seek(self, encirclePoint(player, brain.slotAngle, type.encircleRadius), speed); +} + +/** + * Sprungkralle: verfolgen → ansetzen (stillstehen, Vorwarnung) → springen → verfolgen. + * Die Sprungrichtung wird beim Ansetzen festgelegt: Wer die Vorwarnung sieht, kann + * ausweichen. Das ist die „Fairness“ des Angriffs. + * @param {Brain} brain + * @param {Vec2} self + * @param {Vec2} player + * @param {number} now + * @param {number} speed + * @param {{triggerRange: number, windupMs: number, speed: number, durationMs: number, cooldownMs: number}} leap + * @returns {{velocity: Vec2, telegraph: boolean, leaping: boolean}} + */ +export function leaperStep(brain, self, player, now, speed, leap) { + if (brain.leapState === 'windup') { + if (now < brain.leapStateUntil) { + return { velocity: { x: 0, y: 0 }, telegraph: true, leaping: false }; + } + brain.leapState = 'leap'; + brain.leapStateUntil = now + leap.durationMs; + } + if (brain.leapState === 'leap') { + if (now < brain.leapStateUntil) { + return { velocity: scale(brain.leapDirection, leap.speed), telegraph: false, leaping: true }; + } + brain.leapState = 'chase'; + brain.nextLeapAt = now + leap.cooldownMs; + } + // chase + if (distance(self, player) <= leap.triggerRange && now >= brain.nextLeapAt) { + brain.leapState = 'windup'; + brain.leapStateUntil = now + leap.windupMs; + brain.leapDirection = normalize(sub(player, self)); + return { velocity: { x: 0, y: 0 }, telegraph: true, leaping: false }; + } + return { velocity: seek(self, player, speed), telegraph: false, leaping: false }; +} + +/** + * Fernkämpfer auf Abstand (Nieter-Drohne, Walzmeister). + * @param {Brain} brain + * @param {Vec2} self + * @param {Vec2} player + * @param {number} speed + * @param {{min: number, max: number}} range + * @returns {Vec2} + */ +export function kiteVelocity(brain, self, player, speed, range) { + return keepDistance(self, player, range, speed, brain.strafeDirection); +} + +/** + * Flankierer (Blechsoldat): steuert eine Position seitlich des Spielers an und + * hält dort Abstand. Nah an der Flankenposition geht er ins Abstandhalten über. + * @param {Brain} brain + * @param {Vec2} self + * @param {Vec2} player + * @param {number} speed + * @param {{flankAngleDeg: number, flankDistance: number, range: {min: number, max: number}}} type + * @returns {Vec2} + */ +export function flankVelocity(brain, self, player, speed, type) { + const target = flankPoint(player, self, degToRad(type.flankAngleDeg) * brain.flankSide, type.flankDistance); + // Ist die Flanke (fast) erreicht, wie ein Fernkämpfer weiterkämpfen. + if (distance(self, target) < type.range.min * 0.5) { + return keepDistance(self, player, type.range, speed, brain.flankSide); + } + return seek(self, target, speed); +} + +/** + * Taktgeber für Schüsse und Salven. + * @param {AttackState} state + * @param {number} now + * @param {number} distanceToPlayer + * @param {{cooldownMs: number, burst?: number, burstIntervalMs?: number, maxDistance: number}} attack + * @returns {boolean} true, wenn in diesem Frame geschossen werden soll. + */ +export function attackStep(state, now, distanceToPlayer, attack) { + if (state.burstRemaining > 0) { + if (now >= state.nextShotAt) { + state.burstRemaining -= 1; + state.nextShotAt = now + (attack.burstIntervalMs ?? 0); + return true; + } + return false; + } + if (now >= state.nextAttackAt && distanceToPlayer <= attack.maxDistance) { + state.burstRemaining = (attack.burst ?? 1) - 1; + state.nextShotAt = now + (attack.burstIntervalMs ?? 0); + state.nextAttackAt = now + attack.cooldownMs; + return true; + } + return false; +} + +/** + * Winkel aller Projektile einer Salve, gleichmäßig über `spreadDeg` verteilt. + * @param {number} baseAngle Bogenmaß (Richtung zum Ziel). + * @param {number} count + * @param {number} spreadDeg Gesamtbreite des Fächers in Grad. + * @returns {number[]} + */ +export function volleyAngles(baseAngle, count, spreadDeg) { + if (count <= 1) return [baseAngle]; + const spread = degToRad(spreadDeg); + const step = spread / (count - 1); + return Array.from({ length: count }, (_, i) => baseAngle - spread / 2 + i * step); +} + +/** + * Brutmutter: Wie viele Krabbler jetzt schlüpfen sollen. + * @param {Brain} brain + * @param {number} now + * @param {number} aliveChildren Aktuell lebende Nachkommen dieser Brutmutter. + * @param {{intervalMs: number, spawnCount: number, maxChildren: number}} brood + * @returns {number} + */ +export function broodStep(brain, now, aliveChildren, brood) { + if (now < brain.nextBroodAt) return 0; + brain.nextBroodAt = now + brood.intervalMs; + return Math.max(0, Math.min(brood.spawnCount, brood.maxChildren - aliveChildren)); +} diff --git a/app/static/js/logic/format.js b/app/static/js/logic/format.js new file mode 100644 index 0000000..d5a3768 --- /dev/null +++ b/app/static/js/logic/format.js @@ -0,0 +1,94 @@ +/** + * Formatierung und Eingabeprüfung für Anzeige und Highscore-Formular (ohne Phaser). + * @module logic/format + */ + +import { DIRECTION_SYMBOLS, HIGHSCORE } from '../config.js'; + +const scoreFormatter = new Intl.NumberFormat('de-DE'); + +/** + * Punktestand mit Tausendertrennzeichen („12.345“). + * @param {number} score + * @returns {string} + */ +export function formatScore(score) { + return scoreFormatter.format(Math.max(0, Math.floor(score))); +} + +/** + * Dauer als „m:ss“. + * @param {number} ms + * @returns {string} + */ +export function formatDuration(ms) { + const totalSeconds = Math.max(0, Math.floor(ms / 1000)); + const minutes = Math.floor(totalSeconds / 60); + const seconds = String(totalSeconds % 60).padStart(2, '0'); + return `${minutes}:${seconds}`; +} + +/** + * Multiplikator mit deutschem Dezimalkomma („×1,5“). + * @param {number} multiplier + * @returns {string} + */ +export function formatMultiplier(multiplier) { + return `×${String(Math.round(multiplier * 10) / 10).replace('.', ',')}`; +} + +/** + * Abklingzeit in Sekunden für das HUD („12“, „0,8“). + * @param {number} ms + * @returns {string} + */ +export function formatCooldown(ms) { + if (ms <= 0) return ''; + const seconds = ms / 1000; + return seconds >= 1 ? String(Math.ceil(seconds)) : seconds.toFixed(1).replace('.', ','); +} + +/** + * Richtungsfolge als Pfeile („↑ → ↓ ↓“). + * @param {readonly string[]} sequence + * @param {string} [separator] + * @returns {string} + */ +export function formatSequence(sequence, separator = ' ') { + return sequence.map((dir) => DIRECTION_SYMBOLS[dir] ?? '?').join(separator); +} + +/** Wie auf dem Server (app/validation.py): alles außer Buchstaben, Ziffern und wenigen Zeichen. */ +const DISALLOWED_NAME_CHARS = /[^\p{L}\p{N}_ .\-'!?]/gu; +/** Steuer-, Format-, Surrogat- und private Zeichen (Unicode-Kategorie C). */ +const CONTROL_CHARS = /\p{C}/gu; + +/** + * Bereinigt einen Namen genauso wie das Backend, damit der Spieler vor dem Absenden + * sieht, was gespeichert wird. Der Server prüft trotzdem selbst. + * @param {string} raw + * @returns {string} + */ +export function sanitizeName(raw) { + return String(raw) + .normalize('NFKC') + .replace(CONTROL_CHARS, '') + .replace(DISALLOWED_NAME_CHARS, '') + .split(/\s+/u) + .filter(Boolean) + .join(' '); +} + +/** + * Prüft einen Namen für das Highscore-Formular. + * @param {string} raw + * @returns {{ok: true, name: string} | {ok: false, error: string}} + */ +export function validateName(raw) { + const name = sanitizeName(raw); + if (!name) return { ok: false, error: 'Bitte einen Namen mit Buchstaben oder Ziffern eingeben.' }; + if ([...name].length > HIGHSCORE.nameMaxLength) { + return { ok: false, error: `Höchstens ${HIGHSCORE.nameMaxLength} Zeichen.` }; + } + return { ok: true, name }; +} diff --git a/app/static/js/logic/marchPattern.js b/app/static/js/logic/marchPattern.js new file mode 100644 index 0000000..3239a9c --- /dev/null +++ b/app/static/js/logic/marchPattern.js @@ -0,0 +1,87 @@ +/** + * Notenmuster der Hintergrundmusik: ein pompöser Marsch (eigene Komposition, CC0), + * der die Propaganda-Stimmung überzeichnet. Ohne Web-Audio-Abhängigkeit, damit sich + * Rhythmus und Harmonie testen lassen; gespielt wird er von `systems/Music.js`. + * + * Raster: 16 Schritte (Sechzehntel) pro Takt, 8 Takte, Viervierteltakt. + * @module logic/marchPattern + */ + +export const TEMPO_BPM = 112; +export const STEPS_PER_BAR = 16; +export const BARS = 8; +export const TOTAL_STEPS = STEPS_PER_BAR * BARS; + +/** Dauer eines Sechzehntels in Sekunden. */ +export const STEP_SECONDS = 60 / TEMPO_BPM / 4; + +/** Akkordgrundtöne (MIDI) je Takt: I I IV V I IV V I in C-Dur. */ +export const CHORD_ROOTS = Object.freeze([48, 48, 53, 55, 48, 53, 55, 48]); + +/** Dur-Dreiklang über dem Grundton. */ +const MAJOR_TRIAD = Object.freeze([0, 4, 7]); + +/** + * Fanfarenmelodie: [Takt, Schritt, MIDI-Ton, Länge in Schritten]. + * @type {readonly (readonly [number, number, number, number])[]} + */ +const MELODY = Object.freeze([ + [0, 0, 67, 3], [0, 3, 67, 1], [0, 4, 72, 4], [0, 8, 76, 6], [0, 14, 72, 2], + [1, 0, 74, 4], [1, 4, 72, 4], [1, 8, 71, 4], [1, 12, 67, 4], + [2, 0, 69, 3], [2, 3, 69, 1], [2, 4, 72, 4], [2, 8, 77, 6], [2, 14, 76, 2], + [3, 0, 74, 4], [3, 4, 71, 4], [3, 8, 67, 8], + [4, 0, 67, 3], [4, 3, 67, 1], [4, 4, 72, 4], [4, 8, 76, 4], [4, 12, 79, 4], + [5, 0, 81, 6], [5, 6, 77, 2], [5, 8, 76, 4], [5, 12, 72, 4], + [6, 0, 74, 3], [6, 3, 76, 1], [6, 4, 74, 4], [6, 8, 71, 4], [6, 12, 67, 4], + [7, 0, 72, 8], +]); + +/** + * @typedef {Object} MusicEvent + * @property {'kick'|'snare'|'bass'|'stab'|'lead'} instrument + * @property {number[]} notes MIDI-Töne (leer bei Schlagzeug). + * @property {number} lengthSteps + * @property {number} velocity 0..1 + */ + +/** + * Alle Ereignisse eines Schritts. + * @param {number} step 0..TOTAL_STEPS-1 (größere Werte werden umgebrochen). + * @returns {MusicEvent[]} + */ +export function eventsAtStep(step) { + const s = ((step % TOTAL_STEPS) + TOTAL_STEPS) % TOTAL_STEPS; + const bar = Math.floor(s / STEPS_PER_BAR); + const pos = s % STEPS_PER_BAR; + const root = CHORD_ROOTS[bar]; + const events = []; + + // „Umm“ auf 1 und 3 (Bass + große Trommel), „ta“ auf 2 und 4 (Akkord + kleine Trommel). + if (pos === 0 || pos === 8) { + events.push({ instrument: 'kick', notes: [], lengthSteps: 2, velocity: 1 }); + events.push({ instrument: 'bass', notes: [pos === 0 ? root - 12 : root - 5], lengthSteps: 4, velocity: 0.9 }); + } + if (pos === 4 || pos === 12) { + events.push({ instrument: 'snare', notes: [], lengthSteps: 1, velocity: 0.8 }); + events.push({ instrument: 'stab', notes: MAJOR_TRIAD.map((i) => root + 12 + i), lengthSteps: 2, velocity: 0.8 }); + } + // Trommelwirbel in der zweiten Hälfte des letzten Takts leitet die Wiederholung ein. + if (bar === BARS - 1 && pos >= 8 && pos !== 12) { + events.push({ instrument: 'snare', notes: [], lengthSteps: 1, velocity: 0.35 + (pos - 8) * 0.07 }); + } + for (const [mBar, mStep, note, length] of MELODY) { + if (mBar === bar && mStep === pos) { + events.push({ instrument: 'lead', notes: [note], lengthSteps: length, velocity: 0.8 }); + } + } + return events; +} + +/** + * Frequenz eines MIDI-Tons (A4 = 69 = 440 Hz). + * @param {number} midi + * @returns {number} + */ +export function midiToFrequency(midi) { + return 440 * Math.pow(2, (midi - 69) / 12); +} diff --git a/app/static/js/logic/math.js b/app/static/js/logic/math.js new file mode 100644 index 0000000..71ca88a --- /dev/null +++ b/app/static/js/logic/math.js @@ -0,0 +1,137 @@ +/** + * Kleine Vektor- und Zahlenhelfer ohne Phaser-Abhängigkeit. + * Vektoren sind einfache Objekte `{x, y}`; die Funktionen verändern ihre Eingaben nie. + * @module logic/math + */ + +/** @typedef {{x: number, y: number}} Vec2 */ + +/** + * Begrenzt `value` auf das Intervall [min, max]. + * @param {number} value + * @param {number} min + * @param {number} max + * @returns {number} + */ +export function clamp(value, min, max) { + return Math.min(max, Math.max(min, value)); +} + +/** + * Lineare Interpolation zwischen `a` und `b`. + * @param {number} a + * @param {number} b + * @param {number} t 0..1 + * @returns {number} + */ +export function lerp(a, b, t) { + return a + (b - a) * t; +} + +/** @param {number} deg @returns {number} */ +export function degToRad(deg) { + return (deg * Math.PI) / 180; +} + +/** @param {number} x @param {number} y @returns {Vec2} */ +export function vec(x = 0, y = 0) { + return { x, y }; +} + +/** @param {Vec2} a @param {Vec2} b @returns {Vec2} */ +export function add(a, b) { + return { x: a.x + b.x, y: a.y + b.y }; +} + +/** @param {Vec2} a @param {Vec2} b @returns {Vec2} */ +export function sub(a, b) { + return { x: a.x - b.x, y: a.y - b.y }; +} + +/** @param {Vec2} v @param {number} s @returns {Vec2} */ +export function scale(v, s) { + return { x: v.x * s, y: v.y * s }; +} + +/** @param {Vec2} v @returns {number} */ +export function length(v) { + return Math.hypot(v.x, v.y); +} + +/** @param {Vec2} a @param {Vec2} b @returns {number} */ +export function distance(a, b) { + return Math.hypot(b.x - a.x, b.y - a.y); +} + +/** + * Einheitsvektor in Richtung `v`. Der Nullvektor bleibt der Nullvektor – + * so muss kein Aufrufer Division durch null abfangen. + * @param {Vec2} v + * @returns {Vec2} + */ +export function normalize(v) { + const len = length(v); + return len > 0 ? { x: v.x / len, y: v.y / len } : { x: 0, y: 0 }; +} + +/** + * Kürzt `v` auf höchstens `max` Länge, die Richtung bleibt erhalten. + * @param {Vec2} v + * @param {number} max + * @returns {Vec2} + */ +export function clampLength(v, max) { + const len = length(v); + return len > max && len > 0 ? scale(v, max / len) : { x: v.x, y: v.y }; +} + +/** + * Dreht `v` um `angle` (Bogenmaß, im Uhrzeigersinn bei y nach unten wie im Canvas). + * @param {Vec2} v + * @param {number} angle + * @returns {Vec2} + */ +export function rotate(v, angle) { + const cos = Math.cos(angle); + const sin = Math.sin(angle); + return { x: v.x * cos - v.y * sin, y: v.x * sin + v.y * cos }; +} + +/** + * Winkel des Vektors von `from` nach `to` (Bogenmaß, 0 = nach rechts). + * @param {Vec2} from + * @param {Vec2} to + * @returns {number} + */ +export function angleTo(from, to) { + return Math.atan2(to.y - from.y, to.x - from.x); +} + +/** @param {number} angle @returns {Vec2} Einheitsvektor für den Winkel. */ +export function fromAngle(angle) { + return { x: Math.cos(angle), y: Math.sin(angle) }; +} + +/** + * Prüft, ob ein Punkt in einem Kreis liegt (inkl. Radius eines Objekts). + * @param {Vec2} point + * @param {Vec2} center + * @param {number} radius + * @param {number} [objectRadius=0] Ausdehnung des Objekts, damit große Gegner am Rand zählen. + * @returns {boolean} + */ +export function inCircle(point, center, radius, objectRadius = 0) { + return distance(point, center) <= radius + objectRadius; +} + +/** + * Richtungsvektor aus gedrückten Tasten; diagonal wird normalisiert, damit man + * schräg nicht schneller läuft (klassischer 8-Wege-Fehler). + * @param {{up: boolean, down: boolean, left: boolean, right: boolean}} keys + * @returns {Vec2} + */ +export function directionFromKeys(keys) { + const x = (keys.right ? 1 : 0) - (keys.left ? 1 : 0); + const y = (keys.down ? 1 : 0) - (keys.up ? 1 : 0); + return normalize({ x, y }); +} diff --git a/app/static/js/logic/rng.js b/app/static/js/logic/rng.js new file mode 100644 index 0000000..4fbce94 --- /dev/null +++ b/app/static/js/logic/rng.js @@ -0,0 +1,69 @@ +/** + * Deterministischer Zufallszahlengenerator. + * + * Warum nicht Math.random: Mit einem Seed lässt sich eine Welle reproduzieren – + * das macht die Wellengenerierung testbar und Balancing-Fehler nachstellbar. + * @module logic/rng + */ + +/** @typedef {() => number} Rng Liefert Zahlen im Intervall [0, 1). */ + +/** + * Mulberry32: klein, schnell und für Spielzwecke gut genug verteilt. + * @param {number} seed Beliebige Ganzzahl. + * @returns {Rng} + */ +export function createRng(seed) { + let state = seed >>> 0; + return function next() { + state = (state + 0x6d2b79f5) >>> 0; + let t = state; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +/** + * Ganzzahl im geschlossenen Intervall [min, max]. + * @param {Rng} rng + * @param {number} min + * @param {number} max + * @returns {number} + */ +export function randInt(rng, min, max) { + return min + Math.floor(rng() * (max - min + 1)); +} + +/** + * Gleitkommazahl im Intervall [min, max). + * @param {Rng} rng + * @param {number} min + * @param {number} max + * @returns {number} + */ +export function randFloat(rng, min, max) { + return min + rng() * (max - min); +} + +/** + * Zufälliges Element einer nicht-leeren Liste. + * @template T + * @param {Rng} rng + * @param {readonly T[]} items + * @returns {T} + */ +export function pick(rng, items) { + if (items.length === 0) { + throw new Error('pick() braucht mindestens ein Element'); + } + return items[Math.floor(rng() * items.length)]; +} + +/** + * Seed aus der aktuellen Zeit, für echte Spielrunden. + * @returns {number} + */ +export function timeSeed() { + return (Date.now() ^ Math.floor(Math.random() * 0xffffffff)) >>> 0; +} diff --git a/app/static/js/logic/scoring.js b/app/static/js/logic/scoring.js new file mode 100644 index 0000000..ce8188d --- /dev/null +++ b/app/static/js/logic/scoring.js @@ -0,0 +1,127 @@ +/** + * Punkte, Serien und Multiplikator (ohne Phaser). + * + * Regeln: Jeder Abschuss innerhalb von `streakWindowMs` nach dem letzten setzt die + * Serie fort. Alle `stepKills` Abschüsse steigt der Multiplikator um `stepValue` + * bis `maxMultiplier`. Ein Treffer am Präsidenten beendet die Serie – das belohnt + * sauberes Spielen statt blindem Draufhalten. + * @module logic/scoring + */ + +import { SCORING } from '../config.js'; + +/** + * Multiplikator für eine Serienlänge. + * @param {number} streak Anzahl Abschüsse in Folge (inkl. des aktuellen). + * @param {typeof SCORING} [cfg] + * @returns {number} + */ +export function multiplierForStreak(streak, cfg = SCORING) { + if (streak <= 0) return 1; + return Math.min(cfg.maxMultiplier, 1 + Math.floor(streak / cfg.stepKills) * cfg.stepValue); +} + +/** + * Bonus für eine überstandene Welle (ohne Multiplikator). + * @param {number} waveNumber + * @param {typeof SCORING} [cfg] + * @returns {number} + */ +export function waveBonus(waveNumber, cfg = SCORING) { + return waveNumber * cfg.waveBonusPerWave; +} + +/** + * Führt Punktestand, Serie und Statistik einer Spielrunde. + */ +export class ScoreKeeper { + /** @param {typeof SCORING} [cfg] */ + constructor(cfg = SCORING) { + this.cfg = cfg; + this.score = 0; + this.kills = 0; + this.streak = 0; + this.bestStreak = 0; + this.lastKillAt = -Infinity; + } + + /** + * Läuft die Serie zum Zeitpunkt `now` noch? + * @param {number} now Spielzeit in ms. + * @returns {boolean} + */ + isStreakActive(now) { + return this.streak > 0 && now - this.lastKillAt <= this.cfg.streakWindowMs; + } + + /** + * Aktueller Multiplikator (1, wenn die Serie abgelaufen ist). + * @param {number} now + * @returns {number} + */ + multiplierAt(now) { + return this.isStreakActive(now) ? multiplierForStreak(this.streak, this.cfg) : 1; + } + + /** + * Verbleibender Anteil des Serienfensters (1 = gerade getroffen, 0 = abgelaufen). + * @param {number} now + * @returns {number} + */ + streakTimeLeft(now) { + if (!this.isStreakActive(now)) return 0; + return 1 - (now - this.lastKillAt) / this.cfg.streakWindowMs; + } + + /** + * Verbucht einen Abschuss. + * @param {number} basePoints Punkte des Gegnertyps. + * @param {number} now Spielzeit in ms. + * @returns {{awarded: number, multiplier: number, streak: number}} + */ + registerKill(basePoints, now) { + if (!this.isStreakActive(now)) { + this.streak = 0; + } + this.streak += 1; + this.kills += 1; + this.bestStreak = Math.max(this.bestStreak, this.streak); + this.lastKillAt = now; + const multiplier = multiplierForStreak(this.streak, this.cfg); + const awarded = Math.round(basePoints * multiplier); + this.score += awarded; + return { awarded, multiplier, streak: this.streak }; + } + + /** Beendet die laufende Serie (z. B. wenn der Präsident getroffen wird). */ + breakStreak() { + this.streak = 0; + } + + /** + * Fügt Bonuspunkte ohne Multiplikator hinzu. + * @param {number} points + * @returns {number} Tatsächlich gutgeschriebene Punkte. + */ + addBonus(points) { + const awarded = Math.max(0, Math.round(points)); + this.score += awarded; + return awarded; + } + + /** + * Momentaufnahme für HUD und Game-Over-Bildschirm. + * @param {number} now + */ + snapshot(now) { + const active = this.isStreakActive(now); + return { + score: this.score, + kills: this.kills, + streak: active ? this.streak : 0, + multiplier: this.multiplierAt(now), + streakTimeLeft: this.streakTimeLeft(now), + bestStreak: this.bestStreak, + }; + } +} diff --git a/app/static/js/logic/steering.js b/app/static/js/logic/steering.js new file mode 100644 index 0000000..ca377e3 --- /dev/null +++ b/app/static/js/logic/steering.js @@ -0,0 +1,145 @@ +/** + * Steuerungsverhalten („Steering Behaviors“) für die Gegner-KI, ohne Phaser. + * + * Jede Funktion liefert eine Wunschgeschwindigkeit. Die Entities mischen mehrere + * davon (z. B. Verfolgen + Abstand zu Nachbarn) und begrenzen das Ergebnis auf ihr + * Tempo. Die drei Grundmuster aus dem Design: + * - Verfolgen → seek + * - Abstand → keepDistance (mit seitlichem Ausweichen im Wohlfühlbereich) + * - Flankieren → flankPoint / encirclePoint als Ziel für seek + * @module logic/steering + */ + +import { add, angleTo, clampLength, distance, fromAngle, length, normalize, scale, sub } from './math.js'; + +/** @typedef {import('./math.js').Vec2} Vec2 */ + +/** Anteil der Grundgeschwindigkeit beim seitlichen Ausweichen. */ +export const DEFAULT_STRAFE_FACTOR = 0.6; + +/** + * Direkt auf ein Ziel zu. + * @param {Vec2} position + * @param {Vec2} target + * @param {number} speed + * @returns {Vec2} + */ +export function seek(position, target, speed) { + return scale(normalize(sub(target, position)), speed); +} + +/** + * Direkt von einer Bedrohung weg. + * @param {Vec2} position + * @param {Vec2} threat + * @param {number} speed + * @returns {Vec2} + */ +export function flee(position, threat, speed) { + return scale(seek(position, threat, speed), -1); +} + +/** + * Abstoßung von Nachbarn, damit Gruppen nicht zu einem Klumpen verschmelzen. + * Nähere Nachbarn stoßen stärker ab (linear bis 0 am Rand des Radius). + * @param {Vec2} position + * @param {Iterable} neighbors Andere Gegner (der eigene Eintrag darf enthalten sein). + * @param {number} radius + * @returns {Vec2} Unskalierter Richtungsvektor (Länge ≈ Anzahl/Stärke der Überlappungen). + */ +export function separation(position, neighbors, radius) { + let push = { x: 0, y: 0 }; + for (const other of neighbors) { + if (other === position) continue; + const d = distance(position, other); + if (d >= radius) continue; + // Exakt übereinander: feste Richtung statt NaN, damit sich die beiden trennen. + const away = d > 0 ? normalize(sub(position, other)) : { x: 1, y: 0 }; + push = add(push, scale(away, 1 - d / radius)); + } + return push; +} + +/** + * Hält einen Abstand zwischen `band.min` und `band.max` zum Ziel ein. + * Zu weit weg → annähern, zu nah → zurückweichen, dazwischen → seitlich ausweichen, + * damit Fernkämpfer kein stehendes Ziel sind. + * @param {Vec2} position + * @param {Vec2} target + * @param {{min: number, max: number}} band + * @param {number} speed + * @param {1|-1} strafeDirection 1 = im Uhrzeigersinn, -1 = dagegen. + * @param {number} [strafeFactor] + * @returns {Vec2} + */ +export function keepDistance(position, target, band, speed, strafeDirection, strafeFactor = DEFAULT_STRAFE_FACTOR) { + const d = distance(position, target); + const toTarget = normalize(sub(target, position)); + if (d > band.max) return scale(toTarget, speed); + if (d < band.min) return scale(toTarget, -speed); + const tangent = { x: -toTarget.y * strafeDirection, y: toTarget.x * strafeDirection }; + return scale(tangent, speed * strafeFactor); +} + +/** + * Flankenposition: Punkt auf einem Kreis um das Ziel, gegenüber der aktuellen + * Blickachse Ziel→Gegner um `angleOffset` gedreht. Der Gegner läuft also nicht + * frontal an, sondern schwenkt seitlich ein. + * @param {Vec2} target + * @param {Vec2} position + * @param {number} angleOffset Bogenmaß; Vorzeichen bestimmt die Seite. + * @param {number} radius + * @returns {Vec2} + */ +export function flankPoint(target, position, angleOffset, radius) { + const baseAngle = angleTo(target, position); + return add(target, scale(fromAngle(baseAngle + angleOffset), radius)); +} + +/** + * Umzingelungspunkt: fester Winkel („Platz im Kreis“) um das Ziel. Verteilt man + * die Winkel auf einen Schwarm, greift er von allen Seiten an. + * @param {Vec2} target + * @param {number} slotAngle Bogenmaß. + * @param {number} radius + * @returns {Vec2} + */ +export function encirclePoint(target, slotAngle, radius) { + return add(target, scale(fromAngle(slotAngle), radius)); +} + +/** + * Gewichtete Summe mehrerer Steuerungsvektoren, begrenzt auf `maxSpeed`. + * @param {{vector: Vec2, weight: number}[]} parts + * @param {number} maxSpeed + * @returns {Vec2} + */ +export function combine(parts, maxSpeed) { + const sum = parts.reduce((acc, p) => add(acc, scale(p.vector, p.weight)), { x: 0, y: 0 }); + return clampLength(sum, maxSpeed); +} + +/** + * Nähert die aktuelle Geschwindigkeit der Wunschgeschwindigkeit an. Ohne diese + * Glättung würden Gegner bei jedem Richtungswechsel ruckartig umspringen. + * @param {Vec2} current + * @param {Vec2} desired + * @param {number} responsiveness 0..1 (1 = sofort). + * @returns {Vec2} + */ +export function steerTowards(current, desired, responsiveness) { + return { + x: current.x + (desired.x - current.x) * responsiveness, + y: current.y + (desired.y - current.y) * responsiveness, + }; +} + +/** + * Ist ein Vektor (fast) null? Nützlich für Animationen („steht still“). + * @param {Vec2} v + * @param {number} [epsilon] + * @returns {boolean} + */ +export function isNearlyZero(v, epsilon = 1e-3) { + return length(v) < epsilon; +} diff --git a/app/static/js/logic/waveDirector.js b/app/static/js/logic/waveDirector.js new file mode 100644 index 0000000..34b8e2e --- /dev/null +++ b/app/static/js/logic/waveDirector.js @@ -0,0 +1,111 @@ +/** + * Ablaufsteuerung der Wellen (ohne Phaser): Pause → Welle → Spawns → Welle geschafft. + * + * Der Director kennt keine Sprites. Er ruft `spawnGroup` auf, wenn eine Gruppe + * erscheinen soll, und fragt `aliveCount` ab, um zu erkennen, wann eine Welle + * geschafft ist. So lässt sich der gesamte Ablauf ohne Browser testen. + * @module logic/waveDirector + */ + +import { WAVES } from '../config.js'; +import { generateWave } from './waves.js'; + +/** @typedef {import('./waves.js').WavePlan} WavePlan */ +/** @typedef {import('./waves.js').SpawnGroup} SpawnGroup */ + +/** + * @typedef {Object} WaveDirectorOptions + * @property {import('./rng.js').Rng} rng + * @property {(group: SpawnGroup, plan: WavePlan) => void} spawnGroup + * @property {() => number} aliveCount + * @property {(plan: WavePlan) => void} [onWaveStart] + * @property {(waveNumber: number) => void} [onWaveCleared] + * @property {typeof WAVES} [cfg] + */ + +export class WaveDirector { + /** @param {WaveDirectorOptions} options */ + constructor(options) { + this.rng = options.rng; + this.spawnGroup = options.spawnGroup; + this.aliveCount = options.aliveCount; + this.onWaveStart = options.onWaveStart ?? (() => {}); + this.onWaveCleared = options.onWaveCleared ?? (() => {}); + this.cfg = options.cfg ?? WAVES; + + /** @type {'idle'|'intermission'|'active'} */ + this.state = 'idle'; + this.waveNumber = 0; + /** @type {WavePlan|null} */ + this.plan = null; + this.nextWaveAt = 0; + this.nextGroupIndex = 0; + /** + * Uhr der laufenden Welle. Sie steht still, solange zu viele Gegner leben – + * so stauen sich Spawns nicht auf, wenn der Spieler in Bedrängnis ist. + */ + this.waveClock = 0; + } + + /** + * Startet den Ablauf; die erste Welle folgt nach `firstWaveDelayMs`. + * @param {number} now Spielzeit in ms. + */ + start(now) { + this.state = 'intermission'; + this.waveNumber = 0; + this.nextWaveAt = now + this.cfg.firstWaveDelayMs; + } + + /** + * Muss jeden Frame aufgerufen werden. + * @param {number} now Spielzeit in ms. + * @param {number} deltaMs Seit dem letzten Aufruf vergangene Spielzeit. + */ + update(now, deltaMs) { + if (this.state === 'intermission' && now >= this.nextWaveAt) { + this.beginWave(); + return; + } + if (this.state !== 'active' || !this.plan) return; + + if (this.aliveCount() < this.cfg.maxAliveEnemies) { + this.waveClock += deltaMs; + } + const { groups } = this.plan; + while (this.nextGroupIndex < groups.length && groups[this.nextGroupIndex].atMs <= this.waveClock) { + this.spawnGroup(groups[this.nextGroupIndex], this.plan); + this.nextGroupIndex += 1; + } + if (this.nextGroupIndex >= groups.length && this.aliveCount() === 0) { + const cleared = this.waveNumber; + this.state = 'intermission'; + this.nextWaveAt = now + this.cfg.intermissionMs; + this.onWaveCleared(cleared); + } + } + + /** @private */ + beginWave() { + this.waveNumber += 1; + this.plan = generateWave(this.waveNumber, this.rng, this.cfg); + this.nextGroupIndex = 0; + this.waveClock = 0; + this.state = 'active'; + this.onWaveStart(this.plan); + } + + /** @returns {number} Gegner, die in dieser Welle noch erscheinen werden. */ + get pendingEnemies() { + if (this.state !== 'active' || !this.plan) return 0; + return this.plan.groups.slice(this.nextGroupIndex).reduce((sum, g) => sum + g.count, 0); + } + + /** + * @param {number} now + * @returns {number} Restzeit der Pause in ms (0 während einer Welle). + */ + intermissionRemaining(now) { + return this.state === 'intermission' ? Math.max(0, this.nextWaveAt - now) : 0; + } +} diff --git a/app/static/js/logic/waves.js b/app/static/js/logic/waves.js new file mode 100644 index 0000000..83c97c6 --- /dev/null +++ b/app/static/js/logic/waves.js @@ -0,0 +1,230 @@ +/** + * Wellengenerierung (ohne Phaser). + * + * Idee: Jede Welle hat ein Punktebudget, das mit der Wellennummer wächst. Gegner + * „kosten“ Budget (config ENEMY_TYPES.cost). Der Generator kauft zuerst Eliten + * (in jeder n-ten Welle), dann mittlere Gegner (Anteil steigt mit der Welle) und + * füllt den Rest mit kleinen Gegnern auf. So wird es gleichmäßig schwerer, ohne + * dass man jede Welle von Hand bauen muss. + * @module logic/waves + */ + +import { ENEMY_TYPES, WAVES } from '../config.js'; +import { pick, randFloat, randInt } from './rng.js'; + +/** @typedef {import('./rng.js').Rng} Rng */ +/** @typedef {'north'|'south'|'east'|'west'} Edge */ + +/** + * @typedef {Object} SpawnGroup + * @property {string} type Gegnertyp-ID aus ENEMY_TYPES. + * @property {number} count Anzahl Gegner in dieser Gruppe. + * @property {number} atMs Spawn-Zeitpunkt relativ zum Wellenstart. + * @property {Edge} edge Arenarand, an dem die Gruppe erscheint. + */ + +/** + * @typedef {Object} WavePlan + * @property {number} number + * @property {number} budget + * @property {string[]} factions + * @property {SpawnGroup[]} groups Nach atMs aufsteigend sortiert. + * @property {number} totalEnemies Summe aller Gruppen (ohne ausgebrütete Krabbler). + * @property {number} hpMultiplier + * @property {number} speedMultiplier + */ + +/** @type {readonly Edge[]} */ +export const EDGES = Object.freeze(['north', 'south', 'east', 'west']); + +/** Anteil des Budgets, der auch in Elite-Wellen für Fußvolk reserviert bleibt. */ +const MIN_FODDER_SHARE = 0.3; + +/** Position der Eliten im Spawn-Ablauf (0 = zuerst, 1 = zuletzt): nicht sofort, nicht am Ende. */ +const ELITE_TIMELINE_POSITION = 0.4; + +/** + * Budget der Welle `n`. + * @param {number} n Wellennummer ab 1. + * @param {typeof WAVES} [cfg] + * @returns {number} + */ +export function waveBudget(n, cfg = WAVES) { + return Math.round(cfg.firstBudget + cfg.budgetGrowth * Math.pow(n - 1, cfg.budgetExponent)); +} + +/** + * Welche Fraktionen in Welle `n` angreifen. + * @param {number} n + * @param {typeof WAVES} [cfg] + * @returns {string[]} + */ +export function waveFactions(n, cfg = WAVES) { + if (n < cfg.legionFromWave) return ['swarm']; + if (n < cfg.mixedFromWave) return ['legion']; + return ['swarm', 'legion']; +} + +/** + * Anzahl der Elite-Gegner in Welle `n`. + * @param {number} n + * @param {typeof WAVES} [cfg] + * @returns {number} + */ +export function eliteCount(n, cfg = WAVES) { + if (n % cfg.eliteEvery !== 0) return 0; + return Math.min(cfg.maxElitesPerWave, n / cfg.eliteEvery); +} + +/** + * Lebenspunkte- und Tempo-Multiplikatoren für späte Wellen. + * @param {number} n + * @param {typeof WAVES} [cfg] + * @returns {{hp: number, speed: number}} + */ +export function waveMultipliers(n, cfg = WAVES) { + const steps = Math.max(0, n - cfg.scalingFromWave + 1); + return { + hp: 1 + steps * cfg.hpScalePerWave, + speed: Math.min(cfg.speedScaleMax, 1 + steps * cfg.speedScalePerWave), + }; +} + +/** + * Alle Typ-IDs einer Fraktion und Stufe. + * @param {string} faction + * @param {'small'|'medium'|'elite'} tier + * @param {typeof ENEMY_TYPES} [types] + * @returns {string[]} + */ +export function typesOf(faction, tier, types = ENEMY_TYPES) { + return Object.values(types) + .filter((t) => t.faction === faction && t.tier === tier) + .map((t) => t.id); +} + +/** + * Kauft Gruppen einer Stufe, bis das Budget nicht mehr reicht. + * @returns {{groups: {type: string, count: number}[], leftover: number}} + */ +function buyGroups(rng, factions, tier, budget, types) { + const groups = []; + let remaining = budget; + for (;;) { + const affordable = factions + .flatMap((f) => typesOf(f, tier, types)) + .filter((id) => types[id].cost <= remaining); + if (affordable.length === 0) break; + const type = types[pick(rng, affordable)]; + const maxAffordable = Math.floor(remaining / type.cost); + const count = Math.min(randInt(rng, type.groupSize.min, type.groupSize.max), maxAffordable); + groups.push({ type: type.id, count }); + remaining -= count * type.cost; + } + return { groups, leftover: remaining }; +} + +/** + * Mischt eine Liste (Fisher-Yates) mit dem übergebenen Zufallsgenerator. + * @template T + * @param {Rng} rng + * @param {T[]} items + * @returns {T[]} + */ +function shuffled(rng, items) { + const copy = items.slice(); + for (let i = copy.length - 1; i > 0; i -= 1) { + const j = Math.floor(rng() * (i + 1)); + [copy[i], copy[j]] = [copy[j], copy[i]]; + } + return copy; +} + +/** + * Erzeugt den Plan für Welle `n`. + * @param {number} n Wellennummer ab 1. + * @param {Rng} rng Zufallsgenerator (für Tests mit festem Seed). + * @param {typeof WAVES} [cfg] + * @param {typeof ENEMY_TYPES} [types] + * @returns {WavePlan} + */ +export function generateWave(n, rng, cfg = WAVES, types = ENEMY_TYPES) { + if (!Number.isInteger(n) || n < 1) { + throw new RangeError(`Ungültige Wellennummer: ${n}`); + } + const budget = waveBudget(n, cfg); + const factions = waveFactions(n, cfg); + + // Eliten zuerst – sie sind der Höhepunkt der Welle. In gemischten Wellen wechselt + // die Fraktion der Eliten von Elite-Welle zu Elite-Welle (erste Elite-Welle: + // Schwärmer, weil die Wellen davor der Blechlegion gehörten). + const elites = []; + let remaining = budget; + const eliteRound = n / cfg.eliteEvery - 1; + for (let i = 0; i < eliteCount(n, cfg); i += 1) { + const faction = factions[(eliteRound + i) % factions.length]; + const eliteType = typesOf(faction, 'elite', types)[0]; + elites.push({ type: eliteType, count: 1 }); + remaining -= types[eliteType].cost; + } + // Auch neben Eliten braucht es Fußvolk, sonst wirkt die Welle leer. + remaining = Math.max(remaining, Math.ceil(budget * MIN_FODDER_SHARE)); + + const mediumShare = Math.min( + cfg.mediumShareMax, + cfg.mediumShareBase + cfg.mediumSharePerWave * (n - 1), + ); + const medium = buyGroups(rng, factions, 'medium', Math.floor(remaining * mediumShare), types); + const smallBudget = remaining - Math.floor(remaining * mediumShare) + medium.leftover; + const small = buyGroups(rng, factions, 'small', smallBudget, types); + + // Reihenfolge: Fußvolk gemischt, Eliten etwa bei 40 % des Ablaufs. + const ordered = shuffled(rng, [...small.groups, ...medium.groups]); + const eliteIndex = Math.floor(ordered.length * ELITE_TIMELINE_POSITION); + ordered.splice(eliteIndex, 0, ...elites); + + // Spätere Wellen kommen dichter hintereinander. + const delayFactor = Math.max(cfg.groupDelayMinFactor, 1 - cfg.groupDelayFactorPerWave * (n - 1)); + let atMs = 0; + const groups = ordered.map((group, index) => { + if (index > 0) { + atMs += Math.round(randFloat(rng, cfg.groupDelayMs.min, cfg.groupDelayMs.max) * delayFactor); + } + return { ...group, atMs, edge: pick(rng, EDGES) }; + }); + + const multipliers = waveMultipliers(n, cfg); + return { + number: n, + budget, + factions, + groups, + totalEnemies: groups.reduce((sum, g) => sum + g.count, 0), + hpMultiplier: multipliers.hp, + speedMultiplier: multipliers.speed, + }; +} + +/** + * Zufälliger Spawnpunkt am gegebenen Arenarand, knapp innerhalb der Welt. + * @param {Edge} edge + * @param {{width: number, height: number}} world + * @param {number} margin Abstand zum Rand. + * @param {Rng} rng + * @returns {{x: number, y: number}} + */ +export function spawnPointOnEdge(edge, world, margin, rng) { + const along = (size) => randFloat(rng, margin, size - margin); + switch (edge) { + case 'north': + return { x: along(world.width), y: margin }; + case 'south': + return { x: along(world.width), y: world.height - margin }; + case 'west': + return { x: margin, y: along(world.height) }; + case 'east': + return { x: world.width - margin, y: along(world.height) }; + default: + throw new RangeError(`Unbekannter Rand: ${edge}`); + } +} diff --git a/app/static/js/logic/weapon.js b/app/static/js/logic/weapon.js new file mode 100644 index 0000000..124ccd1 --- /dev/null +++ b/app/static/js/logic/weapon.js @@ -0,0 +1,146 @@ +/** + * Waffenzustand: Magazin, Reserve, Feuerrate, Nachladen (ohne Phaser). + * @module logic/weapon + */ + +import { degToRad } from './math.js'; + +/** + * @typedef {Object} WeaponDef + * @property {string} id + * @property {string} name + * @property {number} magazineSize + * @property {number|null} reserveStart null = unbegrenzt + * @property {number|null} reserveMax null = unbegrenzt + * @property {number} fireIntervalMs + * @property {number} reloadMs + * @property {number} damage + * @property {number} pellets + * @property {number} spreadDeg + * @property {number} bulletSpeed + * @property {number} rangePx + * @property {boolean} automatic + */ + +export class WeaponState { + /** @param {WeaponDef} def */ + constructor(def) { + this.def = def; + this.magazine = def.magazineSize; + /** @type {number} Bei unbegrenzter Reserve Infinity. */ + this.reserve = def.reserveStart === null ? Infinity : def.reserveStart; + /** Spielzeit, zu der das Nachladen fertig ist; 0 = lädt nicht nach. */ + this.reloadingUntil = 0; + this.reloadStartedAt = 0; + this.lastShotAt = -Infinity; + } + + /** @returns {boolean} */ + get hasInfiniteReserve() { + return this.def.reserveMax === null; + } + + /** @returns {boolean} Weder Magazin noch Reserve – Waffe ist leer. */ + get isEmpty() { + return this.magazine === 0 && this.reserve === 0; + } + + /** @returns {boolean} */ + get isReloading() { + return this.reloadingUntil > 0; + } + + /** + * Schließt ein fälliges Nachladen ab. Muss jeden Frame aufgerufen werden. + * @param {number} now + * @returns {boolean} true, wenn in diesem Aufruf fertig nachgeladen wurde. + */ + update(now) { + if (this.isReloading && now >= this.reloadingUntil) { + const needed = this.def.magazineSize - this.magazine; + const taken = Math.min(needed, this.reserve); + this.magazine += taken; + this.reserve -= taken; + this.reloadingUntil = 0; + return true; + } + return false; + } + + /** + * @param {number} now + * @returns {boolean} + */ + canFire(now) { + return !this.isReloading && this.magazine > 0 && now - this.lastShotAt >= this.def.fireIntervalMs; + } + + /** + * Feuert einen Schuss, falls möglich. + * @param {number} now + * @param {() => number} rng Zufall für die Streuung. + * @returns {number[]|null} Winkelabweichungen der Projektile (Bogenmaß) oder null. + */ + fire(now, rng) { + if (!this.canFire(now)) return null; + this.magazine -= 1; + this.lastShotAt = now; + const offsets = pelletOffsets(this.def.pellets, this.def.spreadDeg, rng); + // Leeres Magazin lädt automatisch nach – niemand will im Gefecht R suchen. + if (this.magazine === 0) this.startReload(now); + return offsets; + } + + /** + * Beginnt das Nachladen. + * @param {number} now + * @returns {boolean} false, wenn es nichts nachzuladen gibt. + */ + startReload(now) { + if (this.isReloading || this.magazine >= this.def.magazineSize || this.reserve <= 0) { + return false; + } + this.reloadStartedAt = now; + this.reloadingUntil = now + this.def.reloadMs; + return true; + } + + /** Bricht das Nachladen ab (z. B. beim Waffenwechsel); nichts wird verbraucht. */ + cancelReload() { + this.reloadingUntil = 0; + } + + /** + * @param {number} now + * @returns {number} 0..1, 1 wenn nicht nachgeladen wird. + */ + reloadProgress(now) { + if (!this.isReloading) return 1; + return Math.min(1, (now - this.reloadStartedAt) / this.def.reloadMs); + } + + /** Füllt die Reserve bis zum Maximum auf (Nachschubkapsel). */ + refill() { + if (!this.hasInfiniteReserve) { + this.reserve = /** @type {number} */ (this.def.reserveMax); + } + } +} + +/** + * Streuung der Projektile eines Schusses. Mehrere Projektile (Schrot) werden + * gleichmäßig über den Fächer verteilt und leicht verwackelt, damit sich das Muster + * nicht wiederholt; ein Einzelprojektil streut zufällig innerhalb des Fächers. + * @param {number} pellets + * @param {number} spreadDeg + * @param {() => number} rng + * @returns {number[]} + */ +export function pelletOffsets(pellets, spreadDeg, rng) { + const spread = degToRad(spreadDeg); + if (pellets <= 1) { + return [(rng() - 0.5) * spread]; + } + const step = spread / (pellets - 1); + return Array.from({ length: pellets }, (_, i) => -spread / 2 + i * step + (rng() - 0.5) * step * 0.5); +} diff --git a/app/static/js/main.js b/app/static/js/main.js new file mode 100644 index 0000000..9d706df --- /dev/null +++ b/app/static/js/main.js @@ -0,0 +1,110 @@ +/** + * Einstiegspunkt des Frontends: liest die Server-URLs aus dem HTML, baut die + * gemeinsamen Dienste (Einstellungen, Audio, API) und startet Phaser. + * @module main + */ + +import { GAME } from './config.js'; +import { ERRORS } from './content/texts.js'; +import { BootScene } from './scenes/BootScene.js'; +import { BriefingScene } from './scenes/BriefingScene.js'; +import { DisclaimerScene } from './scenes/DisclaimerScene.js'; +import { GameOverScene } from './scenes/GameOverScene.js'; +import { GameScene } from './scenes/GameScene.js'; +import { HudScene } from './scenes/HudScene.js'; +import { ControlsScene, CreditsScene, HighscoresScene } from './scenes/InfoScenes.js'; +import { MenuScene } from './scenes/MenuScene.js'; +import { PauseScene } from './scenes/PauseScene.js'; +import { ApiClient } from './systems/ApiClient.js'; +import { AudioManager } from './systems/AudioManager.js'; +import { SafeStorage, Settings } from './systems/Settings.js'; + + +/** @param {string} message */ +function showBootError(message) { + const target = document.getElementById('boot-message'); + if (target) { + target.textContent = message; + target.classList.add('boot-message--error'); + } +} + +/** + * Liest die vom Server gerenderten URLs (funktioniert auch unter einer Unter-URL). + * @param {HTMLElement} shell + */ +function readContext(shell) { + return { + staticBase: shell.dataset.staticBase ?? '/static/', + api: { + highscores: shell.dataset.apiHighscores ?? '/api/highscores', + runs: shell.dataset.apiRuns ?? '/api/runs', + }, + disclaimerUrl: shell.dataset.disclaimerUrl ?? '/disclaimer', + }; +} + +function start() { + const shell = document.getElementById('game-shell'); + if (!shell) return; + if (typeof window.Phaser === 'undefined') { + showBootError(ERRORS.phaserMissing); + return; + } + + const context = readContext(shell); + const settings = new Settings(SafeStorage.forBrowser()); + const services = { + settings, + audio: new AudioManager(settings, { staticBase: context.staticBase }), + api: new ApiClient(context.api), + }; + // Klangdateien schon jetzt als Bytes laden; dekodiert wird nach der ersten Interaktion. + services.audio.preload(); + + const game = new Phaser.Game({ + type: Phaser.AUTO, + parent: 'game', + width: GAME.width, + height: GAME.height, + backgroundColor: GAME.backgroundColor, + banner: false, + // Rechtsklick soll kein Browser-Kontextmenü über dem Spiel öffnen. + disableContextMenu: true, + scale: { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH }, + physics: { default: 'arcade', arcade: { debug: false } }, + // Ton übernimmt der eigene AudioManager (Kanäle, Synthesizer, Musik). Ohne diese + // Einstellung würde Phaser zusätzlich einen eigenen AudioContext anlegen. + audio: { noAudio: true }, + // Reihenfolge = Zeichenreihenfolge: HUD und Pause liegen über dem Spiel. + scene: [ + BootScene, + MenuScene, + DisclaimerScene, + BriefingScene, + GameScene, + HudScene, + PauseScene, + GameOverScene, + HighscoresScene, + ControlsScene, + CreditsScene, + ], + callbacks: { + preBoot: (g) => { + g.registry.set('context', context); + g.registry.set('services', services); + }, + }, + }); + + // Für End-to-End-Tests und Fehlersuche in der Browser-Konsole. + window.gloryDefense = game; +} + +try { + start(); +} catch (error) { + console.error(error); + showBootError(ERRORS.generic); +} diff --git a/app/static/js/scenes/BootScene.js b/app/static/js/scenes/BootScene.js new file mode 100644 index 0000000..899225f --- /dev/null +++ b/app/static/js/scenes/BootScene.js @@ -0,0 +1,47 @@ +/** + * Startszene: lädt Grafiken mit Fortschrittsbalken und erzeugt für alles, was nicht + * geladen werden konnte, Platzhalter. Danach geht es ins Hauptmenü. + * @module scenes/BootScene + */ + +import { COLORS } from '../config.js'; +import { queueAssets } from '../systems/Assets.js'; +import { createPlaceholderTextures } from '../systems/Placeholders.js'; + +const BAR = Object.freeze({ width: 420, height: 14 }); + +export class BootScene extends Phaser.Scene { + constructor() { + super('Boot'); + } + + preload() { + const { width, height } = this.scale; + const context = this.registry.get('context'); + /** @type {string[]} */ + this.failedAssets = []; + + const frame = this.add.graphics(); + frame.lineStyle(2, COLORS.gold, 1); + frame.strokeRect(width / 2 - BAR.width / 2 - 4, height / 2 - BAR.height / 2 - 4, BAR.width + 8, BAR.height + 8); + const bar = this.add.graphics(); + this.load.on('progress', (value) => { + bar.clear(); + bar.fillStyle(COLORS.crimson, 1); + bar.fillRect(width / 2 - BAR.width / 2, height / 2 - BAR.height / 2, BAR.width * value, BAR.height); + }); + // Fehlende Dateien sind kein Abbruchgrund – dafür gibt es Platzhalter. + this.load.on('loaderror', (file) => this.failedAssets.push(file.key)); + + queueAssets(this, context.staticBase); + } + + create() { + if (this.failedAssets.length > 0) { + console.warn(`Glory Defense: ${this.failedAssets.length} Grafik(en) nicht geladen, verwende Platzhalter:`, this.failedAssets); + } + createPlaceholderTextures(this); + document.getElementById('boot-message')?.remove(); + this.scene.start('Menu'); + } +} diff --git a/app/static/js/scenes/BriefingScene.js b/app/static/js/scenes/BriefingScene.js new file mode 100644 index 0000000..3980d1f --- /dev/null +++ b/app/static/js/scenes/BriefingScene.js @@ -0,0 +1,68 @@ +/** + * Missionsbriefing im Schreibmaschinenstil. Leertaste/Klick zeigt zuerst den ganzen + * Text, ein zweiter Druck startet den Einsatz. + * @module scenes/BriefingScene + */ + +import { BRIEFING_CONTINUE, BRIEFINGS, PRESIDENT } from '../content/texts.js'; +import { oncePerEvent } from '../systems/keyboard.js'; +import { textStyle, UI } from '../ui/theme.js'; + +/** Tippgeschwindigkeit der Schreibmaschine in Zeichen pro Sekunde. */ +const CHARS_PER_SECOND = 70; + +export class BriefingScene extends Phaser.Scene { + constructor() { + super('Briefing'); + } + + create() { + const { width, height } = this.scale; + this.input.setDefaultCursor('default'); + const briefing = BRIEFINGS[Math.floor(Math.random() * BRIEFINGS.length)]; + + const bg = this.add.graphics(); + bg.fillStyle(0x0d1321, 1); + bg.fillRect(0, 0, width, height); + bg.lineStyle(3, 0xf2c14e, 1); + bg.strokeRect(60, 50, width - 120, height - 100); + bg.fillStyle(0xc1121f, 1); + bg.fillRect(60, 50, width - 120, 64); + + this.add.text(width / 2, 82, briefing.title, textStyle({ fontSize: '26px', strokeThickness: 0 })).setOrigin(0.5); + this.add.text(96, 140, `AN: ${PRESIDENT.toUpperCase()}`, textStyle({ fontSize: '18px', color: UI.colors.gold })); + + this.fullText = briefing.lines.join('\n\n'); + this.bodyText = this.add.text(96, 185, '', { + ...textStyle({ fontSize: '21px', strokeThickness: 0 }), + fontFamily: 'Consolas, "Courier New", monospace', + wordWrap: { width: width - 192 }, + lineSpacing: 6, + }); + this.typed = 0; + + this.add.text(width / 2, height - 80, BRIEFING_CONTINUE, textStyle({ fontSize: '17px', color: UI.colors.muted })).setOrigin(0.5); + + const advance = oncePerEvent((event) => { + // Gedrückt gehaltene Tasten sollen das Briefing nicht versehentlich überspringen. + if (event?.repeat) return; + if (this.typed < this.fullText.length) { + this.typed = this.fullText.length; + this.bodyText.setText(this.fullText); + } else { + this.scene.start('Game'); + } + }); + this.input.on('pointerup', advance); + this.input.keyboard.on('keydown-SPACE', advance); + this.input.keyboard.on('keydown-ENTER', advance); + this.input.keyboard.on('keydown-ESC', oncePerEvent(() => this.scene.start('Menu'))); + this.input.keyboard.addCapture('SPACE'); + } + + update(_time, delta) { + if (this.typed >= this.fullText.length) return; + this.typed = Math.min(this.fullText.length, this.typed + (CHARS_PER_SECOND * delta) / 1000); + this.bodyText.setText(this.fullText.slice(0, Math.floor(this.typed))); + } +} diff --git a/app/static/js/scenes/DisclaimerScene.js b/app/static/js/scenes/DisclaimerScene.js new file mode 100644 index 0000000..bcbeb20 --- /dev/null +++ b/app/static/js/scenes/DisclaimerScene.js @@ -0,0 +1,56 @@ +/** + * Disclaimer als HTML-Overlay. Der Text kommt aus dem Template + * `_disclaimer_content.html` (einzige Quelle, auch für die Seite /disclaimer). + * Die Bestätigung wird in localStorage gespeichert. + * @module scenes/DisclaimerScene + */ + +import { DISCLAIMER } from '../content/texts.js'; +import { el, Overlay } from '../systems/Overlay.js'; + +export class DisclaimerScene extends Phaser.Scene { + constructor() { + super('Disclaimer'); + } + + /** @param {{mandatory?: boolean}} data */ + create(data) { + const services = this.registry.get('services'); + const context = this.registry.get('context'); + const mandatory = Boolean(data?.mandatory); + + const content = []; + const template = document.getElementById('disclaimer-content'); + if (template instanceof HTMLTemplateElement) { + content.push(template.content.cloneNode(true)); + } else { + content.push(el('p', '', DISCLAIMER.missingTemplate)); + } + const link = /** @type {HTMLAnchorElement} */ (el('a', '', DISCLAIMER.openPage)); + link.href = context.disclaimerUrl; + link.target = '_blank'; + link.rel = 'noopener'; + const linkLine = el('p'); + linkLine.append(link); + content.push(linkLine); + + const close = () => { + // Der Klick ist eine Nutzeraktion – guter Moment, um den Ton freizuschalten. + services.audio.unlock(); + services.audio.play('ui-confirm'); + services.settings.acceptDisclaimer(); + this.overlay.close(); + this.events.emit('disclaimer-closed'); + this.scene.stop(); + }; + + this.overlay = new Overlay({ + id: 'disclaimer-overlay', + content, + buttons: [{ label: mandatory ? DISCLAIMER.accept : DISCLAIMER.close, onClick: close, testId: 'disclaimer-accept' }], + // Beim ersten Start muss aktiv bestätigt werden; Esc schließt nur den erneuten Aufruf. + onEscape: mandatory ? undefined : close, + }); + this.events.once('shutdown', () => this.overlay?.element.isConnected && this.overlay.close()); + } +} diff --git a/app/static/js/scenes/GameOverScene.js b/app/static/js/scenes/GameOverScene.js new file mode 100644 index 0000000..fbd6d97 --- /dev/null +++ b/app/static/js/scenes/GameOverScene.js @@ -0,0 +1,185 @@ +/** + * Game Over: Statistik, Namenseingabe für die Ehrentafel und Top 10. + * Formular als HTML-Overlay (Texteingabe im Canvas wäre unzugänglich). + * @module scenes/GameOverScene + */ + +import { HIGHSCORE } from '../config.js'; +import { GAME_OVER, HIGHSCORES } from '../content/texts.js'; +import { formatDuration, formatScore, validateName } from '../logic/format.js'; +import { el, Overlay } from '../systems/Overlay.js'; + +/** + * @typedef {Object} RunStats + * @property {number} score + * @property {number} wave + * @property {number} kills + * @property {number} bestStreak + * @property {number} durationMs + * @property {string|null} runToken + */ + +export class GameOverScene extends Phaser.Scene { + constructor() { + super('GameOver'); + } + + /** @param {RunStats} stats */ + create(stats) { + this.stats = stats; + this.services = this.registry.get('services'); + const { width, height } = this.scale; + this.input.setDefaultCursor('default'); + // Sonst würde Phaser Tasten wie Leertaste oder WASD im Namensfeld abfangen. + this.input.keyboard.clearCaptures(); + this.input.keyboard.disableGlobalCapture(); + this.events.once('shutdown', () => { + this.overlay?.close(); + this.input.keyboard?.enableGlobalCapture(); + }); + + this.services.audio.stopMusic(); + this.services.audio.play('game-over'); + + const bg = this.add.graphics(); + bg.fillGradientStyle(0x2a0a10, 0x2a0a10, 0x0d1321, 0x0d1321, 1); + bg.fillRect(0, 0, width, height); + + this.showForm(); + } + + /** @returns {HTMLElement[]} Untertitel und Statistik. */ + summary() { + const s = this.stats; + const subtitle = GAME_OVER.subtitles[Math.floor(Math.random() * GAME_OVER.subtitles.length)]; + const list = el('dl', 'stats'); + const rows = [ + [GAME_OVER.stats.score, formatScore(s.score)], + [GAME_OVER.stats.wave, String(s.wave)], + [GAME_OVER.stats.kills, String(s.kills)], + [GAME_OVER.stats.bestStreak, String(s.bestStreak)], + [GAME_OVER.stats.duration, formatDuration(s.durationMs)], + ]; + for (const [label, value] of rows) { + const row = el('div', 'stats__row'); + row.append(el('dt', '', label), el('dd', '', value)); + list.append(row); + } + this.subtitle = this.subtitle ?? subtitle; + return [el('p', 'disclaimer__lead', this.subtitle), list]; + } + + endButtons() { + return [ + { label: GAME_OVER.retry, onClick: () => this.scene.start('Game'), testId: 'gameover-retry' }, + { label: GAME_OVER.menu, onClick: () => this.scene.start('Menu'), secondary: true, testId: 'gameover-menu' }, + ]; + } + + showForm() { + const content = this.summary(); + if (!this.stats.runToken || this.stats.score <= 0) { + if (!this.stats.runToken) content.push(el('p', 'field__error', GAME_OVER.noToken)); + this.openOverlay(content, this.endButtons()); + return; + } + + const form = /** @type {HTMLFormElement} */ (el('form', 'highscore-form')); + const field = el('label', 'field'); + const input = /** @type {HTMLInputElement} */ (el('input', 'field__input')); + input.type = 'text'; + input.name = 'name'; + input.maxLength = HIGHSCORE.nameMaxLength; + input.autocomplete = 'nickname'; + input.spellcheck = false; + input.required = true; + input.value = this.services.settings.getLastName(); + input.dataset.testid = 'highscore-name'; + const error = el('p', 'field__error'); + error.setAttribute('role', 'alert'); + field.append(el('span', 'field__label', GAME_OVER.nameLabel), input, el('span', 'field__hint', GAME_OVER.nameHint)); + form.append(field, error); + content.push(form); + + const submit = async () => { + const check = validateName(input.value); + if (!check.ok) { + error.textContent = check.error; + input.focus(); + return; + } + submitButton.disabled = true; + error.textContent = GAME_OVER.submitting; + const result = await this.services.api.submitHighscore({ + name: check.name, + score: this.stats.score, + wave: this.stats.wave, + durationS: Math.floor(this.stats.durationMs / 1000), + runToken: /** @type {string} */ (this.stats.runToken), + }); + if (!this.sys.isActive()) return; + if (result.ok) { + this.services.settings.setLastName(check.name); + this.showResults(GAME_OVER.saved(result.rank), result.highscores ?? [], result.rank); + return; + } + submitButton.disabled = false; + if (result.error === 'network') error.textContent = GAME_OVER.offline; + else error.textContent = result.fields?.name ?? result.message ?? GAME_OVER.offline; + }; + form.addEventListener('submit', (event) => { + event.preventDefault(); + submit(); + }); + + this.openOverlay(content, [ + { label: GAME_OVER.submit, onClick: () => submit(), testId: 'highscore-submit' }, + { label: GAME_OVER.skip, onClick: () => this.showResults('', null, null), secondary: true, testId: 'highscore-skip' }, + ]); + const submitButton = /** @type {HTMLButtonElement} */ (this.overlay.actions.firstElementChild); + input.select(); + } + + /** + * @param {string} message + * @param {import('../systems/ApiClient.js').HighscoreEntry[]|null} highscores null = neu laden + * @param {number|null} ownRank + */ + async showResults(message, highscores, ownRank) { + const content = this.summary(); + if (message) content.push(el('p', 'disclaimer__lead', message)); + const table = el('ol', 'highscore-list'); + content.push(table); + this.openOverlay(content, this.endButtons()); + + let entries = highscores; + if (!entries) { + table.append(el('li', '', HIGHSCORES.loading)); + const result = await this.services.api.fetchHighscores(); + if (!this.sys.isActive()) return; + entries = result.ok ? result.highscores : []; + table.textContent = ''; + if (!result.ok) table.append(el('li', '', HIGHSCORES.error)); + } + if (entries.length === 0 && table.childElementCount === 0) table.append(el('li', '', HIGHSCORES.empty)); + for (const entry of entries) { + const item = el('li', entry.rank === ownRank ? 'highscore-list__own' : ''); + item.append( + el('span', 'highscore-list__rank', `${entry.rank}.`), + el('span', 'highscore-list__name', entry.name), + el('span', 'highscore-list__score', formatScore(entry.score)), + el('span', 'highscore-list__wave', `W${entry.wave}`), + ); + table.append(item); + } + } + + /** + * @param {HTMLElement[]} content + * @param {import('../systems/Overlay.js').OverlayButton[]} buttons + */ + openOverlay(content, buttons) { + this.overlay?.close(); + this.overlay = new Overlay({ id: 'gameover-overlay', title: GAME_OVER.title, content, buttons }); + } +} diff --git a/app/static/js/scenes/GameScene.js b/app/static/js/scenes/GameScene.js new file mode 100644 index 0000000..32b63ca --- /dev/null +++ b/app/static/js/scenes/GameScene.js @@ -0,0 +1,664 @@ +/** + * Die eigentliche Spielszene: Arena, Präsident, Gegner, Projektile, Wellen und + * Orbital-Befehle. Das HUD läuft als eigene Szene darüber (HudScene) und liest + * seinen Zustand über `hudState()`. + * + * Zeitmessung: Alle Spielmechaniken verwenden `this.gameTime` (eigene Uhr, die nur + * läuft, während die Szene aktiv ist). So laufen Abklingzeiten in der Pause nicht + * weiter, und die gemeldete Spieldauer enthält keine Pausen. + * @module scenes/GameScene + */ + +import { COLORS, ENEMY_TYPES, FX, GAME, PLAYER, SCORING } from '../config.js'; +import { ORBITAL_TEXT, PLAYER_TEXT, PROPAGANDA, WAVE } from '../content/texts.js'; +import { SupplyPod, Turret } from '../entities/Deployables.js'; +import { Enemy } from '../entities/Enemy.js'; +import { Player } from '../entities/Player.js'; +import { ProjectilePool } from '../entities/ProjectilePool.js'; +import { clamp, directionFromKeys, distance, inCircle } from '../logic/math.js'; +import { createRng, randFloat, timeSeed } from '../logic/rng.js'; +import { ScoreKeeper, waveBonus } from '../logic/scoring.js'; +import { WaveDirector } from '../logic/waveDirector.js'; +import { spawnPointOnEdge } from '../logic/waves.js'; +import { formatMultiplier, formatSequence } from '../logic/format.js'; +import { buildArena } from '../systems/Arena.js'; +import { Effects } from '../systems/Effects.js'; +import { GroundMarker } from '../systems/GroundMarker.js'; +import { OrbitalSystem } from '../systems/OrbitalSystem.js'; +import { oncePerEvent } from '../systems/keyboard.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; + +/** Längere Frames (z. B. nach Tab-Wechsel) zählen nicht voll als Spielzeit. */ +const MAX_FRAME_MS = 100; +/** Streuung der Mitglieder einer Spawn-Gruppe um ihren Spawnpunkt. */ +const SPAWN_SPREAD = 70; +/** Kein Spawn näher als das am Präsidenten – sonst gäbe es unfaire Treffer aus dem Nichts. */ +const MIN_SPAWN_DISTANCE = 420; +/** Ein Klick kurz vor Ende der Feuerpause wird nachgeholt (fühlt sich reaktionsschneller an). */ +const CLICK_BUFFER_MS = 180; +const PLAYER_BULLET_POOL = 240; +const ENEMY_BULLET_POOL = 280; +const ENEMY_BULLET_RANGE = 950; +/** Reichweitenzuschlag für Geschützprojektile über den Zielradius hinaus. */ +const TURRET_BULLET_EXTRA_RANGE = 80; +const OPPOSITE_EDGE = Object.freeze({ north: 'south', south: 'north', east: 'west', west: 'east' }); +const FACTION_COLORS = Object.freeze({ swarm: COLORS.swarm, legion: COLORS.legion }); +const ORBITAL_COLORS = Object.freeze({ strike: COLORS.strike, supply: COLORS.supply, turret: COLORS.turret }); + +export class GameScene extends Phaser.Scene { + constructor() { + super('Game'); + } + + create() { + this.services = this.registry.get('services'); + this.rng = createRng(timeSeed()); + this.gameTime = 0; + this.isOver = false; + this.runToken = null; + this.lowAmmoHinted = false; + this.propagandaDeck = []; + this.firePressedAt = -Infinity; + this.services.api.startRun().then((token) => { + this.runToken = token; + }); + + this.createArena(); + this.player = new Player(this, GAME.world.width / 2, GAME.world.height / 2); + this.cameras.main.setBounds(0, 0, GAME.world.width, GAME.world.height); + this.cameras.main.startFollow(this.player, true, GAME.cameraLerp, GAME.cameraLerp); + + this.enemies = this.physics.add.group(); + this.pods = this.physics.add.group(); + /** @type {Turret[]} */ + this.turrets = []; + /** @type {{marker: GroundMarker, cfg: object}[]} */ + this.mortars = []; + this.playerBullets = new ProjectilePool(this, TEXTURE_KEYS.bulletPlayer, PLAYER_BULLET_POOL, GAME.depth.projectiles); + this.enemyBullets = new ProjectilePool(this, TEXTURE_KEYS.bulletEnemy, ENEMY_BULLET_POOL, GAME.depth.projectiles); + this.effects = new Effects(this); + this.score = new ScoreKeeper(); + this.healthBars = this.add.graphics().setDepth(GAME.depth.effects); + + this.enemyContext = { + player: this.player, + neighbors: [], + rng: this.rng, + fireBullet: (x, y, angle, speed, damage) => { + this.enemyBullets.fire(x, y, angle, speed, damage, ENEMY_BULLET_RANGE); + this.services.audio.play('enemy-shot'); + }, + spawnChildren: (mother, count) => this.spawnBrood(mother, count), + scheduleMortar: (x, y, cfg) => this.scheduleMortar(x, y, cfg), + }; + + this.setupInput(); + this.orbital = new OrbitalSystem(this, { + getPlayer: () => this.player, + getAimPoint: () => this.aimPoint(), + onImpact: (command, x, y) => this.onOrbitalImpact(command, x, y), + onFeedback: (kind, command, remainingMs) => this.onOrbitalFeedback(kind, command, remainingMs), + }); + this.waves = new WaveDirector({ + rng: this.rng, + spawnGroup: (group, plan) => this.spawnGroup(group, plan), + aliveCount: () => this.enemies.countActive(true), + onWaveStart: (plan) => this.onWaveStart(plan), + onWaveCleared: (n) => this.onWaveCleared(n), + }); + this.setupCollisions(); + this.waves.start(this.gameTime); + + this.scene.launch('Hud'); + this.input.setDefaultCursor('none'); + this.game.events.on('blur', this.autoPause, this); + this.events.once('shutdown', this.cleanup, this); + this.services.audio.startMusic(); + } + + // ------------------------------------------------------------------ Aufbau + + createArena() { + const { width, height } = GAME.world; + this.physics.world.setBounds(0, 0, width, height); + this.worldRect = new Phaser.Geom.Rectangle(0, 0, width, height); + buildArena(this, this.rng); + } + + setupInput() { + // Bewegung wird pro Frame abgefragt (gehaltene Tasten). Einmalige Aktionen laufen + // dagegen über keydown-Ereignisse: Phasers JustDown verliert Tastendrücke, die + // innerhalb eines Frames gedrückt UND losgelassen werden (schnelles Antippen). + this.keys = this.input.keyboard.addKeys('W,A,S,D,R,SPACE,ONE,TWO,THREE,ESC'); + /** @type {Set} Seit dem letzten Frame angeforderte Aktionen. */ + this.pendingActions = new Set(); + const bindings = { ESC: 'pause', SPACE: 'dodge', R: 'reload', ONE: 'slot-0', TWO: 'slot-1', THREE: 'slot-2' }; + for (const [key, action] of Object.entries(bindings)) { + this.input.keyboard.on( + `keydown-${key}`, + oncePerEvent((event) => { + if (!event.repeat) this.pendingActions.add(action); + }), + ); + } + this.input.on('pointerdown', (pointer) => { + this.services.audio.unlock(); + if (pointer.leftButtonDown()) this.firePressedAt = this.gameTime; + }); + this.input.on('wheel', (_pointer, _over, _dx, dy) => { + if (dy !== 0 && this.player.cycleWeapon(dy > 0 ? 1 : -1)) this.services.audio.play('switch'); + }); + } + + setupCollisions() { + this.physics.add.overlap(this.playerBullets.group, this.enemies, (a, b) => { + const [bullet, enemy] = a instanceof Enemy ? [b, a] : [a, b]; + this.onBulletHitEnemy(bullet, enemy); + }); + this.physics.add.overlap( + this.player, + this.enemyBullets.group, + (a, b) => this.onEnemyBulletHitPlayer(a === this.player ? b : a), + // Während der Rolle fliegen Projektile hindurch, statt verschluckt zu werden. + () => !this.player.isDodging(this.gameTime), + ); + this.physics.add.overlap(this.player, this.enemies, (a, b) => this.onEnemyContact(a === this.player ? b : a)); + this.physics.add.overlap(this.player, this.pods, (a, b) => this.onPickup(a === this.player ? b : a)); + } + + // ------------------------------------------------------------------ Hauptschleife + + update(_time, delta) { + const dt = Math.min(delta, MAX_FRAME_MS); + this.gameTime += dt; + const now = this.gameTime; + + if (this.isOver) { + this.player.move(now, { x: 0, y: 0 }, true); + this.updateEnemies(now); + this.updateProjectiles(); + return; + } + if (this.pendingActions.has('pause')) { + this.pendingActions.clear(); + this.openPause(); + return; + } + + this.orbital.update(now); + this.updatePlayer(now); + this.updateEnemies(now); + this.updateDeployables(now); + this.updateMortars(now); + this.updateProjectiles(); + this.waves.update(now, dt); + this.drawHealthBars(); + } + + updatePlayer(now) { + const { keys, player } = this; + const comboActive = this.orbital.isInputActive; + // Während der Befehlseingabe dienen WASD als Richtungstasten, nicht zum Laufen. + const move = comboActive + ? { x: 0, y: 0 } + : directionFromKeys({ up: keys.W.isDown, down: keys.S.isDown, left: keys.A.isDown, right: keys.D.isDown }); + + const actions = this.pendingActions; + if (!comboActive && actions.has('dodge') && player.tryDodge(now, move)) { + this.services.audio.play('dodge'); + this.effects.afterimage(player); + this.effects.burst(player.x, player.y, COLORS.muted, 8); + } + player.move(now, move, comboActive); + const aim = this.aimPoint(); + player.aimAt(aim.x, aim.y); + + player.weapons.forEach((_weapon, index) => { + if (actions.has(`slot-${index}`) && player.switchWeapon(index)) this.services.audio.play('switch'); + }); + if (actions.has('reload') && player.weapon.startReload(now)) { + this.services.audio.play('reload'); + } + actions.clear(); + if (player.updateWeapons(now)) this.services.audio.play('reload-done'); + this.handleFiring(now); + } + + handleFiring(now) { + const { player } = this; + const weapon = player.weapon; + const def = weapon.def; + const held = this.input.activePointer.leftButtonDown(); + const clicked = now - this.firePressedAt <= CLICK_BUFFER_MS; + if (!(def.automatic ? held || clicked : clicked)) return; + + if (weapon.isEmpty) { + // Waffe leer: automatisch zur Dienstpistole mit unbegrenzter Munition wechseln. + const fallback = player.weapons.findIndex((w) => w.hasInfiniteReserve); + if (fallback >= 0 && player.switchWeapon(fallback)) this.feedback(PLAYER_TEXT.outOfAmmo, 'warn'); + this.firePressedAt = -Infinity; + return; + } + if (weapon.magazine === 0 && weapon.startReload(now)) this.services.audio.play('reload'); + + const offsets = weapon.fire(now, this.rng); + if (!offsets) return; + this.firePressedAt = -Infinity; + const muzzle = player.muzzlePosition(); + for (const offset of offsets) { + this.playerBullets.fire(muzzle.x, muzzle.y, player.aimAngle + offset, def.bulletSpeed, def.damage, def.rangePx); + } + this.effects.muzzle(muzzle.x, muzzle.y, player.aimAngle); + this.services.audio.play(`shot-${def.id}`); + if (weapon.isReloading && weapon.reserve > 0) this.services.audio.play('reload'); + + if (!weapon.hasInfiniteReserve && weapon.reserve === 0 && !this.lowAmmoHinted) { + this.lowAmmoHinted = true; + const supply = this.orbital.commands.find((c) => c.id === 'supply'); + this.feedback(PLAYER_TEXT.lowAmmo(supply ? formatSequence(supply.sequence) : ''), 'warn'); + } + } + + updateEnemies(now) { + const list = this.enemies.getChildren().slice(); + const ctx = this.enemyContext; + ctx.neighbors = list; + for (const enemy of list) { + if (enemy.alive) enemy.step(now, ctx); + } + } + + updateDeployables(now) { + const alive = this.enemies.getChildren().filter((e) => e.alive); + for (let i = this.turrets.length - 1; i >= 0; i -= 1) { + const turret = this.turrets[i]; + const running = turret.step(now, alive, (x, y, angle) => { + this.playerBullets.fire( + x, + y, + angle, + turret.cfg.bulletSpeed, + turret.cfg.bulletDamage, + turret.cfg.range + TURRET_BULLET_EXTRA_RANGE, + TEXTURE_KEYS.bulletTurret, + ); + this.effects.muzzle(x, y, angle, COLORS.turretBullet); + this.services.audio.play('turret-shot'); + }); + if (!running) { + this.effects.burst(turret.x, turret.y, COLORS.turret, 14); + turret.destroy(); + this.turrets.splice(i, 1); + } + } + for (const pod of this.pods.getChildren().slice()) { + if (!pod.tick(now)) pod.destroy(); + } + } + + updateMortars(now) { + for (let i = this.mortars.length - 1; i >= 0; i -= 1) { + const { marker, cfg } = this.mortars[i]; + if (!marker.isDue(now)) { + marker.update(now); + continue; + } + marker.destroy(); + this.mortars.splice(i, 1); + this.effects.explosion(marker.x, marker.y, cfg.radius, COLORS.mortar); + this.services.audio.play('explosion-small'); + if (inCircle(this.player, marker, cfg.radius, PLAYER.radius)) this.damagePlayer(cfg.damage); + } + } + + updateProjectiles() { + this.playerBullets.update(this.worldRect); + this.enemyBullets.update(this.worldRect); + } + + drawHealthBars() { + const g = this.healthBars; + g.clear(); + for (const enemy of this.enemies.getChildren()) { + if (!enemy.alive || (enemy.hp >= enemy.maxHp && !enemy.isElite)) continue; + const width = enemy.isElite ? 72 : 30; + const height = enemy.isElite ? 7 : 4; + const x = enemy.x - width / 2; + const y = enemy.y - enemy.type.radius - 12; + g.fillStyle(0x000000, 0.6); + g.fillRect(x - 1, y - 1, width + 2, height + 2); + g.fillStyle(enemy.isElite ? COLORS.gold : COLORS.hpBarLow, 1); + g.fillRect(x, y, (width * enemy.hp) / enemy.maxHp, height); + } + } + + /** @returns {{x: number, y: number}} Mausposition in Weltkoordinaten. */ + aimPoint() { + const point = this.input.activePointer.positionToCamera(this.cameras.main); + return { x: point.x, y: point.y }; + } + + // ------------------------------------------------------------------ Gegner + + spawnGroup(group, plan) { + let point = spawnPointOnEdge(group.edge, GAME.world, GAME.spawnMargin, this.rng); + if (distance(point, this.player) < MIN_SPAWN_DISTANCE) { + point = spawnPointOnEdge(OPPOSITE_EDGE[group.edge], GAME.world, GAME.spawnMargin, this.rng); + } + const margin = GAME.spawnMargin; + for (let i = 0; i < group.count; i += 1) { + const x = clamp(point.x + randFloat(this.rng, -SPAWN_SPREAD, SPAWN_SPREAD), margin, GAME.world.width - margin); + const y = clamp(point.y + randFloat(this.rng, -SPAWN_SPREAD, SPAWN_SPREAD), margin, GAME.world.height - margin); + this.spawnEnemy(group.type, x, y, { hpMultiplier: plan.hpMultiplier, speedMultiplier: plan.speedMultiplier }); + } + const type = ENEMY_TYPES[group.type]; + if (type.tier === 'elite') { + this.announce(WAVE.elite[type.id] ?? type.name, '', 'elite'); + this.services.audio.play('alarm'); + } + } + + /** + * @param {string} typeId + * @param {number} x + * @param {number} y + * @param {{hpMultiplier?: number, speedMultiplier?: number, parent?: Enemy}} [options] + * @returns {Enemy} + */ + spawnEnemy(typeId, x, y, options = {}) { + const enemy = new Enemy(this, x, y, typeId, { now: this.gameTime, rng: this.rng, ...options }); + this.enemies.add(enemy); + enemy.initBody(); + enemy.setAlpha(0); + this.tweens.add({ targets: enemy, alpha: 1, duration: 250 }); + return enemy; + } + + spawnBrood(mother, count) { + const childType = mother.type.brood.childType; + for (let i = 0; i < count; i += 1) { + const angle = this.rng() * Math.PI * 2; + const reach = mother.type.radius + ENEMY_TYPES[childType].radius; + const child = this.spawnEnemy(childType, mother.x + Math.cos(angle) * reach, mother.y + Math.sin(angle) * reach, { + hpMultiplier: mother.multipliers.hp, + speedMultiplier: mother.multipliers.speed, + parent: mother, + }); + child.setAlpha(1); + mother.childCount += 1; + } + this.effects.burst(mother.x, mother.y, COLORS.swarm, 10); + this.services.audio.play('brood'); + } + + scheduleMortar(x, y, cfg) { + const now = this.gameTime; + this.mortars.push({ marker: new GroundMarker(this, x, y, cfg.radius, COLORS.mortar, now, now + cfg.delayMs), cfg }); + this.services.audio.play('mortar'); + } + + /** + * @param {Enemy} enemy + * @param {number} amount + * @param {number} hitX + * @param {number} hitY + */ + damageEnemy(enemy, amount, hitX, hitY) { + if (!enemy.alive) return; + const killed = enemy.takeDamage(amount); + this.effects.flash(enemy); + this.effects.burst(hitX, hitY, FACTION_COLORS[enemy.type.faction], 4); + this.services.audio.play(enemy.type.faction === 'legion' ? 'hit-metal' : 'hit-flesh'); + if (killed) this.killEnemy(enemy); + } + + /** @param {Enemy} enemy */ + killEnemy(enemy) { + const now = this.gameTime; + const previousMultiplier = this.score.multiplierAt(now); + const result = this.score.registerKill(enemy.type.points, now); + const label = result.multiplier > 1 ? `+${result.awarded} ${formatMultiplier(result.multiplier)}` : `+${result.awarded}`; + this.effects.floatingText(enemy.x, enemy.y - enemy.type.radius, label); + if (result.multiplier > previousMultiplier) { + // Neue Multiplikatorstufe deutlich am Präsidenten melden – Belohnung soll man sehen. + this.effects.floatingText(this.player.x, this.player.y - 48, `SERIE ${formatMultiplier(result.multiplier)}`, '#ffe28a', 26); + } + this.effects.burst(enemy.x, enemy.y, FACTION_COLORS[enemy.type.faction], enemy.isElite ? 40 : 12); + if (enemy.isElite) this.effects.explosion(enemy.x, enemy.y, enemy.type.radius * 3, COLORS.gold); + if (enemy.parentEnemy) enemy.parentEnemy.childCount = Math.max(0, enemy.parentEnemy.childCount - 1); + this.services.audio.play(enemy.type.faction === 'legion' ? 'death-legion' : 'death-swarm'); + + // Körper sofort deaktivieren (zählt nicht mehr als lebend, keine Kollisionen), + // die Grafik aber kurz ausblenden statt sie hart verschwinden zu lassen. + enemy.disableBody(true, false); + this.tweens.add({ + targets: enemy, + alpha: 0, + scale: 0.4, + duration: 220, + onComplete: () => enemy.destroy(), + }); + } + + // ------------------------------------------------------------------ Kollisionen + + onBulletHitEnemy(bullet, enemy) { + if (!bullet.active || !enemy.alive) return; + this.playerBullets.kill(bullet); + this.damageEnemy(enemy, bullet.damage, bullet.x, bullet.y); + } + + onEnemyBulletHitPlayer(bullet) { + if (!bullet.active || this.isOver) return; + this.enemyBullets.kill(bullet); + this.damagePlayer(bullet.damage); + } + + /** @param {Enemy} enemy */ + onEnemyContact(enemy) { + const now = this.gameTime; + if (!enemy.alive || this.isOver || this.player.isDodging(now)) return; + if (now - enemy.lastContactAt < enemy.type.contactCooldownMs) return; + enemy.lastContactAt = now; + this.damagePlayer(enemy.type.contactDamage); + } + + /** @param {SupplyPod} pod */ + onPickup(pod) { + if (pod.collected || this.isOver) return; + pod.collected = true; + this.player.heal(pod.cfg.heal); + this.player.refillAmmo(); + this.lowAmmoHinted = false; + this.feedback(ORBITAL_TEXT.supplyPickup(pod.cfg.heal), 'ok'); + this.effects.burst(pod.x, pod.y, COLORS.supply, 20); + this.services.audio.play('pickup'); + pod.destroy(); + } + + /** + * @param {number} amount + * @returns {number} Tatsächlich erlittener Schaden. + */ + damagePlayer(amount) { + const dealt = this.player.takeDamage(amount, this.gameTime); + if (dealt <= 0) return 0; + this.effects.flash(this.player); + this.effects.shake('hit'); + this.services.audio.play('player-hit'); + if (SCORING.damageBreaksStreak) this.score.breakStreak(); + this.events.emit('player-damaged', dealt); + if (!this.player.alive) this.onPlayerDeath(); + return dealt; + } + + // ------------------------------------------------------------------ Orbital-Befehle + + onOrbitalFeedback(kind, command, remainingMs) { + const audio = this.services.audio; + if (kind === 'step') audio.play('combo-step'); + else if (kind === 'fail') { + audio.play('combo-fail'); + this.feedback(ORBITAL_TEXT.invalid, 'warn'); + } else if (kind === 'notReady') { + audio.play('combo-fail'); + this.feedback(ORBITAL_TEXT.notReady(command.shortName, Math.ceil(remainingMs / 1000)), 'warn'); + } else if (kind === 'deploy') { + audio.play('orbital-call'); + this.feedback(ORBITAL_TEXT.requested(command.shortName), 'ok'); + } + } + + onOrbitalImpact(command, x, y) { + const center = { x, y }; + this.effects.explosion(x, y, command.radius, ORBITAL_COLORS[command.id] ?? COLORS.gold); + this.services.audio.play(command.id === 'strike' ? 'explosion-big' : 'explosion-small'); + + for (const enemy of this.enemies.getChildren().slice()) { + if (enemy.alive && inCircle(enemy, center, command.radius, enemy.type.radius)) { + this.damageEnemy(enemy, command.damage, enemy.x, enemy.y); + } + } + if (command.playerDamage > 0 && inCircle(this.player, center, command.radius, PLAYER.radius)) { + if (this.damagePlayer(command.playerDamage) > 0 && command.id === 'strike') { + this.feedback(ORBITAL_TEXT.selfHit, 'warn'); + } + } + if (command.id === 'supply' && !this.isOver) { + const pod = new SupplyPod(this, x, y, command, this.gameTime); + this.pods.add(pod); + pod.initBody(); + } + if (command.id === 'turret' && !this.isOver) { + this.turrets.push(new Turret(this, x, y, command, this.gameTime)); + this.feedback(ORBITAL_TEXT.turretOnline, 'ok'); + } + } + + // ------------------------------------------------------------------ Wellen + + onWaveStart(plan) { + const factionKey = plan.factions.length > 1 ? 'mixed' : plan.factions[0]; + this.announce(WAVE.incoming(plan.number), WAVE.factionLine[factionKey], 'wave'); + this.services.audio.play('wave-start'); + } + + onWaveCleared(waveNumber) { + const bonus = this.score.addBonus(waveBonus(waveNumber)); + const healed = this.player.heal(PLAYER.waveClearHeal); + const lines = [WAVE.bonus(bonus)]; + if (healed > 0) lines.push(WAVE.heal(healed)); + lines.push(`„${this.nextPropaganda()}“`); + this.announce(WAVE.cleared(waveNumber), lines.join('\n'), 'cleared'); + this.services.audio.play('wave-cleared'); + } + + /** Propaganda ohne direkte Wiederholung: Stapel mischen und nacheinander ziehen. */ + nextPropaganda() { + if (this.propagandaDeck.length === 0) { + this.propagandaDeck = PROPAGANDA.slice(); + for (let i = this.propagandaDeck.length - 1; i > 0; i -= 1) { + const j = Math.floor(this.rng() * (i + 1)); + [this.propagandaDeck[i], this.propagandaDeck[j]] = [this.propagandaDeck[j], this.propagandaDeck[i]]; + } + } + return this.propagandaDeck.pop(); + } + + // ------------------------------------------------------------------ Meldungen + + /** + * Große Einblendung im HUD. + * @param {string} title + * @param {string} subtitle + * @param {'wave'|'cleared'|'elite'} kind + */ + announce(title, subtitle, kind) { + this.events.emit('announce', { title, subtitle, kind }); + } + + /** + * Kurze Statuszeile im HUD. + * @param {string} text + * @param {'ok'|'warn'} tone + */ + feedback(text, tone) { + this.events.emit('feedback', { text, tone }); + } + + // ------------------------------------------------------------------ Pause und Ende + + openPause() { + if (this.isOver || !this.scene.isActive()) return; + this.scene.pause(); + this.scene.launch('Pause'); + } + + autoPause() { + // Fenster verliert den Fokus: lieber pausieren, als den Präsidenten allein zu lassen. + if (this.scene.isActive() && !this.isOver) this.openPause(); + } + + onPlayerDeath() { + if (this.isOver) return; + this.isOver = true; + this.services.audio.play('player-death'); + this.services.audio.stopMusic(); + this.effects.explosion(this.player.x, this.player.y, 120, COLORS.crimson); + this.player.setTint(0x555555); + this.tweens.add({ targets: this.player, alpha: 0.3, duration: FX.deathDelayMs }); + this.time.delayedCall(FX.deathDelayMs, () => this.finish()); + } + + finish() { + const snapshot = this.score.snapshot(this.gameTime); + const stats = { + score: snapshot.score, + wave: Math.max(1, this.waves.waveNumber), + kills: snapshot.kills, + bestStreak: snapshot.bestStreak, + durationMs: this.gameTime, + runToken: this.runToken, + }; + this.scene.stop('Hud'); + this.scene.start('GameOver', stats); + } + + cleanup() { + this.orbital?.destroy(); + this.game.events.off('blur', this.autoPause, this); + this.input.setDefaultCursor('default'); + this.services.audio.stopMusic(); + } + + // ------------------------------------------------------------------ HUD-Daten + + /** Zustand für das HUD (wird jeden Frame von HudScene gelesen). */ + hudState() { + const now = this.gameTime; + const { player } = this; + const weapon = player.weapon; + return { + hp: player.hp, + maxHp: player.maxHp, + dodge: player.dodgeReadiness(now), + weaponIndex: player.weaponIndex, + weapons: player.weapons.map((w) => ({ name: w.def.shortName, empty: w.isEmpty })), + weaponName: weapon.def.name, + magazine: weapon.magazine, + magazineSize: weapon.def.magazineSize, + reserve: weapon.reserve, + reloading: weapon.isReloading, + reloadProgress: weapon.reloadProgress(now), + score: this.score.snapshot(now), + wave: { + number: this.waves.waveNumber, + state: this.waves.state, + enemies: this.waves.pendingEnemies + this.enemies.countActive(true), + nextInMs: this.waves.intermissionRemaining(now), + }, + orbital: this.orbital.hudState(now), + over: this.isOver, + }; + } +} diff --git a/app/static/js/scenes/HudScene.js b/app/static/js/scenes/HudScene.js new file mode 100644 index 0000000..bc6278e --- /dev/null +++ b/app/static/js/scenes/HudScene.js @@ -0,0 +1,292 @@ +/** + * HUD über der Spielszene: Leben, Munition, Welle, Punkte, Serie, Rolle, + * Orbital-Befehle mit Abklingzeiten, Einblendungen und Fadenkreuz. + * + * Läuft als eigene Szene, damit das HUD nicht mit der Kamera mitscrollt und nicht + * vom Bildschirmwackeln betroffen ist. Texte werden nur bei Änderungen neu gesetzt + * (setText rendert intern eine Textur neu und ist vergleichsweise teuer). + * @module scenes/HudScene + */ + +import { COLORS, DIRECTION_SYMBOLS, FX, ORBITAL, PLAYER, WEAPONS } from '../config.js'; +import { ORBITAL_TEXT, PRESIDENT, WAVE } from '../content/texts.js'; +import { formatCooldown, formatMultiplier, formatScore } from '../logic/format.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; +import { textStyle, UI, uiStyle } from '../ui/theme.js'; + +const MARGIN = 24; +const HP_BAR = Object.freeze({ width: 280, height: 18 }); +const DODGE_BAR = Object.freeze({ width: 120, height: 6 }); +const RELOAD_BAR = Object.freeze({ width: 220, height: 6 }); +const STREAK_BAR = Object.freeze({ width: 140, height: 5 }); +const ORBITAL_PANEL = Object.freeze({ width: 350, rowHeight: 34, arrowsX: 150 }); +const SLOT_GAP = 22; +/** Ab diesem Anteil Leben wird der Balken rot und der Bildschirmrand pulsiert. */ +const LOW_HP_RATIO = 0.3; +const LOW_HP_BORDER = 16; +const LOW_HP_PULSE_MS = 140; +/** Randpfeile für Gegner außerhalb des Bildes. */ +const INDICATOR = Object.freeze({ edge: 22, size: 9, eliteSize: 14, max: 30 }); +const FEEDBACK_MS = 2200; + +export class HudScene extends Phaser.Scene { + constructor() { + super('Hud'); + } + + create() { + this.gameScene = this.scene.get('Game'); + const { width, height } = this.scale; + /** Letzter gesetzter Text je Textobjekt (nicht `this.cache` – das ist Phasers Cache). */ + this.textCache = new Map(); + this.colorCache = new Map(); + this.g = this.add.graphics(); + + // Oben links: Leben und Rolle + this.add.text(MARGIN, 14, PRESIDENT.toUpperCase(), uiStyle({ fontSize: '15px', color: UI.colors.gold })); + this.hpText = this.add.text(MARGIN + HP_BAR.width + 12, 34, '', uiStyle({ fontSize: '17px' })); + this.add.text(MARGIN, 64, 'ROLLE', uiStyle({ fontSize: '13px', color: UI.colors.muted })); + + // Oben Mitte: Welle + this.waveTitle = this.add.text(width / 2, 12, '', textStyle({ fontSize: '28px', color: UI.colors.gold })).setOrigin(0.5, 0); + this.waveInfo = this.add.text(width / 2, 48, '', uiStyle({ fontSize: '18px' })).setOrigin(0.5, 0); + + // Oben rechts: Punkte und Multiplikator + this.scoreText = this.add.text(width - MARGIN, 10, '', textStyle({ fontSize: '32px' })).setOrigin(1, 0); + this.multText = this.add.text(width - MARGIN, 50, '', uiStyle({ fontSize: '20px', color: UI.colors.gold })).setOrigin(1, 0); + + // Unten links: Waffe + // Waffennamen stehen fest – einmal setzen und nach tatsächlicher Breite anordnen. + let slotX = MARGIN; + this.slotTexts = PLAYER.weaponSlots.map((id, i) => { + const slot = this.add.text(slotX, height - 132, `${i + 1} ${WEAPONS[id].shortName}`, uiStyle({ fontSize: '15px' })); + slotX += slot.width + SLOT_GAP; + return slot; + }); + this.weaponName = this.add.text(MARGIN, height - 106, '', uiStyle({ fontSize: '18px', color: UI.colors.gold })); + this.ammoText = this.add.text(MARGIN, height - 80, '', uiStyle({ fontSize: '34px' })); + + // Unten rechts: Orbital-Befehle + const panelX = width - MARGIN - ORBITAL_PANEL.width; + const panelTop = height - MARGIN - ORBITAL.commands.length * ORBITAL_PANEL.rowHeight - 34; + this.orbitalPanel = { x: panelX, y: panelTop }; + this.orbitalTitle = this.add.text(panelX + 10, panelTop + 7, ORBITAL_TEXT.panelTitle, uiStyle({ fontSize: '15px', color: UI.colors.gold })); + this.orbitalRows = ORBITAL.commands.map((command, i) => { + const y = panelTop + 34 + i * ORBITAL_PANEL.rowHeight; + return { + name: this.add.text(panelX + 10, y + 1, command.shortName, uiStyle({ fontSize: '15px' })), + arrows: command.sequence.map((dir, j) => + // Pfeile aus einer Symbolschrift, damit sie überall gleich breit und gut erkennbar sind. + this.add.text(panelX + ORBITAL_PANEL.arrowsX + j * 24, y - 3, DIRECTION_SYMBOLS[dir], textStyle({ fontSize: '19px', fontFamily: UI.symbolFont })), + ), + cooldown: this.add.text(panelX + ORBITAL_PANEL.width - 10, y, '', uiStyle({ fontSize: '16px', color: UI.colors.muted })).setOrigin(1, 0), + y, + }; + }); + + // Einblendungen + this.bannerTitle = this.add.text(width / 2, 150, '', textStyle({ fontSize: '46px', color: UI.colors.gold, strokeThickness: 8 })).setOrigin(0.5).setAlpha(0); + this.bannerSubtitle = this.add + .text(width / 2, 186, '', { ...uiStyle({ fontSize: '22px', align: 'center' }), wordWrap: { width: 900 } }) + .setOrigin(0.5, 0) + .setAlpha(0); + this.feedbackText = this.add.text(width / 2, height - 170, '', uiStyle({ fontSize: '20px' })).setOrigin(0.5).setAlpha(0); + + this.vignette = this.add.rectangle(0, 0, width, height, COLORS.crimson, 0).setOrigin(0); + this.crosshair = this.add.image(0, 0, TEXTURE_KEYS.crosshair); + + const events = this.gameScene.events; + events.on('announce', this.showBanner, this); + events.on('feedback', this.showFeedback, this); + events.on('player-damaged', this.flashDamage, this); + this.events.once('shutdown', () => { + events.off('announce', this.showBanner, this); + events.off('feedback', this.showFeedback, this); + events.off('player-damaged', this.flashDamage, this); + }); + } + + /** + * Setzt Text nur, wenn er sich geändert hat. + * @param {Phaser.GameObjects.Text} target + * @param {string} value + */ + setText(target, value) { + if (this.textCache.get(target) !== value) { + this.textCache.set(target, value); + target.setText(value); + } + } + + /** + * Setzt die Textfarbe nur bei Änderung (setColor rendert den Text sonst neu). + * @param {Phaser.GameObjects.Text} target + * @param {string} color + */ + setColor(target, color) { + if (this.colorCache.get(target) !== color) { + this.colorCache.set(target, color); + target.setColor(color); + } + } + + update() { + const gameScene = this.gameScene; + if (!gameScene?.player || !(gameScene.sys.isActive() || gameScene.sys.isPaused())) return; + const s = gameScene.hudState(); + const paused = gameScene.sys.isPaused(); + const g = this.g; + g.clear(); + + // Leben + const hpRatio = s.hp / s.maxHp; + this.bar(g, MARGIN, 36, HP_BAR.width, HP_BAR.height, hpRatio, hpRatio <= LOW_HP_RATIO ? COLORS.hpBarLow : COLORS.hpBar); + this.setText(this.hpText, `${Math.ceil(s.hp)} / ${s.maxHp}`); + this.bar(g, MARGIN + 56, 70, DODGE_BAR.width, DODGE_BAR.height, s.dodge, s.dodge >= 1 ? COLORS.gold : COLORS.muted); + + // Welle + this.setText(this.waveTitle, s.wave.number > 0 ? WAVE.incoming(s.wave.number) : WAVE.preparing); + const info = s.wave.state === 'intermission' ? WAVE.nextIn(Math.ceil(s.wave.nextInMs / 1000)) : WAVE.remaining(s.wave.enemies); + this.setText(this.waveInfo, info); + + // Punkte + this.setText(this.scoreText, formatScore(s.score.score)); + let streakLabel = ''; + if (s.score.multiplier > 1) streakLabel = `${formatMultiplier(s.score.multiplier)} · Serie ${s.score.streak}`; + else if (s.score.streak >= 2) streakLabel = `Serie ${s.score.streak}`; + this.setText(this.multText, streakLabel); + if (s.score.streakTimeLeft > 0) { + this.bar(g, this.scale.width - MARGIN - STREAK_BAR.width, 80, STREAK_BAR.width, STREAK_BAR.height, s.score.streakTimeLeft, COLORS.gold); + } + + // Waffe + s.weapons.forEach((weapon, i) => { + const active = i === s.weaponIndex; + this.setColor(this.slotTexts[i], active ? UI.colors.gold : weapon.empty ? UI.colors.danger : UI.colors.muted); + }); + this.setText(this.weaponName, s.weaponName); + const reserve = Number.isFinite(s.reserve) ? String(s.reserve) : '∞'; + this.setText(this.ammoText, s.reloading ? `NACHLADEN · ${reserve}` : `${s.magazine} / ${s.magazineSize} · ${reserve}`); + this.setColor(this.ammoText, s.magazine === 0 && !s.reloading ? UI.colors.danger : UI.colors.cream); + if (s.reloading) this.bar(g, MARGIN, this.scale.height - 36, RELOAD_BAR.width, RELOAD_BAR.height, s.reloadProgress, COLORS.gold); + + this.drawOrbitalPanel(g, s.orbital); + this.drawOffscreenIndicators(g, gameScene); + if (hpRatio <= LOW_HP_RATIO && !s.over) { + // Pulsierender Rand statt Dauerrot: auffällig, verdeckt aber nichts. + const pulse = 0.35 + 0.35 * Math.sin(this.time.now / LOW_HP_PULSE_MS); + g.lineStyle(LOW_HP_BORDER, COLORS.crimson, pulse); + g.strokeRect(LOW_HP_BORDER / 2, LOW_HP_BORDER / 2, this.scale.width - LOW_HP_BORDER, this.scale.height - LOW_HP_BORDER); + } + + // Fadenkreuz folgt der Maus; in der Pause und nach dem Tod ausgeblendet. + const pointer = this.input.activePointer; + this.crosshair.setPosition(pointer.x, pointer.y); + this.crosshair.setVisible(!paused && !s.over); + } + + drawOrbitalPanel(g, orbital) { + const { x, y } = this.orbitalPanel; + const height = 34 + orbital.commands.length * ORBITAL_PANEL.rowHeight; + g.fillStyle(COLORS.navy, 0.72); + g.fillRect(x, y, ORBITAL_PANEL.width, height); + g.lineStyle(2, orbital.active ? COLORS.gold : COLORS.muted, orbital.active ? 1 : 0.5); + g.strokeRect(x, y, ORBITAL_PANEL.width, height); + + orbital.commands.forEach((command, i) => { + const row = this.orbitalRows[i]; + // Dünner Ladebalken unter der Zeile + if (!command.ready) { + g.fillStyle(COLORS.muted, 0.35); + g.fillRect(x + 10, row.y + 22, ORBITAL_PANEL.width - 20, 3); + g.fillStyle(COLORS.gold, 0.9); + g.fillRect(x + 10, row.y + 22, (ORBITAL_PANEL.width - 20) * command.cooldownProgress, 3); + } + this.setColor(row.name, command.ready ? UI.colors.cream : UI.colors.muted); + row.arrows.forEach((arrow, j) => { + const done = orbital.active && j < command.progress; + this.setColor(arrow, done ? UI.colors.gold : command.ready ? UI.colors.cream : UI.colors.muted); + arrow.setScale(done ? 1.2 : 1); + }); + this.setText(row.cooldown, command.ready ? 'bereit' : `${formatCooldown(command.remainingMs)} s`); + this.setColor(row.cooldown, command.ready ? UI.colors.ok : UI.colors.muted); + }); + } + + /** + * Pfeile am Bildschirmrand für Gegner außerhalb des sichtbaren Bereichs. Die Arena ist + * größer als der Bildschirm – ohne Hinweis kämen Angriffe scheinbar aus dem Nichts. + * @param {Phaser.GameObjects.Graphics} g + * @param {Phaser.Scene & {enemies: Phaser.Physics.Arcade.Group}} gameScene + */ + drawOffscreenIndicators(g, gameScene) { + const view = gameScene.cameras.main.worldView; + const cx = this.scale.width / 2; + const cy = this.scale.height / 2; + let shown = 0; + for (const enemy of gameScene.enemies.getChildren()) { + if (!enemy.alive || view.contains(enemy.x, enemy.y)) continue; + const dx = enemy.x - view.x - cx; + const dy = enemy.y - view.y - cy; + // Schnittpunkt der Linie Bildmitte→Gegner mit dem (eingerückten) Bildschirmrand. + const reach = Math.min((cx - INDICATOR.edge) / Math.abs(dx || 1e-6), (cy - INDICATOR.edge) / Math.abs(dy || 1e-6)); + const x = cx + dx * reach; + const y = cy + dy * reach; + const angle = Math.atan2(dy, dx); + const size = enemy.isElite ? INDICATOR.eliteSize : INDICATOR.size; + const color = enemy.isElite ? COLORS.gold : enemy.type.faction === 'swarm' ? COLORS.swarm : COLORS.legion; + const cos = Math.cos(angle); + const sin = Math.sin(angle); + g.fillStyle(color, enemy.isElite ? 1 : 0.8); + g.fillTriangle( + x + cos * size, + y + sin * size, + x - cos * size * 0.6 - sin * size * 0.7, + y - sin * size * 0.6 + cos * size * 0.7, + x - cos * size * 0.6 + sin * size * 0.7, + y - sin * size * 0.6 - cos * size * 0.7, + ); + shown += 1; + if (shown >= INDICATOR.max) break; + } + } + + /** Einfacher Balken mit dunklem Hintergrund. */ + bar(g, x, y, width, height, ratio, color) { + g.fillStyle(0x000000, 0.55); + g.fillRect(x - 2, y - 2, width + 4, height + 4); + g.fillStyle(color, 1); + g.fillRect(x, y, width * Math.max(0, Math.min(1, ratio)), height); + } + + /** @param {{title: string, subtitle: string, kind: string}} message */ + showBanner(message) { + this.tweens.killTweensOf([this.bannerTitle, this.bannerSubtitle]); + this.bannerTitle.setText(message.title).setColor(message.kind === 'elite' ? UI.colors.danger : UI.colors.gold); + this.bannerSubtitle.setText(message.subtitle); + this.bannerTitle.setAlpha(0).setScale(1.3); + this.bannerSubtitle.setAlpha(0); + this.tweens.add({ targets: this.bannerTitle, alpha: 1, scale: 1, duration: 220, ease: 'Back.easeOut' }); + this.tweens.add({ targets: this.bannerSubtitle, alpha: 1, duration: 300 }); + this.tweens.add({ + targets: [this.bannerTitle, this.bannerSubtitle], + alpha: 0, + delay: FX.announcementMs, + duration: 500, + }); + } + + /** @param {{text: string, tone: 'ok'|'warn'}} message */ + showFeedback(message) { + this.tweens.killTweensOf(this.feedbackText); + this.feedbackText.setText(message.text).setColor(message.tone === 'warn' ? UI.colors.danger : UI.colors.cyan); + this.feedbackText.setAlpha(1); + this.tweens.add({ targets: this.feedbackText, alpha: 0, delay: FEEDBACK_MS, duration: 400 }); + } + + flashDamage() { + this.tweens.killTweensOf(this.vignette); + this.vignette.setFillStyle(COLORS.crimson, 0.28); + this.tweens.add({ targets: this.vignette, fillAlpha: 0, duration: 320 }); + } +} diff --git a/app/static/js/scenes/InfoScenes.js b/app/static/js/scenes/InfoScenes.js new file mode 100644 index 0000000..d50f417 --- /dev/null +++ b/app/static/js/scenes/InfoScenes.js @@ -0,0 +1,136 @@ +/** + * Einfache Informationsseiten im Canvas: Ehrentafel, Steuerung, Credits. + * Alle kehren mit Esc, Enter oder Klick auf „Zurück“ ins Hauptmenü zurück. + * @module scenes/InfoScenes + */ + +import { ORBITAL } from '../config.js'; +import { CONTROLS, CREDITS, HIGHSCORES } from '../content/texts.js'; +import { formatScore, formatSequence } from '../logic/format.js'; +import { oncePerEvent } from '../systems/keyboard.js'; +import { textStyle, UI, uiStyle } from '../ui/theme.js'; + +/** + * Gemeinsamer Rahmen: Hintergrund, Titel und Zurück-Schaltfläche. + * @param {Phaser.Scene} scene + * @param {string} title + * @param {string} backLabel + */ +function frame(scene, title, backLabel) { + const { width, height } = scene.scale; + scene.input.setDefaultCursor('default'); + const bg = scene.add.graphics(); + bg.fillGradientStyle(0x0d1321, 0x0d1321, 0x1b2438, 0x1b2438, 1); + bg.fillRect(0, 0, width, height); + bg.lineStyle(3, 0xf2c14e, 1); + bg.strokeRect(40, 30, width - 80, height - 60); + + scene.add.text(width / 2, 70, title, textStyle({ fontSize: '38px', color: UI.colors.gold })).setOrigin(0.5); + const back = scene.add + .text(width / 2, height - 70, backLabel, textStyle({ fontSize: '22px' })) + .setOrigin(0.5) + .setInteractive({ useHandCursor: true }); + back.on('pointerover', () => back.setColor(UI.colors.gold)); + back.on('pointerout', () => back.setColor(UI.colors.cream)); + const leave = () => scene.scene.start('Menu'); + back.on('pointerup', leave); + const leaveByKey = oncePerEvent((event) => { + if (!event.repeat) leave(); + }); + scene.input.keyboard.on('keydown-ESC', leaveByKey); + scene.input.keyboard.on('keydown-ENTER', leaveByKey); +} + +export class HighscoresScene extends Phaser.Scene { + constructor() { + super('Highscores'); + } + + create() { + frame(this, HIGHSCORES.title, HIGHSCORES.back); + const { width } = this.scale; + this.statusText = this.add.text(width / 2, 300, HIGHSCORES.loading, uiStyle({ fontSize: '22px', color: UI.colors.muted })).setOrigin(0.5); + this.registry + .get('services') + .api.fetchHighscores() + .then((result) => { + if (!this.sys.isActive()) return; + if (!result.ok) this.statusText.setText(HIGHSCORES.error); + else if (result.highscores.length === 0) this.statusText.setText(HIGHSCORES.empty); + else { + this.statusText.destroy(); + this.renderTable(result.highscores); + } + }); + } + + /** @param {import('../systems/ApiClient.js').HighscoreEntry[]} entries */ + renderTable(entries) { + const columns = { rank: 280, name: 360, score: 900, wave: 1000 }; + const top = 130; + const rowHeight = 40; + const header = uiStyle({ fontSize: '17px', color: UI.colors.muted }); + this.add.text(columns.rank, top, HIGHSCORES.columns.rank, header); + this.add.text(columns.name, top, HIGHSCORES.columns.name, header); + this.add.text(columns.score, top, HIGHSCORES.columns.score, header).setOrigin(1, 0); + this.add.text(columns.wave, top, HIGHSCORES.columns.wave, header).setOrigin(1, 0); + entries.forEach((entry, i) => { + const y = top + 40 + i * rowHeight; + const color = i === 0 ? UI.colors.gold : UI.colors.cream; + const style = uiStyle({ fontSize: '24px', color }); + this.add.text(columns.rank, y, `${entry.rank}.`, style); + // Canvas-Text interpretiert kein HTML – Namen werden hier sicher als Text gezeichnet. + this.add.text(columns.name, y, entry.name, style); + this.add.text(columns.score, y, formatScore(entry.score), style).setOrigin(1, 0); + this.add.text(columns.wave, y, String(entry.wave), style).setOrigin(1, 0); + }); + } +} + +export class ControlsScene extends Phaser.Scene { + constructor() { + super('Controls'); + } + + create() { + frame(this, CONTROLS.title, CONTROLS.back); + const keyStyle = uiStyle({ fontSize: '20px', color: UI.colors.gold }); + const valueStyle = uiStyle({ fontSize: '20px' }); + CONTROLS.rows.forEach(([key, action], i) => { + const y = 130 + i * 38; + this.add.text(560, y, key, keyStyle).setOrigin(1, 0); + this.add.text(590, y, action, valueStyle); + }); + const top = 130 + CONTROLS.rows.length * 38 + 30; + this.add.text(this.scale.width / 2, top, CONTROLS.orbitalTitle, textStyle({ fontSize: '22px', color: UI.colors.gold })).setOrigin(0.5); + ORBITAL.commands.forEach((command, i) => { + const y = top + 40 + i * 36; + this.add.text(560, y, command.name, valueStyle).setOrigin(1, 0); + this.add.text(590, y, formatSequence(command.sequence, ' '), { ...keyStyle, fontFamily: UI.symbolFont }); + }); + } +} + +export class CreditsScene extends Phaser.Scene { + constructor() { + super('Credits'); + } + + create() { + frame(this, CREDITS.title, CREDITS.back); + const { width } = this.scale; + let y = 118; + for (const section of CREDITS.sections) { + const heading = this.add.text(width / 2, y, section.heading, textStyle({ fontSize: '21px', color: UI.colors.gold })).setOrigin(0.5, 0); + y += heading.height + 4; + for (const line of section.lines) { + const text = this.add + .text(width / 2, y, line, { ...uiStyle({ fontSize: '17px', align: 'center' }), wordWrap: { width: width - 200 } }) + .setOrigin(0.5, 0); + // Tatsächliche Höhe verwenden: umgebrochene Zeilen sind höher als eine Zeile. + y += text.height + 2; + } + y += 12; + } + } +} diff --git a/app/static/js/scenes/MenuScene.js b/app/static/js/scenes/MenuScene.js new file mode 100644 index 0000000..027f3da --- /dev/null +++ b/app/static/js/scenes/MenuScene.js @@ -0,0 +1,118 @@ +/** + * Hauptmenü mit Propaganda-Laufband. Beim allerersten Start wird zuerst der + * Disclaimer angezeigt; das Menü ist erst danach bedienbar. + * @module scenes/MenuScene + */ + +import { GAME } from '../config.js'; +import { MENU, PROPAGANDA, TAGLINE, TITLE } from '../content/texts.js'; +import { TEXTURE_KEYS } from '../systems/Placeholders.js'; +import { MenuList } from '../ui/MenuList.js'; +import { textStyle, UI, uiStyle } from '../ui/theme.js'; + +/** Geschwindigkeit des Laufbands in px/s. */ +const TICKER_SPEED = 90; +/** Anzahl Scheinwerferkegel im Hintergrund. */ +const SEARCHLIGHTS = 3; + +export class MenuScene extends Phaser.Scene { + constructor() { + super('Menu'); + } + + create() { + const { width, height } = this.scale; + const services = this.registry.get('services'); + this.input.setDefaultCursor('default'); + + this.drawBackground(width, height); + + this.add.image(width / 2, 150, TEXTURE_KEYS.emblem).setDisplaySize(150, 150); + this.add + .text(width / 2, 262, TITLE, textStyle({ fontSize: '68px', color: UI.colors.gold, strokeThickness: 10, stroke: '#7a0a12' })) + .setOrigin(0.5); + this.add.text(width / 2, 318, TAGLINE, textStyle({ fontSize: '24px' })).setOrigin(0.5); + + this.menu = new MenuList(this, width / 2, 372, [ + { label: MENU.start, onSelect: () => this.startMission() }, + { label: MENU.highscores, onSelect: () => this.scene.start('Highscores') }, + { label: MENU.controls, onSelect: () => this.scene.start('Controls') }, + { label: MENU.disclaimer, onSelect: () => this.openDisclaimer(false) }, + { label: MENU.credits, onSelect: () => this.scene.start('Credits') }, + ], { spacing: 54 }); + + this.add.text(width / 2, height - 62, MENU.hint, uiStyle({ fontSize: '16px', color: UI.colors.muted })).setOrigin(0.5); + this.createTicker(width, height); + + // Reine Touch-Geräte (Handy, Tablet) haben weder WASD noch Maus – lieber gleich sagen. + if (globalThis.matchMedia?.('(pointer: coarse)').matches && !globalThis.matchMedia?.('(any-pointer: fine)').matches) { + this.add.text(width / 2, height - 92, MENU.touchNotice, uiStyle({ fontSize: '18px', color: UI.colors.danger })).setOrigin(0.5); + } + + // Ton darf erst nach einer Nutzeraktion starten (Browser-Richtlinie); die Musik + // wird vorgemerkt und beginnt mit dem ersten Klick oder Tastendruck. + services.audio.startMusic(); + this.input.once('pointerdown', () => services.audio.unlock()); + this.input.keyboard.once('keydown', () => services.audio.unlock()); + + if (!services.settings.isDisclaimerAccepted()) { + this.openDisclaimer(true); + } + } + + /** + * @param {boolean} mandatory Beim ersten Start muss bestätigt werden. + */ + openDisclaimer(mandatory) { + this.menu.setEnabled(false); + this.scene.launch('Disclaimer', { mandatory }); + this.scene.get('Disclaimer').events.once('disclaimer-closed', () => { + this.menu.setEnabled(true); + }); + } + + startMission() { + this.registry.get('services').audio.unlock(); + this.scene.start('Briefing'); + } + + drawBackground(width, height) { + const bg = this.add.graphics(); + bg.fillGradientStyle(0x0d1321, 0x0d1321, 0x2a0a10, 0x2a0a10, 1); + bg.fillRect(0, 0, width, height); + // Diagonale Streifen wie auf einem Propagandaplakat. + bg.fillStyle(0xc1121f, 0.08); + for (let x = -height; x < width; x += 90) { + bg.fillTriangle(x, height, x + 45, height, x + height + 45, 0); + } + + for (let i = 0; i < SEARCHLIGHTS; i += 1) { + const beam = this.add.triangle(width * (0.2 + 0.3 * i), height + 20, 0, 0, -120, -height * 1.1, 120, -height * 1.1, 0xf2c14e, 0.06); + beam.setOrigin(0, 0); + this.tweens.add({ + targets: beam, + angle: { from: -25, to: 25 }, + duration: 4200 + i * 900, + yoyo: true, + repeat: -1, + ease: 'Sine.easeInOut', + }); + } + } + + createTicker(width, height) { + const bar = this.add.rectangle(0, height - 36, width, 36, 0xc1121f, 0.9).setOrigin(0, 0); + bar.setDepth(GAME.depth.hud); + const line = PROPAGANDA.join(' ★ '); + this.ticker = this.add + .text(width, height - 18, line, uiStyle({ fontSize: '19px', strokeThickness: 0 })) + .setOrigin(0, 0.5) + .setDepth(GAME.depth.hud + 1); + } + + update(_time, delta) { + if (!this.ticker) return; + this.ticker.x -= (TICKER_SPEED * delta) / 1000; + if (this.ticker.x < -this.ticker.width) this.ticker.x = this.scale.width; + } +} diff --git a/app/static/js/scenes/PauseScene.js b/app/static/js/scenes/PauseScene.js new file mode 100644 index 0000000..c5074cf --- /dev/null +++ b/app/static/js/scenes/PauseScene.js @@ -0,0 +1,110 @@ +/** + * Pausenmenü (Esc) mit Lautstärkereglern. Als HTML-Overlay umgesetzt, damit die + * Schieberegler per Maus, Tastatur und Screenreader bedienbar sind. + * @module scenes/PauseScene + */ + +import { ORBITAL } from '../config.js'; +import { formatSequence } from '../logic/format.js'; +import { PAUSE } from '../content/texts.js'; +import { oncePerEvent } from '../systems/keyboard.js'; +import { el, Overlay } from '../systems/Overlay.js'; +import { VOLUME_CHANNELS } from '../systems/Settings.js'; + +export class PauseScene extends Phaser.Scene { + constructor() { + super('Pause'); + } + + create() { + const { width, height } = this.scale; + const services = this.registry.get('services'); + this.input.setDefaultCursor('default'); + // Solange die Pause offen ist, soll der Browser Tasten normal verarbeiten + // (Pfeiltasten für Schieberegler, Tab für den Fokus). + this.input.keyboard.disableGlobalCapture(); + services.audio.duck(true); + this.add.rectangle(0, 0, width, height, 0x000000, 0.45).setOrigin(0); + + const content = [el('p', 'disclaimer__lead', PAUSE.subtitle)]; + for (const channel of VOLUME_CHANNELS) { + content.push(this.volumeField(channel, services.settings)); + } + const codes = el('p', 'field__hint'); + codes.textContent = ORBITAL.commands + .map((c) => `${c.shortName}: ${formatSequence(c.sequence)}`) + .join(' · '); + content.push(codes); + + let quitArmed = false; + this.overlay = new Overlay({ + id: 'pause-overlay', + title: PAUSE.title, + content, + buttons: [ + { label: PAUSE.resume, onClick: () => this.resume(), testId: 'pause-resume' }, + { + label: PAUSE.quit, + secondary: true, + testId: 'pause-quit', + onClick: () => { + // Zweistufig statt Browser-Dialog: erster Klick fragt nach, zweiter bricht ab. + if (!quitArmed) { + quitArmed = true; + quitButton.textContent = PAUSE.confirmQuit; + return; + } + this.quit(); + }, + }, + ], + onEscape: () => this.resume(), + }); + const quitButton = this.overlay.actions.lastElementChild; + + this.input.keyboard.on( + 'keydown-ESC', + oncePerEvent((event) => { + if (!event.repeat) this.resume(); + }), + ); + this.events.once('shutdown', () => { + services.audio.duck(false); + if (this.overlay.element.isConnected) this.overlay.close(); + this.input.keyboard?.enableGlobalCapture(); + }); + } + + /** + * Schieberegler für einen Lautstärkekanal. + * @param {'master'|'music'|'sfx'} channel + * @param {import('../systems/Settings.js').Settings} settings + * @returns {HTMLElement} + */ + volumeField(channel, settings) { + const field = el('label', 'field'); + const label = el('span', 'field__label', PAUSE.volumes[channel]); + const input = /** @type {HTMLInputElement} */ (el('input', 'field__input')); + input.type = 'range'; + input.min = '0'; + input.max = '100'; + input.step = '5'; + input.value = String(Math.round(settings.getVolume(channel) * 100)); + input.dataset.testid = `volume-${channel}`; + input.addEventListener('input', () => settings.setVolume(channel, Number(input.value) / 100)); + field.append(label, input); + return field; + } + + resume() { + this.scene.resume('Game'); + this.scene.get('Game').input.setDefaultCursor('none'); + this.scene.stop(); + } + + quit() { + this.scene.stop('Hud'); + this.scene.stop('Game'); + this.scene.start('Menu'); + } +} diff --git a/app/static/js/systems/ApiClient.js b/app/static/js/systems/ApiClient.js new file mode 100644 index 0000000..695ce4c --- /dev/null +++ b/app/static/js/systems/ApiClient.js @@ -0,0 +1,129 @@ +/** + * Zugriff auf die JSON-API des Flask-Backends (ohne Phaser). + * + * Fehler werden nie geworfen, sondern als Ergebnisobjekt zurückgegeben: Ein + * ausgefallener Highscore-Server darf das Spiel nicht unterbrechen. + * @module systems/ApiClient + */ + +import { HIGHSCORE } from '../config.js'; + +/** + * @typedef {Object} HighscoreEntry + * @property {number} rank + * @property {string} name + * @property {number} score + * @property {number} wave + * @property {string} created_at + */ + +/** + * @typedef {Object} SubmitResult + * @property {boolean} ok + * @property {number} [rank] + * @property {HighscoreEntry[]} [highscores] + * @property {string} [error] Fehlercode der API oder „network“. + * @property {string} [message] Lesbare Meldung. + * @property {Record} [fields] Feldfehler bei Validierung. + */ + +export class ApiClient { + /** + * @param {{highscores: string, runs: string}} endpoints + * @param {typeof fetch} [fetchImpl] Für Tests austauschbar. + * @param {number} [timeoutMs] + */ + constructor(endpoints, fetchImpl = globalThis.fetch?.bind(globalThis), timeoutMs = HIGHSCORE.requestTimeoutMs) { + this.endpoints = endpoints; + this.fetchImpl = fetchImpl; + this.timeoutMs = timeoutMs; + } + + /** + * @param {string} url + * @param {RequestInit} [init] + * @returns {Promise<{status: number, body: any}>} + */ + async request(url, init = {}) { + const controller = typeof AbortController === 'function' ? new AbortController() : null; + const timer = controller ? setTimeout(() => controller.abort(), this.timeoutMs) : null; + try { + const response = await this.fetchImpl(url, { + ...init, + signal: controller?.signal, + credentials: 'same-origin', + headers: { Accept: 'application/json', ...(init.headers ?? {}) }, + }); + let body = null; + try { + body = await response.json(); + } catch { + body = null; + } + return { status: response.status, body }; + } finally { + if (timer) clearTimeout(timer); + } + } + + /** + * Meldet eine neue Spielrunde an. + * @returns {Promise} Run-Token oder null, wenn der Server nicht erreichbar ist. + */ + async startRun() { + try { + const { status, body } = await this.request(this.endpoints.runs, { method: 'POST' }); + return status === 201 && typeof body?.run_token === 'string' ? body.run_token : null; + } catch { + return null; + } + } + + /** + * @returns {Promise<{ok: boolean, highscores: HighscoreEntry[]}>} + */ + async fetchHighscores() { + try { + const { status, body } = await this.request(this.endpoints.highscores); + if (status === 200 && Array.isArray(body?.highscores)) { + return { ok: true, highscores: body.highscores }; + } + } catch { + // Netzwerkfehler oder Timeout – unten als Fehlschlag gemeldet. + } + return { ok: false, highscores: [] }; + } + + /** + * Reicht einen Highscore ein. + * @param {{name: string, score: number, wave: number, durationS: number, runToken: string}} entry + * @returns {Promise} + */ + async submitHighscore(entry) { + const payload = { + name: entry.name, + score: Math.max(0, Math.floor(entry.score)), + wave: Math.max(1, Math.floor(entry.wave)), + duration_s: Math.max(0, Math.floor(entry.durationS)), + run_token: entry.runToken, + }; + try { + const { status, body } = await this.request(this.endpoints.highscores, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + }); + if (status === 201) { + return { ok: true, rank: body?.rank, highscores: body?.highscores ?? [] }; + } + return { + ok: false, + error: body?.error ?? `http_${status}`, + message: body?.message ?? 'Unbekannter Fehler.', + fields: body?.fields, + }; + } catch { + return { ok: false, error: 'network', message: 'Keine Verbindung zum Server.' }; + } + } +} diff --git a/app/static/js/systems/Arena.js b/app/static/js/systems/Arena.js new file mode 100644 index 0000000..ce73d75 --- /dev/null +++ b/app/static/js/systems/Arena.js @@ -0,0 +1,79 @@ +/** + * Aufbau der Arena: Boden, Dekoration und Begrenzung. + * + * Mit geladenen Kenney-Kacheln entsteht ein Erdboden mit Felsen, fremdartiger Flora + * und Flecken; ohne sie ein einfaches Schachbrett-Platzhaltermuster. Dekoration hat + * keine Physik – sie soll nur den Boden lebendig machen, nicht den Weg versperren. + * @module systems/Arena + */ + +import { COLORS, GAME } from '../config.js'; +import { pick, randFloat, randInt } from '../logic/rng.js'; +import { GROUND_FRAMES, GROUND_SHEET } from './Assets.js'; +import { TEXTURE_KEYS } from './Placeholders.js'; + +/** Abdunkelung des Bodens, damit Figuren und Projektile sich klar abheben. */ +const GROUND_TINT = 0x6f6458; +/** Anzahl Deko-Objekte je Sorte (für eine 2400×1600-Arena abgestimmt). */ +const DECOR = Object.freeze({ dirtPatches: 180, rocks: 45, bushes: 28, splats: 14 }); +/** Flora und Flecken in „außerirdischen“ Farben statt Erdgrün. */ +const ALIEN_TINTS = Object.freeze([0x6d5a8f, 0x3f7f78, 0x7d5f86]); +const SPLAT_TINT = 0x2f4a1a; +/** Freiraum um die Startposition, damit dort nichts die Sicht stört. */ +const CLEAR_RADIUS = 180; + +/** + * @param {Phaser.Scene} scene + * @param {() => number} rng + */ +export function buildArena(scene, rng) { + const { width, height } = GAME.world; + const depth = GAME.depth.ground; + + if (scene.textures.exists(GROUND_SHEET.key)) { + const key = GROUND_SHEET.key; + const tile = GROUND_SHEET.frame; + scene.add.tileSprite(0, 0, width, height, key, GROUND_FRAMES.dirtA).setOrigin(0).setDepth(depth).setTint(GROUND_TINT); + // Zweite Erdsorte im Kachelraster verstreut: bricht das sichtbare Wiederholungsmuster. + for (let i = 0; i < DECOR.dirtPatches; i += 1) { + const x = randInt(rng, 0, Math.floor(width / tile) - 1) * tile; + const y = randInt(rng, 0, Math.floor(height / tile) - 1) * tile; + scene.add.image(x, y, key, GROUND_FRAMES.dirtB).setOrigin(0).setDepth(depth).setTint(GROUND_TINT); + } + const place = (frame, count, decorate) => { + for (let i = 0; i < count; i += 1) { + const point = randomPoint(rng, width, height); + const image = scene.add.image(point.x, point.y, key, frame(rng)).setDepth(depth + 1); + image.setAngle(randFloat(rng, 0, 360)); + decorate(image); + } + }; + place((r) => pick(r, GROUND_FRAMES.rocks), DECOR.rocks, (img) => img.setScale(randFloat(rng, 0.45, 0.95)).setTint(0x8d9196)); + place((r) => pick(r, GROUND_FRAMES.bushes), DECOR.bushes, (img) => img.setScale(randFloat(rng, 0.5, 1.1)).setTint(pick(rng, ALIEN_TINTS))); + place(() => GROUND_FRAMES.splat, DECOR.splats, (img) => img.setScale(randFloat(rng, 0.8, 1.6)).setTint(SPLAT_TINT).setAlpha(0.7)); + } else { + scene.add.tileSprite(0, 0, width, height, TEXTURE_KEYS.ground).setOrigin(0).setDepth(depth); + } + + // Emblem der Vereinigten Erde als Bodenmarkierung der Landezone. + scene.add + .image(width / 2, height / 2, TEXTURE_KEYS.emblem) + .setDisplaySize(300, 300) + .setAlpha(0.14) + .setDepth(depth + 1); + + const border = scene.add.graphics().setDepth(depth + 2); + border.lineStyle(10, COLORS.crimson, 0.9); + border.strokeRect(5, 5, width - 10, height - 10); + border.lineStyle(3, COLORS.gold, 0.9); + border.strokeRect(14, 14, width - 28, height - 28); +} + +/** Zufallspunkt in der Arena außerhalb der freien Startzone. */ +function randomPoint(rng, width, height) { + for (;;) { + const x = randFloat(rng, 30, width - 30); + const y = randFloat(rng, 30, height - 30); + if (Math.hypot(x - width / 2, y - height / 2) > CLEAR_RADIUS) return { x, y }; + } +} diff --git a/app/static/js/systems/Assets.js b/app/static/js/systems/Assets.js new file mode 100644 index 0000000..f9266a8 --- /dev/null +++ b/app/static/js/systems/Assets.js @@ -0,0 +1,76 @@ +/** + * Liste aller Grafikdateien und ihr Laden mit Rückfallebene. + * + * Jede Datei ist optional: Schlägt das Laden fehl (Datei fehlt, Netzwerkfehler), + * erzeugt `Placeholders.js` unter demselben Schlüssel eine Ersatzgrafik. Quellen und + * Lizenzen aller Dateien stehen in docs/ASSETS.md. + * @module systems/Assets + */ + +/** Eigene Vektorgrafiken (SVG, CC0). Größe = Rastergröße im Spiel in Pixeln. */ +export const SPRITES = Object.freeze([ + { key: 'player', file: 'sprites/president.svg', size: 64 }, + { key: 'enemy-krabbler', file: 'sprites/krabbler.svg', size: 36 }, + { key: 'enemy-sprungkralle', file: 'sprites/sprungkralle.svg', size: 48 }, + { key: 'enemy-brutmutter', file: 'sprites/brutmutter.svg', size: 84 }, + { key: 'enemy-nieter', file: 'sprites/nieter.svg', size: 36 }, + { key: 'enemy-blechsoldat', file: 'sprites/blechsoldat.svg', size: 48 }, + { key: 'enemy-walzmeister', file: 'sprites/walzmeister.svg', size: 88 }, + { key: 'turret', file: 'sprites/turret.svg', size: 52 }, + { key: 'supply-pod', file: 'sprites/supply-pod.svg', size: 48 }, + { key: 'emblem', file: 'sprites/emblem.svg', size: 200 }, +]); + +/** Kenney Particle Pack (CC0), auf 128 px verkleinert. */ +export const PARTICLES = Object.freeze([ + { key: 'fx-smoke', file: 'kenney/particles/smoke.png' }, + { key: 'fx-fire', file: 'kenney/particles/fire.png' }, + { key: 'fx-spark', file: 'kenney/particles/spark.png' }, + { key: 'fx-scorch', file: 'kenney/particles/scorch.png' }, + { key: 'fx-muzzle', file: 'kenney/particles/muzzle.png' }, + { key: 'fx-glow', file: 'kenney/particles/glow.png' }, +]); + +/** + * Kenney Top-down Shooter (CC0): Ausschnitt aus dem Tilesheet als Streifen mit + * 64-px-Kacheln. Die Reihenfolge der Kacheln steht in GROUND_FRAMES. + */ +export const GROUND_SHEET = Object.freeze({ key: 'ground-tiles', file: 'kenney/tiles/ground_strip.png', frame: 64 }); + +/** Kachelindizes im Bodenstreifen. */ +export const GROUND_FRAMES = Object.freeze({ + dirtA: 0, + dirtB: 1, + rocks: Object.freeze([2, 3, 4]), + bushes: Object.freeze([5, 6]), + splat: 7, +}); + +/** + * Stellt alle Dateien in die Lade-Warteschlange. + * @param {Phaser.Scene} scene + * @param {string} staticBase URL des static-Ordners (mit abschließendem /). + */ +export function queueAssets(scene, staticBase) { + scene.load.setPath(`${staticBase}assets/`); + for (const sprite of SPRITES) { + scene.load.svg(sprite.key, sprite.file, { width: sprite.size, height: sprite.size }); + } + for (const particle of PARTICLES) { + scene.load.image(particle.key, particle.file); + } + scene.load.spritesheet(GROUND_SHEET.key, GROUND_SHEET.file, { + frameWidth: GROUND_SHEET.frame, + frameHeight: GROUND_SHEET.frame, + }); + scene.load.setPath(''); +} + +/** + * @param {Phaser.Scene} scene + * @param {string} key + * @returns {boolean} true, wenn die echte Grafik (nicht der Platzhalter) geladen ist. + */ +export function hasTexture(scene, key) { + return scene.textures.exists(key); +} diff --git a/app/static/js/systems/AudioAssets.js b/app/static/js/systems/AudioAssets.js new file mode 100644 index 0000000..9147860 --- /dev/null +++ b/app/static/js/systems/AudioAssets.js @@ -0,0 +1,87 @@ +/** + * Klangdateien (Kenney, CC0) und Abspieloptionen je Effekt. + * + * Mehrere Dateien pro Effekt werden zufällig abgewechselt, damit Dauerfeuer nicht + * monoton klingt. Fehlt eine Datei oder kann der Browser OGG nicht dekodieren, + * springt der Synthesizer in `Synth.js` ein. + * @module systems/AudioAssets + */ + +/** Pfad relativ zu `static/assets/`. */ +export const AUDIO_PATH = 'kenney/audio/'; + +/** @type {Readonly>} */ +export const SOUND_FILES = Object.freeze({ + 'shot-carbine': ['laserSmall_000.ogg', 'laserSmall_001.ogg', 'laserSmall_002.ogg'], + 'shot-shotgun': ['laserLarge_000.ogg', 'laserLarge_001.ogg'], + 'shot-pistol': ['laserRetro_000.ogg', 'laserRetro_001.ogg'], + 'turret-shot': ['laserRetro_002.ogg'], + 'enemy-shot': ['laserSmall_003.ogg', 'laserSmall_004.ogg'], + 'hit-flesh': ['impactSoft_medium_000.ogg', 'impactSoft_medium_001.ogg', 'impactSoft_medium_002.ogg'], + 'hit-metal': ['impactMetal_light_000.ogg', 'impactMetal_light_001.ogg', 'impactMetal_light_002.ogg'], + 'death-swarm': ['slime_000.ogg', 'slime_001.ogg'], + 'death-legion': ['explosionCrunch_000.ogg', 'explosionCrunch_001.ogg'], + 'explosion-small': ['explosionCrunch_002.ogg', 'explosionCrunch_003.ogg'], + 'explosion-big': ['lowFrequency_explosion_000.ogg'], + 'player-hit': ['impactPunch_heavy_000.ogg', 'impactPunch_heavy_001.ogg'], + 'player-death': ['lowFrequency_explosion_001.ogg'], + reload: ['impactPlate_light_000.ogg'], + 'reload-done': ['click_001.ogg'], + switch: ['select_001.ogg'], + 'combo-step': ['tick_001.ogg'], + 'combo-fail': ['error_001.ogg'], + 'orbital-call': ['confirmation_001.ogg'], + pickup: ['maximize_001.ogg'], + brood: ['slime_001.ogg'], + 'ui-click': ['click_001.ogg'], + 'ui-confirm': ['confirmation_002.ogg'], + 'wave-start': ['jingles_HIT15.ogg'], + 'wave-cleared': ['jingles_STEEL07.ogg'], + alarm: ['jingles_HIT11.ogg'], + 'game-over': ['jingles_PIZZI07.ogg'], + // Nur synthetisch (kein passendes kurzes Sample): Ausweichrolle, Mörserpfeifen. + dodge: [], + mortar: [], +}); + +/** + * Lautstärke (0..1), Tonhöhe (1 = original) und Tonhöhenstreuung je Effekt. + * Jingles laufen über den Musikkanal, damit „Musik leiser“ auch sie betrifft. + * @type {Readonly>} + */ +export const SOUND_OPTIONS = Object.freeze({ + 'shot-carbine': { volume: 0.35, spread: 0.08 }, + 'shot-shotgun': { volume: 0.5, rate: 0.8, spread: 0.06 }, + 'shot-pistol': { volume: 0.4, spread: 0.06 }, + 'turret-shot': { volume: 0.22, rate: 1.4, spread: 0.1 }, + 'enemy-shot': { volume: 0.22, rate: 0.7, spread: 0.1 }, + 'hit-flesh': { volume: 0.35, spread: 0.15 }, + 'hit-metal': { volume: 0.3, spread: 0.15 }, + 'death-swarm': { volume: 0.5, spread: 0.15 }, + 'death-legion': { volume: 0.4, rate: 1.2, spread: 0.1 }, + 'explosion-small': { volume: 0.6, spread: 0.1 }, + 'explosion-big': { volume: 1 }, + 'player-hit': { volume: 0.6, spread: 0.1 }, + 'player-death': { volume: 1, rate: 0.8 }, + reload: { volume: 0.45 }, + 'reload-done': { volume: 0.4 }, + switch: { volume: 0.4 }, + 'combo-step': { volume: 0.5 }, + 'combo-fail': { volume: 0.5 }, + 'orbital-call': { volume: 0.6 }, + pickup: { volume: 0.6 }, + brood: { volume: 0.5, rate: 0.7 }, + 'ui-click': { volume: 0.4 }, + 'ui-confirm': { volume: 0.5 }, + 'wave-start': { volume: 0.8, channel: 'music' }, + 'wave-cleared': { volume: 0.8, channel: 'music' }, + alarm: { volume: 0.8, channel: 'music' }, + 'game-over': { volume: 0.9, channel: 'music' }, + dodge: { volume: 0.35 }, + mortar: { volume: 0.3 }, +}); + +/** @returns {string[]} Alle benötigten Dateien ohne Duplikate. */ +export function allSoundFiles() { + return [...new Set(Object.values(SOUND_FILES).flat())]; +} diff --git a/app/static/js/systems/AudioManager.js b/app/static/js/systems/AudioManager.js new file mode 100644 index 0000000..74abb60 --- /dev/null +++ b/app/static/js/systems/AudioManager.js @@ -0,0 +1,188 @@ +/** + * Audio: Lautstärkekanäle (Gesamt, Musik, Effekte), Klangdateien, synthetischer + * Ersatz und Hintergrundmusik – alles über die Web Audio API. + * + * Browser erlauben Ton erst nach einer Nutzerinteraktion. Die Dateien werden deshalb + * vorab nur als Bytes geladen und erst in `unlock()` (erster Klick/Tastendruck) + * dekodiert. Ohne Web Audio bleibt das Spiel stumm, aber spielbar. + * @module systems/AudioManager + */ + +import { AUDIO } from '../config.js'; +import { allSoundFiles, AUDIO_PATH, SOUND_FILES, SOUND_OPTIONS } from './AudioAssets.js'; +import { MarchMusic } from './Music.js'; +import { createNoiseBuffer, SYNTH_RECIPES } from './Synth.js'; + +/** Obergrenze gleichzeitig klingender Effekte – schützt vor Übersteuern und CPU-Spitzen. */ +const MAX_VOICES = 24; +/** Lautstärke der Musik während der Pause (Anteil). */ +const PAUSE_DUCK = 0.35; + +export class AudioManager { + /** + * @param {import('./Settings.js').Settings} settings + * @param {{staticBase?: string, fetchImpl?: typeof fetch}} [options] + */ + constructor(settings, options = {}) { + this.settings = settings; + this.baseUrl = `${options.staticBase ?? '/static/'}assets/${AUDIO_PATH}`; + this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis); + /** @type {AudioContext|null} */ + this.context = null; + /** @type {{master: GainNode, music: GainNode, sfx: GainNode, duck: GainNode}|null} */ + this.gains = null; + /** @type {Map>} Rohdaten je Datei (vor dem Entsperren). */ + this.raw = new Map(); + /** @type {Map} Dekodierte Klänge je Datei. */ + this.buffers = new Map(); + /** @type {Map} Letzte Abspielzeit je Effekt (gegen Übersteuern). */ + this.lastPlayed = new Map(); + this.activeVoices = 0; + /** @type {MarchMusic|null} */ + this.music = null; + this.musicWanted = false; + this.noiseBuffer = null; + settings.onVolumeChange(() => this.applyVolumes()); + } + + /** Lädt die Klangdateien als Bytes vor (ohne AudioContext, also vor jeder Interaktion möglich). */ + preload() { + if (!this.fetchImpl) return; + for (const file of allSoundFiles()) { + if (this.raw.has(file)) continue; + const request = this.fetchImpl(this.baseUrl + file) + .then((response) => (response.ok ? response.arrayBuffer() : null)) + .catch(() => null); + this.raw.set(file, request); + } + } + + /** Erzeugt den AudioContext nach der ersten Nutzerinteraktion und dekodiert die Klänge. */ + unlock() { + if (this.context) { + if (this.context.state === 'suspended') this.context.resume().catch(() => {}); + return; + } + const Ctor = globalThis.AudioContext ?? globalThis.webkitAudioContext; + if (!Ctor) return; + try { + this.context = new Ctor(); + } catch { + this.context = null; + return; + } + const ctx = this.context; + const master = ctx.createGain(); + const duck = ctx.createGain(); + const music = ctx.createGain(); + const sfx = ctx.createGain(); + music.connect(duck).connect(master); + sfx.connect(master); + master.connect(ctx.destination); + this.gains = { master, music, sfx, duck }; + this.noiseBuffer = createNoiseBuffer(ctx); + this.applyVolumes(); + this.decodeAll(); + if (this.musicWanted) this.startMusic(); + } + + /** @private */ + decodeAll() { + for (const [file, request] of this.raw) { + request.then((bytes) => { + if (!bytes || !this.context) return; + // decodeAudioData übernimmt den Puffer – eine Kopie hält die Rohdaten wiederverwendbar. + this.context + .decodeAudioData(bytes.slice(0)) + .then((buffer) => this.buffers.set(file, buffer)) + .catch(() => { + // Format nicht unterstützt (z. B. OGG in alten Safari-Versionen): Synthesizer übernimmt. + }); + }); + } + } + + /** Überträgt die Einstellungen auf die Gain-Knoten. */ + applyVolumes() { + if (!this.gains || !this.context) return; + const t = this.context.currentTime; + this.gains.master.gain.setTargetAtTime(this.settings.getVolume('master'), t, 0.02); + this.gains.music.gain.setTargetAtTime(this.settings.getVolume('music'), t, 0.02); + this.gains.sfx.gain.setTargetAtTime(this.settings.getVolume('sfx'), t, 0.02); + } + + /** + * Prüft Mindestabstand und Stimmenlimit. + * @param {string} name + * @returns {boolean} + */ + shouldPlay(name) { + if (!this.context || !this.gains || this.context.state !== 'running') return false; + if (this.activeVoices >= MAX_VOICES) return false; + const now = performance.now(); + const last = this.lastPlayed.get(name) ?? -Infinity; + if (now - last < AUDIO.sfxMinIntervalMs) return false; + this.lastPlayed.set(name, now); + return true; + } + + /** + * Spielt einen Effekt: Klangdatei, falls dekodiert, sonst synthetischer Ersatz. + * @param {string} name Schlüssel aus SOUND_FILES. + */ + play(name) { + if (!this.shouldPlay(name)) return; + const ctx = /** @type {AudioContext} */ (this.context); + const gains = /** @type {NonNullable} */ (this.gains); + const options = SOUND_OPTIONS[name] ?? {}; + const destination = options.channel === 'music' ? gains.music : gains.sfx; + const volume = options.volume ?? 1; + const variants = (SOUND_FILES[name] ?? []).map((file) => this.buffers.get(file)).filter(Boolean); + + this.activeVoices += 1; + const release = () => { + this.activeVoices = Math.max(0, this.activeVoices - 1); + }; + + if (variants.length > 0) { + const source = ctx.createBufferSource(); + source.buffer = variants[Math.floor(Math.random() * variants.length)]; + // Leichte Tonhöhenstreuung: derselbe Effekt klingt nie exakt gleich. + const spread = options.spread ?? 0; + source.playbackRate.value = (options.rate ?? 1) * (1 + (Math.random() * 2 - 1) * spread); + const gain = ctx.createGain(); + gain.gain.value = volume; + source.connect(gain).connect(destination); + source.onended = release; + source.start(); + return; + } + const recipe = SYNTH_RECIPES[name]; + if (recipe && this.noiseBuffer) recipe(ctx, destination, this.noiseBuffer, volume); + // Synthetische Klänge sind kurz; die Stimme wird nach einer Sekunde freigegeben. + setTimeout(release, 1000); + } + + /** Startet die Marschmusik (oder merkt sie vor, bis Audio entsperrt ist). */ + startMusic() { + this.musicWanted = true; + if (!this.context || !this.gains || !this.noiseBuffer || this.music) return; + this.music = new MarchMusic(this.context, this.gains.music, this.noiseBuffer); + this.music.start(); + } + + stopMusic() { + this.musicWanted = false; + this.music?.stop(); + this.music = null; + } + + /** + * Senkt die Musik während der Pause ab. + * @param {boolean} ducked + */ + duck(ducked) { + if (!this.gains || !this.context) return; + this.gains.duck.gain.setTargetAtTime(ducked ? PAUSE_DUCK : 1, this.context.currentTime, 0.1); + } +} diff --git a/app/static/js/systems/Effects.js b/app/static/js/systems/Effects.js new file mode 100644 index 0000000..0c41362 --- /dev/null +++ b/app/static/js/systems/Effects.js @@ -0,0 +1,237 @@ +/** + * Visuelle Rückmeldung: Explosionen, Funken, Rauch, Brandspuren, Mündungsfeuer, + * schwebende Texte und Bildschirmwackeln. + * + * Rückmeldung ist kein Luxus: Ohne Treffer-Aufblitzen und Funken fühlt sich Schießen + * „hohl“ an und man sieht nicht, ob man überhaupt trifft. Sind die Kenney-Partikel + * nicht geladen, fällt alles auf einfache Kreise zurück. + * @module systems/Effects + */ + +import { COLORS, FX, GAME } from '../config.js'; +import { UI } from '../ui/theme.js'; +import { TEXTURE_KEYS } from './Placeholders.js'; + +/** Kenney-Partikel sind 128 px groß; auf diese Größen wird skaliert. */ +const PARTICLE_SOURCE_SIZE = 128; +/** Höchstzahl gleichzeitig sichtbarer Brandspuren (älteste verschwinden zuerst). */ +const MAX_SCORCH_MARKS = 40; +const SCORCH_LIFETIME_MS = 20000; +const MUZZLE_FLASH_MS = 70; + +export class Effects { + /** @param {Phaser.Scene} scene */ + constructor(scene) { + this.scene = scene; + const has = (key) => scene.textures.exists(key); + this.hasKenney = has('fx-spark') && has('fx-smoke') && has('fx-fire'); + /** @type {Phaser.GameObjects.Image[]} */ + this.scorchMarks = []; + + // Gemeinsame Emitter: deutlich günstiger als ein Emitter pro Treffer. + const sparkKey = has('fx-spark') ? 'fx-spark' : TEXTURE_KEYS.particle; + const sparkScale = has('fx-spark') ? 14 / PARTICLE_SOURCE_SIZE : 0.9; + this.sparks = scene.add.particles(0, 0, sparkKey, { + lifespan: 380, + speed: { min: 80, max: 280 }, + scale: { start: sparkScale, end: 0 }, + alpha: { start: 1, end: 0 }, + rotate: { min: 0, max: 360 }, + blendMode: 'ADD', + emitting: false, + }); + this.sparks.setDepth(GAME.depth.effects); + + if (this.hasKenney) { + this.fire = scene.add.particles(0, 0, 'fx-fire', { + lifespan: 450, + speed: { min: 20, max: 140 }, + scale: { start: 0.35, end: 0 }, + alpha: { start: 0.9, end: 0 }, + rotate: { min: 0, max: 360 }, + blendMode: 'ADD', + emitting: false, + }); + this.smoke = scene.add.particles(0, 0, 'fx-smoke', { + lifespan: 1100, + speed: { min: 10, max: 60 }, + scale: { start: 0.3, end: 0.9 }, + alpha: { start: 0.45, end: 0 }, + rotate: { min: 0, max: 360 }, + tint: 0x555555, + emitting: false, + }); + this.fire.setDepth(GAME.depth.effects); + this.smoke.setDepth(GAME.depth.effects - 1); + } + } + + /** + * Funkenregen an einer Stelle. + * @param {number} x + * @param {number} y + * @param {number} color + * @param {number} [count] + */ + burst(x, y, color, count = 8) { + this.sparks.setParticleTint(color); + this.sparks.explode(count, x, y); + } + + /** + * Explosion mit Feuer, Rauch, Lichtblitz und Brandspur. Der Ring zeigt den + * tatsächlichen Wirkungsradius, damit Spieler lernen, wie weit Schaden reicht. + * @param {number} x + * @param {number} y + * @param {number} radius + * @param {number} color + */ + explosion(x, y, radius, color) { + const ring = this.scene.add.circle(x, y, radius, color, 0.22).setDepth(GAME.depth.effects); + ring.setStrokeStyle(4, color, 0.9); + ring.setScale(0.15); + this.scene.tweens.add({ + targets: ring, + scale: 1, + alpha: 0, + duration: 380, + ease: 'Cubic.easeOut', + onComplete: () => ring.destroy(), + }); + + if (this.hasKenney) { + const amount = Math.min(28, Math.round(radius / 6)); + this.fire.explode(amount, x, y); + this.smoke.explode(Math.ceil(amount / 2), x, y); + this.glow(x, y, radius * 1.6, color); + this.scorch(x, y, radius); + } + this.burst(x, y, color, Math.min(40, Math.round(radius / 5))); + this.burst(x, y, COLORS.cream, 8); + this.shake('explosion'); + } + + /** Kurzer, additiver Lichtblitz. */ + glow(x, y, size, color) { + if (!this.scene.textures.exists('fx-glow')) return; + const flash = this.scene.add + .image(x, y, 'fx-glow') + .setDisplaySize(size, size) + .setTint(color) + .setBlendMode(Phaser.BlendModes.ADD) + .setDepth(GAME.depth.effects); + this.scene.tweens.add({ targets: flash, alpha: 0, duration: 260, onComplete: () => flash.destroy() }); + } + + /** Brandspur auf dem Boden, die langsam verblasst. */ + scorch(x, y, radius) { + if (!this.scene.textures.exists('fx-scorch')) return; + const mark = this.scene.add + .image(x, y, 'fx-scorch') + .setDisplaySize(radius * 2.2, radius * 2.2) + .setAngle(Math.random() * 360) + .setTint(0x1a1410) + .setAlpha(0.55) + .setDepth(GAME.depth.ground + 2); + this.scorchMarks.push(mark); + if (this.scorchMarks.length > MAX_SCORCH_MARKS) this.scorchMarks.shift()?.destroy(); + this.scene.tweens.add({ + targets: mark, + alpha: 0, + delay: SCORCH_LIFETIME_MS, + duration: 2000, + onComplete: () => { + this.scorchMarks = this.scorchMarks.filter((m) => m !== mark); + mark.destroy(); + }, + }); + } + + /** + * Aufsteigender, verblassender Text (Punkte, Meldungen am Ort). + * @param {number} x + * @param {number} y + * @param {string} text + * @param {string} [color] + * @param {number} [fontSize] + */ + floatingText(x, y, text, color = '#f2c14e', fontSize = 18) { + const label = this.scene.add + .text(x, y, text, { + fontFamily: UI.uiFont, + fontStyle: 'bold', + fontSize: `${fontSize}px`, + color, + stroke: '#0d1321', + strokeThickness: 4, + }) + .setOrigin(0.5) + .setDepth(GAME.depth.effects); + this.scene.tweens.add({ + targets: label, + y: y - 36, + alpha: 0, + duration: FX.damageNumberMs, + ease: 'Quad.easeOut', + onComplete: () => label.destroy(), + }); + } + + /** + * Kamera wackeln lassen. + * @param {'hit'|'explosion'} kind + */ + shake(kind) { + const cfg = FX.screenShake[kind]; + this.scene.cameras.main.shake(cfg.durationMs, cfg.intensity); + } + + /** + * Lässt ein Sprite kurz weiß aufblitzen (Treffer-Feedback). + * @param {Phaser.GameObjects.Sprite} sprite + */ + flash(sprite) { + sprite.setTintFill(0xffffff); + this.scene.time.delayedCall(FX.hitFlashMs, () => { + if (sprite.active) sprite.clearTint(); + }); + } + + /** + * Nachbild einer Figur (Ausweichrolle): verdeutlicht Richtung und Tempo der Bewegung. + * @param {Phaser.GameObjects.Sprite} sprite + */ + afterimage(sprite) { + const ghost = this.scene.add + .image(sprite.x, sprite.y, sprite.texture.key) + .setRotation(sprite.rotation) + .setAlpha(0.45) + .setTint(COLORS.gold) + .setDepth(sprite.depth - 1); + this.scene.tweens.add({ targets: ghost, alpha: 0, scale: 1.15, duration: 260, onComplete: () => ghost.destroy() }); + } + + /** + * Mündungsfeuer an der Waffenspitze. + * @param {number} x + * @param {number} y + * @param {number} angle Schussrichtung (Bogenmaß). + * @param {number} [color] + */ + muzzle(x, y, angle, color = COLORS.playerBullet) { + if (this.scene.textures.exists('fx-muzzle')) { + // Die Kenney-Grafik zeigt nach oben – um 90° drehen, damit sie in Schussrichtung zeigt. + const flash = this.scene.add + .image(x, y, 'fx-muzzle') + .setOrigin(0.5, 0.9) + .setRotation(angle + Math.PI / 2) + .setScale(0.26) + .setTint(color) + .setBlendMode(Phaser.BlendModes.ADD) + .setDepth(GAME.depth.effects); + this.scene.tweens.add({ targets: flash, alpha: 0, duration: MUZZLE_FLASH_MS, onComplete: () => flash.destroy() }); + } else { + this.burst(x, y, color, 3); + } + } +} diff --git a/app/static/js/systems/GroundMarker.js b/app/static/js/systems/GroundMarker.js new file mode 100644 index 0000000..2315679 --- /dev/null +++ b/app/static/js/systems/GroundMarker.js @@ -0,0 +1,85 @@ +/** + * Bodenmarkierung für verzögerte Einschläge (Orbital-Befehle, Mörser). + * + * Die Markierung zeigt den tatsächlichen Wirkungsradius und füllt sich bis zum + * Einschlag – so kann der Spieler Gefahr erkennen und ausweichen. + * @module systems/GroundMarker + */ + +import { GAME } from '../config.js'; +import { UI } from '../ui/theme.js'; + +export class GroundMarker { + /** + * @param {Phaser.Scene} scene + * @param {number} x + * @param {number} y + * @param {number} radius + * @param {number} color + * @param {number} startAt Spielzeit bei Erstellung. + * @param {number} impactAt Spielzeit des Einschlags. + * @param {{label?: string, beam?: boolean}} [options] + */ + constructor(scene, x, y, radius, color, startAt, impactAt, options = {}) { + this.scene = scene; + this.x = x; + this.y = y; + this.radius = radius; + this.color = color; + this.startAt = startAt; + this.impactAt = impactAt; + this.beam = options.beam ?? false; + this.graphics = scene.add.graphics().setDepth(GAME.depth.markers); + this.label = options.label + ? scene.add + .text(x, y, '', { + fontFamily: UI.uiFont, + fontStyle: 'bold', + fontSize: '16px', + color: '#f4ecd8', + stroke: '#0d1321', + strokeThickness: 4, + }) + .setOrigin(0.5) + .setDepth(GAME.depth.markers + 1) + : null; + this.labelText = options.label ?? ''; + } + + /** + * Zeichnet den aktuellen Zustand. + * @param {number} now + */ + update(now) { + const total = Math.max(1, this.impactAt - this.startAt); + const progress = Math.min(1, Math.max(0, (now - this.startAt) / total)); + // Puls wird zum Einschlag hin schneller – intuitive Warnung ohne Text. + const pulse = 0.5 + 0.5 * Math.sin(now / (120 - 80 * progress)); + const g = this.graphics; + g.clear(); + g.fillStyle(this.color, 0.12 + 0.1 * pulse); + g.fillCircle(this.x, this.y, this.radius); + g.fillStyle(this.color, 0.35); + g.fillCircle(this.x, this.y, this.radius * progress); + g.lineStyle(3, this.color, 0.6 + 0.4 * pulse); + g.strokeCircle(this.x, this.y, this.radius); + if (this.beam) { + g.lineStyle(2 + 6 * progress, this.color, 0.25 + 0.5 * progress); + g.lineBetween(this.x, this.y - 900, this.x, this.y); + } + if (this.label) { + const seconds = Math.max(0, (this.impactAt - now) / 1000).toFixed(1).replace('.', ','); + this.label.setText(`${this.labelText} ${seconds}`); + } + } + + /** @param {number} now @returns {boolean} */ + isDue(now) { + return now >= this.impactAt; + } + + destroy() { + this.graphics.destroy(); + this.label?.destroy(); + } +} diff --git a/app/static/js/systems/Music.js b/app/static/js/systems/Music.js new file mode 100644 index 0000000..6033cb5 --- /dev/null +++ b/app/static/js/systems/Music.js @@ -0,0 +1,130 @@ +/** + * Spielt den Marsch aus `logic/marchPattern.js` mit synthetischen Instrumenten. + * + * Zeitplanung nach dem Muster „Vorausplanen mit zwei Uhren“: Ein grober JavaScript- + * Timer plant alle 25 ms die Noten der nächsten ~120 ms exakt auf der Audio-Uhr ein. + * Direkt im Timer zu spielen würde hörbar wackeln, weil JavaScript-Timer ungenau sind. + * @module systems/Music + */ + +import { eventsAtStep, midiToFrequency, STEP_SECONDS, TOTAL_STEPS } from '../logic/marchPattern.js'; + +const SCHEDULER_INTERVAL_MS = 25; +const LOOKAHEAD_SECONDS = 0.12; +/** Grundlautstärke der Musik vor dem Musik-Regler. */ +const MUSIC_LEVEL = 0.55; +/** Liegt die Planung weiter zurück (Tab im Hintergrund), wird neu synchronisiert statt nachgeholt. */ +const MAX_LAG_SECONDS = 0.25; + +export class MarchMusic { + /** + * @param {AudioContext} ctx + * @param {AudioNode} destination Musik-Bus. + * @param {AudioBuffer} noiseBuffer + */ + constructor(ctx, destination, noiseBuffer) { + this.ctx = ctx; + this.noiseBuffer = noiseBuffer; + this.out = ctx.createGain(); + this.out.gain.value = MUSIC_LEVEL; + this.out.connect(destination); + this.timer = null; + this.step = 0; + this.nextTime = 0; + } + + start() { + if (this.timer !== null) return; + this.step = 0; + this.nextTime = this.ctx.currentTime + 0.1; + this.timer = setInterval(() => this.schedule(), SCHEDULER_INTERVAL_MS); + } + + /** Blendet aus und gibt die Knoten frei. */ + stop() { + if (this.timer !== null) clearInterval(this.timer); + this.timer = null; + const now = this.ctx.currentTime; + this.out.gain.setTargetAtTime(0, now, 0.08); + const out = this.out; + setTimeout(() => out.disconnect(), 600); + } + + /** @private */ + schedule() { + const now = this.ctx.currentTime; + if (this.nextTime < now - MAX_LAG_SECONDS) this.nextTime = now + 0.05; + while (this.nextTime < now + LOOKAHEAD_SECONDS) { + for (const event of eventsAtStep(this.step)) this.play(event, this.nextTime); + this.nextTime += STEP_SECONDS; + this.step = (this.step + 1) % TOTAL_STEPS; + } + } + + /** + * @param {import('../logic/marchPattern.js').MusicEvent} event + * @param {number} time Audio-Zeit. + * @private + */ + play(event, time) { + const length = event.lengthSteps * STEP_SECONDS; + switch (event.instrument) { + case 'kick': + this.voice('sine', 150, time, 0.22, 0.9 * event.velocity, 45); + break; + case 'snare': + this.snare(time, 0.35 * event.velocity); + break; + case 'bass': + this.voice('triangle', midiToFrequency(event.notes[0]), time, length * 0.9, 0.35 * event.velocity); + break; + case 'stab': + for (const note of event.notes) { + this.voice('sawtooth', midiToFrequency(note), time, length * 0.7, 0.05 * event.velocity, undefined, 1400); + } + break; + case 'lead': + this.voice('square', midiToFrequency(event.notes[0]), time, length * 0.92, 0.06 * event.velocity, undefined, 2600); + break; + default: + break; + } + } + + /** @private */ + voice(type, freq, time, duration, volume, freqEnd, lowpass) { + const osc = this.ctx.createOscillator(); + const gain = this.ctx.createGain(); + osc.type = type; + osc.frequency.setValueAtTime(freq, time); + if (freqEnd) osc.frequency.exponentialRampToValueAtTime(freqEnd, time + duration); + gain.gain.setValueAtTime(0.0001, time); + gain.gain.exponentialRampToValueAtTime(volume, time + 0.01); + gain.gain.exponentialRampToValueAtTime(0.0001, time + duration); + let node = osc.connect(gain); + if (lowpass) { + const filter = this.ctx.createBiquadFilter(); + filter.type = 'lowpass'; + filter.frequency.value = lowpass; + node = gain.connect(filter); + } + node.connect(this.out); + osc.start(time); + osc.stop(time + duration + 0.05); + } + + /** @private */ + snare(time, volume) { + const source = this.ctx.createBufferSource(); + source.buffer = this.noiseBuffer; + const filter = this.ctx.createBiquadFilter(); + filter.type = 'highpass'; + filter.frequency.value = 1500; + const gain = this.ctx.createGain(); + gain.gain.setValueAtTime(volume, time); + gain.gain.exponentialRampToValueAtTime(0.0001, time + 0.12); + source.connect(filter).connect(gain).connect(this.out); + source.start(time, Math.random() * 0.5); + source.stop(time + 0.15); + } +} diff --git a/app/static/js/systems/OrbitalSystem.js b/app/static/js/systems/OrbitalSystem.js new file mode 100644 index 0000000..b710457 --- /dev/null +++ b/app/static/js/systems/OrbitalSystem.js @@ -0,0 +1,179 @@ +/** + * Orbital-Befehle: Eingabe (Halte-Taste + Richtungsfolge), Abklingzeiten, + * Bodenmarkierung und verzögerter Einschlag. + * + * Die Eingabelogik steckt in `logic/comboInput.js`, die Abklingzeiten in + * `logic/cooldowns.js`; hier wird beides mit Phaser-Tastatur und Grafik verbunden. + * @module systems/OrbitalSystem + */ + +import { COLORS, GAME, ORBITAL } from '../config.js'; +import { codeToDirection, ComboInput } from '../logic/comboInput.js'; +import { CooldownTracker } from '../logic/cooldowns.js'; +import { clamp, distance } from '../logic/math.js'; +import { GroundMarker } from './GroundMarker.js'; +import { oncePerEvent } from './keyboard.js'; + +/** Farbe der Markierung je Befehl. */ +const MARKER_COLORS = Object.freeze({ + strike: COLORS.strike, + supply: COLORS.supply, + turret: COLORS.turret, +}); + +/** + * @typedef {typeof ORBITAL.commands[number]} OrbitalCommand + */ + +/** + * @typedef {Object} OrbitalCallbacks + * @property {() => {x: number, y: number}} getPlayer + * @property {() => {x: number, y: number}} getAimPoint Mausposition in Weltkoordinaten. + * @property {(command: OrbitalCommand, x: number, y: number) => void} onImpact + * @property {(kind: 'step'|'fail'|'deploy'|'notReady', command?: OrbitalCommand, remainingMs?: number) => void} onFeedback + */ + +export class OrbitalSystem { + /** + * @param {Phaser.Scene} scene + * @param {OrbitalCallbacks} callbacks + */ + constructor(scene, callbacks) { + this.scene = scene; + this.callbacks = callbacks; + this.commands = ORBITAL.commands; + this.combo = new ComboInput(this.commands); + this.cooldowns = new CooldownTracker(); + /** @type {{command: OrbitalCommand, marker: GroundMarker}[]} */ + this.pending = []; + this.now = 0; + + this.holdKey = scene.input.keyboard.addKey(ORBITAL.holdKey); + // Pfeiltasten abfangen, sonst scrollt der Browser die Seite. + scene.input.keyboard.addCapture('UP,DOWN,LEFT,RIGHT'); + this.onKeyDown = oncePerEvent((event) => this.handleKeyDown(event)); + scene.input.keyboard.on('keydown', this.onKeyDown); + } + + /** @returns {boolean} true, solange ein Befehl eingegeben wird (Bewegung pausiert). */ + get isInputActive() { + return this.combo.active; + } + + /** + * @param {number} now Spielzeit in ms. + */ + update(now) { + this.now = now; + if (this.holdKey.isDown && !this.combo.active) this.combo.begin(); + else if (!this.holdKey.isDown && this.combo.active) this.combo.end(); + + for (let i = this.pending.length - 1; i >= 0; i -= 1) { + const entry = this.pending[i]; + if (entry.marker.isDue(now)) { + entry.marker.destroy(); + this.pending.splice(i, 1); + this.callbacks.onImpact(entry.command, entry.marker.x, entry.marker.y); + } else { + entry.marker.update(now); + } + } + } + + /** + * @param {KeyboardEvent} event + * @private + */ + handleKeyDown(event) { + // Gedrückt gehaltene Tasten erzeugen Wiederholungen – die zählen nicht als Eingabe. + if (event.repeat) return; + // Q und erste Richtung können im selben Frame ankommen, bevor update() die + // Eingabe gestartet hat – dann hier starten, sonst ginge die erste Richtung verloren. + if (!this.combo.active && this.holdKey.isDown) this.combo.begin(); + if (!this.combo.active) return; + const direction = codeToDirection(event.code); + if (!direction) return; + const result = this.combo.push(direction); + if (result.status === 'progress') this.callbacks.onFeedback('step'); + else if (result.status === 'fail') this.callbacks.onFeedback('fail'); + else if (result.status === 'match') this.request(/** @type {string} */ (result.commandId)); + } + + /** + * Fordert einen Befehl an (sofern bereit) und setzt die Markierung ans Ziel. + * @param {string} commandId + * @returns {boolean} + */ + request(commandId) { + const command = this.commands.find((c) => c.id === commandId); + if (!command) return false; + const now = this.now; + if (!this.cooldowns.isReady(command.id, now)) { + this.callbacks.onFeedback('notReady', command, this.cooldowns.remaining(command.id, now)); + return false; + } + const target = this.clampTarget(this.callbacks.getAimPoint()); + this.cooldowns.trigger(command.id, command.cooldownMs, now); + const marker = new GroundMarker( + this.scene, + target.x, + target.y, + command.radius, + MARKER_COLORS[command.id] ?? COLORS.gold, + now, + now + command.delayMs, + { label: command.shortName, beam: true }, + ); + marker.update(now); + this.pending.push({ command, marker }); + this.callbacks.onFeedback('deploy', command); + return true; + } + + /** + * Begrenzt das Ziel auf die maximale Reichweite und die Arena. + * @param {{x: number, y: number}} aim + * @returns {{x: number, y: number}} + */ + clampTarget(aim) { + const player = this.callbacks.getPlayer(); + const d = distance(player, aim); + let { x, y } = aim; + if (d > ORBITAL.maxTargetRange) { + const f = ORBITAL.maxTargetRange / d; + x = player.x + (aim.x - player.x) * f; + y = player.y + (aim.y - player.y) * f; + } + const margin = GAME.spawnMargin; + return { + x: clamp(x, margin, GAME.world.width - margin), + y: clamp(y, margin, GAME.world.height - margin), + }; + } + + /** + * Daten für die HUD-Anzeige. + * @param {number} now + */ + hudState(now) { + return { + active: this.combo.active, + commands: this.commands.map((c) => ({ + id: c.id, + name: c.shortName, + sequence: c.sequence, + progress: this.combo.progressFor(c.id), + ready: this.cooldowns.isReady(c.id, now), + remainingMs: this.cooldowns.remaining(c.id, now), + cooldownProgress: this.cooldowns.progress(c.id, now), + })), + }; + } + + /** Aufräumen beim Beenden der Szene. */ + destroy() { + this.scene.input.keyboard?.off('keydown', this.onKeyDown); + for (const entry of this.pending) entry.marker.destroy(); + this.pending = []; + } +} diff --git a/app/static/js/systems/Overlay.js b/app/static/js/systems/Overlay.js new file mode 100644 index 0000000..c26555c --- /dev/null +++ b/app/static/js/systems/Overlay.js @@ -0,0 +1,121 @@ +/** + * HTML-Overlays über dem Spiel-Canvas (Disclaimer, Pause, Namenseingabe). + * + * Warum HTML statt Canvas-Text: Formulare, Schieberegler und längere Texte sind so + * für Screenreader und Tastatur bedienbar, und Browser-Features (Autokorrektur aus, + * Textauswahl) funktionieren ohne Nachbau. + * + * Sicherheit: Dynamische Inhalte werden ausschließlich per `textContent` gesetzt, + * niemals per `innerHTML` – Spielernamen aus der Highscore-Liste können also + * kein HTML einschleusen. + * @module systems/Overlay + */ + +/** + * Erzeugt ein Element mit Klasse und optionalem Text. + * @param {string} tag + * @param {string} [className] + * @param {string} [text] + * @returns {HTMLElement} + */ +export function el(tag, className, text) { + const node = document.createElement(tag); + if (className) node.className = className; + if (text !== undefined) node.textContent = text; + return node; +} + +/** + * @typedef {Object} OverlayButton + * @property {string} label + * @property {() => void} onClick + * @property {boolean} [secondary] + * @property {string} [testId] data-testid für End-to-End-Tests. + */ + +/** + * @typedef {Object} OverlayOptions + * @property {string} [title] + * @property {Node[]} [content] + * @property {OverlayButton[]} [buttons] + * @property {string} [id] + * @property {() => void} [onEscape] Wird bei Esc aufgerufen (z. B. Schließen/Fortsetzen). + */ + +export class Overlay { + /** + * Öffnet ein Overlay im Element #overlay-root. + * @param {OverlayOptions} options + */ + constructor(options) { + const root = document.getElementById('overlay-root') ?? document.body; + this.previousFocus = document.activeElement; + this.onEscape = options.onEscape; + + this.element = el('div', 'overlay'); + if (options.id) this.element.id = options.id; + this.element.setAttribute('role', 'dialog'); + this.element.setAttribute('aria-modal', 'true'); + + this.panel = el('div', 'overlay__panel'); + this.element.append(this.panel); + + if (options.title) { + const heading = el('h2', 'disclaimer__title', options.title); + heading.id = `${options.id ?? 'overlay'}-title`; + this.element.setAttribute('aria-labelledby', heading.id); + this.panel.append(heading); + } + for (const node of options.content ?? []) this.panel.append(node); + + this.actions = el('div', 'overlay__actions'); + for (const button of options.buttons ?? []) this.addButton(button); + if (this.actions.childElementCount > 0) this.panel.append(this.actions); + + this.handleKeyDown = (event) => { + // Tasten im Overlay gehören dem Overlay: Ohne stopPropagation würde z. B. das + // Enter, mit dem man den Disclaimer bestätigt, danach auch das Menü auslösen. + event.stopPropagation(); + if (event.key === 'Escape' && this.onEscape) { + event.preventDefault(); + this.onEscape(); + } + }; + this.element.addEventListener('keydown', this.handleKeyDown); + root.append(this.element); + + // Fokus ins Overlay, damit Tastaturnutzer sofort bedienen können. + const focusTarget = this.panel.querySelector('input, button, a'); + if (focusTarget instanceof HTMLElement) focusTarget.focus(); + else { + this.panel.tabIndex = -1; + this.panel.focus(); + } + } + + /** + * @param {OverlayButton} button + * @returns {HTMLButtonElement} + */ + addButton(button) { + const node = /** @type {HTMLButtonElement} */ (el('button', `button${button.secondary ? ' button--secondary' : ''}`, button.label)); + node.type = 'button'; + if (button.testId) node.dataset.testid = button.testId; + node.addEventListener('click', () => button.onClick()); + this.actions.append(node); + return node; + } + + /** Entfernt das Overlay und gibt den Fokus zurück an das Spiel. */ + close() { + this.element.removeEventListener('keydown', this.handleKeyDown); + this.element.remove(); + const game = document.querySelector('#game canvas'); + if (game instanceof HTMLElement) { + game.tabIndex = -1; + game.focus({ preventScroll: true }); + } else if (this.previousFocus instanceof HTMLElement) { + this.previousFocus.focus({ preventScroll: true }); + } + } +} diff --git a/app/static/js/systems/Placeholders.js b/app/static/js/systems/Placeholders.js new file mode 100644 index 0000000..6697451 --- /dev/null +++ b/app/static/js/systems/Placeholders.js @@ -0,0 +1,212 @@ +/** + * Erzeugt alle Platzhalter-Texturen zur Laufzeit aus einfachen Formen. + * + * Damit ist das Spiel ohne eine einzige Bilddatei vollständig spielbar. Echte + * Grafiken (Phase „Assets“) werden unter denselben Schlüsseln geladen; fehlt eine + * Datei oder schlägt das Laden fehl, springt hier der Platzhalter ein. + * + * Konvention: Alle Figuren „schauen“ nach rechts (Winkel 0), damit + * `setRotation(zielwinkel)` ohne Versatz funktioniert. + * @module systems/Placeholders + */ + +import { COLORS, ENEMY_TYPES, PLAYER } from '../config.js'; + +/** Alle Texturschlüssel, die das Spiel verwendet. */ +export const TEXTURE_KEYS = Object.freeze({ + player: 'player', + enemy: (typeId) => `enemy-${typeId}`, + bulletPlayer: 'bullet-player', + bulletEnemy: 'bullet-enemy', + bulletTurret: 'bullet-turret', + turret: 'turret', + supplyPod: 'supply-pod', + ground: 'ground', + particle: 'particle', + crosshair: 'crosshair', + emblem: 'emblem', +}); + +/** + * Zeichnet mit einer temporären Graphics-Instanz und speichert das Ergebnis als Textur. + * Bereits vorhandene Texturen (z. B. geladene Grafiken) werden nicht überschrieben. + * @param {Phaser.Scene} scene + * @param {string} key + * @param {number} width + * @param {number} height + * @param {(g: Phaser.GameObjects.Graphics) => void} draw + */ +function makeTexture(scene, key, width, height, draw) { + if (scene.textures.exists(key)) return; + const g = scene.make.graphics({ x: 0, y: 0 }, false); + draw(g); + g.generateTexture(key, width, height); + g.destroy(); +} + +function drawPlayer(g) { + const s = PLAYER.radius * 2 + 12; + const c = s / 2; + // Umhang (hinten, also links) in den Farben der Vereinigten Erde. + g.fillStyle(COLORS.playerCape, 1); + g.fillTriangle(c - 4, c - 16, c - 4, c + 16, 2, c); + g.fillStyle(COLORS.gold, 1); + g.fillRect(c - 8, c - 2, 6, 4); + // Rüstung + g.fillStyle(COLORS.player, 1); + g.fillCircle(c, c, PLAYER.radius - 2); + g.lineStyle(3, COLORS.gold, 1); + g.strokeCircle(c, c, PLAYER.radius - 2); + // Geschlossener Helm mit Visier – bewusst ohne Gesicht. + g.fillStyle(COLORS.navy, 1); + g.fillRoundedRect(c + 2, c - 7, 9, 14, 3); + // Waffe + g.fillStyle(COLORS.navy, 1); + g.fillRect(c + 6, c + 4, s / 2 - 6, 5); +} + +function drawSwarm(g, size, variant) { + const c = size / 2; + const r = size / 2 - 3; + g.lineStyle(2, COLORS.swarmDark, 1); + // Beine + for (let i = -1; i <= 1; i += 1) { + g.lineBetween(c + i * r * 0.4, c - r * 0.5, c + i * r * 0.55, 1); + g.lineBetween(c + i * r * 0.4, c + r * 0.5, c + i * r * 0.55, size - 1); + } + g.fillStyle(COLORS.swarm, 1); + g.fillEllipse(c - r * 0.15, c, r * 1.6, r * 1.2); + g.fillStyle(COLORS.swarmDark, 1); + g.fillCircle(c + r * 0.6, c, r * 0.35); + if (variant === 'medium') { + // Sprungkralle: kräftige Klauen vorne + g.lineStyle(3, COLORS.swarmDark, 1); + g.lineBetween(c + r * 0.6, c - r * 0.3, size - 1, c - r * 0.6); + g.lineBetween(c + r * 0.6, c + r * 0.3, size - 1, c + r * 0.6); + } + if (variant === 'elite') { + // Brutmutter: Eiersack + g.fillStyle(0xd9c27a, 1); + for (let i = 0; i < 5; i += 1) g.fillCircle(c - r * 0.6 + (i % 2) * 6, c - 10 + i * 5, 5); + } +} + +function drawLegion(g, size, variant) { + const c = size / 2; + const r = size / 2 - 3; + g.fillStyle(COLORS.legionDark, 1); + if (variant === 'elite') { + // Walzmeister: Ketten links und rechts + g.fillRect(4, 2, size - 8, 8); + g.fillRect(4, size - 10, size - 8, 8); + } + g.fillStyle(COLORS.legion, 1); + if (variant === 'small') { + g.fillCircle(c, c, r); + } else { + g.fillRoundedRect(c - r, c - r * 0.8, r * 1.7, r * 1.6, 5); + } + g.lineStyle(2, COLORS.legionDark, 1); + g.strokeCircle(c, c, r * 0.55); + // Rotes „Auge“ + g.fillStyle(COLORS.enemyBullet, 1); + g.fillCircle(c + r * 0.35, c, Math.max(2, r * 0.18)); + // Waffenlauf(e) + g.fillStyle(COLORS.legionDark, 1); + if (variant === 'elite') { + g.fillRect(c + r * 0.5, c - 10, r * 0.55, 6); + g.fillRect(c + r * 0.5, c + 4, r * 0.55, 6); + } else { + g.fillRect(c + r * 0.5, c - 2, r * 0.55, 4); + } +} + +/** + * Erzeugt alle Platzhalter, die noch nicht als echte Grafik geladen wurden. + * @param {Phaser.Scene} scene + */ +export function createPlaceholderTextures(scene) { + const playerSize = PLAYER.radius * 2 + 12; + makeTexture(scene, TEXTURE_KEYS.player, playerSize, playerSize, drawPlayer); + + for (const type of Object.values(ENEMY_TYPES)) { + const size = type.radius * 2 + 6; + makeTexture(scene, TEXTURE_KEYS.enemy(type.id), size, size, (g) => + type.faction === 'swarm' ? drawSwarm(g, size, type.tier) : drawLegion(g, size, type.tier), + ); + } + + makeTexture(scene, TEXTURE_KEYS.bulletPlayer, 14, 6, (g) => { + g.fillStyle(COLORS.playerBullet, 1); + g.fillRoundedRect(0, 0, 14, 6, 3); + }); + makeTexture(scene, TEXTURE_KEYS.bulletTurret, 14, 6, (g) => { + g.fillStyle(COLORS.turretBullet, 1); + g.fillRoundedRect(0, 0, 14, 6, 3); + }); + makeTexture(scene, TEXTURE_KEYS.bulletEnemy, 12, 12, (g) => { + g.fillStyle(COLORS.enemyBullet, 1); + g.fillCircle(6, 6, 6); + g.fillStyle(0xffd0c0, 1); + g.fillCircle(6, 6, 2.5); + }); + + makeTexture(scene, TEXTURE_KEYS.turret, 48, 48, (g) => { + g.fillStyle(COLORS.navy, 1); + g.fillCircle(24, 24, 20); + g.lineStyle(3, COLORS.turret, 1); + g.strokeCircle(24, 24, 20); + g.fillStyle(COLORS.turret, 1); + g.fillRect(24, 20, 24, 8); + }); + + makeTexture(scene, TEXTURE_KEYS.supplyPod, 44, 44, (g) => { + // Kapsel mit Geschenkband – bewusst kein Kreuz (Rotkreuz-Zeichen ist geschützt). + g.fillStyle(COLORS.supply, 1); + g.fillRoundedRect(4, 4, 36, 36, 8); + g.fillStyle(COLORS.cream, 1); + g.fillRoundedRect(9, 9, 26, 26, 5); + g.fillStyle(COLORS.gold, 1); + g.fillRect(20, 9, 4, 26); + g.fillRect(9, 20, 26, 4); + g.fillCircle(22, 22, 4); + }); + + makeTexture(scene, TEXTURE_KEYS.ground, 128, 128, (g) => { + g.fillStyle(COLORS.ground, 1); + g.fillRect(0, 0, 128, 128); + g.fillStyle(COLORS.groundAlt, 1); + g.fillRect(0, 0, 64, 64); + g.fillRect(64, 64, 64, 64); + g.lineStyle(1, 0x000000, 0.18); + g.strokeRect(0, 0, 128, 128); + }); + + makeTexture(scene, TEXTURE_KEYS.particle, 8, 8, (g) => { + g.fillStyle(0xffffff, 1); + g.fillCircle(4, 4, 4); + }); + + makeTexture(scene, TEXTURE_KEYS.crosshair, 32, 32, (g) => { + g.lineStyle(2, COLORS.gold, 1); + g.strokeCircle(16, 16, 9); + g.lineBetween(16, 0, 16, 9); + g.lineBetween(16, 23, 16, 32); + g.lineBetween(0, 16, 9, 16); + g.lineBetween(23, 16, 32, 16); + }); + + makeTexture(scene, TEXTURE_KEYS.emblem, 160, 160, (g) => { + // Emblem der Vereinigten Erde: Planet mit Umlaufbahn (eigener Entwurf). + g.fillStyle(COLORS.navy, 1); + g.fillCircle(80, 80, 76); + g.lineStyle(6, COLORS.gold, 1); + g.strokeCircle(80, 80, 76); + g.fillStyle(COLORS.crimson, 1); + g.fillCircle(80, 80, 34); + g.lineStyle(6, COLORS.gold, 1); + g.strokeEllipse(80, 80, 132, 44); + g.fillStyle(COLORS.cream, 1); + g.fillCircle(136, 62, 8); + }); +} diff --git a/app/static/js/systems/Settings.js b/app/static/js/systems/Settings.js new file mode 100644 index 0000000..4c2f299 --- /dev/null +++ b/app/static/js/systems/Settings.js @@ -0,0 +1,157 @@ +/** + * Dauerhafte Einstellungen im Browser (localStorage) – ohne Phaser. + * + * localStorage kann fehlen oder Ausnahmen werfen (privater Modus, blockierte + * Website-Daten, volle Quote). Das Spiel muss dann trotzdem laufen: Werte bleiben + * in diesem Fall nur für die aktuelle Sitzung im Speicher. + * @module systems/Settings + */ + +import { AUDIO, HIGHSCORE, STORAGE_KEYS } from '../config.js'; +import { clamp } from '../logic/math.js'; + +/** @typedef {'master'|'music'|'sfx'} VolumeChannel */ + +/** @type {readonly VolumeChannel[]} */ +export const VOLUME_CHANNELS = Object.freeze(['master', 'music', 'sfx']); + +/** + * Schlüssel-Wert-Speicher mit JSON und Fallback auf den Arbeitsspeicher. + */ +export class SafeStorage { + /** @param {Storage|null|undefined} backend */ + constructor(backend) { + this.backend = backend ?? null; + /** @type {Map} */ + this.memory = new Map(); + } + + /** + * Erzeugt einen Speicher für den Browser; der Zugriff auf `localStorage` selbst + * kann bereits eine Ausnahme werfen (z. B. bei gesperrten Cookies). + * @returns {SafeStorage} + */ + static forBrowser() { + try { + return new SafeStorage(globalThis.localStorage); + } catch { + return new SafeStorage(null); + } + } + + /** + * @template T + * @param {string} key + * @param {T} fallback + * @returns {T} + */ + get(key, fallback) { + let raw = this.memory.get(key) ?? null; + try { + raw = this.backend?.getItem(key) ?? raw; + } catch { + // Browser verweigert den Zugriff – Speicherwert verwenden. + } + if (raw === null) return fallback; + try { + return JSON.parse(raw); + } catch { + return fallback; + } + } + + /** + * @param {string} key + * @param {unknown} value + * @returns {boolean} true, wenn dauerhaft gespeichert wurde. + */ + set(key, value) { + const raw = JSON.stringify(value); + this.memory.set(key, raw); + try { + this.backend?.setItem(key, raw); + return this.backend !== null; + } catch { + return false; + } + } +} + +/** + * Spielereinstellungen: Disclaimer-Bestätigung, Lautstärken, letzter Name. + */ +export class Settings { + /** @param {SafeStorage} storage */ + constructor(storage) { + this.storage = storage; + /** @type {Set<(channel: VolumeChannel, value: number) => void>} */ + this.volumeListeners = new Set(); + const stored = storage.get(STORAGE_KEYS.volumes, {}); + /** @type {Record} */ + this.volumes = { ...AUDIO.defaultVolumes }; + for (const channel of VOLUME_CHANNELS) { + const value = stored?.[channel]; + if (typeof value === 'number' && Number.isFinite(value)) { + this.volumes[channel] = clamp(value, 0, 1); + } + } + } + + /** @returns {boolean} */ + isDisclaimerAccepted() { + return this.storage.get(STORAGE_KEYS.disclaimerAccepted, false) === true; + } + + acceptDisclaimer() { + this.storage.set(STORAGE_KEYS.disclaimerAccepted, true); + } + + /** + * @param {VolumeChannel} channel + * @returns {number} 0..1 + */ + getVolume(channel) { + return this.volumes[channel]; + } + + /** + * Effektive Lautstärke eines Kanals (inkl. Gesamtlautstärke). + * @param {'music'|'sfx'} channel + * @returns {number} + */ + effectiveVolume(channel) { + return this.volumes.master * this.volumes[channel]; + } + + /** + * @param {VolumeChannel} channel + * @param {number} value 0..1, wird begrenzt. + */ + setVolume(channel, value) { + if (!VOLUME_CHANNELS.includes(channel)) return; + const safe = Number.isFinite(value) ? clamp(value, 0, 1) : this.volumes[channel]; + this.volumes[channel] = safe; + this.storage.set(STORAGE_KEYS.volumes, this.volumes); + for (const listener of this.volumeListeners) listener(channel, safe); + } + + /** + * @param {(channel: VolumeChannel, value: number) => void} listener + * @returns {() => void} Funktion zum Abmelden. + */ + onVolumeChange(listener) { + this.volumeListeners.add(listener); + return () => this.volumeListeners.delete(listener); + } + + /** @returns {string} */ + getLastName() { + const name = this.storage.get(STORAGE_KEYS.lastName, ''); + return typeof name === 'string' ? name.slice(0, HIGHSCORE.nameMaxLength) : ''; + } + + /** @param {string} name */ + setLastName(name) { + this.storage.set(STORAGE_KEYS.lastName, String(name).slice(0, HIGHSCORE.nameMaxLength)); + } +} diff --git a/app/static/js/systems/Synth.js b/app/static/js/systems/Synth.js new file mode 100644 index 0000000..be49558 --- /dev/null +++ b/app/static/js/systems/Synth.js @@ -0,0 +1,138 @@ +/** + * Synthetische Klänge über die Web Audio API – ohne eine einzige Audiodatei. + * + * Dient als Ersatz, wenn Klangdateien fehlen oder der Browser OGG nicht dekodiert, + * und liefert Effekte, für die es kein passendes Sample gibt (Rolle, Mörserpfeifen). + * @module systems/Synth + */ + +/** + * Erzeugt eine Sekunde weißes Rauschen (wird für Rausch-Effekte wiederverwendet). + * @param {BaseAudioContext} ctx + * @returns {AudioBuffer} + */ +export function createNoiseBuffer(ctx) { + const buffer = ctx.createBuffer(1, ctx.sampleRate, ctx.sampleRate); + const data = buffer.getChannelData(0); + for (let i = 0; i < data.length; i += 1) data[i] = Math.random() * 2 - 1; + return buffer; +} + +/** + * Hüllkurve: schneller Anstieg, exponentielles Abklingen. Exponentiell klingt + * natürlicher als linear, darf aber nie genau 0 erreichen (daher 0.0001). + * @param {GainNode} gain + * @param {number} start + * @param {number} peak + * @param {number} attack + * @param {number} duration + */ +function envelope(gain, start, peak, attack, duration) { + gain.gain.setValueAtTime(0.0001, start); + gain.gain.exponentialRampToValueAtTime(Math.max(0.0002, peak), start + attack); + gain.gain.exponentialRampToValueAtTime(0.0001, start + duration); +} + +/** + * Einzelner Ton mit optionalem Tonhöhenverlauf. + * @param {AudioContext} ctx + * @param {AudioNode} destination + * @param {{type?: OscillatorType, freq: number, freqEnd?: number, duration: number, volume: number, attack?: number, delay?: number}} p + */ +export function tone(ctx, destination, p) { + const start = ctx.currentTime + (p.delay ?? 0); + const osc = ctx.createOscillator(); + const gain = ctx.createGain(); + osc.type = p.type ?? 'sine'; + osc.frequency.setValueAtTime(p.freq, start); + if (p.freqEnd) osc.frequency.exponentialRampToValueAtTime(p.freqEnd, start + p.duration); + envelope(gain, start, p.volume, p.attack ?? 0.005, p.duration); + osc.connect(gain).connect(destination); + osc.start(start); + osc.stop(start + p.duration + 0.05); +} + +/** + * Gefiltertes Rauschen (Knall, Zischen, Wusch). + * @param {AudioContext} ctx + * @param {AudioNode} destination + * @param {AudioBuffer} noiseBuffer + * @param {{filter?: BiquadFilterType, freq: number, freqEnd?: number, q?: number, duration: number, volume: number, attack?: number}} p + */ +export function noise(ctx, destination, noiseBuffer, p) { + const start = ctx.currentTime; + const source = ctx.createBufferSource(); + source.buffer = noiseBuffer; + const filter = ctx.createBiquadFilter(); + filter.type = p.filter ?? 'lowpass'; + filter.Q.value = p.q ?? 1; + filter.frequency.setValueAtTime(p.freq, start); + if (p.freqEnd) filter.frequency.exponentialRampToValueAtTime(p.freqEnd, start + p.duration); + const gain = ctx.createGain(); + envelope(gain, start, p.volume, p.attack ?? 0.004, p.duration); + source.connect(filter).connect(gain).connect(destination); + source.start(start, Math.random() * 0.5); + source.stop(start + p.duration + 0.05); +} + +/** Tonfolge (Fanfaren, Hinweise). */ +function arpeggio(ctx, dest, freqs, step, type, volume) { + freqs.forEach((freq, i) => tone(ctx, dest, { type, freq, duration: step * 1.6, volume, delay: i * step })); +} + +/** + * Rezepte je Effektname. `v` ist die Lautstärke (0..1) des Effekts. + * @type {Record void>} + */ +export const SYNTH_RECIPES = { + 'shot-carbine': (c, d, n, v) => { + tone(c, d, { type: 'square', freq: 1400, freqEnd: 300, duration: 0.08, volume: 0.25 * v }); + noise(c, d, n, { filter: 'highpass', freq: 2500, duration: 0.06, volume: 0.2 * v }); + }, + 'shot-shotgun': (c, d, n, v) => noise(c, d, n, { freq: 3000, freqEnd: 300, duration: 0.25, volume: 0.6 * v }), + 'shot-pistol': (c, d, _n, v) => tone(c, d, { type: 'square', freq: 900, freqEnd: 200, duration: 0.1, volume: 0.3 * v }), + 'turret-shot': (c, d, _n, v) => tone(c, d, { type: 'triangle', freq: 1800, freqEnd: 600, duration: 0.06, volume: 0.25 * v }), + 'enemy-shot': (c, d, _n, v) => tone(c, d, { type: 'sawtooth', freq: 500, freqEnd: 150, duration: 0.12, volume: 0.15 * v }), + 'hit-flesh': (c, d, n, v) => noise(c, d, n, { filter: 'bandpass', freq: 700, q: 2, duration: 0.07, volume: 0.5 * v }), + 'hit-metal': (c, d, _n, v) => tone(c, d, { type: 'triangle', freq: 2200, freqEnd: 1600, duration: 0.09, volume: 0.25 * v }), + 'death-swarm': (c, d, n, v) => noise(c, d, n, { filter: 'bandpass', freq: 900, freqEnd: 200, q: 3, duration: 0.3, volume: 0.6 * v }), + 'death-legion': (c, d, n, v) => noise(c, d, n, { freq: 1800, freqEnd: 200, duration: 0.35, volume: 0.6 * v }), + 'explosion-small': (c, d, n, v) => { + noise(c, d, n, { freq: 1200, freqEnd: 120, duration: 0.6, volume: 0.8 * v }); + tone(c, d, { freq: 110, freqEnd: 40, duration: 0.35, volume: 0.6 * v }); + }, + 'explosion-big': (c, d, n, v) => { + noise(c, d, n, { freq: 900, freqEnd: 60, duration: 1.4, volume: 1 * v }); + tone(c, d, { freq: 80, freqEnd: 30, duration: 0.9, volume: 0.9 * v }); + }, + 'player-hit': (c, d, n, v) => { + tone(c, d, { type: 'square', freq: 220, freqEnd: 90, duration: 0.15, volume: 0.35 * v }); + noise(c, d, n, { filter: 'bandpass', freq: 500, duration: 0.1, volume: 0.4 * v }); + }, + 'player-death': (c, d, n, v) => { + noise(c, d, n, { freq: 700, freqEnd: 50, duration: 1.8, volume: 1 * v }); + tone(c, d, { type: 'sawtooth', freq: 300, freqEnd: 40, duration: 1.6, volume: 0.3 * v }); + }, + reload: (c, d, n, v) => noise(c, d, n, { filter: 'bandpass', freq: 2500, q: 4, duration: 0.08, volume: 0.5 * v }), + 'reload-done': (c, d, _n, v) => tone(c, d, { type: 'square', freq: 1200, duration: 0.04, volume: 0.2 * v }), + switch: (c, d, _n, v) => tone(c, d, { type: 'triangle', freq: 700, duration: 0.05, volume: 0.3 * v }), + 'combo-step': (c, d, _n, v) => tone(c, d, { type: 'sine', freq: 880, duration: 0.05, volume: 0.35 * v }), + 'combo-fail': (c, d, _n, v) => tone(c, d, { type: 'square', freq: 180, freqEnd: 120, duration: 0.18, volume: 0.25 * v }), + 'orbital-call': (c, d, _n, v) => arpeggio(c, d, [523, 659, 784, 1047], 0.06, 'triangle', 0.3 * v), + pickup: (c, d, _n, v) => arpeggio(c, d, [659, 784, 988, 1319], 0.05, 'sine', 0.35 * v), + brood: (c, d, n, v) => noise(c, d, n, { filter: 'bandpass', freq: 400, freqEnd: 900, q: 5, duration: 0.4, volume: 0.5 * v }), + 'ui-click': (c, d, _n, v) => tone(c, d, { type: 'sine', freq: 1000, duration: 0.03, volume: 0.3 * v }), + 'ui-confirm': (c, d, _n, v) => arpeggio(c, d, [784, 1047], 0.06, 'triangle', 0.3 * v), + 'wave-start': (c, d, _n, v) => arpeggio(c, d, [392, 523, 659, 784], 0.12, 'sawtooth', 0.12 * v), + 'wave-cleared': (c, d, _n, v) => arpeggio(c, d, [523, 659, 784, 1047, 1319], 0.1, 'square', 0.1 * v), + alarm: (c, d, _n, v) => { + for (let i = 0; i < 3; i += 1) { + tone(c, d, { type: 'square', freq: 660, duration: 0.14, volume: 0.15 * v, delay: i * 0.3 }); + tone(c, d, { type: 'square', freq: 880, duration: 0.14, volume: 0.15 * v, delay: i * 0.3 + 0.15 }); + } + }, + 'game-over': (c, d, _n, v) => arpeggio(c, d, [392, 349, 311, 262], 0.22, 'triangle', 0.3 * v), + dodge: (c, d, n, v) => noise(c, d, n, { filter: 'bandpass', freq: 400, freqEnd: 2400, q: 1.5, duration: 0.25, volume: 0.5 * v, attack: 0.05 }), + // Pfeifen passend zur Mörser-Vorwarnzeit: von hoch nach tief. + mortar: (c, d, _n, v) => tone(c, d, { type: 'sine', freq: 1500, freqEnd: 450, duration: 1.3, volume: 0.2 * v, attack: 0.1 }), +}; diff --git a/app/static/js/systems/keyboard.js b/app/static/js/systems/keyboard.js new file mode 100644 index 0000000..4fb63a7 --- /dev/null +++ b/app/static/js/systems/keyboard.js @@ -0,0 +1,30 @@ +/** + * Hilfen für Phaser-Tastaturereignisse. + * @module systems/keyboard + */ + +/** + * Lässt jedes KeyboardEvent nur einmal zum Handler durch. + * + * Warum: Phaser 3.90 verarbeitet bei jedem neuen DOM-Tastaturereignis die gesamte + * Warteschlange des aktuellen Frames erneut und leert sie erst am Frame-Ende. Treffen + * drei oder mehr Tastenereignisse innerhalb eines Frames ein (schnelles Tippen, oder + * die automatische Wiederholung der gehaltenen Q-Taste während einer Befehlseingabe), + * meldet Phaser dasselbe `keydown` mehrfach. Für Orbital-Befehle hieße das: Aus + * „↓“ wird „↓ ↓“ und die Eingabe schlägt fehl. Das Ereignisobjekt selbst ist dabei + * identisch – daran erkennen wir Wiederholungen zuverlässig. + * + * @template {KeyboardEvent} E + * @param {(event: E) => void} handler + * @returns {(event: E) => void} + */ +export function oncePerEvent(handler) { + const seen = new WeakSet(); + return (event) => { + if (event && typeof event === 'object') { + if (seen.has(event)) return; + seen.add(event); + } + handler(event); + }; +} diff --git a/app/static/js/ui/MenuList.js b/app/static/js/ui/MenuList.js new file mode 100644 index 0000000..3cf7caf --- /dev/null +++ b/app/static/js/ui/MenuList.js @@ -0,0 +1,93 @@ +/** + * Senkrechte Menüliste aus Canvas-Texten, bedienbar mit Maus und Tastatur. + * @module ui/MenuList + */ + +import { oncePerEvent } from '../systems/keyboard.js'; +import { UI } from './theme.js'; + +/** + * @typedef {Object} MenuItem + * @property {string} label + * @property {() => void} onSelect + */ + +export class MenuList { + /** + * @param {Phaser.Scene} scene + * @param {number} x Mittelpunkt + * @param {number} y Oberkante des ersten Eintrags + * @param {MenuItem[]} items + * @param {{spacing?: number, fontSize?: number}} [options] + */ + constructor(scene, x, y, items, options = {}) { + this.scene = scene; + this.items = items; + this.audio = scene.registry.get('services')?.audio ?? null; + this.index = 0; + this.enabled = true; + const spacing = options.spacing ?? 58; + const fontSize = options.fontSize ?? 30; + + this.texts = items.map((item, i) => { + const text = scene.add + .text(x, y + i * spacing, item.label.toUpperCase(), { + ...UI.text, + fontSize: `${fontSize}px`, + color: UI.colors.cream, + }) + .setOrigin(0.5) + .setInteractive({ useHandCursor: true }); + text.on('pointerover', () => { + if (this.enabled) this.focus(i); + }); + text.on('pointerup', () => { + if (this.enabled) this.select(i); + }); + return text; + }); + + this.keys = scene.input.keyboard.addKeys('UP,DOWN,W,S,ENTER,SPACE'); + this.onKeyDown = oncePerEvent((event) => { + if (!this.enabled || event.repeat) return; + if (event.code === 'ArrowUp' || event.code === 'KeyW') this.focus(this.index - 1); + else if (event.code === 'ArrowDown' || event.code === 'KeyS') this.focus(this.index + 1); + else if (event.code === 'Enter' || event.code === 'Space' || event.code === 'NumpadEnter') this.select(this.index); + }); + scene.input.keyboard.on('keydown', this.onKeyDown); + scene.events.once('shutdown', () => this.destroy()); + this.focus(0); + } + + /** @param {number} index */ + focus(index) { + const count = this.items.length; + const next = (index + count) % count; + if (next !== this.index) this.audio?.play('ui-click'); + this.index = next; + this.texts.forEach((text, i) => { + const active = i === this.index; + text.setColor(active ? UI.colors.gold : UI.colors.cream); + text.setScale(active ? 1.08 : 1); + // Großbuchstaben wie auf einem Plakat; die Texte selbst bleiben normal geschrieben. + const label = this.items[i].label.toUpperCase(); + text.setText(active ? `» ${label} «` : label); + }); + } + + /** @param {number} index */ + select(index) { + this.focus(index); + this.audio?.play('ui-confirm'); + this.items[index].onSelect(); + } + + /** @param {boolean} enabled */ + setEnabled(enabled) { + this.enabled = enabled; + } + + destroy() { + this.scene.input.keyboard?.off('keydown', this.onKeyDown); + } +} diff --git a/app/static/js/ui/theme.js b/app/static/js/ui/theme.js new file mode 100644 index 0000000..2f973b4 --- /dev/null +++ b/app/static/js/ui/theme.js @@ -0,0 +1,53 @@ +/** + * Gemeinsame Text- und Farbstile für Canvas-Texte (Menüs, HUD). + * + * Es werden bewusst nur Systemschriften verwendet: Nichts wird mitgeliefert, also + * gibt es keine Lizenzfragen, und die Buchstaben sind eindeutig lesbar (die + * Tastenhinweise „Q“, „X“ oder „K“ dürfen nicht wie „O“ oder „H“ aussehen). + * @module ui/theme + */ + +export const UI = Object.freeze({ + /** Plakatschrift für Titel und große Zahlen. */ + titleFont: 'Impact, Haettenschweiler, "Arial Narrow Bold", "Arial Black", sans-serif', + /** Gut lesbare Schrift für HUD, Tabellen und Fließtext. */ + uiFont: '"Segoe UI", system-ui, -apple-system, Roboto, "Helvetica Neue", Arial, sans-serif', + /** Für Pfeile und Symbole. */ + symbolFont: '"Segoe UI Symbol", "Segoe UI", system-ui, sans-serif', + colors: Object.freeze({ + gold: '#f2c14e', + cream: '#f4ecd8', + crimson: '#c1121f', + muted: '#a9b1c4', + navy: '#0d1321', + danger: '#ff6b5a', + ok: '#5ad469', + cyan: '#9be7ff', + }), + /** Standard-Textstil (Titelschrift) mit dunkler Kontur für Lesbarkeit auf jedem Hintergrund. */ + text: Object.freeze({ + fontFamily: 'Impact, Haettenschweiler, "Arial Narrow Bold", "Arial Black", sans-serif', + fontSize: '20px', + color: '#f4ecd8', + stroke: '#0d1321', + strokeThickness: 4, + }), +}); + +/** + * Titelschrift-Stil mit Änderungen. + * @param {Partial} overrides + * @returns {Phaser.Types.GameObjects.Text.TextStyle} + */ +export function textStyle(overrides = {}) { + return { ...UI.text, ...overrides }; +} + +/** + * Wie {@link textStyle}, aber in der gut lesbaren, fetten UI-Schrift (HUD, Tabellen, Fließtext). + * @param {Partial} overrides + * @returns {Phaser.Types.GameObjects.Text.TextStyle} + */ +export function uiStyle(overrides = {}) { + return { ...UI.text, fontFamily: UI.uiFont, fontStyle: 'bold', ...overrides }; +} diff --git a/app/templates/_disclaimer_content.html b/app/templates/_disclaimer_content.html new file mode 100644 index 0000000..812831c --- /dev/null +++ b/app/templates/_disclaimer_content.html @@ -0,0 +1,9 @@ +{# Einzige Quelle des Disclaimer-Texts: wird von /disclaimer und im Spiel (index.html) genutzt. #} +

Hinweis vor dem Einsatz

+

Glory Defense ist Satire und reine Fiktion.

+
    +
  • Alle Figuren, Staaten, Organisationen und Fraktionen – einschließlich „Präsident Maximilian Valor“, der „Vereinigten Erde“, der „Schwärmer“ und der „Blechlegion“ – sind frei erfunden.
  • +
  • Ähnlichkeiten mit realen Personen, lebend oder verstorben, sowie mit realen Organisationen oder Ereignissen sind nicht beabsichtigt und rein zufällig.
  • +
  • Das Spiel vertritt keine politische Position. Es richtet sich nicht gegen reale Parteien, Politikerinnen und Politiker oder Länder.
  • +
  • Die übertriebenen Durchsagen und Parolen sind Gegenstand der Satire, nicht ihre Botschaft: Der Spott gilt Militarismus und Propaganda im Allgemeinen.
  • +
diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..a04acb7 --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,14 @@ + + + + + + + {% block title %}Glory Defense{% endblock %} + + + + +{% block content %}{% endblock %} + + diff --git a/app/templates/disclaimer.html b/app/templates/disclaimer.html new file mode 100644 index 0000000..a3fb4c4 --- /dev/null +++ b/app/templates/disclaimer.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block title %}Disclaimer – Glory Defense{% endblock %} +{% block body_class %}page{% endblock %} +{% block content %} +
+ {% include "_disclaimer_content.html" %} +

+ Zurück zum Spiel +

+
+{% endblock %} diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..89af5dd --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} +{% block body_class %}game-page{% endblock %} +{% block content %} +{# + Alle URLs kommen per data-Attribut ins JavaScript. So funktioniert das Spiel auch, + wenn die App in cPanel unter einer Unter-URL (z. B. /glory) eingebunden ist. +#} +
+
+
+

Lade Einsatzdaten …

+ +
+ + + +{% endblock %} diff --git a/app/validation.py b/app/validation.py new file mode 100644 index 0000000..0517d7c --- /dev/null +++ b/app/validation.py @@ -0,0 +1,219 @@ +"""Validierung und Plausibilitätsprüfung von Highscore-Einreichungen. + +Reine Funktionen ohne Flask-Abhängigkeit, damit sie isoliert testbar sind. +""" + +from __future__ import annotations + +import logging +import re +import unicodedata +from collections.abc import Iterable, Mapping +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +logger = logging.getLogger(__name__) + +NAME_MAX_LENGTH = 16 + +#: Obergrenze für die Rohlänge, bevor überhaupt bereinigt wird – schützt vor +#: unnötiger Arbeit an absurd langen Eingaben. +NAME_RAW_MAX_LENGTH = 200 + +#: Alles außer Buchstaben, Ziffern, Unterstrich, Leerzeichen und ein paar harmlosen +#: Satzzeichen wird entfernt. Umlaute und andere Unicode-Buchstaben bleiben erhalten. +_DISALLOWED_NAME_CHARS = re.compile(r"[^\w .\-'!?]") + +RUN_TOKEN_MAX_LENGTH = 512 + + +class SubmissionError(ValueError): + """Ungültige Einreichung; ``fields`` ordnet Feldnamen eine lesbare Meldung zu.""" + + def __init__(self, fields: dict[str, str]) -> None: + super().__init__("; ".join(f"{key}: {msg}" for key, msg in fields.items())) + self.fields = fields + + +@dataclass(frozen=True) +class ScoreSubmission: + """Eine formal gültige Highscore-Einreichung.""" + + name: str + score: int + wave: int + duration_s: int + run_token: str + + +@dataclass(frozen=True) +class PlausibilityRules: + """Grenzwerte für die Plausibilitätsprüfung (siehe ``config.GAME_RULE_DEFAULTS``).""" + + score_max: int + score_flat_allowance: int + score_max_points_per_second: int + wave_max: int + wave_min_seconds: int + duration_max_seconds: int + duration_tolerance_seconds: int + + @classmethod + def from_config(cls, config: Mapping[str, Any]) -> PlausibilityRules: + """Erzeugt die Regeln aus einer Flask-Konfiguration.""" + return cls( + score_max=int(config["SCORE_MAX"]), + score_flat_allowance=int(config["SCORE_FLAT_ALLOWANCE"]), + score_max_points_per_second=int(config["SCORE_MAX_POINTS_PER_SECOND"]), + wave_max=int(config["WAVE_MAX"]), + wave_min_seconds=int(config["WAVE_MIN_SECONDS"]), + duration_max_seconds=int(config["DURATION_MAX_SECONDS"]), + duration_tolerance_seconds=int(config["DURATION_TOLERANCE_SECONDS"]), + ) + + +def sanitize_name(raw: str) -> str: + """Bereinigt einen Spielernamen für Anzeige und Speicherung. + + Schritte: Unicode-Normalisierung (NFKC, macht z. B. Vollbreiten-Zeichen zu normalen), + Entfernen von Steuer- und Formatzeichen (u. a. unsichtbare Zero-Width- und + Bidi-Zeichen, mit denen man Namen optisch fälschen könnte), Entfernen nicht + erlaubter Zeichen und Zusammenfassen von Leerraum. + + Die Ausgabe im Frontend wird trotzdem immer als Text (nicht als HTML) gesetzt – + die Bereinigung ist eine zweite Verteidigungslinie, nicht die einzige. + """ + text = unicodedata.normalize("NFKC", raw) + # Kategorie „C*“ = Steuer-, Format-, Surrogat-, private und nicht zugewiesene Zeichen. + text = "".join(ch for ch in text if not unicodedata.category(ch).startswith("C")) + text = _DISALLOWED_NAME_CHARS.sub("", text) + return " ".join(text.split()) + + +def normalize_for_blocklist(text: str) -> str: + """Vergleichsform für die Sperrliste: klein geschrieben, nur Buchstaben und Ziffern. + + So lassen sich gesperrte Begriffe nicht mit Leerzeichen, Punkten oder anderer + Groß-/Kleinschreibung umgehen („M.a.x Muster“ entspricht „maxmuster“). + """ + folded = unicodedata.normalize("NFKC", text).casefold() + return "".join(ch for ch in folded if ch.isalnum()) + + +def load_blocklist(path: str | Path) -> list[str]: + """Liest die Sperrliste (UTF-8, ein Begriff pro Zeile, ``#`` leitet Kommentare ein). + + Fehlt die Datei, ist nichts gesperrt. Ist sie unlesbar, wird gewarnt, statt die + Einreichung scheitern zu lassen. + """ + try: + text = Path(path).read_text(encoding="utf-8") + except FileNotFoundError: + return [] + except (OSError, UnicodeDecodeError) as exc: + logger.warning("Sperrliste %s konnte nicht gelesen werden: %s", path, exc) + return [] + terms = [] + for line in text.splitlines(): + entry = line.strip() + if entry and not entry.startswith("#"): + normalized = normalize_for_blocklist(entry) + if normalized: + terms.append(normalized) + return terms + + +def is_name_blocked(name: str, terms: Iterable[str]) -> bool: + """True, wenn ein gesperrter Begriff im (normalisierten) Namen vorkommt.""" + normalized = normalize_for_blocklist(name) + return any(term in normalized for term in terms) + + +def _strict_int(value: object) -> int | None: + """Nur echte Ganzzahlen: ``True`` ist in Python auch ein ``int``, aber kein Punktestand.""" + if isinstance(value, bool) or not isinstance(value, int): + return None + return value + + +def parse_submission(payload: Mapping[str, Any], rules: PlausibilityRules) -> ScoreSubmission: + """Prüft Typen und Wertebereiche einer Einreichung. + + Raises: + SubmissionError: mit allen gefundenen Fehlern auf einmal, damit das Frontend + nicht Fehler für Fehler nachfragen muss. + """ + errors: dict[str, str] = {} + + raw_name = payload.get("name") + name = "" + if not isinstance(raw_name, str): + errors["name"] = "Name fehlt oder ist kein Text." + elif len(raw_name) > NAME_RAW_MAX_LENGTH: + errors["name"] = f"Name darf höchstens {NAME_MAX_LENGTH} Zeichen lang sein." + else: + name = sanitize_name(raw_name) + if not name: + errors["name"] = "Name ist leer oder enthält nur unzulässige Zeichen." + elif len(name) > NAME_MAX_LENGTH: + errors["name"] = f"Name darf höchstens {NAME_MAX_LENGTH} Zeichen lang sein." + + score = _strict_int(payload.get("score")) + if score is None or not 0 <= score <= rules.score_max: + errors["score"] = f"Punkte müssen eine ganze Zahl zwischen 0 und {rules.score_max} sein." + + wave = _strict_int(payload.get("wave")) + if wave is None or not 1 <= wave <= rules.wave_max: + errors["wave"] = f"Welle muss eine ganze Zahl zwischen 1 und {rules.wave_max} sein." + + duration_s = _strict_int(payload.get("duration_s")) + if duration_s is None or not 0 <= duration_s <= rules.duration_max_seconds: + errors["duration_s"] = ( + f"Spieldauer muss eine ganze Zahl zwischen 0 und {rules.duration_max_seconds} sein." + ) + + run_token = payload.get("run_token") + if not isinstance(run_token, str) or not 0 < len(run_token) <= RUN_TOKEN_MAX_LENGTH: + errors["run_token"] = "Run-Token fehlt oder ist ungültig." # noqa: S105 + + if errors: + raise SubmissionError(errors) + + # Nach der Prüfung oben sind alle Werte gesetzt; die asserts helfen nur dem Typprüfer. + assert score is not None and wave is not None and duration_s is not None # noqa: S101 + assert isinstance(run_token, str) # noqa: S101 + return ScoreSubmission( + name=name, score=score, wave=wave, duration_s=duration_s, run_token=run_token + ) + + +def check_plausibility( + submission: ScoreSubmission, elapsed_s: float, rules: PlausibilityRules +) -> str | None: + """Prüft, ob Punktestand, Welle und Dauer zusammenpassen können. + + Args: + submission: Formal gültige Einreichung. + elapsed_s: Serverseitig gemessene Zeit seit Ausgabe des Run-Tokens. + rules: Grenzwerte. + + Returns: + ``None`` wenn plausibel, sonst eine kurze deutsche Begründung. + """ + # Die gemeldete (aktive) Spielzeit kann kürzer sein als die Token-Zeit, weil Pausen + # nicht zählen – aber nie länger. + if submission.duration_s > elapsed_s + rules.duration_tolerance_seconds: + return "Die gemeldete Spieldauer ist länger als die tatsächliche Rundenzeit." + + # Jede überstandene Welle kostet mindestens die Pause bis zur nächsten. + min_duration = (submission.wave - 1) * rules.wave_min_seconds + if submission.duration_s + rules.duration_tolerance_seconds < min_duration: + return "Diese Welle ist in der gemeldeten Zeit nicht erreichbar." + + max_score = ( + rules.score_flat_allowance + submission.duration_s * rules.score_max_points_per_second + ) + if submission.score > max_score: + return "Der Punktestand ist für die Spieldauer nicht plausibel." + return None diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..f6808e4 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,180 @@ +# Architektur + +Glory Defense ist eine monolithische Flask-Anwendung. Das eigentliche Spiel läuft +vollständig im Browser (Phaser 3). Der Server liefert Seiten, statische Dateien und +eine kleine JSON-API für die Ehrentafel. + +```mermaid +flowchart LR + Browser["Browser
Phaser 3 + ES-Module"] -- "GET /, /disclaimer, /static/…" --> Flask + Browser -- "POST /api/runs
GET/POST /api/highscores" --> Flask + Flask["Flask-App
(passenger_wsgi.py → create_app)"] --> DB[("SQLite
instance/glory_defense.sqlite3")] +``` + +## Backend (`app/`) + +| Modul | Aufgabe | +|---|---| +| `__init__.py` | App-Factory `create_app()`: Konfiguration laden, Datenbank initialisieren, Blueprints registrieren, Security-Header (CSP), JSON-Fehler für `/api/*` | +| `config.py` | Konfiguration aus Umgebungsvariablen, Pfade relativ zum Projektordner, automatisch erzeugter Schlüssel, Plausibilitätsgrenzen | +| `routes.py` | `GET /`, `GET /disclaimer`, `GET /healthz` | +| `api.py` | `POST /api/runs`, `GET /api/highscores`, `POST /api/highscores` | +| `models.py` | SQLite-Schema und Zugriffsfunktionen (Highscores, Rate-Limit-Protokoll, verbrauchte Run-Tokens), CLI `flask init-db` und `flask scores list/delete/delete-name` (Moderation) | +| `validation.py` | reine Funktionen: Namensbereinigung, Sperrliste, Typprüfung, Plausibilitätsprüfung | + +`passenger_wsgi.py` im Projektordner ergänzt `sys.path`, lädt optional `.env` und +stellt `application = create_app()` bereit. + +### Warum der Zustand in SQLite liegt + +Passenger betreibt je nach Last mehrere Python-Prozesse und beendet sie nach +Leerlauf. Zustand im Arbeitsspeicher, etwa ein Rate-Limit-Zähler, wäre deshalb +weder zwischen den Prozessen geteilt noch dauerhaft. Darum liegen auch +Rate-Limit-Einträge und eingelöste Run-Tokens in SQLite. Zählen und Eintragen laufen +in `BEGIN IMMEDIATE`-Transaktionen, damit parallele Prozesse sich nicht in die +Quere kommen. + +### Highscore-Ablauf + +```mermaid +sequenceDiagram + participant G as Spiel (Browser) + participant A as Flask-API + participant D as SQLite + G->>A: POST /api/runs (Spielstart) + A-->>G: 201 {run_token} (signiert mit SECRET_KEY, enthält Zeitstempel) + Note over G: Spielen … + G->>A: POST /api/highscores {name, score, wave, duration_s, run_token} + A->>D: Rate-Limit prüfen und Versuch protokollieren + A->>A: Format prüfen, Name bereinigen, optionale Sperrliste prüfen + A->>A: Token prüfen (Signatur, Alter) + A->>A: Plausibilität (Dauer ≤ Token-Alter, Punkte ≤ Obergrenze, Welle erreichbar) + A->>D: Token einlösen + Eintrag speichern (eine Transaktion) + A-->>G: 201 {rank, highscores} +``` + +Antwortcodes: `400` ungültige Eingaben (mit Feldfehlern), `409` Token schon +eingelöst, `413` zu große Anfrage, `422` Token ungültig/abgelaufen oder Punktestand +unplausibel, `429` Rate-Limit (mit `Retry-After`). + +Die Prüfungen verhindern kein Cheaten, denn die Spiellogik läuft im Browser. Sie +filtern aber offensichtlich Unmögliches aus und verhindern, dass eine Runde mehrere +Einträge erzeugt. + +### Sicherheit + +- **Content-Security-Policy:** `script-src 'self'`, kein `unsafe-eval`, keine fremden Quellen. + `blob:`/`data:` sind für Bilder und Audio erlaubt, weil Phaser geladene Dateien so dekodiert. +- **Namen:** NFKC-Normalisierung, Entfernen von Steuer-, Format- und Bidi-Zeichen, Whitelist, + max. 16 Zeichen. Im Frontend werden Namen ausschließlich als Text ausgegeben + (`textContent` bzw. Canvas-Text), nie als HTML. +- **Datenschutz:** Statt IP-Adressen wird nur ein HMAC-Hash gespeichert, und nur solange + das Rate-Limit-Fenster läuft. +- **Proxy:** Mit `GLORY_TRUST_PROXY=1` übernimmt `ProxyFix` nur Client-IP und Protokoll, + nicht Host oder Präfix (sonst ließen sich per Header fremde URLs in die Seite schleusen). +- **Schlüssel:** Fehlt `SECRET_KEY`, entsteht `instance/secret_key` erst beim ersten Bedarf + (Run-Token, Rate-Limit). CLI-Befehle legen also keine unnötige Schlüsseldatei an. +- **Anfragegröße** begrenzt auf 16 KB. + +## Frontend (`app/static/js/`) + +Native ES-Module ohne Bundler oder Build-Schritt. Phaser wird vorher als klassisches +Script geladen und ist global verfügbar. Alle URLs (Static-Basis, API) übergibt das +Template per `data-*`-Attribut. Darum funktioniert das Spiel auch unter einer +Unter-URL. + +``` +main.js Dienste bauen (Settings, Audio, API), Phaser starten +config.js alle Spielwerte +content/texts.js alle Texte +logic/ reine Logik ohne Phaser – vollständig per Vitest getestet +scenes/ Phaser-Szenen +entities/ Spielobjekte (Phaser-Sprites) +systems/ Querschnittsdienste (Assets, Audio, Effekte, Orbital, Overlays …) +ui/ Menüliste, Textstile +``` + +### Trennung von Logik und Darstellung + +Alles, was sich ohne Grafik berechnen lässt, liegt in `logic/` und importiert nie +Phaser. Die Szenen und Entities rufen diese Funktionen auf und setzen das Ergebnis +in Physik und Grafik um. + +| Modul | Inhalt | +|---|---| +| `waves.js` | Wellenbudget, Fraktionen, Eliten, Gegnerzusammenstellung, Spawn-Zeitplan | +| `waveDirector.js` | Ablauf: Pause → Welle → Spawns → Welle geschafft (mit Spawn-Stopp bei zu vielen Gegnern) | +| `scoring.js` | Punkte, Serien, Multiplikator, Wellenbonus | +| `comboInput.js` | Eingabe der Orbital-Befehle als Richtungsfolge | +| `cooldowns.js` | Abklingzeiten | +| `steering.js` | Steuerungsverhalten: Verfolgen, Fliehen, Abstand halten, Flankieren, Umzingeln, Separation | +| `enemyAi.js` | Entscheidungen je Gegnertyp: Sprungangriff, Salven, Brut, Ausweichrichtung | +| `weapon.js` | Magazin, Reserve, Feuerrate, Nachladen, Streuung | +| `format.js` | Anzeigeformate (Punkte, Zeiten, Befehlscodes), Namensbereinigung wie im Backend | +| `rng.js` / `math.js` | seedbarer Zufall, Vektorhelfer | +| `marchPattern.js` | Noten der Hintergrundmusik | + +### Szenenfluss + +```mermaid +flowchart TD + Boot["Boot
Assets laden, Platzhalter erzeugen"] --> Menu + Menu["Menü"] -- "erster Start" --> Disclaimer["Disclaimer (Overlay)"] + Disclaimer -- "bestätigt (localStorage)" --> Menu + Menu -- "Mission starten" --> Briefing + Menu --> Highscores["Ehrentafel"] --> Menu + Menu --> Controls["Steuerung"] --> Menu + Menu --> Credits --> Menu + Menu -- "Disclaimer" --> Disclaimer + Briefing --> Game["Game + HUD (parallel)"] + Game -- "Esc / Fenster verliert Fokus" --> Pause["Pause (Overlay, Lautstärke)"] + Pause -- "Weiter" --> Game + Pause -- "Abbrechen" --> Menu + Game -- "Leben = 0" --> GameOver["Game Over
Name, Top 10"] + GameOver -- "Erneut" --> Game + GameOver -- "Hauptmenü" --> Menu +``` + +- **Game** und **HUD** laufen gleichzeitig. Das HUD liest in jedem Frame + `GameScene.hudState()` und empfängt Ereignisse (`announce`, `feedback`, + `player-damaged`). So scrollt es nicht mit der Kamera und wackelt nicht mit. +- **Disclaimer, Pause und Game Over** sind HTML-Overlays über dem Canvas + (`systems/Overlay.js`). Formulare und Schieberegler sind so mit Tastatur und + Screenreader bedienbar. + +### Zeit, Eingabe und Kollisionen + +- **Spielzeit:** Alle Mechaniken nutzen `GameScene.gameTime`, eine eigene Uhr, die nur + bei aktiver Szene läuft. Abklingzeiten laufen in der Pause also nicht weiter, und + die gemeldete Spieldauer enthält keine Pausen. Große Frame-Sprünge werden auf + 100 ms begrenzt. +- **Tastatur:** Bewegung wird pro Frame abgefragt. Einmalige Aktionen (Rolle, + Nachladen, Waffenwechsel, Pause) kommen über `keydown`-Ereignisse. Phasers + `JustDown` verliert Tastendrücke, die innerhalb eines Frames gedrückt und + losgelassen werden. Außerdem meldet Phaser 3.90 bei mehreren Tastenereignissen pro + Frame frühere `keydown` erneut. `systems/keyboard.js` (`oncePerEvent`) filtert das + anhand der Ereignisidentität. +- **Kollisionen (Arcade Physics, Kreis-Hitboxen):** + - Spielerprojektile ↔ Gegner: Schaden, Projektil verschwindet + - Gegnerprojektile ↔ Präsident: Schaden. Während der Rolle fliegen Projektile hindurch. + - Gegner ↔ Präsident: Kontaktschaden mit Abklingzeit je Gegner + - Präsident ↔ Kapsel: Heilung und Munition + - Gegner untereinander: keine Physik-Kollision, sondern Separation in der Steuerung. + Das ist günstiger und verhindert, dass Gegner sich an Engstellen verkeilen. + - Flächenschaden (Orbitalschlag, Mörser, Kapsel-Einschlag): Kreis-Test gegen alle + Gegner bzw. den Präsidenten. Kann sich selbst treffen. +- **Pooling:** Projektile werden wiederverwendet statt neu erzeugt (keine Ruckler + durch den Garbage Collector). + +### Grafik und Ton + +- `systems/Assets.js` lädt eigene SVGs und Kenney-Texturen. Was fehlt, erzeugt + `systems/Placeholders.js` unter demselben Schlüssel aus einfachen Formen. Das Spiel + ist also auch ganz ohne Asset-Dateien spielbar, was ein End-to-End-Test prüft. +- `systems/AudioManager.js`: Web Audio mit drei Kanälen (Gesamt, Musik, Effekte). + Klangdateien werden vorab als Bytes geladen und nach der ersten Nutzeraktion + dekodiert. Jeder Effekt hat einen synthetischen Ersatz (`Synth.js`). Die + Marschmusik wird mit Vorausplanung auf der Audio-Uhr erzeugt (`Music.js`). +- Einstellungen (Disclaimer-Bestätigung, Lautstärken, letzter Name) liegen in + `localStorage`. Ist das blockiert, fällt `systems/Settings.js` auf den + Arbeitsspeicher zurück. diff --git a/docs/ASSETS.md b/docs/ASSETS.md new file mode 100644 index 0000000..73c53e9 --- /dev/null +++ b/docs/ASSETS.md @@ -0,0 +1,199 @@ +# Assets: Quellen und Lizenzen + +Alle Dateien unter `app/static/assets/` sind hier mit Quelle, Autor und Lizenz +aufgeführt. Es werden ausschließlich Assets mit eindeutig freier Lizenz verwendet; +keine Datei zeigt reale Personen, Marken oder Figuren aus anderen Spielen. + +Ein automatischer Test (`tests/test_assets.py`) prüft, dass jede Datei im +Asset-Ordner in diesem Dokument vorkommt und jede im Spiel referenzierte Datei +existiert. + +> **Ohne Assets spielbar:** Fehlt eine Datei oder schlägt das Laden fehl, erzeugt +> `app/static/js/systems/Placeholders.js` unter demselben Schlüssel eine +> Ersatzgrafik aus einfachen Formen. Klänge werden bei Bedarf synthetisch erzeugt. + +## Übersicht + +| Kategorie | Quelle | Autor | Lizenz | +|---|---|---|---| +| Figuren, Emblem, Geschütz, Kapsel (SVG) | eigens für dieses Projekt erstellt | Glory-Defense-Projekt | CC0 1.0 | +| Bodenkacheln | [Kenney – Top-down Shooter](https://kenney.nl/assets/top-down-shooter) | Kenney Vleugels (kenney.nl) | CC0 1.0 | +| Partikel-Texturen | [Kenney – Particle Pack](https://kenney.nl/assets/particle-pack) | Kenney Vleugels (kenney.nl) | CC0 1.0 | +| Schriften | Systemschriften (Impact, Segoe UI bzw. Ersatzschriften des Systems), **nicht mitgeliefert** | – | – | +| Soundeffekte und Jingles | Kenney – [Sci-Fi Sounds](https://kenney.nl/assets/sci-fi-sounds), [Impact Sounds](https://kenney.nl/assets/impact-sounds), [Interface Sounds](https://kenney.nl/assets/interface-sounds), [Music Jingles](https://kenney.nl/assets/music-jingles) | Kenney Vleugels (kenney.nl) | CC0 1.0 | +| Hintergrundmusik (Marsch) | eigene Komposition, zur Laufzeit synthetisiert | Glory-Defense-Projekt | CC0 1.0 | +| Spiel-Engine (Code) | [Phaser 3.90.0](https://phaser.io) | Phaser Studio Inc. | MIT | + +CC0 verlangt keine Namensnennung. Kenney wird trotzdem im Spiel unter „Credits“ +genannt. CC-BY-Assets werden derzeit nicht verwendet; kämen welche hinzu, müssten +sie zwingend in den Credits erscheinen. + +## Eigene Vektorgrafiken (`app/static/assets/sprites/`) + +Eigens für Glory Defense gezeichnet, Lizenz **CC0 1.0** (gemeinfrei). Alle +Figuren sind frei erfunden. Der Präsident trägt bewusst einen geschlossenen Helm +(kein Gesicht, keine Frisur). Sein Umhang in Rot und Gold und das Emblem der +fiktiven „Vereinigten Erde“ (auch auf dem Umhang) sind eigene Entwürfe ohne +Lorbeerzweige oder Sternenkreis, damit sie keinem realen Emblem ähneln. Die Nachschubkapsel trägt ein Geschenkband statt eines +Kreuzes, weil das Rotkreuz-Zeichen rechtlich geschützt ist. + +| Datei | Inhalt | +|---|---| +| `sprites/president.svg` | Präsident Maximilian Valor (Draufsicht) | +| `sprites/krabbler.svg` | Schwärmer: Krabbler (klein) | +| `sprites/sprungkralle.svg` | Schwärmer: Sprungkralle (mittel) | +| `sprites/brutmutter.svg` | Schwärmer: Brutmutter (Elite) | +| `sprites/nieter.svg` | Blechlegion: Nieter-Drohne (klein) | +| `sprites/blechsoldat.svg` | Blechlegion: Blechsoldat (mittel) | +| `sprites/walzmeister.svg` | Blechlegion: Walzmeister (Elite) | +| `sprites/turret.svg` | Geschütz „Wachsamer Nachbar“ | +| `sprites/supply-pod.svg` | Nachschubkapsel „Fürsorgepaket“ | +| `sprites/emblem.svg` | Emblem der Vereinigten Erde (Menü, Bodenmarkierung) | + +Auch `app/static/favicon.svg` ist ein eigener Entwurf (CC0). + +## Kenney – Top-down Shooter (`app/static/assets/kenney/tiles/`) + +- Quelle: (Version im ZIP `kenney_top-down-shooter.zip`) +- Autor: Kenney Vleugels, [kenney.nl](https://kenney.nl) +- Lizenz: Creative Commons Zero (CC0 1.0), Lizenztext: `kenney/tiles/License.txt` + +| Datei | Inhalt | +|---|---| +| `kenney/tiles/ground_strip.png` | Ausschnitt aus `Tilesheet/tilesheet_complete.png`, 8 Kacheln à 64 px: Erde A (Zeile 0, Spalte 4), Erde B (0/5), Felsen (8/20, 8/21, 8/22), Büsche (8/18, 8/19), Fleck (11/22). Im Spiel eingefärbt. | +| `kenney/tiles/License.txt` | Originale Lizenzdatei | + +## Kenney – Particle Pack (`app/static/assets/kenney/particles/`) + +- Quelle: (Version 1.1) +- Autor: Kenney Vleugels, [kenney.nl](https://kenney.nl), mit Filtervorlagen von Indigo Ray, + Craig Nisbet, Zoltan Erdokovy, Heliagon, ThreeDee, Killst4r und Tim2501 (laut Lizenzdatei) +- Lizenz: Creative Commons Zero (CC0 1.0), Lizenztext: `kenney/particles/License.txt` +- Bearbeitung: von 512 × 512 px auf 128 × 128 px verkleinert + +| Datei | Original | +|---|---| +| `kenney/particles/smoke.png` | `PNG (Transparent)/smoke_04.png` | +| `kenney/particles/fire.png` | `PNG (Transparent)/fire_01.png` | +| `kenney/particles/spark.png` | `PNG (Transparent)/spark_05.png` | +| `kenney/particles/scorch.png` | `PNG (Transparent)/scorch_02.png` | +| `kenney/particles/muzzle.png` | `PNG (Transparent)/muzzle_01.png` | +| `kenney/particles/glow.png` | `PNG (Transparent)/light_01.png` | +| `kenney/particles/License.txt` | Originale Lizenzdatei | + +## Schriften + +Das Spiel liefert **keine Schriftdateien** mit, sondern nutzt Systemschriften: +Impact (bzw. Arial Black oder die Standardschrift) für Titel, Segoe UI bzw. +system-ui für HUD und Texte. Damit gibt es keine Lizenzfragen. + +Frühere Versionen verwendeten „Kenney Future“ aus dem Paket „Kenney Fonts“. Das +Paket nennt CC0, die in die Schriftdateien eingebetteten Metadaten aber +„Creative Commons Attribution Share Alike 3.0“ (FontStruct, 2013). Wegen dieses +Widerspruchs und weil die Schrift „Q“ kaum von „O“ und „X/K“ kaum von „H“ +unterscheidet (schlecht für Tastenhinweise), wurde sie entfernt. + +## Kenney – Klänge (`app/static/assets/kenney/audio/`) + +Alle Klänge unverändert übernommen (OGG Vorbis). Lizenz jeweils **Creative Commons Zero (CC0 1.0)**, +Autor Kenney Vleugels ([kenney.nl](https://kenney.nl)). Welcher Klang wofür verwendet wird, steht in +`app/static/js/systems/AudioAssets.js`. Jeder Effekt hat zusätzlich einen synthetischen Ersatz +(`systems/Synth.js`), falls Dateien fehlen oder der Browser OGG nicht abspielen kann. + +### Sci-Fi Sounds + +- Quelle: +- Lizenztext: `kenney/audio/License-SciFiSounds.txt` + +| Datei | +|---| +| `kenney/audio/explosionCrunch_000.ogg` | +| `kenney/audio/explosionCrunch_001.ogg` | +| `kenney/audio/explosionCrunch_002.ogg` | +| `kenney/audio/explosionCrunch_003.ogg` | +| `kenney/audio/laserLarge_000.ogg` | +| `kenney/audio/laserLarge_001.ogg` | +| `kenney/audio/laserRetro_000.ogg` | +| `kenney/audio/laserRetro_001.ogg` | +| `kenney/audio/laserRetro_002.ogg` | +| `kenney/audio/laserSmall_000.ogg` | +| `kenney/audio/laserSmall_001.ogg` | +| `kenney/audio/laserSmall_002.ogg` | +| `kenney/audio/laserSmall_003.ogg` | +| `kenney/audio/laserSmall_004.ogg` | +| `kenney/audio/lowFrequency_explosion_000.ogg` | +| `kenney/audio/lowFrequency_explosion_001.ogg` | +| `kenney/audio/slime_000.ogg` | +| `kenney/audio/slime_001.ogg` | +| `kenney/audio/License-SciFiSounds.txt` (Lizenzdatei) | + +### Impact Sounds + +- Quelle: +- Lizenztext: `kenney/audio/License-ImpactSounds.txt` + +| Datei | +|---| +| `kenney/audio/impactMetal_light_000.ogg` | +| `kenney/audio/impactMetal_light_001.ogg` | +| `kenney/audio/impactMetal_light_002.ogg` | +| `kenney/audio/impactPlate_light_000.ogg` | +| `kenney/audio/impactPunch_heavy_000.ogg` | +| `kenney/audio/impactPunch_heavy_001.ogg` | +| `kenney/audio/impactSoft_medium_000.ogg` | +| `kenney/audio/impactSoft_medium_001.ogg` | +| `kenney/audio/impactSoft_medium_002.ogg` | +| `kenney/audio/License-ImpactSounds.txt` (Lizenzdatei) | + +### Interface Sounds + +- Quelle: +- Lizenztext: `kenney/audio/License-InterfaceSounds.txt` + +| Datei | +|---| +| `kenney/audio/click_001.ogg` | +| `kenney/audio/confirmation_001.ogg` | +| `kenney/audio/confirmation_002.ogg` | +| `kenney/audio/error_001.ogg` | +| `kenney/audio/maximize_001.ogg` | +| `kenney/audio/select_001.ogg` | +| `kenney/audio/tick_001.ogg` | +| `kenney/audio/License-InterfaceSounds.txt` (Lizenzdatei) | + +### Music Jingles + +- Quelle: +- Lizenztext: `kenney/audio/License-MusicJingles.txt` + +| Datei | +|---| +| `kenney/audio/jingles_HIT11.ogg` | +| `kenney/audio/jingles_HIT15.ogg` | +| `kenney/audio/jingles_PIZZI07.ogg` | +| `kenney/audio/jingles_STEEL07.ogg` | +| `kenney/audio/License-MusicJingles.txt` (Lizenzdatei) | + +### Hintergrundmusik + +Der Marsch ist eine eigene Komposition (`app/static/js/logic/marchPattern.js`, CC0) und wird +zur Laufzeit synthetisch erzeugt (`app/static/js/systems/Music.js`) – es gibt keine Musikdatei. + +## Bibliotheken + +| Datei | Quelle | Lizenz | +|---|---|---| +| `app/static/js/lib/phaser.min.js` | Phaser 3.90.0 aus dem npm-Paket `phaser` | MIT, © Phaser Studio Inc., Lizenztext `app/static/js/lib/PHASER_LICENSE.md` | + +## Neue Assets hinzufügen + +1. Nur Assets mit eindeutig freier Lizenz verwenden (bevorzugt CC0: Kenney.nl, + OpenGameArt.org nur CC0/CC-BY). Die Pixabay-Lizenz ist laut Projektvorgaben + erlaubt, aber keine CC-Lizenz: Nutzungsbedingungen je Datei prüfen und festhalten. + Auch die in Dateien eingebetteten Lizenzangaben prüfen (z. B. Schrift-Metadaten). +2. Datei unter `app/static/assets/` ablegen und in `app/static/js/systems/Assets.js` + eintragen (Klänge: `app/static/js/systems/AudioAssets.js`). +3. Diese Datei ergänzen (Quelle, Autor, Lizenz, Bearbeitung). +4. Bei CC-BY: Namensnennung zusätzlich in `app/static/js/content/texts.js` unter + `CREDITS` eintragen. +5. `pytest tests/test_assets.py` ausführen. diff --git a/docs/DEPLOYMENT_CPANEL.md b/docs/DEPLOYMENT_CPANEL.md new file mode 100644 index 0000000..74df3f6 --- /dev/null +++ b/docs/DEPLOYMENT_CPANEL.md @@ -0,0 +1,175 @@ +# Deployment auf cPanel („Setup Python App“ / Phusion Passenger) + +Diese Anleitung beschreibt die Installation auf einem Shared-Hosting mit cPanel und +CloudLinux-„Setup Python App“. Die App braucht keine Hintergrundprozesse, keinen +Redis, keine WebSockets und keine kompilierten Pakete: Flask, python-dotenv und +SQLite reichen. + +## Überblick + +| cPanel-Feld | Wert | +|---|---| +| Python version | **3.10** oder neuer (neueste verfügbare wählen) | +| Application root | Ordner im Home-Verzeichnis, z. B. `glory_defense` | +| Application URL | Domain oder Unterpfad, z. B. `example.ch/` oder `example.ch/glory` | +| Application startup file | `passenger_wsgi.py` | +| Application Entry point | `application` | + +## 1. Upload-Paket bauen + +Auf dem eigenen Rechner im Projektordner (Windows, Linux oder macOS): + +```bash +python scripts/build_deploy_zip.py +``` + +Das erzeugt `dist/glory_defense.zip` mit genau den Dateien, die der Server braucht: +`passenger_wsgi.py`, `requirements.txt`, `.env.example` und den Ordner `app/` +(inkl. `app/static/js/lib/phaser.min.js` und `app/static/assets/`). **Nicht** +enthalten sind `.env` (Geheimnisse), `instance/` (Datenbank), Tests, `.venv`, +`node_modules` und Caches. Node.js wird auf dem Server nicht benötigt. + +> Bitte nicht mit „Komprimierter Ordner“ bzw. `Compress-Archive` aus Windows +> PowerShell 5.1 packen: Das schreibt Pfade mit Backslash (`app\api.py`) ins ZIP, +> und manche Entpacker auf Linux-Servern machen daraus flache Dateinamen. Dann +> startet die App mit `No module named 'app'` nicht. Das Skript verwendet immer `/`. + +Alternativ kann das Repository über cPanel → **Git™ Version Control** direkt in den +Application-Root geklont werden. + +## 2. Python-App anlegen + +1. cPanel → **Software** → **Setup Python App** → **Create Application**. +2. Felder wie in der Tabelle oben ausfüllen. +3. **Create** klicken. cPanel legt den Ordner, eine virtuelle Umgebung + (`~/virtualenv/glory_defense//`) und eine Beispiel-`passenger_wsgi.py` an. +4. Oben auf der Seite erscheint der Befehl zum Aktivieren der venv, etwa: + ```bash + source /home/BENUTZER/virtualenv/glory_defense/3.11/bin/activate && cd /home/BENUTZER/glory_defense + ``` + Diesen Befehl für Schritt 5 kopieren. + +## 3. Dateien hochladen + +1. cPanel → **File Manager** → in den Application-Root wechseln (z. B. `~/glory_defense`). +2. Die von cPanel erzeugte `passenger_wsgi.py` löschen oder überschreiben lassen. +3. `glory_defense.zip` hochladen und dort **Extract** wählen. +4. Prüfen: `passenger_wsgi.py` und der Ordner `app/` liegen **direkt** im Application-Root. + +## 4. Umgebungsvariablen setzen + +In „Setup Python App“ bei der App unter **Environment variables** eintragen und +danach **Save** klicken: + +| Name | Wert | +|---|---| +| `SECRET_KEY` | langer Zufallswert, z. B. Ausgabe von `python -c "import secrets; print(secrets.token_hex(32))"` | +| `GLORY_DB_PATH` | optional, Standard `instance/glory_defense.sqlite3` (relativ zum Application-Root) | +| `GLORY_RATE_LIMIT_MAX` | optional, Standard `5` | +| `GLORY_RATE_LIMIT_WINDOW` | optional, Standard `600` (Sekunden) | +| `GLORY_TRUST_PROXY` | optional, Standard `0`. Nur `1`, wenn ein vertrauenswürdiger Proxy (z. B. CDN) davorsteht, siehe „Typische Fehler“ | +| `GLORY_NAME_BLOCKLIST` | optional, Standard `instance/name_blocklist.txt`, siehe „Moderation der Ehrentafel“ | + +Alternativ eine Datei `.env` im Application-Root anlegen (Vorlage `.env.example`). +In cPanel gesetzte Variablen haben Vorrang vor der `.env`. + +> Ohne `SECRET_KEY` erzeugt die App beim ersten Spielstart `instance/secret_key` +> selbst. Das funktioniert, ein eigener Wert in cPanel ist aber sauberer und +> übersteht Neuinstallationen. + +## 5. Abhängigkeiten installieren + +**Variante A, über die Oberfläche:** In „Setup Python App“ bei der App unter +*Configuration files* `requirements.txt` eintragen, **Add** und dann +**Run Pip Install** klicken. + +**Variante B, per Terminal** (cPanel → **Terminal** oder SSH): + +```bash +source /home/BENUTZER/virtualenv/glory_defense/3.11/bin/activate && cd /home/BENUTZER/glory_defense +pip install -r requirements.txt +``` + +Die Datenbank legt die App beim ersten Aufruf selbst an, ein eigener Schritt ist +nicht nötig. + +## 6. Neustarten und prüfen + +- In „Setup Python App“ auf **Restart** klicken, oder per Terminal: + ```bash + mkdir -p tmp && touch tmp/restart.txt + ``` +- Im Browser aufrufen: + - `https://example.ch/healthz` muss `{"status":"ok"}` liefern + - `https://example.ch/` zeigt den Disclaimer und danach das Hauptmenü + - `https://example.ch/api/highscores` liefert `{"highscores":[]}` + +Läuft die App unter einem Unterpfad (z. B. `/glory`), funktionieren alle Links +automatisch: Das Template erzeugt URLs über `url_for`, und Passenger übergibt den +Pfad als `SCRIPT_NAME`. + +## 7. Updates einspielen + +1. Lokal `python scripts/build_deploy_zip.py` ausführen, das neue ZIP hochladen und + entpacken (vorhandene Dateien überschreiben). `instance/` dabei **nicht** löschen, + denn dort liegen Highscores, Sperrliste und ggf. der automatisch erzeugte Schlüssel. +2. Falls sich `requirements.txt` geändert hat: **Run Pip Install** bzw. `pip install -r requirements.txt`. +3. **Restart** (oder `touch tmp/restart.txt`). +4. Im Browser mit Strg+F5 neu laden, damit keine alten JavaScript-Dateien aus dem Cache kommen. + +## 8. Datensicherung + +Zu sichern ist nur der Ordner `instance/`: + +- `instance/glory_defense.sqlite3`: Highscores +- `instance/name_blocklist.txt`: Sperrliste, falls angelegt +- `instance/secret_key`: nur vorhanden, wenn kein `SECRET_KEY` gesetzt ist + +## 9. Moderation der Ehrentafel + +Spielernamen erscheinen öffentlich. Unpassende Einträge (Beleidigungen, Namen realer +Personen) lassen sich im Terminal löschen. Zuerst die venv aktivieren (Befehl aus +Schritt 2.4), dann: + +```bash +flask --app passenger_wsgi scores list # Einträge mit ID anzeigen +flask --app passenger_wsgi scores delete 17 23 # Einträge per ID löschen +flask --app passenger_wsgi scores delete-name "Name" # alle Einträge mit diesem Namen löschen +``` + +Die Befehle brauchen keinen `SECRET_KEY`. Das ist wichtig, denn in cPanel gesetzte +Umgebungsvariablen stehen im Terminal nicht zur Verfügung. Eine `.env` im +Application-Root wird dagegen auch hier gelesen. + +**Sperrliste (optional):** Die Datei `instance/name_blocklist.txt` anlegen, ein Begriff +pro Zeile, `#` leitet Kommentare ein. Namen, die einen dieser Begriffe enthalten, +lehnt die API ab. Groß-/Kleinschreibung, Leerzeichen und Satzzeichen spielen dabei +keine Rolle, „Max Muster“ sperrt also auch „max.muster“. Die Datei wird bei jeder +Einreichung neu gelesen, ein Neustart ist nicht nötig. + +## Typische Fehler + +| Symptom | Ursache und Lösung | +|---|---| +| „Incomplete response received from application“ oder Fehler 500 | Details stehen in `stderr.log` im Application-Root bzw. in cPanel → *Errors*. Meist fehlen die Abhängigkeiten (Schritt 4) oder die Startdatei ist falsch eingetragen. | +| `ModuleNotFoundError: No module named 'app'` | `passenger_wsgi.py` liegt nicht im Application-Root, der Ordner `app/` fehlt bzw. liegt eine Ebene zu tief (ZIP in einen Unterordner entpackt), oder das ZIP wurde mit Backslash-Pfaden erstellt (Dateien heißen dann `app\api.py`). Paket mit `python scripts/build_deploy_zip.py` bauen. | +| `ModuleNotFoundError: No module named 'flask'` | Pip-Install lief in der falschen Umgebung. Befehl aus Schritt 2.4 verwenden (venv aktivieren) und erneut installieren (Schritt 5). | +| `SyntaxError` oder Flask-Importfehler beim Start | Python-Version zu alt. In „Setup Python App“ **3.10 oder neuer** wählen (die App kann dafür neu angelegt werden, Dateien bleiben erhalten). | +| `sqlite3.OperationalError: unable to open database file` | Der Ordner der Datenbank ist nicht beschreibbar. `instance/` muss dem cPanel-Benutzer gehören (Rechte 755). `GLORY_DB_PATH` nicht auf einen fremden Ordner setzen. | +| `database is locked` bei viel Last | SQLite wartet bis zu 10 s auf Sperren. Bei sehr vielen gleichzeitigen Einreichungen hilft ein kleineres Rate-Limit. Für ein Spiel mit Highscore-Liste reicht SQLite in der Regel. | +| Seite lädt, Spiel bleibt schwarz, Konsole zeigt 404 für `phaser.min.js` | `app/static/js/lib/phaser.min.js` wurde nicht mit hochgeladen (manche FTP-Clients überspringen große Dateien). Das Upload-ZIP aus Schritt 1 enthält sie. | +| Änderungen nicht sichtbar | App neu starten (Schritt 6) und Browser-Cache leeren (Strg+F5). | +| Alle Spieler teilen sich ein Rate-Limit | Ein vorgeschalteter Proxy (z. B. CDN) liefert allen dieselbe IP. Wenn der Proxy `X-Forwarded-For` zuverlässig setzt, `GLORY_TRUST_PROXY=1` setzen. Sonst beim Hoster `mod_remoteip` erfragen. | +| `/healthz` ok, aber Highscores werden mit „Run-Token ungültig“ abgelehnt | `SECRET_KEY` wurde zwischen Spielstart und Einreichen geändert (z. B. durch Neustart mit neuem Wert). Einfach eine neue Runde spielen. | + +## Sicherheitshinweise + +- Die App setzt eine strikte Content-Security-Policy. Das Spiel lädt keine Skripte + von fremden Servern. +- IP-Adressen werden nicht gespeichert, nur ein HMAC-Hash (mit `SECRET_KEY`) für das + Rate-Limit. Einträge werden nach Ablauf des Zeitfensters automatisch gelöscht. +- Spielernamen werden bereinigt (max. 16 Zeichen, keine Steuer- oder Sonderzeichen) + und im Frontend immer als Text ausgegeben, nie als HTML. Unpassende Einträge lassen + sich löschen oder per Sperrliste verhindern (Abschnitt 9). +- Mit `GLORY_TRUST_PROXY=1` übernimmt die App vom Proxy nur Client-IP und Protokoll, + nicht Host oder Pfadpräfix. So lassen sich keine fremden URLs in die Seite schleusen. diff --git a/docs/GAME_DESIGN.md b/docs/GAME_DESIGN.md new file mode 100644 index 0000000..28f94af --- /dev/null +++ b/docs/GAME_DESIGN.md @@ -0,0 +1,211 @@ +# Game Design + +Alle Werte stehen zentral in `app/static/js/config.js`. Die Tabellen hier geben den +Stand zum Zeitpunkt des Schreibens wieder. Bei Abweichungen gilt `config.js`. +Einheiten: Pixel (px), px/s, Millisekunden (ms), Lebenspunkte (LP). + +## Welt und Ton + +- **Setting:** Die fiktive „Vereinigte Erde“ wird von zwei außerirdischen Fraktionen + angegriffen. Präsident Maximilian Valor verteidigt „den ewigen Frieden“ persönlich. +- **Satire:** Durchsagen des „Ministeriums für Zuversicht“ zwischen den Wellen, + Briefings, Game-Over-Texte. Der Spott gilt Militarismus und Propaganda im + Allgemeinen, nicht realen Personen, Parteien oder Ländern. Namen und Begriffe sind + eigenständig. Ein Test (`tests/test_assets.py`) verhindert Begriffe aus bekannten + Vorbildern. +- **Arena:** 2400 × 1600 px, größer als der Bildschirm (1280 × 720). Die Kamera folgt + dem Präsidenten. Gegner außerhalb des Bildes zeigt das HUD als Randpfeile an. + +## Der Präsident + +| Wert | | +|---|---| +| Leben | 100 LP | +| Tempo | 240 px/s (diagonal gleich schnell) | +| Hitbox | Kreis, Radius 18 px | +| Unverwundbarkeit nach Treffer | 500 ms (sonst tötet ein Schwarm in einem Frame) | +| Ausweichrolle | 640 px/s für 320 ms, unverwundbar, Abklingzeit 1500 ms. Ohne Bewegung in Blickrichtung. | +| Heilung nach jeder Welle | 15 LP | + +Treffer am Präsidenten beenden die Punkteserie. Gegnerprojektile fliegen während der +Rolle hindurch, statt verschluckt zu werden. + +## Waffen + +| | Karabiner »Zuversicht« | Schrotflinte »Überzeugungskraft« | Dienstpistole »Anstand« | +|---|---|---|---| +| Taste | 1 | 2 | 3 | +| Modus | Dauerfeuer | Einzelschuss | Einzelschuss | +| Schaden | 14 | 8 × 11 (Schrot) | 16 | +| Feuerpause | 110 ms | 650 ms | 260 ms | +| Magazin / Reserve (Start, max.) | 30 / 180, 270 | 6 / 24, 48 | 12 / unbegrenzt | +| Nachladen | 1,5 s | 1,9 s | 1,1 s | +| Streuung | 3° | 24° Fächer | 2° | +| Reichweite | 820 px | 420 px | 700 px | +| Schaden/s (Feuerstoß / mit Nachladen) | 127 / 88 | 135 / 91 | 62 / 45 | + +- Leeres Magazin lädt automatisch nach. Ein Waffenwechsel bricht das Nachladen ab. +- Sind Magazin und Reserve leer, wechselt das Spiel automatisch zur Dienstpistole. + Ohne Munition ist man also nie wehrlos. +- Die Nachschubkapsel füllt die Reserve aller Waffen auf das Maximum. + +## Gegner + +### Die Schwärmer (insektoid, Nahkampf) + +| | Krabbler (klein) | Sprungkralle (mittel) | Brutmutter (Elite) | +|---|---|---|---| +| Leben | 20 | 60 | 450 | +| Tempo | 175 | 125 | 58 | +| Kontaktschaden (Abklingzeit) | 6 (700 ms) | 14 (800 ms) | 28 (1000 ms) | +| Punkte | 10 | 30 | 250 | +| Budgetkosten | 1 | 3 | 15 | +| Gruppengröße | 4–8 | 1–3 | 1 | +| Verhalten | Umzingeln | Sprungangriff | Brüten | + +- **Umzingeln:** Jeder Krabbler bekommt einen eigenen Anflugwinkel auf einem Kreis + (130 px) um den Präsidenten. Ab 170 px Abstand greift er direkt an. Ein Rudel + kommt dadurch von mehreren Seiten. +- **Sprungangriff:** Verfolgen. Ab 260 px setzt die Sprungkralle 450 ms an: sie steht + still, färbt sich rot und wird größer. Dann springt sie mit 560 px/s für 380 ms in + die beim Ansetzen festgelegte Richtung. Wer auf die Vorwarnung reagiert, kann + ausweichen. Abklingzeit 2,4 s. +- **Brüten:** Langsames Verfolgen, alle 5 s schlüpfen bis zu 3 Krabbler, höchstens 6 + gleichzeitig lebende Nachkommen. + +### Die Blechlegion (Roboter, Fernkampf) + +| | Nieter-Drohne (klein) | Blechsoldat (mittel) | Walzmeister (Elite) | +|---|---|---|---| +| Leben | 30 | 90 | 700 | +| Tempo | 95 | 78 | 44 | +| Wunschabstand | 220–340 px | 200–380 px | 260–460 px | +| Angriff | Einzelschuss 7, alle 1,5 s | 3er-Salve à 8, alle 2,3 s | Fächer aus 7 × 10 (50°), alle 2,7 s + Mörser | +| Projektiltempo | 330 | 400 | 290 | +| Punkte | 20 | 50 | 400 | +| Budgetkosten | 2 | 4 | 18 | +| Gruppengröße | 2–3 | 1–3 | 1 | +| Verhalten | Abstand halten | Flankieren | Belagern | + +- **Abstand halten:** Zu weit weg → annähern, zu nah → zurückweichen, dazwischen seitlich + ausweichen. Die Richtung wechselt zufällig alle 1,4–3,2 s. So sind Fernkämpfer + kein stehendes Ziel. +- **Flankieren:** Ziel ist ein Punkt, der gegenüber der Linie Präsident→Gegner um 70° + gedreht ist (Abstand 290 px). Der Blechsoldat schwenkt also seitlich ein, statt + frontal anzulaufen. Dort angekommen, hält er Abstand. +- **Mörser (Walzmeister):** Alle 5,2 s zielt er auf die aktuelle Position des + Präsidenten. Eine rote Bodenmarkierung (Radius 90 px) füllt sich 1,4 s lang, dann + folgt der Einschlag (26 Schaden). Stehenbleiben ist keine Option. +- Frisch gespawnte Gegner schießen frühestens nach etwa 0,5–1,6 s. Das ist fair, + weil sonst Salven aus dem Nichts kämen. + +### Allgemeine KI + +Alle Bewegungen sind Steuerungsvektoren (`logic/steering.js`), die sich überlagern. +Eine Separation (Radius 34 px + Gegnerradius) schiebt Gegner auseinander und +verhindert Klumpen. Die Geschwindigkeit wird weich nachgeführt (18 % pro Frame), +damit Richtungswechsel nicht ruckeln. Nahkämpfer bleiben am Rand des Präsidenten +stehen, statt sich auf seinen Mittelpunkt zu drängen. + +## Orbital-Befehle + +Eingabe: **Q gedrückt halten** und die Richtungsfolge mit Pfeiltasten oder WASD +eingeben. Während der Eingabe steht der Präsident still. Das Ziel ist die +Mausposition, begrenzt auf 560 px Entfernung und die Arena. Falsche Eingaben leeren +den Puffer, man kann sofort neu ansetzen. Keine Folge ist der Anfang einer anderen, +und jede beginnt mit einer anderen Richtung (wird getestet). Die Codes sind eigene +Erfindungen. Der Orbitalschlag-Code ↑ → ↓ ↓ stammt aus der Projektvorgabe. Ein Test +stellt sicher, dass keiner der Codes einem Code aus einem bekannten Spiel mit +ähnlicher Mechanik entspricht. + +| Befehl | Code | Verzögerung | Abklingzeit | Wirkung | +|---|---|---|---|---| +| Orbitalschlag »Morgenröte« | ↑ → ↓ ↓ | 2,5 s | 30 s | Radius 150 px, 260 Schaden an Gegnern, **40 am Präsidenten**, falls er im Radius steht | +| Nachschubkapsel »Fürsorgepaket« | ← ← ↓ → | 3 s | 45 s | Einschlag: Radius 70 px, 120 Schaden (20 am Präsidenten). Danach liegt 30 s eine Kapsel: +50 LP, volle Reserve. | +| Geschütz »Wachsamer Nachbar« | → ← → ↑ ↑ | 3 s | 60 s | Einschlag: Radius 60 px, 80 Schaden (15 am Präsidenten). Danach 25 s Geschütz: zielt auf den nächsten Gegner (480 px), 12 Schaden alle 150 ms | + +Bis zum Einschlag zeigt eine Bodenmarkierung den genauen Wirkungsradius, einen +Strahl aus dem Orbit und einen Countdown. Kapsel und Geschütz blinken in ihren +letzten 3 Sekunden. + +## Wellen + +- **Budget:** `B(n) = 8 + 5 · (n − 1)^1,15`, gerundet. Gegner „kosten“ Budget + (Tabellen oben). +- **Fraktionen:** Wellen 1–2 nur Schwärmer, 3–4 nur Blechlegion, ab 5 gemischt. +- **Eliten:** jede 5. Welle, Anzahl = Welle / 5 (max. 4). Die erste Elite ist eine + Brutmutter, danach wechselt die Fraktion. +- **Zusammenstellung:** Zuerst werden Eliten gekauft (mindestens 30 % des Budgets + bleiben für Fußvolk). Dann gehen `10 % + 4 % · (n − 1)` des Restbudgets + (max. 50 %) in mittlere Gegner, der Rest in kleine. Gruppengrößen je Typ. +- **Ablauf:** Gruppen erscheinen nacheinander (1,3–3 s Abstand, in späten Wellen bis + zu 55 % dichter) an zufälligen Arenarändern, nie näher als 420 px am Präsidenten. + Leben mehr als 60 Gegner, wartet der Spawner. +- **Skalierung ab Welle 6:** +7 % Leben und +1,2 % Tempo pro Welle (Tempo max. +30 %). +- **Pause:** 8 s zwischen den Wellen mit Propaganda-Durchsage (ohne direkte + Wiederholung), Wellenbonus und Heilung. + +| Welle | Budget | Eliten | Leben × | Tempo × | Ø Gegner | +|---|---|---|---|---|---| +| 1 | 8 | 0 | 1,00 | 1,00 | 8 | +| 3 | 19 | 0 | 1,00 | 1,00 | 9 | +| 5 | 33 | 1 | 1,00 | 1,00 | 14 | +| 10 | 71 | 2 | 1,35 | 1,06 | 23 | +| 15 | 112 | 3 | 1,70 | 1,12 | 37 | +| 20 | 156 | 4 | 2,05 | 1,18 | 52 | + +(Ø Gegner ohne ausgebrütete Krabbler, gemittelt über 50 Zufalls-Seeds.) + +## Punkte + +- Abschuss: Punkte des Gegnertyps × Multiplikator +- **Serie:** Jeder Abschuss innerhalb von 3 s nach dem letzten setzt die Serie fort. + Alle 5 Abschüsse steigt der Multiplikator um 0,5, bis maximal ×4. +- Ein Treffer am Präsidenten beendet die Serie. +- **Wellenbonus:** 100 × Wellennummer (ohne Multiplikator) + +### Plausibilitätsgrenzen im Backend + +`app/config.py` (`GAME_RULE_DEFAULTS`) lehnt Einreichungen ab, wenn + +1. die gemeldete Spieldauer länger ist als die Zeit seit Ausgabe des Run-Tokens + (+30 s Toleranz). Pausen zählen nicht zur Spieldauer, daher darf sie kürzer sein. +2. die Welle in der Spieldauer nicht erreichbar ist: `Dauer ≥ (Welle − 1) · 5 s`, + denn jede Pause dauert 8 s. +3. die Punkte über `2000 + 200 · Dauer in s` liegen. + +Herleitung der 200 Punkte/s: Testläufe (Bot mit perfektem Zielen) liegen bei etwa +15–20 Punkten/s. Eine grobe Abschätzung für eine sehr starke Runde (Welle 25 nach +20 Minuten, Multiplikator dauerhaft hoch) ergibt 80–120 Punkte/s im Schnitt. 200/s +im **Durchschnitt über die ganze Runde** lässt also Luft, schneidet aber +Fantasiewerte ab. Der Sockel von 2000 deckt kurze Runden mit Glückstreffern ab. Wer +Punktwerte in `config.js` stark erhöht, muss diese Grenze mit anpassen. + +Wie jede Prüfung im Backend verhindert das kein gezieltes Cheaten (die Spiellogik +läuft im Browser). Für Ausreißer gibt es die Moderationsbefehle (siehe +`docs/DEPLOYMENT_CPANEL.md`). + +## Schwierigkeit + +Ein Testbot (perfektes Zielen, weicht nur zurück, ohne Rolle, Orbital-Befehle und +Nachschub) erreicht Welle 5 nach etwa 2 Minuten. Die erste Elite-Welle mit Brutmutter +ist bewusst die erste echte Hürde. Wer Rolle, Orbitalschlag und Nachschub nutzt, +kommt deutlich weiter. Stellschrauben, wenn das Spiel zu schwer oder zu leicht wirkt: + +- `WAVES.budgetGrowth` / `budgetExponent`: Größe der Wellen +- `WAVES.hpScalePerWave`: Zähigkeit in späten Wellen +- `PLAYER.waveClearHeal`, `ORBITAL.commands[supply].heal`: Heilung +- `ENEMY_TYPES.*.contactDamage` / `attack.damage`: Schaden der Gegner + +## Rückmeldung (Feedback) + +- Trefferblitz (weiß), Funken in Fraktionsfarbe, Punkte als schwebender Text +- neue Multiplikatorstufe als „SERIE ×2“ über dem Präsidenten +- Explosionen mit Feuer, Rauch, Lichtblitz, Brandspur und Wirkungsring (zeigt den Radius) +- Bildschirmwackeln bei Treffern und Explosionen, rote Vignette bei Schaden, + pulsierender Rand unter 30 % Leben +- Ausweichrolle mit Nachbild +- Randpfeile für Gegner außerhalb des Bildes (Eliten in Gold) +- Ton: Kenney-Klänge mit leichter Tonhöhenstreuung, synthetischer Ersatz, + Marschmusik (in der Pause gedämpft), Jingles für Wellenstart, Wellenende, + Elite-Alarm und Game Over diff --git a/docs/TESTING.md b/docs/TESTING.md new file mode 100644 index 0000000..e824637 --- /dev/null +++ b/docs/TESTING.md @@ -0,0 +1,103 @@ +# Tests + +Das Projekt hat drei Testebenen: + +| Ebene | Werkzeug | Ort | Umfang | +|---|---|---|---| +| Backend, Assets, Deployment | pytest | `tests/*.py` | Routen, API inkl. Validierung, Rate-Limit, Tokens, Datenbank, Konfiguration, Moderation, Passenger-Import, Upload-Paket, Asset-Lizenzen, Inhaltsprüfung | +| Spiellogik (JavaScript) | Vitest | `tests/js/*.test.js` | Wellen, Punkte, Combo-Eingabe, Abklingzeiten, Gegner-KI, Waffen, Formatierung, Einstellungen, API-Client, Audio, Tastaturhelfer, Konfiguration | +| End-to-End | Playwright (pytest) | `tests/e2e/test_smoke.py` | Seite lädt, Disclaimer, Spielstart, Schießen, Pause, Orbital-Befehle per Tastatur, Game Over mit Highscore, Spiel ohne Asset-Dateien, keine JavaScript-Fehler | + +## Vorbereitung + +```bash +python -m venv .venv +# Windows: .\.venv\Scripts\Activate.ps1 – Linux/macOS: source .venv/bin/activate +python -m pip install -r requirements-dev.txt +npm install # nur für Vitest und ESLint (Node.js 22 ab 22.13 oder 24) +``` + +## Python-Tests (inkl. End-to-End) + +```bash +pytest # alles +pytest -m "not e2e" # ohne Browser +pytest -m e2e # nur End-to-End +pytest tests/test_api_highscores.py -k rate_limit # gezielt +``` + +Die End-to-End-Tests starten den Flask-Server selbst (zufälliger Port, temporäre +Datenbank). Als Browser nehmen sie das installierte **Microsoft Edge** oder +**Google Chrome**, ein zusätzlicher Download ist nicht nötig. Ist keiner vorhanden: + +```bash +python -m playwright install chromium +GLORY_E2E_BROWSER=chromium pytest -m e2e # PowerShell: $env:GLORY_E2E_BROWSER="chromium"; pytest -m e2e +``` + +`GLORY_E2E_BROWSER` erzwingt einen Kanal (`msedge`, `chrome` oder `chromium`). Findet +Playwright gar keinen Browser, werden die E2E-Tests **übersprungen** (mit +Begründung in der Ausgabe) statt fehlzuschlagen. + +Hinweis: Die E2E-Tests warten per `page.evaluate` statt `page.wait_for_function`. +Letzteres nutzt intern `eval`, und das blockiert die strenge Content-Security-Policy +der App zu Recht. So wird mit der echten CSP getestet. + +## JavaScript-Tests + +```bash +npm test # einmalig +npm run test:watch # bei Änderungen neu +``` + +Die getestete Logik in `app/static/js/logic/` importiert kein Phaser und läuft direkt +in Node. Systeme mit Browser-Abhängigkeit (Audio, Einstellungen, API-Client) werden mit +kleinen Attrappen getestet (Fake-`AudioContext`, Fake-`fetch`, Speicher statt +`localStorage`). + +## Linting + +```bash +ruff check . +ruff format --check . # „ruff format .“ formatiert +npm run lint # ESLint für app/static/js, tests/js, scripts +``` + +Hinweis für Windows PowerShell 5.1: Befehle nicht mit `&&` verketten (das kennt erst +PowerShell 7), sondern nacheinander ausführen. Ist die venv nicht aktiviert, jeden +Befehl über `.\.venv\Scripts\python.exe -m …` aufrufen, z. B. +`.\.venv\Scripts\python.exe -m pytest` oder `.\.venv\Scripts\python.exe -m ruff check .`. + +`ruff` prüft mit `target-version = "py310"`, dass kein Code neuere Python-Features +braucht, als cPanel-Hosts typischerweise anbieten. + +## Was wo getestet wird + +| Anforderung | Tests | +|---|---| +| Alle Routen | `tests/test_routes.py` | +| Highscore-API, Validierung, ungültige Eingaben | `tests/test_api_highscores.py`, `tests/test_validation.py` | +| Rate-Limiting | `tests/test_api_highscores.py` (`test_rate_limit_*`), `tests/test_models.py` | +| Datenbank-Initialisierung | `tests/test_models.py` | +| `passenger_wsgi.py` importiert die App (auch aus fremdem Arbeitsverzeichnis) | `tests/test_passenger_wsgi.py` | +| Wellengenerierung | `tests/js/waves.test.js`, `tests/js/waveDirector.test.js` | +| Punkteberechnung | `tests/js/scoring.test.js` | +| Tastenkombinationen der Orbital-Befehle | `tests/js/comboInput.test.js`, E2E `test_orbital_commands_via_keyboard` | +| Gegner-KI | `tests/js/steering.test.js`, `tests/js/enemyAi.test.js` | +| Seite lädt, Disclaimer, Spielstart, keine JS-Fehler | E2E `test_page_loads_disclaimer_then_game_starts` | +| Spielbar mit Platzhaltern | E2E `test_game_runs_with_placeholders_when_assets_are_missing` | +| Assets dokumentiert, keine fremden Namen | `tests/test_assets.py` | +| Eigene Befehlscodes (nicht aus anderen Spielen) | `tests/js/config.test.js` | +| Moderation (CLI, Sperrliste) | `tests/test_moderation.py` | +| Upload-Paket für cPanel (vollständig, ohne Geheimnisse, startet entpackt) | `tests/test_deploy_zip.py` | +| Proxy-Header, Schlüssel erst bei Bedarf | `tests/test_routes.py`, `tests/test_config.py` | + +## Neue Tests schreiben + +- Neue Spiellogik möglichst in `app/static/js/logic/` ohne Phaser-Import anlegen und + in `tests/js/` testen. +- Backend-Fixtures (`app`, `client`, `issue_token`, `valid_payload`) stehen in + `tests/conftest.py`. `issue_token(started_ago=…)` simuliert eine bereits laufende + Runde, ohne zu warten. +- Für E2E-Tests den Hilfsbefehl `_accept_disclaimer_and_start(page)` nutzen. Der + Spielzustand ist über `window.gloryDefense` (Phaser-Game-Instanz) erreichbar. diff --git a/docs/images/gameplay.png b/docs/images/gameplay.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc79b51725027d73bbba4dd13c6889118f58dac GIT binary patch literal 197062 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

0<2z2e;idcn|uNQh08PInDIkK9*yK;CgC|8t{?) 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

)poh zp1yGp0iByXGG;S`zLnT49TNEz-^;AY}Dw*N{?gd%zNPdg29%Ad`t^@tw8e z#PDF%1XP-pSp_Y%fQ5sbM!7Go$hJc!WiTK{Y$ojI&0MHi8(Y|3;O7v1vHiHg)DI;Q z`;FNpVmTWIYfv%y!{jkZ&6^x}UH zcxQ}KRyd<`epfNq&POzwW_79$D$VQ?v;Z0bH}IdPacG!GpjdCDBBM_3Zk+MW?rj!R z42wcu^{7@!^i1n>{iJw7EfZo^QT*zcj&7s`QdnTVV@#n+9IIAXY}OeV|FESjBt?^o zjPNe??|7Y2JeAEte{piLcp{*>Mp0y z{xJFt)v*4aXcCHN%Z5EH4sU*^%Pu=Ek`TP_|58BZr0H5Q!6ls;Sr;#6(&^kw_uSb+ z)?K@ns%NT(9_9Po@^^D7g$j#-ArYD?koVs zkvEaZcB}IV&2Qzl?t1=zV<78HgXZmuy4&_);LoS&c!;X+=4o=lTAQ>1y6+9L$PHq?bK&1a+|NWI(W{2vc*RgLjeplPQ`S_@0uNG78nV1} zDbjq%Rlj$mVp1i#yBehjP8k^ZAZ$6@zL>ehPi%MikiT(QiEJDYv z=b+O5%phs6AAI<3)<&-A0f8CylvQsSm(k1fc{6|>p%@C=J|0g>N_xD#zS$MgmQHxq zePCL&tk&##f4cFpQ7eY)pL6eyG>H@S%7_Z2yYd_$3QAx(Sg(8ln3`&yqFgz+H~(hG zI!^WwS5as=^uZnh3jI9bVpM`l{|DX<3PGysEr>Fr&Cq0NxZ@<(-2<-i8Jm~7A1Qz~Y<&OFBK-QC?ylNIm&BcoV~!CHClz$!=DCqV24*&$tG)I9(aH+K zgs8;xJ_&MTrTrBQK{U=?6f`*df9uk$=?~IK{o8>aSxzw#$+NF9qsR``k zjroZ6Xa(>xj=w!vO7L1Lc#c;le%Y=YJd#vxmBS$xE~%A&v!CN+B$2}Sbnl(L1WluLkY)ZQfYUm9VixqIj9dh}kZ8;FM_?`wV&EW7IeJMKTR!0|(+I`|{mlbqo{ zYFI_gtNYbw#AdY*O6#s4F05eMZJoOWOw9DC|GVP$29B3#s!-_?y~g{YH*BPsghx+n z>R7}MUws-g4UTLd`mwVWqjWD=u$V-7&^ttRubB>Dod)IU-*x&K-ZB(|ngM-S&B)9* zT2%VfaUK-wcvj7bu|LyrbBE9=6-lb*oOd)3yX_`^#w$vDVes6hsDPkstIb)Hh%Ifs zi*%3w*oJj1WsGjIm9zuw^D0Y0hq07(U<8Oh_2Ao2UJ zUH69nYH1S)?Y!l9@VxCFFCIC~Z}IHl)sKqd$b741YR=Zcv(#w*m?vWVPNbb*$%8sZ zxEoimWeVa>sft|<6zMTpHlM6Q7x~JZ`$rscn$pF4^{Z4J8?vJhT4V@ye@YTW?Rbq@ z>Cygo1ZVL!$r(D`iRV6t7i%?9*=Dd=LhW`5T6pD?O*+9f`J$uNy2c0zE-KDfo;_i` z-fxcf9W1`RLUb38Ji0CAX_XjVD;8;){ameyi#|6oUVay&m@1kq@N@Ay$WeQ;tGqN? zl!?;Zft@nxYuJl)t9DaU>29ILgBeM63$ejZxewgq#~plF+3mD8^wi7b?&a(3Z;R;; z2a;0`TbzrzX^zsl!(wtb2GH?7mSg1y86BKHYhi!*WLp1>B=O8iH}380kP&svyds00 z-QH5K635{24$@d;`1m zO}t)+4@IGJ!+RO6b2jjna5vhOJLLF4=$tL!5O+I_X_*~O*?VF9(4gVN_F6-%BuE)6>Oq~C&WB|8=32z!gWtEqULmuT<0 zhkxud)s5hK1l9O?Z&k3FHt+7Y3oAW466=u3#~-Zk>~VIoINLp%u~!N{B=8P96hp19 z2P%t{>jyRXkfY4*LT1Ggbr&8xTL|*V=uzR%-`=rB?0vr>s^0rK7v+K;3)Pd#t?ZsRmLs5B8XGNIa+#I25&o5_Oc~#OcnC z=Z0&?{ymYw5!ufj>ek*&v7f6Qv0fl5c*(ApI#Iat8@JaGaQm#1!RWQ9uiJvb>6JJk zo0-mUD>JDp5p##tyN}>qG=ewBH!7qrlWSQ}i8Q+Mma{aFZNXNAA9la4q8IaQ5!+V9 ze&r?sYCczFziz(AvD-4VL(Rr!K){;0qMd7sjDNX;5f9f8wV@n$aZKo8=+3Wqt*9}SuDWtZi?2faVu3pc(AYjtXGCM4PCNm58+vT}l6V;5Xst+r@JI6U|~Y$V0CzL!?@ z8$WYAB_A(-h$BAM`ADGICfeu#p57p%hu!S(95-zD?+oiy*x|11DG?#33rML+(_q*t zuT?Z|x5)5&>)JCoB|%sLBrpqeK8uc}8Y#;NQM~-}rrwl*QBG3w+@J4vN|y#p@8S8h z^KqcD&VTILUyTXIq(^0L)PqED5eh?jDqV+?C>{T>+bj*tg~}6qdyh<{j}jHWgrtwN z89|O&q8rU=l*<_G${LH>IKW;~VHbhd>$68KH#ey>4hwu8&%inSvyMHZKAbAA`K+o` z=X1u|F6061yP8J(J*&;0(KO;wh71b~>oE_L!_8Wqo?0>4{%CrRH{v$E@VwV(%~Z|) zp0T9ZnAmHzB`q3~dw-q6t6pmW;Wk1=vo7lN2uG!lD#K>zTjdxDNBLkxK4gt*rGB=inpZh1lJf5-km8QMca?y^ zwwqcs7pT~X3CcykOz}w@gSwATpJ5VTr$OI)g={kRSbX~3 zNvrO{Fm%sKfmkwQZSfvnfVa|^S2$r+l+8?bdqZA{Tku`K&&w(B+ay-0j`Y|WeBbwV zz2fmG05fv%OtoQYDjBHR3IMVrkH_@~CJM#~` zQ|Y95%imm@icZm4RiTs!UX%#sXh@XdBB|V_>BxhHyD`2qE>x=Xe=edadEe&^oS1nN zW-nikt?6r50%=Yt12Q@PmT~zf9kklEUwW@ba!0m>{?O(K&uqTOY!-Q~Ywtlh%FS!d z;kEVn%?MPdLBz;rVVL+KYep42(deENW?86u&NssPaCZ3cn~HJSi^NUfKY>+-Omz~^ z0*6G|#s6)hB*jmk%haPX(_5dF!!V}eXabV^Oa$p#_>L1m{K${eKQIG>hjnX_KlJ*c zy342acZfa$8SnaUoS?Yq*{@4Ro3~10m%MMpEy@CK3_ooxMAtzMNZA7R>c9wI7jrJ^ zbd+O0P4f)ETeji)7gy|cNQCiA-XR-ef3i)O%$V1rS(RDC`q}){~ z8tLX&QdiSCyRrFt`guhSE@L1bU&}F!;EiX7-%PMz|?s4fTjfS;l7 z5W)UOZ4W>+=)tNYr4v2fC4F-!PDLd0<-hd>iO>rTSHO1$LK((mBl5#KH3g$z<0Y;X z&k`T38utZ;v^L32w$4b2KDPqb7SfAwnVk}ohThb2G{5?j&TS4w{~m3U7zKK>)fMGVe%u-7N7n)N5|lFG+Uxn52XroyVbT2@H4s zGVMB3R#6dlt2|hJ#Y!;rY1PffU*U-j-?KcHVZri=^_Rqy>Ev}GM`;~w!&E$3JmYWp zCGvmqOm-%oHAsYK>tuY+ZZJ~z(CHzv&G(3AUP;t#vWXA;aAX)AKWQ>2^;u$N z=BS!PV}ZHLx&Ss^aWQMt+7WUbHcQFPDz8blx^9cOv3R7haOc-Iii+;oX z>KZ(+dumK*8ilCYG%@TepiS|}(N^EmqS9zNHGag`sT`$E#6$QdL@U0w_*7+}&rF|m z#E|)JN1|b$l&ELD0R3AYKE%LVM%Jrv#MRm8?H+sFZ}yCpO9RJ@yf0_3U+))h8GRU; za6fr0JhBd{sQxkN-9w(*qvUuW#c}^mGW~x`afwGMW>5wyDgFBvd@=KnH2RC(VE7+x)#k5Tw1g+XC3(Jn>Pq+RMH|yPHx1tPA;_=9f$% zC089h_E7w%gjpY&@3)qLhSIz#sTaY7_cL8yNBXa!|rxo%AM{-KGSUjm-KlKT*~pXL8^S) z(=xt#A3QS3G;`X1SpMvXshWp>uSpYs^uX@*VQO9Z&PulvAnJ@4ivgC?Lp@i+K~lTr zVr`+AqZ*>yj7kRGv zW_CH>%tABo2>SoV-b8W%Z@YNeuVYWTZ6{>4T%tnqjZejsMD2{v*GKl*Dxzqqq=cUS z=ida>e#7hC6M_Opk7&)k1Uj3X0KfIeu0V9sW&jD9vL9GZM$$H-?r=374Xwh^F^6Y~ zNletMs!zGU>3Q71%Dslkb7P&Y-~N2x*mX_n<-zRgTJe6JJr|v z4b)s1sp6qJ8gEdmtmWFr)3ZZOoq8C$v(OG{g!Je}=(b%hOn8NtaS~YhkOXvF@Zmf5 z#tu|ka|>r<&5U!c?s;T#B{1!8L|JlIF^+1gxabja!AV2?N&6$`)Ps1 zRGq#x;p)8#uv2=-c?sau!i3zKQSN*ad#Hy!QSabHmtPzk!d%@CkQTT!jw;w`$=cIV zHaXN$8Ujr-db3)phmAKQGh2>rS?mVc=dT0ZCErCU0mxTyQ{ zXdS1?^Tpr@JXlA%e*vaL7{|wLJj(rn&sBbgt`z$wF9sRcWsULK+)6~URsz38>`eYa z7tFX6{?X=$Al7oTG;5!(Ec$Cc{5&NWQzyipKL>M;FtY4 z*HqZ;wL#W#71i{kT#B9TIr`S5C|{fT=JNR4azNs;Pge;Zdvt7&2yyKEK3d`Wk2k2Yj7SrO{pB+> z6kgDith0FNV38}!H{Z{O62u&yLEybHSw3vwo2jyZV?D?|7Z5c;@2J&pdYl^z*1mHR z4!qt%W3RJTz}u-CIJC!g<|Q8c3S@hEHk16wf6xnhEr_n87xX__zo0ikp@ERCPUzqG zzNv`y(#^OG3lZ_eYS>VupUK#ndetu!229i@P=}#?2N2 z6uN;AW9hg%14)6%%=(Qi(KY3ah+PU`H#3`pfY`Cjthy+*_fJ+I+rquqb^fim-1{K1 zuvSTnvequAmG-&$7iQM^#bLjp{Etl-x~>%*^$j+Y$SuQqo~^JUs)gWZQC)f}iWU3# zih4GV<8iOb%~Y-u=#EoARO~HVjMVJgnDdH#t}NUxtrW26#9h($T1Y^DMaNfpCWak~ zP%pnUdUlKv1wnAhr6-DjW9zkiJvr<(5ZwznNrhcq_%~&I_aap|AUQ`}0)5F$CeARc zFzn(%teoe@NpBedc_j)vZ#7hx^|)G+V27d&*-=OUHrE=wK8fALrl#nmkd=Bq5g(

2z$T{!;GTU)7B*65PxLt`^pZ`m$sOnfG3wgbm~Brs$$_#v3py-7X*a9ah4 zFRO=b18xHRMrGH~(b(DGIPuA6L9@KTE1BlzM^_nHSm06f-h8LD7aK0)1B6lroX@ah z01$XE_NF}UV8$BV4Re~6&O@JHcu%mEFJ3dP0Bgu-6KYq3iVjiB&aFbs>0qKpxMXI}T~+-6`$!)`dR0NOo2C zsdYn`2Wn@bV zT(4j8rTb}3nRo17`Q*wQq+baQz&!_wzTT{f%=YujhGC{GW(7^`IChTX&#&UuNvHtp zfQv)1l6NfK&Z&M|xlYh5|GhJ`3D8TB&V`K)_U?dKmfkyvZvMXguW#7RX+M}Bd=)CW z03ceYY`$bEpdX@b7WxL>+PsCWNLQuiBsGAy|C2OP6~le*|M1{Qo{Q5yfvHJ(t|g@# zLP4%`9o5_QPHdFGGe1*{(Qi{g%$+V?yaU2-Sj!}2wYIL}8gP)-y1|dz^=GqCoL490 z(6dG8jTYdfg9{)$f$@VK5~9!-v5MGZdI34iR?0Nq3?bqYa21c;HHMwF#0H=)Wlyu9 zm(#Jge};E+MQ82Z)Lha+isa7cq!SUw56*9^D*mxDFJY?xQme@q|Idy){teyTY%LHM z+EA2hM;!Z+yv^gwj2J65?(3QcHR6KvnLE|y5O%lP=!C`CL}i^2CarOUX@W)t{AmwU zE3DyKHS0H_w)6K4H%;HoEvYFOSJF&dd8PF}&WU?{eSe@kh^P)m<)cT@8&m-&MP6|? znaB~rKaw9N-Q6P|kD(Rkmr-zwE94`UmCNGG-W9hqq!xnE<1(6F&czK8i&;j45GgHZVjtg#UjFe_Mn811O z1)`O%c&$%_Z0gtx&N7v>>L?r?*cbuk9mi}S$GkEk3C!`6X;EWaIDQ~jX|Mj!us0ZP z6)H;OM+HD5p%{x;$PO^@^3ueAEf{c3!;Z}b4l(=h$M~<;5>1dJu&6BPRU#k?vkbbN zPnU%HUH+@=F#S-p7wlRB1HN6YIbY|41MjIJ3cTBfN>7+DG>zv}%rLhS-tDd3YwO80 zf#4%3Ga*j+OIHh-B>Hss01>S2n&SK{a_l%aa=!eMT!O46;MLrs1yo>1w(45>nN^T& z@#KWhy5qm~Qho!fe^`xX2@zTI%TyI3LKg8&e^2gi=01z{xQi1NOMJ*t0P9ATp!zlL z#BpE>YN6ijgOwW{X3vGv z=;bNjyojeV_N+;L!YDqgOxtV{ZU13X44;Z$D7ykiEmR}yrb##tDt_e}qm}>nbWJ_U zld?CK>Zi=}uT}nS`C<4wqGD~3_C`%{VYySpZUiT}@W7u`l?=!GocVYYO_-5O=pHGC z&i_IYdjjx3&Ihlz4+?G-b=qLBA^{@A#Cd3AI#FEKQ3QN32hE{mdi#W>oND$-W!*h2kmF{SS(;j3VJO zm(-+;{oQiYs~r;mte%#m<pKR{xuRn=EMd8YfF*W7G8X}gh zm(7;+DHD?R8H6&BzElM?TIIQnP?{T_P@LSnj_Iw4o&^iXu__=o$& zgEz!0X+xEOaf^lJ6`j zoBw)eXUlW%vIE!GRTcW&^fbd2PP!Jqc1RnsPHg|qt_^5ruC}KI1mfwuAX|qC%&RXL zV;^Vo&aaG}!E$CK2{?QC5UZ0H9H{uf83#Kv&xd>cAQuFS+CfX>7L!yxgG{`DyCU;{ z4WjINiuy@@gh^`TBCO^iB`E4yTkP!uGw`}^ zSUQ$%$+rsD;BrY09h!{vl0EP7W3xi1gk^dmPZ9a!-D}w}hC?XTJo>s<{w^+d+;b%~ zTIL#T^E4W>)^F>JeI>$h@57A9th#LN3=u)p7wb~b1@rd~;6M|$zWsxI*;d`@vQF^t zupl}li5(u3TqAER5|AP(veOx+0=63*@+MU=?o)f2dW`y^SI*2)Y|gxuU)}qJbMSw? z0Dr;C3^Rk;OKGo6^A5k0$t<-eIrUzp;q2&E+1+?{tYZH0Nj}Dc-sI`9XG{!229@_L zf;|8OcY)3>EJ8MlfN)?s6qze%zHQC$d_J=pc^PygcbimK-5J;&OpjfqLIl7EeWdft zn*A?B=vx#^fskGl?CJ_6g)y8fb3s*oBC_ITqX*~iWZ8|Kz2U%B_OFn!zwikhSZiuV zU`NzAVwUh&Zo-9oq+jWkWF_vXOZV@n>$C_O$u#?=oQQ5DLDkrF5&O>V=^)9E3Q@Ih z@CDT?uji6SSThqNg2aFCr%B6<*4W2~_PC?)W6Nh3e;B7n>H#or^mQwD%>@s&=j0sN zS7K0Hifu)t^i-|LMQcIG;bCGdeA)NlA|Kk~wmMh^J7c@$nRIEqRI}MUjsy8`8bcoI zVApGA*OP%grmN|ARo8J^us{8jMH`U?Ga-rMF{n+vCusGnXgiUGJSSJ&vmZ}>e3Z*@Z%hY)F2zSw z!V0lEI_m1`NAqMYZkKY=NKSWeW8-CGV1QupLgloZtaLod1UY*wd|uXL^LQnU9ejm? z$-3;`=WAH&h*WDj{^QO>S3w2x+Z?l?(sQC{WjFNF!tU*isI#TbH?_1mzkxTZVE8dg z&bKs#lHk9@)d2lpXv_DHNb2o#`=!4U!3CMIL_xTY1O4!=HN|-&+7Ta#{X9O1)Joi# zD$}b8>GGh=p=J8Dt3>e(s!;e$^2I7%o1cf=vs9ZxDYyoA3r}ZN@x;@JjWMfvP{37< zmh8pFIJv+OpZ*WSM%N)F3ISut15vGj&LUKgn%j14u&3>1^hgY1V3;Ly?(D3gU$%k9 z&pKA7aeIB1@}9Ao8q85`nR02Fy}nO{YS4Ri=m#zDc5f^yhK40vPP$Pe=RxinOhoW~ zfox4oqgs{S{;r~2ZG~c+6kJP-nJ3n(nBt%wXbN4^F`UQzdE#T}U-d3(hmRo?FQw6!6avnQ)W(Jqe8EMmO!hT3a?#T(CP(r_B3EC@hP@QNEbua%;XE&@Q#-jeaPYKO2U z`^Bf%^NgAl$LMfEzvQw{ay1Yx6>9ET>IWvyF9!U`xSJ?lZsYlmuhaO(FrUXwQ1r@- z&)&XCScZ{L?)Vzie#S_o~VeLB=SneaF`q_!kUxQ z`nyx~gSnk_hLxVlJfOCV!LY%_efgc0o%85##?dqefG_MO*S$aDqF|^zm5IR+(m!^} z|7NguNcB*v9xh$Av6$5eFH`edkPZ#YA|Yb15uz=X@V-9&IjAtZ+=6V2b6l+SMU8*g z`$N65Uv{DQ{0}fl4=|E7h{bZ@nOz7A!Ld$fx(o-jF;IXV@dAeEn>sXTbPZ6AbQ= zxs$N|F14D^adId_ey~}jQ}l1E%xHMlT;Jr2y=nCW!-@_jgIbpj+A=^rJPd&D@2p#? z2v`I=eZ*Flph5oQl51yqiE_t%65_IO2`xfig&C7M==r(qC1&(w*$aNN7pCTSBdw@V zDyn|lm(q}h$IV#JCtL05{RqPV=}YIDIiy{RDN!{OsfpGZ1P-+Mwx5M(15Ri#UDzw6IeAd^xDgQId1#9MsuP)O+SddH#4%pDV)DQt8eB#@cF z#6^5_GwEbF_&43|`@2B?#JF0d2T}E7L_{dDKI3C<+BL>drPpDj2XDugPoL!!wjoTj z#}tfS-C4_Fq=>5?J*XD~3b|Nq zb%FS1j&Ap@?M+o>VhgJTArCHDtubBWtaVnQdW!)T1+5ho9?6?KJv*G9!|F$Bf=zQQ zE1x$#MJ~Syg@x3(Z;u%_7`s)Gru#?4A(sI<8lSKI3ktg;CVm04Gy$t!F24!wFM3{$ zhQ&)yS@$`toXiQ1^%i$p?=)=OWy`J>I_&-E5&LQH@n4bm6gf^pnhk8_3q60O=u)#) zrk1I>BmNeqxCg0{s2J^zk_<-iNgpJF!b+CU5(S5&VrLgtXNs~gUjSDYokDC-cr6?^ z?S{rJniV>%=Z!=~dp+SwR1~Fi)wcaTlRGi&X-jqauKinvBMaVJlcahjvX^=E(N0UJ zQ^V{R+j*b1&^Zkzy6dcLkp16}eFJWTH%N)hF3bc z=;Fu362TR#zZr?E-!J*~gxsBDovXdDHPKIgAZ>O*gYJp15Z?KXwmijwbp8O!O2 z&$1E+MbwHD#Em0CUNz2Qu{#0qi?cCuNrBFsHvN6&`xE7=7bu>5C>gQ_S#p;)tHQ#}%tv{pr zbs2kKd~-}it(-x-{ITg6!X=Tq35kwRvWlNLbi|i<*Ymz7w8~*u37R+V{pC#`gAL=k zbk>HC`p8Dte9_EVmdiIMzrUk8U)Mda9mq!N1 z;I==;Z>B=aiW0H3ykJzTt&)r1|&~@}kDze=o>#Sn+G{S?J2XChKX~9yh_OnZyn}wpIEQZjd!=09^ zaS(*Ib?9Dfu?(s?h_>j|2XTdY(*$;b;g&w!MbW1ItVtav6u9hlFuXy9;giw)e^k9? zTU=eRG>p3jcXxLW4hin=!QI^yPdhf7&b>Yew~sg8CYRS&D}Nu{viDv!=wlRUwBFyGx<#hi4!x(CsZ=f!;ciagk>zT! z+&Z%}_aopY0OPg}MjYB<*Y}T|83$UACQH~QkpORMydqG&go3;`^d;;@CRGz9111-X zj6p{S7>|U*W|>TM+Ab(m_A(AktrI=MwJfv1hy++Wk|W`S)r*x!DbQopQE*29uty5f z0G}&sLV}P%&8Vv=bZJhhA~ryyTsFmu&>rT~Zpfs*Sl8yk5PTa7w~aIO!N|#K1NDQ{ z$b~h0Mc^g+Pvp6}_c8|p$Cb^yj|#k$>OTC=Ee7~*xWqX88aTLvR7@@x_|0dXyQw5{ zNP1ZLZd`T%Ky3{$psx(c*BhXH^^gzS&LNLfXVYG}eRfnMPb)x z6n%wSH(;a7GbSx|H~}JHhf(b7%b73He9zLg<+yTI!(p6V==*x{=g$w94gc!n`^wse z{=3Y9bxA>614h2-+pV6k+ebI&_uJ&(h`qs~XJfd}l+gfm^Sik5;aIyPPY_j*_Y>EZ zpI6sOW$45AWK;irRpr?p$IBM;{wI+6BE3XO=Ys8$E^TJ2s0Z8MTXo%?XBtS-9Hb^+ z9`xmE?18SsVg`}VXx;8(S`+RSXZ!pbU5YNxJcJQ8y}D67ien-u41?Vk)buX2Ex(<3 z0oMTdz~5RN6Xqx-2U(5{g?3uf92mR-h5~;HK9`8F?Wum-&t7#SXr73?fi8SXPg^TW zwEfAYVG2NYq@UdF91Q*1_?;UKeK4zJdU$&1OQ*c#cnxp`b}rpJ4vTYbuETk<a({NttYJN5Av1!}*F1)Ui**_d zR>~;GIQ^&fnICH zDFnFS=Txrg;?*kD#;pNs`@^;SbkG{G_qJs8`0K#LEf)}(i@e}@-r6=Sw9Hb~ZY!9| zeFu?}4zp^BtPs(tOK;1NKwt>gZmrSgBi{#e!+YHcwvvA8>tQ9w(CFyRKY~_GAvH2x z7}S0JKx>@cC!S@Fnde2}{S3W)e6(@*#-zMh%M1@6vN_Db2a~8*%h2eEj}bm_pl6hg@IHXUN3_C3#K{ z3ooXo-~lg!)v#=ZW?@$WuCA_ow?QNV!N1$wTJol}@KCq~23uRhz~-jkZC{+{@|?A2r$p0p>&={#PV4d z4JvoSze5;cX+%fI+Ysy)22uDPHY+_t&%jR-I*ZcwBHP zhrouU?WleIJM;9v_G*d7DL=1DKdaexrkt0Y;#p2}LEmi=W3$`I*`Se%vV)s2GQOwv z-yV9s-PS&~t07a2h>!wn~;p{c^k!&b?4xe}aMnw@}B$-Nz4$$RO`f(`YEG#rq zALSulhmSZl{WfgR^b(7g7=|rlI0UlugEHUdbpA#ec$AKQ`vt?jCWI#MZzEp&4WLju z|ELUKWK5xHJEpT+!TnEbkxru~DTb%fwk&ueatvO66a+*^aoFgiD3ii_9tA zPB*ms2l)KRm&+F7s15U`Ujk6Y4K^ZP1=&s%i3TpVUK*(cJ?7eBHkjm+Nd_N4iUaHM z{FB^$gv#zpvoxPfs)z3KWrAvexD~-Ut#fo9Z+M7FRC$Q&REX;Ur~%4gT9G8{p;WCj zu8ouIKkxN_&>EYa(&9ZCb&}Ua9}D*OHL>&uxM|{Nn!y}d8f~UDhW61w6Enf|dIJVr zDV&(kX6fAsacXsu%W`qOzIEGgPs2;Zhi&Jg*<+hqT}_)<1{hGtVOP!41#nyP{E4dM zffr@sFedYi%rp!r3e2;^yqtD9Dj0Z1TyYZ(8O~BA6Q+4ta%;v8o5%?nJ1Tb9>nCI+ zd+-o$QQY}9y;zbz3kO1MwqAp`4U~FN)l#PvQf@g7ssafGx3{X*NnjJ2=q@TY~d_s&V@Mv8MYyoUTs^$)OlouLE{l`(sc zu0M?hV=6ZuLF#YQ^I9KOTDN~P*5^2Ih#XJ!6OdIhGGe=i^;$>Lz;PAF8h^j`V$1Zs z{~P_{$|)4`@bfyr27&mShpVsPgr{Zh)J@||C_)cl?irtqv!Hm z719x|@EcQ!>;zCh;0Jn!kTYe)48pLk5qZ1dZ0!I4imZ#`GS(aoG*Lz(s~4y%>wYbt z%bZBdsS=Y#0qF=a8{bzp{QrbbhoYJd*!0*tzyC&*s{A8>i^RhEsc<=Ez+I^?>)2c% zl^bKBSnyTL=!3JB4{?1IB}(t7BiQ<%u#-AR?5x5ZF7G)>%^o;s*&eUh_Wn}uD)H{R zc@9f?m|O!6r#nab<;YosZ)%Jb)_r@Y{|a>D;AbU^L?6rtBM>K10EqRe#Ui}L(+j!P z-jxjvVH$xAvUn(m^XGU)`z^`Sw{>nDZ84k_6Je8|gBB;e`b&l@(6599+HG@rH#@i( z3Xk(eC+j~>ig31p7h0y!wnr$sLx&+;v}b}3#jisns&ieWD-CZeexoyezo#%R!XAKc zZ^0arnAEL7ly8V{(7K`B8vOc2%r8b#B6yO+P7);Y#c4U3XK>Js33w%TGe$ShIs~Sp z%N>&58Q%{Aa*w<@B1TJ-nE4zT&N&=oT}{kP*>A_& zQQR%R!0yBcggXug3NzNQ9l*`+umBMWE%}oPjGn7}AShvzmQQupmQhrT%QJ4U8+hH; z=NY`|alqN>qXQpF#Z23?MMhnV^_P1CGYF7q|Aj+bf~o zdAS~;JQe=Pw40%X$j7K)VFF_>^rNcuqOjO62-ti6eSGFQQ$0LRq67pO0~V%z1HZAn zG8?vDzq%&DQL&Jh2wkd53OiY2IQ_wAyo|a!Mjdtv%qt}T8mrlc^VF1FMSL6&TbG`HPTCJhEP$e$=(Q>4&Wtk z{$)SEI4^QotIh-6h0KK}U#_nS@rw64>W;g~Y~H`jQUO|Gna|FrX4R=adII$OgLmc? zT`gD6<~<)DUmD4pMtg5#){%bS{Kq$kEPx%=bMkGj?%+~Z zU61$6>-~@@HBph6kXTbbEUY&IrVQ_Qq5WfQCCSyr^;QYnM=EdaB6#vup?u*K+qDMj z!_*jo=+#6Plz_)?xIA&aR+s?!tFjQP0biyO5 zX;!U4tB54TijJ3A|Alf`{qW5-=w0NJKj;N5=sxSCEv6RrbyqGPh{~Yn2760db%MP^UPqQ^~h+g)`EA2q|{`Z9kLyXsDN z4fKgaH2cY)MJB~!B;vWHYpscYs~EW3 z;Q)v! zC$&8Nhz*|o)g3a-uc-H{8T6V=vHivUs&?K<%HuOP9*)))%Hyw3QaFYsG-`*p*dGUs zkk^xe9g#*rvV8rAYz}>qfCk;uKWk$8crW6-%eSmW6-*W2Z`Kh|%YvV+fXBa5VG|zl zsG7GBZRAQ88zGs`6v^5+nh{!hnS*k$a@CbAGNq{QyBc?q&yL*e8N*u7S}dGD&3f+; z&*20n%He@de}d+QYDy4nZD0)?8qdGSw5l=dvugZ|WY?-WOVkvl(a=2-&;g|jJ{B`5 ztCaNH6?9pH4+liLA!z^3pdRF%mKE8~ox$!egm$iPtH5g>K8`45P`11sJHnIrib$Zf z)$17ErcoP|63X#4U**91csKoBLXv1-Ei#L0hEhbmK>Z&L&-+T0{WN~FZg+5o= zG~1vY!!njyY(_{mY_I;T>*}Ij(upeLLyRlxJpwuB1F>BIESIHw+6M;1gNAtU)+HEL`BUF13(l%6Zd0Os4E3)s+; zr#qY&uKZ4@3LK_OCZTvMJE~t&aj8-!6KZo$-YBLn`RskY0%jq$0%EOONdn)Od4$Zh zD&Vgr%iF2zByUIK2uNPLCT1qhr91FaV)TOG_J zCNIt3rZ$VlZ@mpxT9-a-8*(3iWo{BVyhDfM#dA)poK`B-d(Qk~S4@d;VZlJJqWuF; zH9@hE2j=RK!a-ks=XGyrmsKb6WWoh?yIrQ5QB_+u$VmES*mJdcAO0^H0Fuq={?Jde zC>LH(qZxBQXL9PU+57%eWviP84Z#p!_Rogr7m11yNob!XHWvy7kD{_r+=W-n3j}oB zCLA|kQUl;xLOMEYL{nZV{|^f&(y7V-kJE~BewU0k6}R7l;#ZGTU$X2fOLmy?)1{5?!?!X_| z0>+o*cUQPk8&!OlrYe|}gf{j}WAz-uUYe4?dT~WQM>`9uD^FZoG67h^vbGlwHpb@e z4^0g!R9hcAgS~A1r=d9eyrl2?^HmR{Z)lk3ta^x$osEL0Hb|OK4YQuqGzfCmQsk8L zm))?RPcp=M<5uG7p~7W<0wS%EAAh`$VM~`i^1Gt2^+u=$t2rA}P%MZ4PZNv~_^scbea9EjeCp?pYkT`J z{gh5g+4z&6;40hq6$akBQ{34x>wjfMOH5MyyzI|`;u7tzbEa*27;A1`pxQ6vMN0`5+!4YZ#7Z#kuB%_9>)-=EMzJlk*i=0n(~Wp@4Tv2)t|mv zV%JlV8pD3@fUd(u1Y870Sj6a0`4IfiD&p4gn;H?M^sg$C8Dl)%eH3 zfacasJgZ*~h+(s!0}kPhvld#zkHHIp4W=MWZrz@)NdaPD+agk9J8dB@!+`KkI3 zT#5nGMc+cJ`niNnaSOH|=Gi6G z8}fNwtbUQ~e*AGAra$plz+xS^y55%May)|lJy?)9aA6M?DQS+K+K2W|g2nIK@|4gz z^BMCnfDnfKedoE0pag6m#%KQ-wmz;o;H6pYD~?N#pH5+f0%#-B-AKH0qLk2BZnhrb zQgZ24Qpj0t%;cRFFmT%4m*_;Sf#DUdHta` z^n9I5XT+!_6lrI*SJ4)x#y}uxlwJ2?MbN=K@3Cq!DyU{18w1wX$42-kor${WA5Iij z@va?AU0vA9N4@$zMAPrD;Mg(eETh@`L;UujMN!CfDuIx&*X-CV<+c~#m{>s1IV1@d z!NwnxJ&V$eLkiZ%Yf)u-Mx{$l%`-kScXM)<63}(Ij6G!QMH{la1_r#pJftHRnkqtL z<$k^Iz1Q!~PJ6Mu`mjA{6H)uX`UA5s&y{Z7cs(&WqqbGUhtOPBg~dg%Hh=nD&s8NW z1{-Ak=sY`X`LTMl{SK4UrUYQ9+GtUw@qOrFGyLO+5#=jsn@e?N zNc93*n;KD4n4=r3ZsD9o+MFYOsGJ`bvf#yUf}Ua}Z7M3yK|Z_&{-Q@^!$P>n!~z3XBcrS33wZg~?U(Q+(r!;Ib8Zp-Je7KyGT=`Yg#Z&&5X(JnJe9 z*%vwHDGGoj6Lzmm$u$LyXAA)zl>)`iy+L#%d_fM$OK&^ipQ7T>_<;VuItzKEO2Qoc8ITe$ zn>KV|$k449n-pjsqE~X6Evp-%?X>c%%5$dfU&M-i*oNlvd?bz9DQ{L&N`#(YN(s2? z(|a+o7~X@~WGm9^YmUs4bjFV{cXRXi?|A9|hO01DFY8SdHr$LWJ2Y&#H!NiEMF^$U>$*sI8A(OL` z%vgs%o)Tu9e*1o6mt-ntJV|fH6AWw!#fO@&%ms4D-gX;-7446xcvLdn=znLRq4qu) z$>7qL?a0p1y8a0tl>|#u4-#!Xyv6o|3QeB?ijMF)08l@02{iEXsGHwWj)as|XO4Z3 zm;2)fly|-NY6+qY<`$FC?OGn)7V#Xn71_A^N@a&lso$Zeq^RG}v{3zJqut|oFu*P? z4cVr%)lwKj1FfTApPdlGdKR8Z0 zuEbWqdPj6-+t*$IJe^WenDf|D7G}V00s8_vt=g|A&D{f!dLMH$XU#{B!Ha01v6bX5 zJ~OlP?>=hgy_IwIou1k;4*|9;Id3qmi}p)#eG?BOCPyk0HQE=TX#v}wdO(dLMK-*U zBkzxel!b4l6r3~mncrYD+gpVb&_PTUt^QYwa4pDwA0b`X#V<90fvZQiI`!}hx2|)X z?2C|R8e8K3`s3Wn>uxQ*8NP*I!Xtt;k?O=qg&aN<8y+*nI+&Rz>#ozSrpX%jz zJ7hgoY?pAMVcFplaGC-)?PR$Yi^U{fnehl?@y|B##>1bV=k0PA`Hwmb@c<;Icg{WUOI_6=cs;I@s+W@O_r3;$ zt*^pQ8Bty1UiZ{#&1IXyQ`#|or-txhPsR@12OCgsjoj}#$ZCdnb+JxT;CNP?M=0%3 zxt=WI=$_G3XqG8DTV1;$c%eF=!%pvakVCay$P}omA5>oxG0;$%WarQ+~08U?8BO+K*oy72&-sc`FLXA<-}#T^<)*g+^P3zP8P?o{rRoHXVfTYliae7rkRQe8w`l~pH2g?uhSABI z6fRft;}E5vt~_2}v2gC@`RYUT1Fb27j}uLlf7(n*SgS%TEDpLC*C!R0&3&u@TZ)t~ zo~|G)z~ny?0l!^5-^l#fU{U2&k1NdE3z3<*@Rwm^yRh@W${p9!eP<$Nk|FNCR_i@S zy%E2RU$Gz{$PaX+Uc)fpykYTYKeyuF@>=31kDQ#KOp+o@86QKs%Nysp&U*&>6V98_ z`-)k<0;`qu7BZ!0(=mPow||f5ii2|FSNp}Pq>4Zc<1TNa&>#KUIG1d2T?P%MTz`~o z&F+do8y`VK%AxPY^`Jx{asSBg3-Wu7|DA0f2+!9p6=fvh0{9=y1 zXqm7bpRvs`i*d+T&2nh%4h2h~1G3JD2u`~BQ@RSN+B zz{*kDupoZaQXkJT-eC&ef2fGbgCxv^E4k8*4l$7FPvF3wZDeN^&0?O);Na#Rdx_*; zc3mE8r%L4Z&{{LpxT_lr8ec3vVta;~)&4NIaJWos@tHMprM%)L)K#XNAYsJfx2g1pat!id+=<{c9dg5`GVvyrn?C8x9!> zuzLW{C}){^*-91zk!Mb?#mZ(Sj#M^%_r|;-Fdpg&+_P3gLo0>t%#@@{e-o_(?QHq7 z1QYPn*STtELJzT*u8RA2YW$#jq81Uu{gqppA@0v3*0@%+5OPx3tyS14g3;QRQWaZQ zO@CcXK5ehhaVHalwnKDyA`$l?2kQP^nwc!BJ$UDO*r+x;Z{)7hBtqatI^~%j&x?eX z9mXyw6`uZe?{LMYyY?uo|=hu*j{>3vLK;_5I!o)B)TCv?3^eZ?!J-ci|l|&zL zB%8R`2?Tv4Ot|p#1})5bMNih{72Or^-fbq-f)rglJaI%@w0lR7r?MmAHOoLNM+-&7 znr2VPdZ4rfhv@d%?qlc0Z>J)N(*Wc@Ftt61=zAi%T1QrL^EDtl_K6BIu-34Z3R33qM8%GKG^XuJK1Aw^4IZG5;H8$ZvG z@t|YR&>7r7$1j?ur7TKX6_|TJv+c`aqOREbUZ>CEierGs+0eBD|Dsb^FN8D#1q`H3 zFh6slZX@`x(@iRYj*_p`IShHaUm_v%^Gw&BrZb%UqKaRlF0jo6Z;l%%dVz0?(~>ho z0lCw0eTq@znUJO?vhBNNqBjUt;xEJWeBsxdu>R|aFvxzFY!F;m2RGAa^j$ysZA!3m z>3f09|3(fBfrXq;bldeOx6+kM^I)8iH4mJK`|y>N+NiHfGg#b1{x8)$P2%I6s5 zhSj7|<11j;a61bg6;1>g${n#WBBSE5X6GH~HJ`tqI~&Y~{uP<+{U|2kb284v_;f9K z^DLNSc1y1K%9L&P=#U@!81iLO;XpcUS8=V&WV}KD{j98z>HxcgAP8qPG3!N4DKJ01B zd%u5ws`4rP`vGl%Vb-^y>4Og$f5#ajFFIH|_i`We)phw31&lIhhIKL$PnML&buz*i z#dCPV;e|Fcu9YvL6`W}U*}iO?Ac!? z9#%P|A@CUq|8_%)dH{H{)_hg}=4+vPd2-4w(eqhma^<$;M4~4>8pa`UMJFT$MjEj96SIw{&tR?zON563GB|EFrsB}Y>f%>9`6}mjs%5juj8Y_jy1vL23z}c>0+e`&xG6a-E3)AQ*It;v|~QM zRz>vJ@ONWNg?x#5a<|GdA@AeIiJ5cPC>O&iSNV6F4<&L$FTI&Byn-hAZ*5neozy^7H2+{_1p*O+~UhkgCTN2Y}xX6D%r`9#BztfwdGOF)on}wxoY(OHm*> zup1l?Tm6RmFL&1Vn8QhUBJ{gb0OC6`tj^N!3JX}gk!Pj9_MLRr1DQD86ZUixF)=jX z67vju%oTLyYg$gVXi?p}&7A2`S%*Gd60LIm)G9Z|`D*oPck~Y!zap=Se{`IGI*|Ww zz_O3NKLqAckQ}E4*~=?=Rx=*coac{oo>{gavMP?lE)spXw&-t(BjHhsl&^MFMewc# z#ZN~&49}r}LK~~3?-${z=U-?*m~2c)sdKE;1kO|tPJ=sLk>&FBaf#g{a2?xGUmEwi zy#IUo5^u*Xb-H$$PsO{JgaVUXN`IWtJ`%YBWe4I zF7NC(rt2;3Ji8#|v+e0wD&Ne8KO_K3v7uR8GUadi0QzE!R`QQl34oSB#Czpk~31&X9F7&_Xa}=caJ&wzf#y_(=7zhGvV! z`^Df+TfxNUI}a_}lAXkY&TBUj>t5(p>Mlu6OlMI3y*ny(jh6J`TBNE-tTpWpm$QZaxwxckjcB73|_r;9w1=EZJ;j<@7}cpQNM^Pt*0hV*5uh2~^zE zxL5BMd^bKDGFMm>J`F0sH}SBK*gcz?Nn34p#Iu%`px2tYrwcBM9+f6c6yr~#!a?~H z8G+{R78PHQCB9opC9cTgGTArqKbJF3Sxmkq?qlWo-G*nQzB_?@HTQ1&cg{m(7P~>J z*^CNlPabVEfK{XGv!&9H?Nzq1sHNwLJ)OWyg<@Fhmvto7iX0cgPN{NWt$1;|#Q==q z2<6=jfh{mW-0JA{vV6T~X1U-?^UQR^zMw zJm{rOI9RwXI{qKod?84XjL|9#SP=@XJSMhqmWJuiC|6}Y4|ijlur`7L*}}B zV=Hh$@PZ)5IDz_SRF=x?cw7BYMhdMkBcjk4nxj#0!Zo`-50;Bo*G15+_x$t2+p~Jue@>#p)wtpjgR+3)uY$i zv1R`>CR^xfm-2s`YRd=v9B~nD(#aj5*yjd)#$l~P&CxX{%hSDd@)>!85gC^zdnQEN6SQGqn2D}$>S)B z=$aU&$H+UcT7ylS zsF_f>vtfy~)2{K)a)f-{T;iv?v+=OJ`n0RBW_?11!rgG@<4v>+{zrWnSJAMk{iRb% zNbg2xPFj22&HBFlXGYAXutvE2_hT<_HqEe55gs_n;R1w;P+!8Cu|NAyRAFzSVui5t zVHb7EI|6O@O;M8In7OaP=*YhsLh22icE#hQ?g%EFXt`;of(R(<_r?fl2x%}m$yIn7 ze476&NFxlmQ(&G11Hmx~*coPW6S-=Ml6ywr7Wi81+36hLKzr-*FpD{Ux~KF7kNxL) zy3u5cY3oskx?5`)i-9bg?s`QWv{LHzC6A{H`g*v!H5vTMzXsi*f6Whx&c5f?VUy?3 zBNML$EvV}-!6Fglc^Wa$@*CQJK-c14J+!qRv4VfDZ(i`uWMf~_?2!`{(aww#qP0ib zEsJ}Yz%i%pQ}}__`05hT&6VBV!ajyD@(IEbOxbAOCYfv9!&F)5JrrSYb=-{hT&@zjsHgANY-FS<5)5p&r+I=pHh{>!{L=tv)+ zuFFk023MOW2kCFoEM<|$`h|@ks0_*4nH>{Oo?gMn(R1%+2z+Dfy!YMPHIg3{ps09) zqC;8tiq_~IA;=uRi%HHpSiWP1jvt?k`353aUk3SD{UP?lH<_1T68X6hYI9JYM`}xA);S?N@|V7SXV|Qm0IJshx4Pf7q%Kx6f!PRk$)PIm2KLW^FOEK zohMMCTPm&KP`ROhkZ{h;>v8gfO|ppI`{rPcY>W03bTY(gQhIYNXYx$x7{ufFDW07ji4UOrL)qR}rx;pJt!0oKbF`a$u4?-~oH=A&AU zsOZl(dw3D&WjV&*2qCC=VzqJoS|C$@tK;8lI+UX0{-!hc5KGK1oRW!rX)=X~XH-f9c54LlMx?6EpbZ`Sl=yvyze@I|1fJ~5<*RiMWC z6^T~lX{&|T(r-EY*pTB6o$#joI=?@-x%;Df3t^rUX4Hv)F!o2iLz*yJqqrOXfz)SG zX{T})g=wS2oOg#8*QC{(92DW@* zl7fbu^DCevR3`&`#;+cca;iLfSCkT_Tg3rpv>5n-WgOO9 z#^wDe2&IY<2*eRmt?0jR?q&Z4A=?2(mSHrkBJKIgy;o8~n`Nwagzvhz*iJuXE3=3! zS59|JDKDq4r4c4Ft9Q}gENJJTR#>p$<^X3pO)6w)U!6Y}A5-`7xkz+3ZElbpiJ-N4 z#7)|d7@)u&rderHCQC75DG+kLlTOG-3gnsKNXy@|=Cd!Xi`FVamKHu%kA|XOO~)uc5+d)VXblgArTCIP=>yl+YNt6Tp(kJ z`C03gvbv`8yMct>mytu-p28$+(z61(jKPiJ8dDR+0~7KTS#IAa?U%#MVyTLT&`HC* zbkQ+n)lAdn8BsqU*gACfRf2k$ngyd(hFn-JtYplz(NA(XGa*2TmYDWAB{JfYYiUZN2 zy4M~Qy5?c;IYd8=OB7YY&#F5g>~&`r%d=Vf^iLlXNwhFfDxSLk2dpZk@9uyTXU-){ zVbV;1Tw;!~>s25VX~Sko-zh|qenJEqS6Js$Cz@i&AZ8N!lDsd*Bu(pdiN((M)6gW^ zcB6Uetl&nl{9>QeS=G34`;KB_(t+clLORnygM%X10Q+C?OFewBu*c%9)6CvQq)F1@ zr$Ce|)0 zE82n+VS;8`e{ltS8wcD$`LZ-KOIzN<`lQ=HAGVCsW>P{1HxskO{K;&hra zgV3rTeUgxs%wcI|$;W!XuCB8bwISO1gGSMjBPN||D$=% zu7YxpVmmfhp)u?S`B@eIqbekGwN<#Ew)go*EgNLYQzDh|$v%0LWW&)0-WPE;B|S>q%8zxNWmB_; zD?EsrINp-_P-g|E#%5WDT( z;V2YUXID-d(oJLb=Sevn7?Z-?7}TanD}|*fAM~}xPbAotsp7`0sog)9#NZ+En?w;( z1#(hw{~1p7A?|PWQ$IL05`tYY5f0NtIDwJSCi}V2$*IbFxsIU|SMf zCQ*=+LaXbO2XT!UmP+I4yeXltrYQRV_lX*1UaaX4#E+48-gRZ?@UZnlNp62aeHd~m z-IKqz!x%2=Mg?lG)ka!>Uyj(Aipbn1%eWMPZ_>Bzb}TM#sj-oZ#<TGD%R=tL?@SpP($^jMG?5&oJXzJT>$85Wv+WZmG%e5w6}USjDp z|93XRN08lACT8OKb0#2`O=wn+->{~g`GtcG;o((aAXZu1k`hHOzRy?oA? z9MA-k7B-^{xcT28)*Em3B*9khx=F)$nlw26m&Hy0H|tQsW9UiDsHXHewun-PWTDbQ zM$Uevq-FnPU{t1c8M8Km$aul|kcgIMvMSn#eB#yiOdlGQudn@QNYeU=V4Xd;#(Jh6 zh1hMfen!`~#M8nETYvH3va{{Dw>tevxG$nW6(1r#@ zXK)P|9)EJzFnq0ynDrjYH4G50&DmxYFUW5(2Z`KA#N;w>xa??d^B&#;mX#?;6sy>P`DAPtYPP1$2@wl!(lVnBD^hTaj&|7va)s0Hb z-#z=W%vKXd^>c7q%cA$42^}gihC;V}NnhLEt!M^KQugj^Phw=XY&Y)xd=dVK6aJ6B zw;7w7;#E(c!wq5p#wz1jkxf}Iw&%>AFYzOGP3|A|(jp}M{U->Ib{Wt=D)t-wY*n2Q zjsT+$VyR<;rk%9ikLF#@YOZTw5_7U+p-`6QR#-E}v1)#He1T|K*jDTnyPBmIOi&$N zVe*Fn`AVLfrYvl-l6!}kg5fTkHUIDu+ip#eWD0o+@O2`bAwJY6{hhU&1I?|Rpx<*} zs79B~6}&kAbD)L!sS@j>z;O62y4@_-hdn)cp(f zSK9#jRM44f92y~^LTTD2Z)R(*!{|}u6xpr2>udm5+rWP43=JB#$LA1JTnge(zj)rIeEG$Sj@rrTva9O;BXd{+j)jb&Wp@)ObI0Fr zD{&p`f0jA@cQORH=L~fhh4WQxuab5afmu;?dW(T1Hs0z$hf)=IZ;Ka`v7Xq`^+m{Keuaf?Pt9 znDFdF@Z~~o-A*91L>^ugre?uhzHm7j%@(--NF}_KC7q~{J14I0X|WI>_oO*bmM11F z4+N+T$C7tC@6|qsTwLx#*Khqlvi>?Q$}eai$LU&Hy1QFIK#=b4?pnH~ySuwnO1e8m zLTO0}0m&6aS%h`ryQuHyc|O12U%q&G-+Shq`95wF`&xR^U8IB*Qx&GnB$zsb;NEmo@~QJ3XzRb#X)9EDn6px&c+!)bp+ zTGb6hRzdM7^=;>Fu+t9k&!wz07}yCuD7TsE zS2H*juWatw)x8x3ScRT1E36kRn4gO4zI8d@Xjt}C#dG|pAUFgewnCW$kG|=nH%y@% ziV=h-@1?xW7n=K~s0!ev{!@H1Wl}_pzBlO2SzTlEDm9PgP4b^Ntw`g{%FfARc#;cX zO}jtTzc;MVT46Jzou!vVJPSKKfu!BX?>#QPC{Mo*EsivD6Mz4ucEY&cOS@rDOY5No z>2h`IOW>veHAi_ZlfnQtu?U`g-j<z2ZpQW>7NF3q|I=obqQo1sg8#C^ZkuBBt%R{m+LiF!-S+p_2gQxgT-YA% zGh4?v&_4k7>szTP>eO6x8y=q#j=C0Nsl{<;ihC_iV;bz=C}XTOcPZ?K+B|Spu+!Gj zfbH(p%k?vm%Z9KikpJ7&sZiK3t>B@Ee5dEVa_6!Sc@m@yWTZLKXbiEFYX|Hw4fS-J zz|M8WTuA-}aa=<=cKPdHO%5}82Ac{?)BT=-D9<^(Xn(8rGXgSW@NIe-Gv1&U5^8aM zU9^rTF}apoeo@fFFcP`)fvq$9rx$p81VpZoC~7B1?qAuBwOEsFSf;bkOnYDxX&$8e z?LBDVY73b}hJ=o!G3v9HzBpTwPsDD0lUnxpfbGJ)slrFbUdmLHWpJWavi=tL^Gsr! zq5xyyeJqLIq&fcOWBk(` zz+>4;?=zuozOgRO^vzlFm8~F${+yjZ)8rCS`3G@CgxdqM^J$XL?u95f1K91!Ik-J9 zh#zOHUe4T)C`{<{yo=d)@{1(eL zE_L_>6&&VkbWV>EBgz<~gME(a@*Sn^LG{mENfxK9q*a6W-LvF9ytQ`ACS!*>xXOkm ziK5H}AU+XgyAv@$s^hN3lJAjf4~_C{eUE6APBI`ASv& z29_+tjP-9%)k7m@XR5b}=W36cF|XY=YlP)IRL z=Pp8S(10p*3;*1u@Lu#|L&L-<-;zFVZco~-8HiJOqh8xpn)wA;B>;o@2-+SS2D^{H zZBb+W6sTzTOYAuch!bbRMcnROnxjPcV+Q`YvFpLgm#XUPKDJyn3AEt^?{wdNK?%g8 zyG$oY?=8t=&a3-cy2U$w;mfD1MWOI$E6KmL&t~tlCp{OfG$+dd(Jg5)nfz4W0)q?e zn1RD-2+e$YFx4Exx}z*~<$XsN5<5%jLn;XFZVmFw?$)+uVA9t@ym^9IO-K1S^1~zki6w ze-J}%oP>+8QKQRoD$i{3L|os9?5v7?6*et z(CpCg?+7;nQ9Rxv?2MxLsvLwjwpz&8DZLPRsv!uN(rF)+xX~472sPUj2(cLXk^SiPGfkB7@!jEFjW@(TnUdIs&1VSh z7dK2Q9m(QCL{pn*_F@y%PCXLzh%j^_&MaIh`p7?mPcyb)Og%@DL-%>zzPouX-}4a( ziHOY8vaDOq_fy-9L-72XU%do%ip}1kfhrL7Xpt1wq>_ekc1|uk*V!?!=QqC_uc%zJ zqYvL_*JF+^fpQcdsN<&C?lNZJ-afDnY^ub_M%@NPLmk1&k(*kQjokVx`Y%Oa9R1+H z=xx|n@4wdZL6A6hnGBg#K|;8AM_#T_8hZ3-GVCTL{=Mq=*7Ujn%((%=g93)mAj7Z( zVmkHgP1IAuvcJFuR(X`vf=?aoMc-YBjiiqDkj4Iei4t3723(y1VV$%Z^5(_z!b9hbg5w!y8f=~9ehSTs@Y1Q>|TUfA70HYMZ8q9xp_bQ zi|2gTHtd8i*eAaD*u`??){~S0kL|fpw%$no>POp-jcq9!7nSYs&zPg z%aX^Jk7CVm#we5Id{4+5M%c^VCbu!l!Nm@)?VV*o-Fc}cGy?DUqO_-RxTtdz8M0&w zJH*0d3aK=0;RR>~wzGLaptvnH)_MJp98ns@wpS z?t8czng$GgmN&pjH>@KQ*Z0<(O!|7Be5<`}49~F!YXH~|`x(0E?pf=op}-YC%lZjb z5!u{r_{ydkkE2*;;jS}d(YB>j9umHnJP3S-4F|Cccfth^3GA>b?r2UaJ~Zy%QE(Nd z;si-f)fuN~u^jZeOhbEYDrKDyK{iG|W)p zhQb?E{;jOZHh)7=)*!M^ZRR6xs;tmhF`+5V zhDx$1jdsdK%s4buZ(3d2{(Ab;X^%|Wh2wsHlSRN-DlaIVKdSCCZg?j8@T;hWD5D|za1 zQmq_$d=9e$Vc@A@y*AAiRHX)T6`1#(4 z)fkmuW2KVP&dbm#PzF+nuxXCcG0X}p+Y8GI-Rqb;;`!N3eP6pQ8L3y4c!5VXzWTdS zB9=f{Qz}ex6mK)9q6m#qeTutvw}R5`5qP#k27VFV2fLPd8K=h-ap*#Pq8W+>jPjQ$ zwo*5_y(@U-bZp$p?j89k&}LmC%7wZXqs#Svgn?1pooShMg{tMMpyBslt<;eW`0l(8 z>Q{Mi=e`DayQA+xQDFtwfT5%d4>b#~AqOKie1%`Wzb=$1;@_y%$X<)+9b8a92& zLTYOFfPBX=%u>`WgML5&rB?Vrbd`*c=BH&Sxq)f#B^Y0ePV@ej3q%Sz*Ro`dAvzk_ zRA0?xvu&|z196M&JRr*!qO|tSxEZ1xDebyxIlGgY(q1!BTtvBjP+a&%?fd>En|G3)j9Pfo6->ByP{em3wsdgL&jA6LW~c>F5~0?3UB z)G5A0Mf?Lgyan2IMcCF%?RJd&^aGdkjesg$skt8qN(V=a$EYL%1r6fdi%fgfIaEbYL1VR8_8RvdUgp=kTTzNKNcfn z@UOQY#zy2)o@KxTgQmO}v&nP6#l49$Bq?j}y9SH!uN1YbF_pdBFa zEzBl5)#zCTHD`+Ve>XzWf#u13VF*P*xabqr?~Xsa43VssCy6tLyMCup;*4* z;I$3EW6-6K_b}8N&jRlydv3`)n&R+s6p^c8?pa@c+U!bL5$vam3J4v;FTnua!KvIE zQzZ9>G(=*2XAN7}o@x;XtVeL59DI)f&!QEJE;^(ohRMekO@i^0q46 z&qu(9nQ#at`6a=vq?y5G`d<6GxtZ7jsYk*kv8M5ibZ-oN8$2CylsF{<@OyLs{K+dW zYI_2)ydYC_BTWGoKQIX?QQa|26(NSAT7tX1r)uGpK1d)iWi<8zdl4%D~Z|+t?->faRK*OPA5jGf< ztWjLShiL}A&2U|l_e)6v_&Pn_>3dWQFszUP{;wteMW_Ff`ztuL4sMpvpyHGMA!_E; zIFcitdAm|7Y>j-LvT0$7cm2-dbDkn4Eu6(Y`Ffq^>QQ7&an>>#Wk}aNY+?y83E6}d z&CViBJF&Y{I>1I~J~1X7{a!r~3v`du@@x<2xgXSoX(uY5&+Mc$Tvg9ph&j7RI7 zLz}I6yF)n;21wMq&r=dKy#rVF*@6U%sk&?1fF>y=DFh zJ@c-V(QOK%z6NtDo?Pe-t3Lt{*D2#D`v<_2inCzqVQQ7FoIUQ5KFdGUvz$Wac5h$4 zA=6#{4-2SHE;J$mxxIL*FVGFwQQ9#dvY<{WKeA#!p23qN3qkS{EuBi+>R|&E<&u&) zD0viGB;+D3zVh$2*Rl$Q?=0avTNuH#BW0s)tKeVBYM8=Y!R%h17|SBVg8&|%X>L3u zU$_wmSp7mQ##PJINIqyd#b(?DGz+3OVXQvderg~fu3G~8MlW19GXsmjvCHeZR$Z$- zQ15Gd%}VWkXlxmj6Ar`-3d@p;e!2M%N0-i`!tOo;4)#T`uhvm=a z6?oCpM~=7=2+n`Pb-0GM#qHz-=8C_TDI`h4)w`CGZ*+P3v_kUlY?X%qJrx{R%=hS~CRP{4Ml+tn{7HX;8=)8J} zd{S1_AU9;O>w)s(j`l*(Je%(Z-Hf2_CoLC>WgWo2gLGgylsEiuax^ehx8rlj{PCS= zbCDZYJ9Ulqb3tXp@0Do`s3kZ`D>6fbQZ+v~fAOz&ml7Sm^vebjWkdktVKgZtwb4y@RO98ZbT?bkME`(R%T;Z z1{`t3dF)4@_0W1aP%3)IFx$dI-pOZ3C}Tjb_ze0ZGOF2>2`|e;xsqt7$JY^#U&ZIl zt*=UIw35rAZ{hx}DkUUX&1R9l;JMts3=?DbQ`c1aRgR&?&ZJfQ>nScolf9|cThT<*aZXyoZT=jw7mf>Le zaPSM*sZZ$I!ePLdF(SFwewSyd!-d;vZXn^AhiXErCq+Ml{y|ex_bnsYI`^)@*`NxZ zN&_=j1@gSTUv@{4XH)jY+EK_rl@iGH@!CzK_*eZPxEt9P5ev%e9T>wDp^b>o^^+wt z`nxeck9(WVj7R=py&iFfsA2YE8#=4lkEOa-4Q-9Gxy_kESbZ8ylNTf*5VqUwy^!p4 zz@_*`+G4w0cxi0)KqN#vC5uSarZc! zr0CA=0{|!YW=%O@i@9TXl!y#Tb&%YTi&vBOMKgo|;Zm3O0dxj{XD@8)b5&mX{dr;2{DPbdhJwDM}EIFU9^f+o)PJkAh^hqbOpj z9@ibUld;Fk}ahqsLN>Ynxkoa(?G^>fW0lOB->DVw5mptZu|7SK)XaW#s>~#$UH5On6H6+-Ux=erpA8)P2 zs#r9(8v`WllwP>hrv%xupRB&59iPVSOw zak%hgYzQA_F3$-9lkTOAvxgRVKJHBrjIkLf;_BmByby$B2TxZ8v)UE#%QY5YLVavl zUV=HEKo`u?@g!QD%f}9q;zW$UYfXT#UK5vzm3U&YM<9xwe}2ciQTHkQINCc(O+K`2 zLeOTCK2?hfok@27ST?Z*Y`uL17+R=UAugy-$>OVa3S+sE{v?|!x`_nIzHa`o#7b7_ z80Rj!v06S({|7Yq1q46rR{mwByun2B2v++cq2!J78HGZ~RdVa zVi6;fcp?m{dl^Xo>zBvRD`ekK?4@g_+qPUIvt3I$q59oraCF;zp>Hcwb? z?zKD3$W{0Ln4_!gr=hQT5DeHp+JrAHb?#oy44;4zgOKQ$!X`%|ISOyZy1)NOnpyea zP2&=FEoU{JE7Ica?h|RMbgRFQUcW?>PqP4jBMaWrW>GiQJD77Y2MYDNC+y42HtM&b zz*m$%u!FEZdmBCxSB3_}O<@b>ZuvxK(^;!AQ6 zl&D-WkW^!3|L&3oN0MRc9R~?o4oU0DYngeCgk)FtH+a5!>6j2Tfp{??Xe)Is^l{!I z7nAk2=Mr57`b5~W>X~6Bb$v)YgTX-mJ}^;KKp4EbJBj6-#(t3iwH@CbE+Pto4vLWb z?_n|_-i8NAP~F_LrtFA(Hn0=G3Sg=Dj=jQT zc<4IFH3eEfl&jd9^??lgT4&XKzh~&6{QikN=;?jOh1&h){`RrtFC$Nga37x1M`*#E zt+Nva5UHVpj%=0gQ}tf%3w*7bTEZ|NtG6K`g>kjKRRo+OSgr0$Bq(zFa9e84?vY$e zL%Vf1Nu=G@-RDb#U7Oi7mJ&#RP0VqCCkaJNJ?7z__(;!4lSS zqlcr}vHgBAn~lWaXLWuOP0nQa!P&?_86sdZywblMOP3RU=P>$kY&TyYRMA&`{=;Ps7m}sz zdEZ~etLSP-Um)qD%W&$T)F#E3Y|x+9X;zIfr#q}pGO*@Jt?4BywC-w&L3S|4<3A|Nx+zx-S zW)~UUnm~njG@IrXq!E@5rF%LS*nbr*E0(#46kvHTXOfI*Ga8vA^QS$glE2{mL9TS# zO?W3_V+KZLUrD)%eH{k+>pC{ZM1H?T#3*y2_?)!krVQw{)Izf~te-&{G~%p5`Qe=c zghT8){9Xz*MVvD7X$smD3V%*S7E0U*A9c<+YnpL`#{lC(hKkZz@2fW{>;(rSOW`8! zAx(!PSH5Q1`WoLB;wAxFBKe6`WnEukG zaHCZ|M7=v4kWhcN5}wUV~% znv@(DPRBD&3lgRf;Y1S0edtUp!Kz5T@I6)U(hyCUF&^t}#0 zO3_Wi(~mx`j!6qE$F_{3+n!(9^yEED*4q^G;q^{hKU2nWrWOWWOt7Z~IuxUNF zsfYpSmF5@@4|>9;52?~jPpxnpiWE^_gY@0wzebBH`426TK-WlH9|S`lvwux4yzQuJ(k^=x%vguN76Ww{rzqveg#+W4(5= z`uT2jKiZq0oXKnXB-PJ%j7(XC4_pu2)b3R=|FGs%1D4urzn7A)bFAmq9BY0Z_>mpF z#qkzr!_C|Xf3HWl`OrHljOwUwp)T$BpAi}Vjpzdh^%48%ITDMRP29(8QQm>oMpamy zf!P1yEHcW`=$sH}P>tH9SvzrnraB(bqXsJi*J5tm*{jQYgBx)kXD)oxGJ^jhhIZpp zLat^qWw`A;A!sM}g1Gw68R@|MW1ocAVw0k)$m|@+Ah#LGHEt>-Y0Wb5wd2wAa~C8B z5Gr91Wqg`hQnD+j(wgSNpjx~dWRH`NQZM8ZPo(MVYj(BNTt3b}k+Gctk?NTHN`5@< z+tw73eJ-h4+jG`@P}ecf*Gu+qC9w=-kk)mNE;{82by;=eX7D#)AR3G+lnO*%f9RwM zE)U-CdsQ8=8N-?nK+}(l@%GIwOPWVZgJHx_Y#1#l=^ox8%(`>6^ko zDW>*Q&LJU#*inB;Xa6W2R+eCHB7`~JcZ++GEDxD{2jZ-mNKe>Vhz$D(*bQxuR&>6a zqv5bW&uN3^CvPP0tI|xy2q#Xxr3bRJN*5lraBoGjBI58ZFUAHN2KVhFB`m%C{HR@7 zY?IlLS%U%S6wMgE?9QxXnvr?kQ2G3i2z#P3=99AB8ZK7-Noc*rb-)GjzX0}M|7bD- zWWK_+&}v#m#QMkSwO5^3I|a~|BOaq)mQBp3!JU+ z@U*JiRG_2JRCq?yJ`#TLCI)+}bQb?5!h}+B&^iIUJ-c>fveY5l@6K%PjyFXW&@XhR zvJp`EkD>af;@80%`i4kmM|N2GMg;W~z5G`}L_VKq0l~2+4+q3*&pB5jl(sOI3A8qFBy?qe-^22Q{6xVxL4`O={rmq!jL7!WoJ~}O0^wHJt^9<=VGc_%| z&1zAUhk=tQFW-d|n?I(@*9Wgfaszfg60z##*CSIAh8)xl)juvQgpHBs-N1qLYX%a` zzs13NFU6be_?CD7O5P&+|65{y40i!Ypu@voQ6aeBx(i>(YWBT&OP}5Zza{<}5=nvD zSH$tkrakW_Je~{B`PsO|hG_Bpce`aP!dtakdI3enNS~Q6Mjl-Sv|9zUbypTN^9ks; z;EC5kCn!1D$ub%%FH|l~-k?X|%k!5F@y=(QiBG;|!{*?q+yguFmotylWNo!y_R@WO zkMjRYCj~O+KKAWY;}J7 zdr~RUHvb-Lwx6%PqnpOxSRsSy1ES!$yoo>is)f;BU}G9PAm>(h2uS!bU@60rwnwp! z)`rfdvMk|T|1IKIr3)-G{-!JP4QoZWRxHN?o+C+ZJ?*2EDz|X&z}G!?!<<*&%ysOn(9Q30dpV#Rz$ z6Q6{g$TDRfVd1umgL&NX_v^Xlc8dOrebq#RH)lJT=D>+~7_ zcEfK0V>anv9O9H!0v+2ve1E(vv3{;2Yh<?ST??f&$W0IN?0xcfFF^=8U_xMM-td-ndfS0xULRJ zq(*Y;x0f<(hVp9)NM5ccG@xw{XlEHki>~{Wd71d{n`g5JTCN7uGbx?{GMd$XVIpSy zs=Kh*uE0-XpSLevxea{xmlySyNB-0av|lx>QeAKp@WB-24|D~R+CJ%vf^)8VCcEAW zwWbS!0Juy*0;=JP2&gH>$8tx}L{QRkej(k-5V35tfbuevx}K(MBtaPs()C96D8~%v zy4wPxdYb*c>h~=r+BsXq;W9>kaK5?U>h%Z%ax+#NW+XIA=D+yA1mI^0%&?#J@AVDg z{Wu&M=MTGGQc0-RnP#VY*=O|5(`(;P3vxqVEjRxE%KRGAuNF3|_10T>&1v?}1x8Kn zf2w4F$rb&W99QUwg`B~G-}CBH2Jf}=V;-;`YU|HnK4gZ*$x;a_uUBSJ8 zsXFfNoc_VfZ<3q91i`aV(wkrwDN6kK=~R4R@Av{~pc^ZFK43TrZ*TCb&6dT_B7UmZh5ws) z2K1ip_*d^h9L%Epf7FZY7Dzn|&Pm>dcC334>Cftapd$m;i|R;gzpp^P%yU_P@MuW` zqc*+oJs3lbS271`lXPG_vI_Rm>>K+f<;UpYv1WHhP^$N^NqVz$G9W|{+a$aubmN!V zqjFxM8Q0_^b)BNYdjk{_|oi#OCI1S?3TFHof^R~ zM}SWu;&l|##I?LkzwOX`-!=T@;aNS6WfLQ?0C3}d{onqkn|9#q`ne<^^# zekl3`Twt-f&oT_lg>k^ld1g=!R6dl(e`y{(#&3tSfcT=hGc>UW9Zfj{NiD+ zNs3c$=lqqnJdu%}STyD5hLZCBGKDK1(FdOD{gmBFJXeHW$4-|gaVKO$KujeS_8lG5 zn0qOzg!11*x;dP%HfAQhxeL6;_Dv}>iv) zKx;R;=s=s{C%;1h4(4XVuuG6BoqpWc5K@D`V8gy8A9qc^6#UH z4=O!Ha$4omj)-r7nsf6eH>!q8$L^J9&9&?LcjQ_H!%BAfc1aB!Ukc#P?GEtfkCBTi z+X&BoQnNL@Ry^I&;w~Fv`|{!wm2MCpCq))Ph$-%s*f)h-xSs(q>={kwng!p2M4h9A zEer71va!*02&Gk4dzm_8u>xa0;Y%TI4HMa9TkJIq%_U{m#Mt6W+v&PC8SahjBlD98 zX8ZboOy@UfXZ=h?*%MNyrcdc%i9Hg>vhtM^ot&vk$<zmuomB0D(7|>YcQSUUe4U#!kw+xN@z&C1aFAfkL$Ul( zM%w8hP~b%(@UiZ9HZSg$ZH9eXkZSf}Z}cmsqOyhbdD&;}0)CIF!}J})Xa7cTa3unz z_Ews8?hGgM5r2u%fm!j&{CpH#94osu26$G zm7r$S9Lz|KmdL6qwi>jfxA>sdt2}$Fw205dq5gF$Lv7K7BTPqr{}&_JxU+Nw8NIu+ zT_T?R1Wv zn}mdFOF(ABz%Tyw%M(Jsh+QPWqRd<=%y~`vkt?%|#A1s2_%G=PChM;C@tdzi7|yVs z>@CpFmmQZ7rZzJwf)zr@aumHxjnO-eth8g;R(f!eBF!kci zLnWWlbRE*H4J+$!w$<+H9Y%>~dlWUoHud&G+^WTB1CLM9NR0pCXTd70<({&Q`bc*Krvq8F0gaPovJ(d zKERH=A6Kw7@u_b+v|?)e=mD|5*+py1sxItSiD_F&)-mt3yHCA+E@VjQ@so|y7wG>X zhW&{-x(?UX1S0>=o*&MMoSFIbP0E7*Z-cajhfH+X_j)pd@NgN@Tzb`mGRc^X!+xX9 zLJ;_E?8X8!$MjSq!}%^ePKiN~v4aV7ApHKfpVTd-bt%iI57N4E+;aqZ_ik5ooDD;s z-^{zZrc6&$hOTtx{T|(5!LO&5cz-7=+q|W2?)e>K=@rZE^ShH}oE5Oq{ED@aTWC1W zx*V+G6dcGc4%Yg0EgS^n<$rpZ0qE!CXYWU2vdFO&I^`X&*0xaJEpt zWX+E{ky|2c^c>T)1tiv8L+= zagwE(RSPuelc#873}@WlYu(($)$($|X#2)t;L3kd?omaD;Zu)tj!K^kuT@0yl48^M znxv@ZHzBkaWS~nX*yX+02pzZ?C7v2Y=sF=-Z!+9glis8SRDAgQV?@&EllpZX20l?hg;AWv zyS~BN%}}dNbKmySxxSFf6W0+xAJs~5&g{~Rfd2Q@6ngp)C`sMBtA|~YKlH6XWGEp+ z&IlizR4PljiY^a|l%-``KQ6#*aMv?G`rycp{%L#Y_iO^J)}{D}OQeh*Q)^P#HzLs@ z0D>Q+j0rpH+*96hn6EH`LXN&#H9qQD&`yIi$xrz zx7mfoTrS%yW5CeoO=3$PFGSE(s}=R7MgC z+IHM&mM6T5&DC-d=gW2Na*H$YiJ^L86^X(KEWN59d)|mjM`6E>rEL$xv+kLxXcIRi z_-wDRg4lunGXNIP7F&FHrC(q9h9!s1$O+>V3v0XCCpt&&0@aAKwU9UP)bS96aAOI!sBd?{5PKk5ZH)D?vm`12zuX@o51DJ&xpF21typQ~4iFdC-byTE?+Y^h;}_9DG^jW<74!NAqf1v*0XbC6jfv*!}{dK-1WMK4p^qs;IADZj4cZ zk7MEgop;zLz;M@%TiV!bW3I+^34DF+xcm_|J?dwioAbe6`)ddi{a7Anw5%PLH4FnW zXuWt62u4YAw6P=bHLS)XJc1hdd!#|TL{Xasac{8dCO54En{OYx_70sw%l)c~NcFPq zt23jsq^l_!l~7TmS_W^at1%_Y1+=%0rXo+>zH;w$a`RsF1;9fd7#ds#)opc$AhQh4&6AJ4zkDqs=EIjD_uksD=GG`kJSXgK(H?ID=a601j_sZtC zALa;~9wZQ<8w7-QE3*mgJ?03$5D6o{6Aq>7q0 zaR;R~{9H3hu@mA|t<>p!cm9Iw|MHn&76fZv74m{j$%e~Q{px_lkZ;ew!9fI;YS58- z=!OHQc@>8x7&FpFq%+~nQG8r?kkN2r&Ph`Re{zdD&};@(4emVlCucT6Wz#r}Vm?KN zoO(FIC0fe_*s_4Mq8C5$UuS{D`C<%_d6dV_&tI^e3vl;&>BE~1|1CNHhu0Yn?oNR* zSJtpKqYu!&#s}Jqro!~!PCJZ_Nj@~iSA*BGo8Zj9m{`CzJePrmYl**UpZ~ll5Sv$< zN^wZesBp0pVgy?h?0o{~(Dgd5rGt7v+H}?;U2VFP21rbn%_zp{`0W@n#qWR&Ftw_S zk0QD{V^0QmYHZaDB(q@{!S275NSGx<$%(fIl+oaRqDhI_i?6c>k-7uJN2;!SVm{7C zhkMRhS@n6vBPu3SO^c)xubAH|s*yx&n zR5>-R`|(lk)Rl81Dkr#tEt68?gd%;qL+urUNrOb9kWbOzGvuyNUfYg>j_cmb@qujR zeA;S@Q{uOtQK!SjP0TC7C;Tf$n@2+$vV};ukrgwZM9o~elMjD_y_r-`Ug)}pkJu4O zK~C$gU73j(LuAf|zPbo1u<(0so=*;bLt;8yUHO;zX@Aj{y5ca6w+)yeb- zo4;{I-=@2Ue;#|R`?MddLnR?%$_KO7N0@Jf^rZ?FR^z9_VUMI0JIJsmds%9QkyFmM zEMf)A08kjI%sQuFx|tbEUEu5Dm6LEsHJXr045gJp@6Xdpo`am!OGNMfyqMcE{a{yqMYp; zTmQY`hrBY%`v}kBq|=j z)ojLuX=boO=Oo-XV*$bDKlU>^6{o_Ws82CTW~?VKxV0>c$coRdjftVGO}6r2Ib=&D zeHKC`pnXUXKL1ikLY^O~E0jV(Nim+?)-t;dR_vEe$-v_PfmbgpPYy#Esbuwj3`Z&v znf2tI(JYowRgRb9sD3YvvT_RRsjJSKE;&oWTHm);4xSy`a3ToKQ*c`i`w0iIlEh9B z7Ep0q=vj)*h>ydoT1&rIwC%vY4?fVn!qaHH2ZH0rS) z!vznn$A~roRT`ECP%1u4E!@yZb7aoOWcq>6~q92O}kecD-;V`TVqM zt?~|$lm0GP9P(2kmqjG+nAIATkn$}HLs)bYU2H|c6YfL*?69hwEKSnEx*@_A^&&>g zpG}I;3ioHK;e4Z*-#or~?g}OuIh2jN`Gl2XFmo^!Cu8gX7+Q%`Wrw9-=g>lh`fI32 zPxuWnoI_#Zv_G2?Z2}=Io&qnVEdl0vZ_D0uZxIQBOcPTMjT^3_<{ED*Vf4_!niqI!PkLyuBSSI!{{1e$K(ZWX4 zZ-otwBd|#$0@;|Z$3#~7abdu`*bO;RLb(lJ(f}_V-{-dYl}VfduO4r6^_M z`2Z?h>*eb|8J~ZII3ar4zaEnD7EH`4hobZ8vPo8_-4zjp$D;a8YQ5>6|G$s6O2%8> z$AH2gULN=P&ofsjQrpo|>=ycparI<_S>C~Z?BCo>k)Hne5Qe`Dj#dv|%lin}vZyIf ze3*HBo}=3(gljr=+~?Yoc99E_3hB@)abPrre=4E#=XD|Er=tzT&cb+k;2-1u!)}Mz zf0$&d@Ma)n)=Fs|dFI@s#K+W(j7x>I`+1Y4rwV-Xzc(ekNuTuPSIOx7YfSQ=CQPD+ zM{BpNwYgZOf5uBkds+kllEP@r>A91_1Kx@ksjp${ z0Jny@#XtfS|L?~_d%r{aKRE(0{EPqTB^QMEV_oXbjm}a33BaLcK?MBw#?wDV_$P`8 zjn*u(`&j>t_cSclqBYmTt8yya5*jZZ6g_M-oFP(zra68Yo;m#gmI3ydz@jpeUxbm@ zil~}P>H-HZ5@QZ-QbP5Z;nQ0~bXTw>_@6q;dY5!Roc;AbsoqmQjE?b1-Ln z_k84u%NsILmlSkLD$e`M2I>JxWaqGN3nvSe^tjQ2kGsfqjz zK>WMO+YEHT2fxaXpVCDJLbm*%U!csdM5Mz2Zbla?+ABqGzJ}z4gLq~UVBnN(zC(e| zeQ+Sxv!P+*Fau{y@^>hqAC1z`L2bjVaZ7`z{sc<`I$OHjAE+z-r{DqXBTQPgQBUE7 zV^#V78^!l&l$LOQxi?l}`+JOrF6HRp);SNyd987KrstUK#ZB!kCN$Z6oU>l0qmzx& zVxvNYP6~qbLM{(Rj-MawG(VY!EhKWi-a89C`~Rr=>aeK0c551>6{W*R1e8WPhZ05F z0Ff9_>2~Otp+P`Gx=Tt@KpKWda_H{vh8dXp#^-&{cdoOqi+{Q2xA(qxthMg7Gi9Ir zONahP01Yt28I0h%?%OWzCBA-w%9U%=zkR1Bri#1trFm!|jY;|&}5>A@#&qA6=Y9aW$R|gCyfURc1=T;BQ^wK;A z4a6qRChh02EWs;&VuaV}em1mV3adJzDCQ`2f}uu^R2$k!__+4SX?0<`MM4)1bwPZf z_C0*^^LxDGfh@H(*Fv~AU(i=niHhmPb3{@o=a{6s-IRaypNQ=~(#-pB&Ch@7n#exf zk1@mUDU4#=b7v}XY;tV@wpP)<)Njr^IkTu&s>W~N$8~!DTNCa-;)NJ4%K0VH#g?^g z#+H7Vo)Xo1y2PhYi9?&hE!l>VK!HX2x)=lI9rLk?sj8d@vD4!C8TVoblPW?~w}e`P{4q)+>>wa_As zo7PO4&y4X47|*)uKo@ppWI*wMqp|-Rtq7@zTnI6R z{(U7n3G*ffZ%4i)A#`Nx6si;{TP{MV^r0J^l*L&XwPyLiB8osI!pBm3Btu^NLYiA{ zFezb1n2~I?&?bSUw>UG9_`TzDDm}kSqu~+RY+hr*zx3kix$c$Vj;$Tj|B~^4At@~+ z9TT>eLJC}ryA2wyUa`#V*O0Bmqjl!#G zze)chxYQQ1Is}?SJsuoRC5bgMq)M5R$5zSAI?byspV3fAym}ddhy+o8^Ek}n7VDIh zcY{B+hK&C&IyL5pY?j8@FgT-hDR4ik{XmjBZ$@Ytl4tFMwHYC9(gayXKqA*G1;+Y0 z#oQ7Kw~NgS-h?_B*nfLwTMP+@`OONXr&n(mY7NGYJGwglknn$;UZ|P5<@qrqmNH+X zaYhj7Lu|tLZRszt^mp0&&zCWLk%PFsd}- z?(c-(zFEu@lLXfklQUKPU1E0W9h&P*qVZ~uYH8*o`Aj8CwVGXGzA)HM3zHy;Cg`PB zb*(kTXADH=^Y8ANQMS8_C~E!dhpZR+pK-k-ro?toTdCQr$&l4a^qF>Iuvm*9|KQ?Kn?pQg&ueCYq^+wzlsu{JWV(60xyiYZ?ApArFim{G9-JIcVD( zkEwUx@i^M-(rQD!iDqBBxpoO3)ZI5MP?Lu=qB2urxG4+v zTivz)nI_xox>Rl5De$=C`)U#Gui@@Qd339Rn||xJlb;`3kmaNA+(h~t4S!{om9nyw z|C#-S^J$xR`$5gm#h_KbzWl6*HWrC6b?T^KpR}ji#}w?*m+z;gG?(`PSSrmOL{w@U?=Dof{re!j;hT6?v1Mg*(_uA zO_B&{is;_soH#fvMMv|)+QnDBUoNvolDnOH_SsbdLLn3}1+AiLau4^Li-!DaEE@)@ zqv~xYkLuH!;aZzfFZvwrdI_?_`jI=gN|gdSDW8$hSkgc4njb_%qDgTT@G6+SE^1+> zn0P6MX7C zOw>Y6#W7EBu5|U!m8ECb$QJ5387*Q=WS)Ievau9WyucAn^!u?nEFHvoV7g6R0G|Fk!D-5p7 z1?d$H`|mgqr+*?6PluO)I7g^uIM3)EH$cEQrLanV-uS0xck~JnJ$Fp%$WeV!qO9VUhu!owLvk-VYj4i^Z)HnwNB@ZIV`Kx+j>jE5 z;=Uvbu%l_koM6|=ihzUi*yBpywZRj}iSt0%*Uk-RinK~F*%5&P)Yjo&K2>`b$Po!a z0XgJ{fxHvI4#{+2-Qj5FL=E!d#|>MmUX1eyv8c@QWA6CqK$6ID{f}Q9nFEn+t0dwH zGf6`u#*+bS|8z7I>3mRc#$gAsQ&s;+nc|+(Fc_jsi{K$Jn1_1OezOb9uaWhY$emkQ zfZ!Y@{IBiWUpm5SsZ^=$+cral8uzyv z&8DwGUOeSZJ>QY)(-t5>jVn0xm=jxl^RtM<`y##8LRB@(Dj-yC?)4v~f#Fb9udxx}B76)8VR||Jp#$8<(AIXG0b0{?bUZGF zTrfZp^9-Ph#WN=e3L*h?dC($_=-%M)-qSLcJ$Re)wg~&yA&16C z6|-MiUESuZyzPLX2QxInUiX0S&jT{8Vsr{Gz;P$Xnbm6c5JR9bGl~1K^w3p*FNF~M zhdRnOCZlHe2@8W`%nh4#wk^TpHHL8eM9%yu^QkstKtq$&hs%YEo8_p12b)D{oOshjxeWdcH+s78O2DKVEdP|vu=Cjes$+{X&u)vDikbP3zVK$yuP+w5 z8Kw;GJ>AsxwjkN6s0e`KgM~G}Y2JLe@DMGr;sVbU-PlMgq7nlBI$pe>QMi4m`6%OJ z$m&~}F%y4kf0;Zo!>3Kz#F1atVdKxhyIUlu&XGSohi1pOlx;R?jZ}%}#e<1g9KuHR z-+O*u&}YBNQM6GBRZK?z$ZwDzQB)P6h$VTW)KBz}n8oQWx-W!Fp8QSeQ~JdkzbmRp zU%HUki~Hwu-z6@Ml@is$TJbVD#bwmOF>7mf;3KzYu*=D@ifq!=jH?VD(gY}F%&wj0 zQqyY_$~nk2IWYY{x&Tnl?;(kwfX#;Q@UOzJLpef;5}kqvxHH}SF>$Y+5wa~`4d_^N zxlVd}PIb3{Q++2RT4?~zr(ciSUn=2)&nslj-Gcf>S+eYS`>ceC9)|7kn?V@>*ylTd z9WNH4me1IY7|c#OaEDwtZKjFZl};&UeC+B+)fpRn8MG}9Bchi31;IvVuMkt&t8$a# zO4|7GHaV3H8_~CBAu==cc8kW&=;Lg0gN(MlafY_dA-f6|c>jhBWieii;rF0rTvFFnxdpuJH#b$9Y*1Xog<}CEq*fKt}MslWm({)Ag zLdcHP0{Avx)(NxH2f5x@d%y?tnFiths74lj&4oVtF3*ZvXwYmDgxW)nVxf;VyfTh6 z#o;>X;9$^IsxN;RE{-snf|T8Hx=8+AXy|6q)-cJ(6TcS|-eDT!zEl3BdGt|5_2|ty z+}PA^{VZZzsdvKW(-6WIoiWe#d0P(xkmfNjwjaAekKLRWzidsc4zC@`EfT^4$6AkA2`_&J!C{`Rc@@*5tLs%a2P$L zA*taod#(UM$5IL?WChiH(%Rw_80wB4PPUMH_*59}4N;ag@N>eYGQPu7&-nQc?gb@59cND@TQhlHo4qbLt4ahVZ5v$P z{PsTlIc!vM^Lqw-Q@NZRPm(M|)GO!KDMJ~?`HGr!9$$M`H^R=+Q;y;`ohhxHI?_Ob z+coAzZ_u4{`~~3mbKc6&Ihr&a6MnB>=X~or9sqkxe|lKKo++7UUVIx|aqO`pU-xM| z>mp)DM2z#(`9;$9nr}}dSTu=Ig%W(E{!nx0rgogWD{?S;&=T~o<0 z6I_$+92b#}zYE*;jy0J3SOxFe*TP*ENmmS6KYO&;xGBSTXx%%4p_$um$g;gcRSE~8H8@;7V!~zXHdsh5$vyeABeJ0yS zq3mS)9Dup(YeVaBOjBsGNuz3De$1w-F{i<^3g#S7sBF2O5zTnoFQy!l$~cTjZM`BL z^>4J%-RIBw9TF_^+;eJIi|GEJDb;EEeUilNbR#?Mcm_xE~~ zmbZ$ctN9-mM-SI2=239W(eiK9rRbq%wtZL$oeziC%eSm$8#VG1hwV`=+wa-81+r!0 z(n_tlfRnO~SvjOTLnU&C^L=nlLyLSyGe7SjdFJ5D6jr1q|)#_lq zHT!%YjPEu`>Q>hDp1-KEv`9{I`Sv2_m(oJ9+y=Aq-9#=X$0=t?%TSjNkdycNh%9^K zmCx1zxjJw3j`h}By9CWJbNUMtvrbuUJaKXLy#)DMr~&*&;(&2N`UBvbFj@Kn_hJ48 zUpy`RipgseENX?qL zlYPQ$=wI`Sk8!6Asz$m+*kIz={rtJw_s{OQ|1250$EE@}lRUqXFLMf{6Qb$*EhZi) z!Y4-g?pr*I@i@RsIN6QMLVWN9p@ow)MX*l{#C*^lBPNX)QErkf3Hlf?pfpd$U1Ldl zL(*Ai=Y%_?95}EZRr+&^%M%8#3>zp=AxL~{u)o3}h%-oKTdix7g!v|E_36b5Cd^8H zBh{~~OSQLoM8RbT=6JIc!@Bs3(0Q=(|2_IikaQok+G-g9bwP@WN_-mb+d6 zQ8tq)k&d1nmDnW!b(Fx}4333nI4SlFRuyt6ra?uyc$%~#i=C6C76RgLs~3uiU)8`M zw@DBTaze1-G|d3pyFFO>iiSEseGzUI%>g|z0wVvOt&1K|pTx9Xo0KyhBW{*%ZW=`e zTM42rSxFVZJJ|r=BfDki>)$h7l4h{1Fpid+))N`jWc&ip>kEa_DK2Wj?;te^@!b$Wero?>d~;|=`6SC?}yvCTt#Bx z$ynIarF>J%;pv)kS90#J*YfA9Gk|kRA9mDp5&O3JJDKoTk9r}PE1{SQW4~LjWVWT& z3n!p!m+Hu@w8fO~v34AlN`-dPHU(3X@$>@pGz*|jL#Z!4gGKJeZSh?u=Kb0lDDvBk z%XF^B9QQ~n8qD0qe^zi)cGDf4$i5r)&DeE=f;5>QA9-<9{%r(`<1 zUt^cCSxD&3)cRZta%Az4a#6-L*?$nl!f|`R27pq4nGGAy3+u5RsRn?2i0l2jJHrZo zhqE-8i+m5?Gtj&AgXtJ7slC@kVh|wK?G!jfye`zt|TXPHw1MG1g!sFeH;d>>}|$LH0@h1t~tN=1R`UiF`07) zLL?2gSdspZ%Gswn7dxQdb}_5Pi_eXmDf&}mJkMsMzwjlVaMbJ+Wwem4KcCyb&0!vZ zHsKST8PKl8gF2t)J%|wWaqbQb&wQt&6BIYnt{Z=&InsPl*jYaISA|(ACa@!-n=~T3 zgTln=A;|J)muS#=8TLdham#u+9_4bMCQ7l#90pGEHM>L7!k!(Vta^L2P4-P!{kIBJ z2$A*B}=Z!n`;S4jZ)JqJmfWa|-)KPx@WfLK6hhoUHoduj$UT-hqYKSjcc+(Atn z)znPDeQzws9bd}0p5i^NrKHrcGU2_jM|VN-t^SOREZ+jL=aa4QmP0>|_pMt)bYV1p zXMQK(bE|r)g6_5#>}j)5r~b6xs$8Uxo{`;rG;2AvRCb_^9@DnccU&eoNv;5BNv@7% z>U5+Jnxe)hgqng?=Sd|n8jy2#7@Qq(J!3AYpv^}mULeTEN?-tKEau9mG&W-c(L#Cm2{K;ZP9}$#>#~o!u8-^RCjwp1!p7?3QzA0G_zn>xl}e=RTRpXjS?heMO-NWDyfKf6J$yodJ= zVDcQZ=P!WBSF5R&zSxzH2lpN6_*ofQSd8m3CU>zyUNb&xA2TxLwA1j7-|$egMT6;D z1tjlU?$L`ugKFF3qK$D83e+-{?%tEUyxi1*!t7X=K zOONM9w=wQcf}BmKBH;DXpXe|zV}vo0p*#b=eP^=E3ljR9o_@8}_KwJKUu=%qGdeQ3 zh9&2e(%0TY1M4$Mv!)Et%#}Ha@HN)t2Segu$N>m4W_)3O5|Bk#gtNyw!r5mMT&j5n zu;hA@5&aSO1Oe|GVi%o@R-E$W_JZU)?-EBHOisH=G`aFf<+k` z_#rtI5XXEYVM`qpb-un>h1T|5o@_je-X9;^*H2fgsHz_i2VfyrmDrCboHQ0BBo&a2 zlQM;iLnrX2)0$a80iMC!W$i&B+f9^o^@Vz>&Jl@Lqk4%_SP#>h}*_* z56G4!%x#S`ydYh$*>v>%x?wVDcM|@w_|F@pbkL(^O%1uTDjTp=mcYX(<@p5-olajA#J4cw6|;T z=Ot5|w=7JzI*hlBp~nUss5ZHo_T8KXMeK}5=L39>->+>)bF?3go@D4`qYLZt?gWD* z0rKc88Zh36d#)x3ri%4J)64I-3MLso4=Xx(oe>@Qj&kUXg9^Y-lU2DaoZzU@xsL(! zLQ;0O-}%m@O~pml)gqh6$_)do>DC8}fu(r`j^54zymmNDYp*~jw|)pyAhe3UHfEWv zc7X<5T6Su$p$6x%Y#ioQjqkO*c{pyKu z_^yGT+v(vyjTwn|&fgX9x1DlWD0}M94-LN^;pw(p>s%YuH9u}tuy4!`7c*=brT1{O z6`_2J#aS83;DoW)2k8V~sd7Lpf-Uc993U=(k{pN;$+f|v<5r&@rgW{r zdFN$fIwagSlPH0UcGrvye9(tsGd&%S#GEdvydp?TPixxB=V-(l0mI-PzL=VN?1|MX z73J2Ipuf%H#g@>q*Dn5hcqdC1jToT>iyU2v5*k9$0DTM25Bt9R<*C`&yCv zq0iJ8gI8gcEhpg?6v0!#csU?$<5l!9`a_oeqEe) zby>t8EoXH}>*Q}Ius8Qx8n@q7h75P6_jiSXZvj}Uarm_?n7ov*wSJsQcb3`xt2MH@ z5hV|7y-9~)>r3mis6>f1v`nY8C_ao=zo`eG10+pd=h8%BftHZoQXl|yXq^I6e*R5T zDkFevP;qfW7CmOA06u`ASy~`CY+N4Ib<&wWY+%ZE?6`0Q2o)?Ep8g58G$V`VvmL+A zMk7eEH+r5I8#)l*E@Fm`kE5%&m{X_0Y9av9i+ml-j*bGdU)%_0>eai=(6SLDjzq5` zmzMy~$mOZFy{R1`thelBod+aKZb9tv3<{MpNZ^JsR-f_g?Vb3q1x$@vDd;Tyk{YvP z676`o_65j!zK)+}>y60E=24$qjpSj11bjjKC5+CpU)aENE29!uZ|9eZxw;CTp}#Pw zNPij?$?0M0;t6Brw=u3UV46J1p%&WbKi2YQUEpkE?<{$uSFZc9!Of&CX71bj1})6D zk+b}J!>%79;kHqi`ik1gSXqQ5CMkf=-L$d?-z6gZWB`7AEaA{((O ziGy)JM0ghke2+yW$nx?3sTL-D_4c*(O}ckdXAYrtb3ACm@0-b39@z#sBq6@>03j?s z_M-dYn>oh*M?D`Ke&nvnK_6k=dp^GVYY+N2r-X~cpV69$s|B^Iqzuc>6T~pT<;~n6z|9a3xv&8?Z{5sjYDajee0UQ31U)qr5f3Rw2I*%C9p4;u!Bh(ytzEQoa{JS@J}7m$*vOR z3;3Fey9K(xS`Og3J|XPHYi_$1ck;ZgY;||t`Z)>`pZ$H#U2b3St!sJA%ljpL-B-)U zfh<*rG#SV-{XjYo&%SswQG4>u>ExD!R>@X$j5`W7;si!i#vJAfYbR`U=j zO_}Ffd0W?#K6w0QAU%Dsq$6<%yv&SZi zjX(tHN$7Dc?h539+$(Q8c!h6hO=GQ(b=G%Uwk^F`X)IAs@!qXL%xPqJC9|i9ST22U zC7)W!a~i<2T}HGmdEd1rvL;9S@lF_EgOeOc--}rX*~A~-_OwFLzhIr0RkZ?VW!t5mMV=D&!HDl9HzHe z%=y?t8@vDxg{5Yft{7X4q*f72xg3O{&b&4}M;dVSm<(?F>WZkE%?DuCXaLtvbsZ+A zizBGX1ajr1jk}&ggdO%Q6@BlFU{R1CY0o*l5emSnDWkgHlVzpSw~NVZv~|%!P+*9EsP5E;%V?j%dD~nlVQLTr3n1!&dM79WCh5H-%pes&3DYf6j zr~i=1t`VnFx|_K-iFv)D$VVUbmf)5)341ka`Cn{5G;-))P0BPc^9~h5nj3cbBne&o zaOZoL@I1jbf}ztJCv4Zy>cdir+fVnmN7oZ*V!~_-x8!9MbOO*>K4?%SV#}aiie-e_ zT51J31F20ZOQS2dBi}ig%@9e<=Np;5Jd|v;Fzf$*v$vP+cRZ1Erhra_Qh&S~OUGsS zCdcYwI{`X~)SpZOu=6AS^Rc#KE<&$uFm#zgez!$^!Cr% z-Ybj!fUm5CnH+ya!#7X47OPipL%11h`&FY==YtK@%^&`tXT!cUC!lVcco`b>a``Ph z$?;B}J-MJ%aDRrBj1~LvhiIMNXQ<16JRT1(EMFr~T>mkVUPwBF1WMT;G;Ycr&oY9! zI;COR$8@H>AoI)39Z=TBK#urce%CgMTBG@Pjke$c0z91JIp^9Wp6>!x@L-K`5mD~m ze>_`B!Z;k6CufMKTttwFZ?rA-iQFPm=>lO3Jo>g?oHY|HhF=TC=@QMH=Y#M5@I3Wd zQK;UygWl?m6eLb9nC5+WwP|S?&dk|KX8K}lZ$@@x4pA?Zq!d&2JEjE{aspjrs`uOf zbYW}0n!zI2fIuv_-YSSTxJv7$eKNdY=(}~-DPkSzR(8sWVoI1!=LnGxT$Icb4G>y7 zm387Ue)J%{gfk3+Dv9Y*oZGtW_*BwNQ)p%Klb$Q=0$`|MP;*-_`NGR~Grhl(;;G@$i7@C4iU!tKXLKI>5~(@W!VW-tPXC6A|8jeAo5 z%}((}xtG-bxPL!c&im6sh^H(1hM|-4Pixpj%(n#)^@f&d__^HAjLp$D96SGE_Mx7M zo$pFkC{Hcr>+)gGt~x9N21ZRmZz$M|{zV;jKdqpXpQjvsblcGQR1AB4(M1`i z&^GhHZ70K^QO=l{hE+>zdsAY|EL@$+3%nnUxnfwkvAkUDIDloliSsMc6G>TQd-oYF z`}KGMJy)8e59bTYO&V=3h+(ZICEJgl5k<47CAtLxQGF1S3$0VCA@wCp2yDPqY46Nl zoz8+Jtls#_)sNG-$uTIG+v7`(=mPjW|HF%)<3w+zU-N=2BI{h89=0|Yz9!wam!fa~ zJko%BhvQGn*Z?7ZHtyjjKIEpnjW04f2Mz7Imjp>T~+SpG?w6T&g$II#o zDyuz`t-EPJ9|3+sjkZ-db`!3EeMfs>dRuhjGYEmOr?A8hnZTFQlN*yCFZv$$XLnf} z9TTXv<8W&ubEfz3R4301BY+QR>i&zw6a}!RXhy);ubRqMc6&m!z@`1;?}$Ge9@~U8 zQ<%6h3P(=`J)LkXEKbH%k}>2c2!SU<$u2pK?M6NcKMsjc+PQ3xO5Eo_6nL~+ZEz*y z+oAid6kJZv`bWa`@3r&tCqJh z4l#QP0CfI${$X}N8!`a-1F*ANWs28rzS^4%z1%X|@@zGO(!Mj=yOl)gXXxkgR-7MY zV+Sa}SQF>h*YdZch+`9(Pw}Vdx4eWG#HU$?)1%)lZ~~pvbKva*;h5m1-u<*nfi!L#0Q0Gu*9}b1u3>&m9}>mB zg0gQ|X9-wmL?IiJZcR=(=CUWvMVLF~5mC=aO!uh`S#QUa6;4f8arz1kbftKyNZ zx~sjJWyG{cU@RqL6@@=cFZvA*q>p)bsjss0BG_;C!VdQ?Wu5}>z(TG#5$pfj!4 z->ghQneO;fRemg&;~!q!A|)X;wh;fXzZD`SS6a6;-);SamxWw#^1)`(fDvm&%hv$l z2k`B7P>mYjySSe?<_4D-yLU+z^RwnfgAS<6TYP={=d^8AN42FTJZiA~uNihnulNLf z(@*u*D0Q7U28V(e`H4iS7-cr!%dBKGr=-)iQFwezQG5crdMc40ar%JwMQuDGli~Io zChIq^x^Ax{J>%)~{6zjd5P4|)N{i%(~xequ5hT}U9$d&2^bl}C|_?!yvK^y9tBXQ$yWTymzmaWs?&RS zoj4xtaBd-&XqISrV>8u*mXS>{zL(u`SokWu4KyN}o&Sm2{Ny2VmqumY0p5!)BgJ>f z7|B-drWKmj%feIi_gatX*J0#o_yiziOi^D<=vBnyLBCUsLcFYkeDy{D;gIW}K5D?# z=C7q@>+ZTlD|-@dwYP%VyKNtAxRz+U2K9}xEKY$2XFmU2E1a*wFz|^Y6W2RK%F)Ep0bg}q^r#n%Qv+9jk-_`ent|yQc^kKXf_5`Bmum+1XVOE?2n^xIP(xIK!3;i zTJEyFJR3o?XCNnbUz~EA|B2mgtU2eJ%iS$k^lS{+c|{URGT@A+`|tow4*;oSe%(Qi z8A0$W*OkzyV<+rHSXYc=cGg76mx39<%wNi2RNsfa2{N2&rBqLfE6kkW0=e}XsNiH> z+qEt@!Q7{#)E)mr%3;K!Bv!EH()|mF!iLL%zO2EuD|83D%+bz=BECP#bJD~nc5$_n z0W4}%>?4Df*%;2W+`1XGqTbPfu}NCVCb>buYt9v(dxL8Q$wH-slrLIu21-|uU9z1{ zX5cleY^0c&#xQ637{{vRvjqCS?eybiVZonrM7t41CY~aP%=CC%zDLqH(E$8T*qg!k zIs8Ge%D=V8c`7(_{yWjwg}|TJNHtq`vv-A%QTQ{u>)5rSLM!UIxsA7{%UeSH7S9G_ zg@W`{lF3bp@B;0aNm}?PG*d$z7)w*2ahqXZ)6dyfT$YSS26r+tM2E-Q%p8|5mU3F+ z!(X*2dKYxnWM>ZUfE?YI11xS!W?xzy^NowB9)%@?of0CDWwF!=Pf78{M4yx@<9#`nz1VaT7sgG)k;cR^6Wwvj$4__w zzK(&MWC^WM624+w4B8}qm5jsqW7E@FR+?Eh*QH2K8jvGS*p0C0!|$&c%49*lsETv| z!0*u7S!y4X^{l&`0}00|Y8Ds2(yeu^MrjC6sK9Ptiu`gMEuRQ{_>usr#quou*!h(j z3;Rm5B+Bi46yL0o@3u8Ail%Tsu)WD|l@SZ@S;2pzuD1<*$Hv`;lBfx&{b9jCOZ=RO z2>*_E$^*iTov({b+HyLRT~J1x^LkCrBlY`lFW)LY*9}y?OaFfTp1Yy@%JHE2M-PK3 zY-vR*SpIByC>>D;rgZZ0{#gpGz%(_1ul%n3%wUxJhI7U&LbP=PF$x542r+N)a?2VM zs|J^O>Yy3-&bpq}lXN#+%xAX?5Go`3PB15@Neo+M_=nJ)(1S92xuOrNP2akTT3+RN z;T>;hE!8O@jsUmIi0foDAhDShP9NA7ka;?<<9DA~I@66DuSxuNe7a=qXR5Sjf+p3; z_Z@<%rk&gDh@pPQVJ{VpT-o*+n)mYfAAaH)U$N_vLn1LBFs6j%fiJGMoxtcdBXBlv z(zFqoS;XpVGc)X1BNjD!0^X1pI(6>h;m*P=m@H)bvc99J-->?|PbXXFGeke>i3nj( zEOlyFMMma)aS}?GVvp2+1i3I?ld3M8#Yx|JJ49yP`E@b#3En=1>rCB~do`zImOyis}0 zV~@VfS6f91dAIlp)w*G-&hMsADat4kP~|4D@D^9{^{ z9Ns5T@7W*Jo}qrE8i)#aJrlUIOQkD?e%lmY(WFu&{r2O?GhJ(odinbk8ejElzvuMQ z7=Djnp3>qdVnfXqOD9fOi|1Fv(<+Z@?n%ti^W9svKQXn_^57;&?HZl7K|ddzy4N2@ zrnY>GdX?})v$@}h2&i!h4t|q@)Zte?Af_Y8<_}T}AF6{6}j?z;vO(E-l@4DWw;BGrumax3@nCAvX z&B;O^T8JtF=j)IJt2V;?g%i=ANZ-V-Ax0Fv$qnoc?McyN)bHt^ACZ2$@71TsWB-L& z**@0DZ_zNg?73WP_yYRR9ZpM^IOjPRMz>(U9+xNfc*rSf!uXSi>n7_$6l)~R;GG1h za!mLuSe}iRl*UHRrjr2uca)4$B&V->aL1v+xDuw8&#dW?qN+e|#~+`C9MA2}0sk89 z0s}st%*QH=^6=Nfb6jkPG`3t(p7PfUe(pfpeTHs9$Bz5+_5oGB?P+PQ;n*lU??bVk z=#%@-hZsM4R)(5aUse;B>`&NbZNErKYz=8s!lV^Q=8fM~;1`cfHuQu8a;XMg2#URs<*lPTc83lKnqzIOHqYWFLsNw^B(X?bMLsec%+Nj2`SE*7`bV(&brE}fC{@<^62n8` zNaaZgB=@}4JA_mzxqn^a*B37zr`XEi>p*}#S#T1H(H$R0aqpuSKDaiazNvtEvENj3QIvM^V~M%eIuB{_=s4Xz z&-i!9QTk9WIbWK|jV6;{(>Wf9ncSgrBt_f2pr~SClcllPCdt7SYjI1bhUQCuJVxRl z|C18V84h17{AogUJ`)<1W(f>E2lC2w$bKTx?qB)9Z+2t;(yB4OTsTlDvH70m=lJ7Q z8nqo^#mk7VBi$XsqrrMMFE+gjSnrssiJ^Zor!yBiM$zF95_JB}5ndH#@`kvX6 zLpSS{81)0wXnWeng#xiVZ;hueD2kj*r~_>RJ3;*{Kk3--*hU}a6eyXFW3XSy^O-(B$J49tC3t-Z>z)L=>1eOc%O2(5RY<;vL_1>?@fN+}a zV&t6oSs;u%YQ%Hcm3&zDTu9R_MPUCkfw3moh=My1z4lTS)J3Jp&|!lyB5{}LJbftw za+Niob?F>veYITzNI!1DA7;r^_1|Gl>++vcTD-eP(>VO=SX+*zcuvNk21Wj#)+{iI zP+Gs@XmIX*BxDc1_w=%(2t&jbSf@Kbw-Y=uSD*MYo0s0bY*O`FG3a?M zv58d%KEC4xdmGywVYiv4Kk8)C4FA;2TG%N4|3Cz45@plUKEkIXt^zv5q$xt80xcNI zCA{5Z((CTRLd)>?`Yc~hl*t=)H%N&?MxIZPr`NYXa0|bw4@cc+DHg`BTmanFqPr0w zqM%o0=%O}>hl+T_2|J#cma^Tc3O+oRt)Dn?{ZHq)OHLlzQhfSRJC{fw|#XHyha-H9M_T0fP`FO!~gam&n-y!qnY{Q)t3Sb<phk+0Tbg|NC;K5t(QQD-q+EO-RiZ?q=&>GwHOOj z2PvKmpmTNemzJVxzUqku=?BLBlfbG(Uhr=xQjoCbYJ2*M(3^aba8J8vug58li8Gye@p9O4}?{-N;5LDW87PxL`ZZSnWIc{|%QLI(DBj+CG0_EKok~rFO+j z?oK8;kuRNdLvc4ki^o~)2nYM%o+f=-OVaT-nfC-Al;DB}D);=k!xkb#7|Q11`DD1k zG2$f#L@wyfJ@S-JgpJG&{)ZYDF_hbqI86d+2=|))?+7a8nih8u427Ggnsig91w8Ek zMm(VE@bONn7}tGv3c|vQEcVAAKOSWqE|of+ON+`+JY{|Vjbon3jJ)P)A*(cNhrpQd zjQEdFzo?hYXDy|(NOPi`S6pWz-XTgub2A&a1=T$m^Nc@#=@)e3AIIo^Ev9ve5RMP| z727c?wJ1nCRI2)_Ah97#*^~E`{+GU^w;O+^OBI&P8N zO;nLCPPGtvLpR8f!}Y60uuERnqmtnBpHkW^xA;@?-}m<28XDN{Ym+V#e$twRfn=jH zKo1_=(DKA?`Ugn^ZP?v`NU?;5d3$0nWUj>V@|#WDgxr6;R2)K6?KTs> zzs2ZIqxX82A1#LBgGg9YZ0mxQhjP^(#%7KVy{L1L)}(m7@2bk703=x4W2^Sgee!QZ z_?I%Zncc7#Rv^8%paL%6jNN<cNy+GPH;Q@+&be9A7E{?O9)$@54oxn`ub*`G&GM5}i!qK-SMOjTQkOL!Fx zM|18Nk+zBXybkk7*W{DpaqeV_^gNWTbbn)|ACOTYO8oTx&=OGfy`h2=q}x9&VC-(C z=5kzNZzr>ssDNP}Q+$d?s{KgprgOj@qZ(f=^GHCaF{8*Tfv5pBLHpP9kwl)yiXhL) zoP>BLzCI>`W99A~-EknHv83+Yx;r1}y z3?SXz-Kmsx4J9Elba#iObP3X(0wRqx42^V&ba!_QF}(Af^FP=71%A2r9c!(Mx|yjxI66+a_dL7E?d%lb#7?36oNQnp!b{=Wy)r=O^Vgs@ z)7b2~!QYRJkXc<>fhq4!sZdeE^J)KSQo&=G|^}#NOjb#$sZn=nV?3F!kv*p?XICwZe`h z3~;6FW+a`rvyUlBqFL zYu}>0G33Q;waA;9CvcVpYra@`9ZA#??i~cM14%w?6L~9|_*lVz`Y#Crfqx2rqN&7O z($E|FG_7Di=Hevdl0X_|M{gAkSxpb~yFV;u=5BuP3b;#pUp+^l1!O@1{z^r}!Y_DR zx5{6;i_IC{ESEHH!1-2XfpheB{^{?nS0@*f_85yqHESVHp5XT2snA%fDIQ&ZsFkMsRi2HD=>DC+@omy-!s z5~4SOo?WjgTw!)P=Na-k^=TcFbCL5mElU`Ts}%}XqvG+UtO)nMhY5k4+-rYcJqTUXaq>R+K3MS1^mPcfs<;i3!T*H-i9r8lT3D{dVoT!X_!N=# z{^MLndmOpr+Fu1o!02LVs2n2d`Pm7o_~l`-7i@DPRgfp5`4Z?KY@XziTj*J~oy$p5 zBJd%W?&S^N5mNb1{aDORb6K%kyMp3!;}3o%(;#A;CJBz>j3k z>!8k)P6&;@6aa^8)2U{Vf5h0Qeri@|< zh;UPp_5a_l2p=7eOULuN1vOQv2*>xCw&h^99zyxNL1AtT%Y+44^&(hbl*)bQSOrKy zh)A=)&6DBBF<3@7sFFfWki9Imk>n*nb?*ZrU>2?U%>04x_Z0EGB$D(Ix*#Vl|3;m7 z-1EI={&mjrPGZ*&@e2PDwLs}5Fgtp~+MnnUnv{BdAE(Bn4hv%S#ii=gGO=@5Zo;`* z|JF0%|9Y$;2aLcJUwKIRxR#nna_K& z?|P}OX!>r(nu7yhovygFk+y#j$maAXNVyxDSx`{fQ6lmVxsLU4V71^l(|NeCj9Ar{ zMGSz5(xFo{L!1v9&Wp@V?z}1TkDY=eJ^6AX0(nchrDrd(o;u6#v$nhj zh$)o!%h1V_l;P&_l#8A-D<;w?!ms}-_QJw%@I!>ySR}j@^kKJBJS1#;Z$`(9@suL9 zGDD7I%H>+|VqsLWq!X~lU~rR(qA!4p@P&v4WBQ#8P|BkHllvMsP~ou$1$Uns8q}03 z&VE_*nR~7LG7#vIe-NfPwBs(M)b+!h0Bv3SGm>?WZCUArJ+-s8wnQM~<2)rk z4=H?kfC6s;LIfb90gnBDYXD2285`*5(TG$5DOz@@loa}jnBalMn%_h~WCOuNkC&BG@DFdTA!YG^KbtdQaUfzZArx7E&gv&<9Z2@->tHz`j zB;Xook6jnc>SE%$ugvbbrKy~bE+ojFL{6b{3nv8({c&%Zq1)e?F%*Y{$ljUCC*u#D zg2jz$c%NhA;RhA&L-42Lj{KxB!5-1p!*W>~IF_N6L|qEsP$|6sKQq!H= z<+vOr+8B?r{20AnCWrM9qTtQZf8Oup$YXZBzGwSwUFoN10N?sTZNUxY=dlSEqNJTw zD}l;N)mt=2vc>WHJXq9kDWRfW#`dwcDh@Qs}Mj!rA; ztd19(Ty;_^;aD}Q)mFnm{rjDr_SzL0yw&&;KRn5$?~diWaP@`H=M?((Lmr#<)*hmYmx0p6cxTxeeB!nKJ_TiDAbtjp4=p9kScyZt8;`!Mzx$G)Ar za<0MS0WtCea1qg}e=Yn4X1m)Syw5<{)aL;|V>i2^^Dx4bNAeKg6#wl4Do(xm{cp{e zyUO~0$k;UG&jwW-Vb@DBK6V)wgg#@R7-bJKbD^+j@J;4Gc1`YoGUgD1FL!2O@2>-q zzpx2PY)vko!*zrNruDN4<7UT6RG7bC*3YuCr@bSuB*={J1&)&t#)TWZE}XS}qp~oo zN`59p{lo$Q>6_(+hT@$@p>|&=ZOW``^q5R`UPizQR2`jwkob{4n>-1cgdsn;Pxsy2 zE|m;B>=hMFBx5{(S;R|GW-<8+XNSxfO7h4%ng969N;ncNcqsLsS9obUe1~T;(%z9a zZj}v4YEsw#vpKu{rI%2A_LI5~d>~Yu+7z9f6?Ns87Pak^5Eu4XpHH^O6!B({V3DB8 z3AKcV`kCKS4gnF|C216=^#9^ack(O*bxvChV`+l5C2;seJi5F#^)tQU9E}b~vwH)> znW0MvGZQTv=Bf2;9oAGb0$ajal+68GegeM!{%pMOm)>^?=90)`bWr~Xjuo|fuW$;d zbEELvS$-xi{y!{$H^(>2@ntg?S-`S>+e36OT(Rwjn`MfIbk;WIUEADyvEcKezxs*? z=sAmxkObv?1p0MCP$YYv+DwyN?6PE>ver-c?{#$mnPWRcO-RU)qgmsi)#&&VP*eMx zi4GYM{&J-??*e@r2N8woire%(!3^nYt;E)Q+BRF@n!gg;WG*^x^uO^X^izTB3r2~TyfKCKI*tFiPiy`v>#=GS4G5-YJ@x0)aW-r;~hGUG<}?W zzxUt-MtnpMnXH>b`cWuDe8%>c+5DF6eHpKN)F zJ23y->PABAsjxZEbSTY!YJW8=H)j)rkI40!HrF{T+wAqVKzCQMlbTzH!D{c45-ycM z+mH5�a{c|5-j>AvK~DRM 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 literal 0 HcmV?d00001 diff --git a/docs/images/menu.png b/docs/images/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f301b0fd4def0fd7e4a4d624ef4096ed469f5d51 GIT binary patch literal 110831 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 LUbNt~{+Is)?$CaD literal 0 HcmV?d00001 diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..32866ba --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,31 @@ +import js from '@eslint/js'; +import globals from 'globals'; + +export default [ + { + // Fremdcode (Phaser) und Abhängigkeiten werden nicht gelintet. + ignores: ['app/static/js/lib/**', 'node_modules/**', '.venv/**', 'venv/**', 'test-results/**'], + }, + js.configs.recommended, + { + files: ['app/static/js/**/*.js'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { ...globals.browser, Phaser: 'readonly' }, + }, + rules: { + 'no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + eqeqeq: ['error', 'always'], + 'prefer-const': 'error', + }, + }, + { + files: ['tests/js/**/*.js', 'scripts/**/*.mjs', '*.config.js'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { ...globals.node }, + }, + }, +]; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9aebbb9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2172 @@ +{ + "name": "glory-defense", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "glory-defense", + "version": "1.0.0", + "devDependencies": { + "@eslint/js": "^10.0.1", + "eslint": "^10.11.0", + "globals": "^17.12.0", + "phaser": "3.90.0", + "vitest": "^5.0.1" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", + "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.10.tgz", + "integrity": "sha512-bp9svZb+QurZeh+8H4BhrZkifEB0YBNvTVzNSJnJQkj4NrRwmQoDUCGP0vSN7PbvLeM7l1tK6GXL8mrTiH2myg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.10.tgz", + "integrity": "sha512-wm6Dld3RXUAZ/gRWKyUy+4W1B5CB5UeFaOzsSWJWEdxZXHH8rCYiZ5dGe6oJmhsunAPWzL7FZV+VtvmN5Ye2eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.10.tgz", + "integrity": "sha512-UbEfXq/AqGNgRTV3ik+X/iR6mUxu2QdYAadwRxJWquUGnW6gDqdP1FtLtFXRow7RJx0ssRwi80XAPr4r+4DtsA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.10.tgz", + "integrity": "sha512-7f5h17q5KZVx/ji1vb8OTq31ch1O2I7K8NPIr44GkyWTApXMIsmhWqZfgpOH10xeauqghDAvGlZktasCkcF6Eg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.10.tgz", + "integrity": "sha512-ynOk/eEYhC6ZB2xCGvKrEOwE58oBy9LnrAqtkrDF9Fz1VTaNdGZTsV0VarJdhPwb+sOJTGjCLwcuyRJZ1dnMcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.10.tgz", + "integrity": "sha512-ERrAs185meZZhGan7a4l3RiiJK1ArSDlHdST++uvSxe+FDbR4TwUPahT/cbZJvaG6fIpDpF78surN+tX708Y4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.10.tgz", + "integrity": "sha512-KN7OHKD0J3jy1UzBwZWPxpwhODf9IARUIJcrH+yLYKOcmegZ8luEUM38lDP1bDVj40yP6PsSzCqOJF76vljFnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.10.tgz", + "integrity": "sha512-8l9wP8O+wa8zD6iw6egSfzVtu7oZVfH3hlUsMM4MwbLMhxleqeoXbZzjddyK3YyNlwLhqznq3tF7PkNJ8T/V2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.10.tgz", + "integrity": "sha512-SeXNKeQzA5kLhz/J0CH6ZP0/HJ3v1xm/0YbiYpE0kK7emfRC2OIGGIaE14xzkISEGv2aYuUSpiLiU5Gbq+OI0A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.10.tgz", + "integrity": "sha512-mtht0nR+y8/hart4175Ll15w7lY8dg7CtQ+j2FDNTsDRspOWTK/2V3l0aj9sIj7XmvqxT8Yli/wq22e7feTTWg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.10.tgz", + "integrity": "sha512-FSM94nGd55NYo48usCyM/nHfUKRnqc9+b0vJNuKV0oCCpIp/OGims7rO1Nv/DkFkt0S/s2rxsJ2kkS8J3HcpeA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.10.tgz", + "integrity": "sha512-C3YxNB16myRLs7o+B+6PnQ6jBsdIS4+AE4Ah8glVGhDpEv9AOvxhZ/1duAb4B0UGczEK/lBbccksd8VI+p6zfw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.10.tgz", + "integrity": "sha512-571TlE/F1eeTjjdjYAMMMPs1Mfv3MtX6s3+ZKVU6HiUjZ5Njc6c/qzNy/8K3zALTZnaw3JQVYrHxvNfjm43KAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.10.tgz", + "integrity": "sha512-QXW+ZWaiqs2c7Fi++D/SsW07LTPcUrncxcskJGfGNBoaLik1IU6fJymz4HsqwEO0u5Iq11yTO0B/mc4cPk7jrQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.10.tgz", + "integrity": "sha512-5FQFGgah17YeMtG1Yd5a+rMxQpTksyNXxRtKz06FVTaQw3RKYUJQbUoKk0/5jrXBpDo+7makNP7UHA2LQyH64A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/mocker": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.1.tgz", + "integrity": "sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.1", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/spy": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.1.tgz", + "integrity": "sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.11.0.tgz", + "integrity": "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "11.1.5 || >11.1.6 <12", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.23" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", + "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", + "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/phaser": { + "version": "3.90.0", + "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.90.0.tgz", + "integrity": "sha512-/cziz/5ZIn02uDkC9RzN8VF9x3Gs3XdFFf9nkiMEQT3p7hQlWuyjy4QWosU802qqno2YSLn2BfqwOKLv/sSVfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.10.tgz", + "integrity": "sha512-OxkA08pSryMK7B3XiFA09B4OJ1xJMPgIYCBMY2xchzpqgBGsV1o0DetPAE+Sl3N3L4oCPiEzmHVSOj7iR04Zog==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/types": "=0.151.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.10", + "@rolldown/binding-android-arm64": "1.2.10", + "@rolldown/binding-darwin-arm64": "1.2.10", + "@rolldown/binding-darwin-x64": "1.2.10", + "@rolldown/binding-freebsd-x64": "1.2.10", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.10", + "@rolldown/binding-linux-arm64-gnu": "1.2.10", + "@rolldown/binding-linux-arm64-musl": "1.2.10", + "@rolldown/binding-linux-ppc64-gnu": "1.2.10", + "@rolldown/binding-linux-s390x-gnu": "1.2.10", + "@rolldown/binding-linux-x64-gnu": "1.2.10", + "@rolldown/binding-linux-x64-musl": "1.2.10", + "@rolldown/binding-openharmony-arm64": "1.2.10", + "@rolldown/binding-win32-arm64-msvc": "1.2.10", + "@rolldown/binding-win32-x64-msvc": "1.2.10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", + "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", + "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.9", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.1.tgz", + "integrity": "sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.1", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "6.1.4", + "tinyexec": "1.3.0", + "tinyglobby": "^0.2.17", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.1", + "@vitest/browser-preview": "5.0.1", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.1", + "@vitest/coverage-v8": "5.0.1", + "@vitest/ui": "5.0.1", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..713e5d6 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "glory-defense", + "version": "1.0.0", + "private": true, + "description": "Entwicklungswerkzeuge für Glory Defense (JS-Tests, Linting). Für den Betrieb auf dem Server wird Node nicht benötigt.", + "type": "module", + "scripts": { + "test": "vitest run", + "test:watch": "vitest", + "lint": "eslint app/static/js tests/js scripts", + "vendor:phaser": "node scripts/vendor-phaser.mjs" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "eslint": "^10.11.0", + "globals": "^17.12.0", + "phaser": "3.90.0", + "vitest": "^5.0.1" + }, + "engines": { + "node": "^22.13.0 || ^24.0.0 || >=26.0.0" + } +} diff --git a/passenger_wsgi.py b/passenger_wsgi.py new file mode 100644 index 0000000..7a717da --- /dev/null +++ b/passenger_wsgi.py @@ -0,0 +1,27 @@ +"""Einstiegspunkt für Phusion Passenger (cPanel „Setup Python App“). + +Passenger importiert diese Datei und erwartet ein WSGI-Objekt namens ``application``. +In cPanel: „Application startup file“ = ``passenger_wsgi.py``, +„Application Entry point“ = ``application``. +""" + +import os +import sys + +# Passenger startet nicht zwingend im Projektordner. Ohne diesen Eintrag in sys.path +# wäre das Paket ``app`` nicht importierbar. +PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) +if PROJECT_ROOT not in sys.path: + sys.path.insert(0, PROJECT_ROOT) + +try: + from dotenv import load_dotenv +except ImportError: # python-dotenv ist optional; cPanel setzt Variablen auch direkt. + pass +else: + # override=False: In cPanel gesetzte Umgebungsvariablen haben Vorrang vor der .env-Datei. + load_dotenv(os.path.join(PROJECT_ROOT, ".env"), override=False) + +from app import create_app # noqa: E402 (erst nach der sys.path-Anpassung importierbar) + +application = create_app() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..bf8cffa --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,31 @@ +[project] +name = "glory-defense" +version = "1.0.0" +description = "Satirischer 2D-Browser-Shooter (Phaser 3) mit Flask-Backend" +requires-python = ">=3.10" +readme = "README.md" + +[tool.ruff] +# Zielplattform ist das älteste unterstützte Python auf cPanel. +target-version = "py310" +line-length = 100 +extend-exclude = ["node_modules", ".venv", "app/static"] + +[tool.ruff.lint] +select = ["E", "F", "W", "I", "B", "UP", "SIM", "RUF", "N", "ANN", "S"] +ignore = [ + # Deutsche Typografie („…“, –) ist gewollt, keine Verwechslungsgefahr. + "RUF001", "RUF002", "RUF003", +] + +[tool.ruff.lint.per-file-ignores] +"tests/**" = ["ANN", "S101", "S105", "S106", "S603", "S310"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +# Projektordner in den Suchpfad: Sonst findet ein direkt aufgerufenes `pytest` +# (anders als `python -m pytest`) das Paket `app` nicht. +pythonpath = ["."] +markers = [ + "e2e: End-to-End-Tests im echten Browser (Playwright)", +] diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..737b73a --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,11 @@ +-r requirements.txt + +# Tests +pytest>=8.0,<10 +# End-to-End-Smoke-Test (Browser-Steuerung). Nutzt standardmäßig das installierte +# Microsoft Edge oder Google Chrome, siehe docs/TESTING.md. +playwright>=1.45,<2 + +# Linting / Formatierung. Auf eine Minor-Version begrenzt, weil ruff mit neuen +# Versionen neue Regeln einführt und `ruff check` sonst unerwartet fehlschlagen kann. +ruff>=0.16,<0.17 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..87402c8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# Laufzeit-Abhängigkeiten. Bewusst nur reine Python-Pakete, damit die +# Installation in der cPanel-venv ohne Compiler oder Systempakete gelingt. +Flask>=3.0,<4 +python-dotenv>=1.0,<2 diff --git a/scripts/build_deploy_zip.py b/scripts/build_deploy_zip.py new file mode 100644 index 0000000..99b7948 --- /dev/null +++ b/scripts/build_deploy_zip.py @@ -0,0 +1,72 @@ +"""Baut das Upload-Paket für cPanel: nur die Dateien, die der Server braucht. + +Aufruf (im Projektordner, beliebiges Betriebssystem):: + + python scripts/build_deploy_zip.py # -> dist/glory_defense.zip + python scripts/build_deploy_zip.py -o paket.zip + +Warum ein eigenes Skript statt „ZIP-Datei erstellen“: Windows PowerShell 5.1 +(`Compress-Archive`) schreibt Pfade mit Backslash ins Archiv. Manche Entpacker unter +Linux erzeugen daraus flache Dateinamen wie ``app\\api.py`` – dann findet Passenger +das Paket ``app`` nicht. Außerdem landen hier garantiert weder ``.env`` (Geheimnisse) +noch ``instance/`` (Datenbank) noch Caches im Paket. +""" + +from __future__ import annotations + +import argparse +import sys +import zipfile +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +DEFAULT_OUTPUT = PROJECT_ROOT / "dist" / "glory_defense.zip" + +#: Einzeldateien und Ordner, die auf den Server gehören. +INCLUDE_FILES = ("passenger_wsgi.py", "requirements.txt", ".env.example") +INCLUDE_DIRS = ("app",) +#: Wird nie mitgepackt, auch wenn es unterhalb von INCLUDE_DIRS liegt. +EXCLUDED_DIR_NAMES = frozenset({"__pycache__", ".pytest_cache", ".ruff_cache", "node_modules"}) +EXCLUDED_SUFFIXES = frozenset({".pyc", ".pyo"}) + + +def iter_deploy_files(root: Path = PROJECT_ROOT) -> list[Path]: + """Alle Dateien des Upload-Pakets, sortiert (für reproduzierbare Archive).""" + files = [root / name for name in INCLUDE_FILES if (root / name).is_file()] + for directory in INCLUDE_DIRS: + for path in (root / directory).rglob("*"): + relative_parts = path.relative_to(root).parts + if not path.is_file() or EXCLUDED_DIR_NAMES.intersection(relative_parts): + continue + if path.suffix in EXCLUDED_SUFFIXES: + continue + files.append(path) + return sorted(files) + + +def build_zip(target: Path, root: Path = PROJECT_ROOT) -> list[str]: + """Schreibt das ZIP und gibt die enthaltenen Pfade (mit ``/``) zurück.""" + target.parent.mkdir(parents=True, exist_ok=True) + names = [] + with zipfile.ZipFile(target, "w", compression=zipfile.ZIP_DEFLATED) as archive: + for path in iter_deploy_files(root): + # as_posix(): immer „/“ als Trenner, unabhängig vom Betriebssystem. + name = path.relative_to(root).as_posix() + archive.write(path, name) + names.append(name) + return names + + +def main(argv: list[str] | None = None) -> int: + """Kommandozeilen-Einstieg.""" + parser = argparse.ArgumentParser(description="Upload-Paket für cPanel bauen.") + parser.add_argument("-o", "--output", type=Path, default=DEFAULT_OUTPUT, help="Ziel-ZIP") + args = parser.parse_args(argv) + names = build_zip(args.output) + size_kb = args.output.stat().st_size / 1024 + print(f"{args.output} erstellt: {len(names)} Dateien, {size_kb:.0f} KB") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/vendor-phaser.mjs b/scripts/vendor-phaser.mjs new file mode 100644 index 0000000..39d7d9e --- /dev/null +++ b/scripts/vendor-phaser.mjs @@ -0,0 +1,26 @@ +/** + * Kopiert Phaser aus node_modules nach app/static/js/lib/. + * + * Warum kopieren statt CDN: Das Spiel soll ohne externe Abhängigkeiten laufen + * (Offline-Betrieb, Datenschutz, strikte Content-Security-Policy). Die kopierte + * Datei wird mit ausgeliefert; auf dem Server ist daher kein Node nötig. + * + * Aufruf: npm run vendor:phaser + */ +import { copyFileSync, mkdirSync, readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const source = join(root, 'node_modules', 'phaser'); +const target = join(root, 'app', 'static', 'js', 'lib'); + +const { version } = JSON.parse(readFileSync(join(source, 'package.json'), 'utf8')); +if (!version.startsWith('3.')) { + throw new Error(`Erwartet wird Phaser 3.x, gefunden: ${version}`); +} + +mkdirSync(target, { recursive: true }); +copyFileSync(join(source, 'dist', 'phaser.min.js'), join(target, 'phaser.min.js')); +copyFileSync(join(source, 'LICENSE.md'), join(target, 'PHASER_LICENSE.md')); +console.log(`Phaser ${version} nach ${target} kopiert.`); diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..d0caad2 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,79 @@ +"""Gemeinsame pytest-Fixtures: App mit temporärer Datenbank, Test-Client, Run-Tokens.""" + +from __future__ import annotations + +import time +from collections.abc import Callable, Iterator +from pathlib import Path + +import pytest +from flask import Flask +from flask.testing import FlaskClient +from itsdangerous.timed import TimestampSigner + +from app import create_app + + +@pytest.fixture() +def db_path(tmp_path: Path) -> Path: + return tmp_path / "data" / "test.sqlite3" + + +@pytest.fixture() +def app(db_path: Path) -> Iterator[Flask]: + app = create_app( + { + "TESTING": True, + "SECRET_KEY": "test-secret-key", + "DATABASE_PATH": str(db_path), + "RATE_LIMIT_MAX_SUBMISSIONS": 5, + "RATE_LIMIT_WINDOW_SECONDS": 600, + } + ) + yield app + + +@pytest.fixture() +def client(app: Flask) -> FlaskClient: + return app.test_client() + + +@pytest.fixture() +def issue_token(client: FlaskClient, monkeypatch: pytest.MonkeyPatch) -> Callable[..., str]: + """Holt ein Run-Token über die API; ``started_ago`` simuliert eine bereits laufende Runde. + + Die Signatur enthält den Ausgabezeitpunkt. Um eine lange Runde zu simulieren, ohne + wirklich zu warten, wird der Zeitstempel beim Signieren zurückdatiert. + """ + + def _issue(started_ago: int = 0) -> str: + original = TimestampSigner.get_timestamp + monkeypatch.setattr( + TimestampSigner, "get_timestamp", lambda _self: int(time.time()) - started_ago + ) + try: + response = client.post("/api/runs") + finally: + monkeypatch.setattr(TimestampSigner, "get_timestamp", original) + assert response.status_code == 201 + return response.get_json()["run_token"] + + return _issue + + +@pytest.fixture() +def valid_payload(issue_token: Callable[..., str]) -> Callable[..., dict]: + """Erzeugt eine gültige Einreichung; einzelne Felder lassen sich überschreiben.""" + + def _payload(**overrides: object) -> dict: + payload: dict = { + "name": "Kadettin Ada", + "score": 1234, + "wave": 3, + "duration_s": 95, + "run_token": issue_token(started_ago=120), + } + payload.update(overrides) + return payload + + return _payload diff --git a/tests/e2e/test_smoke.py b/tests/e2e/test_smoke.py new file mode 100644 index 0000000..8cb0ba1 --- /dev/null +++ b/tests/e2e/test_smoke.py @@ -0,0 +1,254 @@ +"""End-to-End-Smoke-Tests im echten Browser (Playwright, headless). + +Die Tests starten die Flask-App selbst (temporäre Datenbank, zufälliger Port) und +verwenden standardmäßig ein installiertes Microsoft Edge oder Google Chrome. Mit +``GLORY_E2E_BROWSER`` lässt sich ein Kanal erzwingen (``msedge``, ``chrome`` oder +``chromium`` für den von Playwright geladenen Browser). Ist kein Browser verfügbar, +werden die Tests mit Begründung übersprungen. +""" + +from __future__ import annotations + +import os +import threading +import time +from collections.abc import Iterator +from pathlib import Path + +import pytest + +from app import create_app + +sync_api = pytest.importorskip("playwright.sync_api") +expect = sync_api.expect + +pytestmark = pytest.mark.e2e + +GAME = "window.gloryDefense" + + +def _channels() -> list[str | None]: + forced = os.environ.get("GLORY_E2E_BROWSER", "").strip() + if forced: + return [None if forced == "chromium" else forced] + return ["msedge", "chrome", None] + + +@pytest.fixture(scope="module") +def live_server(tmp_path_factory: pytest.TempPathFactory) -> Iterator[str]: + from werkzeug.serving import make_server + + db_path: Path = tmp_path_factory.mktemp("e2e") / "e2e.sqlite3" + app = create_app({"TESTING": True, "SECRET_KEY": "e2e-secret", "DATABASE_PATH": str(db_path)}) + server = make_server("127.0.0.1", 0, app, threaded=True) + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + yield f"http://127.0.0.1:{server.server_port}" + server.shutdown() + thread.join(timeout=5) + + +@pytest.fixture(scope="module") +def browser() -> Iterator[object]: + with sync_api.sync_playwright() as playwright: + failures: list[str] = [] + for channel in _channels(): + try: + launched = playwright.chromium.launch(channel=channel, headless=True) + except Exception as exc: # jeder Startfehler heißt: nächsten Kandidaten probieren + failures.append(f"{channel or 'chromium'}: {str(exc).splitlines()[0]}") + continue + yield launched + launched.close() + return + pytest.skip("Kein Browser für Playwright gefunden – " + " | ".join(failures)) + + +@pytest.fixture() +def page(browser: object, live_server: str) -> Iterator[object]: + context = browser.new_context(viewport={"width": 1280, "height": 720}) + page = context.new_page() + page.errors = [] # type: ignore[attr-defined] + + def on_console(msg: object) -> None: + if msg.type == "error": + page.errors.append(f"console.{msg.type}: {msg.text}") + + page.on("pageerror", lambda exc: page.errors.append(f"pageerror: {exc}")) + page.on("console", on_console) + page.goto(live_server + "/") + yield page + context.close() + + +def _wait_until(page: object, expression: str, timeout_s: float = 15.0) -> None: + """Wartet, bis ``expression`` im Browser wahr ist. + + Absichtlich nicht ``page.wait_for_function``: Das wertet den Ausdruck per ``eval`` + aus, was die Content-Security-Policy der App (kein ``unsafe-eval``) zu Recht + blockiert. ``page.evaluate`` läuft über das DevTools-Protokoll und ist davon + nicht betroffen – so testen wir mit der echten, unveränderten CSP. + """ + deadline = time.monotonic() + timeout_s + while time.monotonic() < deadline: + if page.evaluate(f"() => Boolean({expression})"): + return + page.wait_for_timeout(100) + raise AssertionError(f"Zeitüberschreitung beim Warten auf: {expression}") + + +def _wait_for_scene(page: object, key: str) -> None: + _wait_until(page, f"{GAME} && {GAME}.scene.isActive('{key}')") + + +def _accept_disclaimer_and_start(page: object) -> None: + accept = page.get_by_test_id("disclaimer-accept") + expect(accept).to_be_visible() + accept.click() + _wait_for_scene(page, "Menu") + page.locator("#game canvas").click(position={"x": 40, "y": 40}) + page.keyboard.press("Enter") + _wait_for_scene(page, "Briefing") + page.keyboard.press("Space") + page.keyboard.press("Space") + _wait_for_scene(page, "Game") + _wait_for_scene(page, "Hud") + + +def test_page_loads_disclaimer_then_game_starts(page: object) -> None: + expect(page).to_have_title("Glory Defense") + _accept_disclaimer_and_start(page) + assert page.evaluate("localStorage.getItem('gloryDefense.disclaimerAccepted.v1')") == "true" + + # Etwas spielen: nach rechts laufen, zielen und Dauerfeuer geben. + page.keyboard.down("d") + page.mouse.move(1000, 300) + page.mouse.down() + page.wait_for_timeout(1200) + page.mouse.up() + page.keyboard.up("d") + + _wait_until(page, f"{GAME}.scene.getScene('Game').gameTime > 1500") + _wait_until(page, f"{GAME}.scene.getScene('Game').runToken !== null") + state = page.evaluate( + f"""() => {{ + const s = {GAME}.scene.getScene('Game'); + return {{ magazine: s.player.weapon.magazine, x: s.player.x }}; + }}""" + ) + assert state["magazine"] < 30, "Es wurde nicht geschossen" + assert state["x"] > 1200, "Der Präsident hat sich nicht bewegt" + + # Pause per Esc, Lautstärke ändern, weiterspielen. + page.keyboard.press("Escape") + resume = page.get_by_test_id("pause-resume") + expect(resume).to_be_visible() + page.get_by_test_id("volume-music").fill("40") + resume.click() + _wait_for_scene(page, "Game") + + assert page.errors == [] # type: ignore[attr-defined] + + +def test_orbital_commands_via_keyboard(page: object) -> None: + _accept_disclaimer_and_start(page) + page.mouse.move(800, 360) + + # Orbitalschlag mit Pfeiltasten, Nachschub mit WASD – beides bei gehaltenem Q. + page.keyboard.down("q") + for key in ("ArrowUp", "ArrowRight", "ArrowDown", "ArrowDown"): + page.keyboard.press(key) + for key in ("a", "a", "s", "d"): + page.keyboard.press(key) + page.keyboard.up("q") + + _wait_until(page, f"{GAME}.scene.getScene('Game').orbital.pending.length === 2", timeout_s=5) + ready = page.evaluate( + f"""() => {{ + const s = {GAME}.scene.getScene('Game'); + return s.orbital.hudState(s.gameTime).commands.map(c => [c.id, c.ready]); + }}""" + ) + assert ready == [["strike", False], ["supply", False], ["turret", True]] + # Nach dem Einschlag liegt eine Nachschubkapsel in der Arena. + _wait_until(page, f"{GAME}.scene.getScene('Game').pods.countActive(true) === 1", timeout_s=8) + assert page.errors == [] # type: ignore[attr-defined] + + +def test_disclaimer_is_remembered_and_reachable_from_menu(page: object) -> None: + page.get_by_test_id("disclaimer-accept").click() + _wait_for_scene(page, "Menu") + page.reload() + _wait_for_scene(page, "Menu") + expect(page.locator("#disclaimer-overlay")).to_have_count(0) + + # Im Menü: 4. Eintrag „Disclaimer“ (dreimal nach unten, Enter). + page.locator("#game canvas").click(position={"x": 40, "y": 40}) + for _ in range(3): + page.keyboard.press("ArrowDown") + page.keyboard.press("Enter") + expect(page.locator("#disclaimer-overlay")).to_be_visible() + expect(page.locator("#disclaimer-overlay")).to_contain_text("Satire und reine Fiktion") + page.get_by_test_id("disclaimer-accept").click() + expect(page.locator("#disclaimer-overlay")).to_have_count(0) + assert page.errors == [] # type: ignore[attr-defined] + + +def test_game_over_submits_highscore(page: object) -> None: + _accept_disclaimer_and_start(page) + _wait_until(page, f"{GAME}.scene.getScene('Game').runToken !== null") + _wait_until(page, f"{GAME}.scene.getScene('Game').gameTime > 2000") + # Test-Abkürzung: Punkte gutschreiben und den Präsidenten fallen lassen. + page.evaluate( + f"""() => {{ + const s = {GAME}.scene.getScene('Game'); + s.score.addBonus(150); + s.player.hitInvulnerableUntil = 0; + s.player.dodgeUntil = 0; + s.damagePlayer(9999); + }}""" + ) + _wait_for_scene(page, "GameOver") + name = page.get_by_test_id("highscore-name") + expect(name).to_be_visible() + name.fill("E2E Kadett") + page.get_by_test_id("highscore-submit").click() + expect(page.locator(".highscore-list__own")).to_contain_text("E2E Kadett") + expect(page.locator("#gameover-overlay")).to_contain_text("Platz 1") + assert page.errors == [] # type: ignore[attr-defined] + + +def test_game_runs_with_placeholders_when_assets_are_missing( + browser: object, live_server: str +) -> None: + """Abnahmekriterium: Das Spiel ist auch ohne echte Grafiken vollständig spielbar.""" + context = browser.new_context(viewport={"width": 1280, "height": 720}) + page = context.new_page() + page.errors = [] # type: ignore[attr-defined] + page.on("pageerror", lambda exc: page.errors.append(str(exc))) + # Sämtliche Grafik-, Schrift- und Klangdateien blockieren. + page.route("**/static/assets/**", lambda route: route.abort()) + page.goto(live_server + "/") + _accept_disclaimer_and_start(page) + _wait_until(page, f"{GAME}.scene.getScene('Game').gameTime > 2500") + textures = page.evaluate( + f"""() => {{ + const t = {GAME}.textures; + return ['player', 'enemy-krabbler', 'enemy-walzmeister', 'supply-pod', 'emblem'] + .map(key => [key, t.exists(key), t.get(key).source[0].width]); + }}""" + ) + # Platzhalter existieren (Größen der Platzhalter, nicht der SVGs). + assert all(exists for _key, exists, _width in textures) + assert dict((key, width) for key, _e, width in textures)["player"] != 64 + assert page.errors == [] # type: ignore[attr-defined] + context.close() + + +def test_disclaimer_page_works_without_javascript(browser: object, live_server: str) -> None: + context = browser.new_context(java_script_enabled=False) + page = context.new_page() + page.goto(live_server + "/disclaimer") + expect(page.locator("main")).to_contain_text("frei erfunden") + expect(page.get_by_role("link", name="Zurück zum Spiel")).to_be_visible() + context.close() diff --git a/tests/js/apiClient.test.js b/tests/js/apiClient.test.js new file mode 100644 index 0000000..51a0524 --- /dev/null +++ b/tests/js/apiClient.test.js @@ -0,0 +1,82 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { ApiClient } from '../../app/static/js/systems/ApiClient.js'; + +const endpoints = { highscores: '/api/highscores', runs: '/api/runs' }; + +/** Baut eine fetch-Attrappe mit fester Antwort. */ +function fakeFetch(status, body) { + return vi.fn(async () => ({ + status, + json: async () => { + if (body === undefined) throw new SyntaxError('kein JSON'); + return body; + }, + })); +} + +describe('ApiClient', () => { + it('holt ein Run-Token', async () => { + const fetch = fakeFetch(201, { run_token: 'abc' }); + expect(await new ApiClient(endpoints, fetch).startRun()).toBe('abc'); + expect(fetch).toHaveBeenCalledWith('/api/runs', expect.objectContaining({ method: 'POST' })); + }); + + it('liefert null statt Fehler, wenn der Server nicht erreichbar ist', async () => { + const fetch = vi.fn(async () => { + throw new TypeError('Failed to fetch'); + }); + const client = new ApiClient(endpoints, fetch); + expect(await client.startRun()).toBeNull(); + expect(await client.fetchHighscores()).toEqual({ ok: false, highscores: [] }); + expect(await client.submitHighscore({ name: 'A', score: 1, wave: 1, durationS: 1, runToken: 't' })).toMatchObject({ + ok: false, + error: 'network', + }); + }); + + it('liest die Highscore-Liste', async () => { + const entries = [{ rank: 1, name: 'Ada', score: 10, wave: 1, created_at: 'x' }]; + const result = await new ApiClient(endpoints, fakeFetch(200, { highscores: entries })).fetchHighscores(); + expect(result).toEqual({ ok: true, highscores: entries }); + }); + + it('behandelt kaputte Antworten als Fehlschlag', async () => { + expect(await new ApiClient(endpoints, fakeFetch(200, undefined)).fetchHighscores()).toEqual({ ok: false, highscores: [] }); + expect(await new ApiClient(endpoints, fakeFetch(500, { error: 'x' })).startRun()).toBeNull(); + }); + + it('sendet Highscores im API-Format mit ganzzahligen Werten', async () => { + const fetch = fakeFetch(201, { rank: 3, highscores: [] }); + const result = await new ApiClient(endpoints, fetch).submitHighscore({ + name: 'Ada', + score: 1234.7, + wave: 3, + durationS: 95.9, + runToken: 'tok', + }); + expect(result).toEqual({ ok: true, rank: 3, highscores: [] }); + const [url, init] = fetch.mock.calls[0]; + expect(url).toBe('/api/highscores'); + expect(init.method).toBe('POST'); + expect(init.headers['Content-Type']).toBe('application/json'); + expect(JSON.parse(init.body)).toEqual({ name: 'Ada', score: 1234, wave: 3, duration_s: 95, run_token: 'tok' }); + }); + + it('gibt Validierungs- und Rate-Limit-Fehler lesbar zurück', async () => { + const invalid = await new ApiClient( + endpoints, + fakeFetch(400, { error: 'validation_failed', message: 'Ungültige Eingaben.', fields: { name: 'zu lang' } }), + ).submitHighscore({ name: 'A', score: 1, wave: 1, durationS: 1, runToken: 't' }); + expect(invalid).toMatchObject({ ok: false, error: 'validation_failed', fields: { name: 'zu lang' } }); + + const limited = await new ApiClient(endpoints, fakeFetch(429, { error: 'rate_limited', message: 'Zu viele' })).submitHighscore({ + name: 'A', + score: 1, + wave: 1, + durationS: 1, + runToken: 't', + }); + expect(limited).toMatchObject({ ok: false, error: 'rate_limited', message: 'Zu viele' }); + }); +}); diff --git a/tests/js/audio.test.js b/tests/js/audio.test.js new file mode 100644 index 0000000..50fbf71 --- /dev/null +++ b/tests/js/audio.test.js @@ -0,0 +1,242 @@ +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import { + BARS, + CHORD_ROOTS, + eventsAtStep, + midiToFrequency, + STEPS_PER_BAR, + TOTAL_STEPS, +} from '../../app/static/js/logic/marchPattern.js'; +import { allSoundFiles, AUDIO_PATH, SOUND_FILES, SOUND_OPTIONS } from '../../app/static/js/systems/AudioAssets.js'; +import { AudioManager } from '../../app/static/js/systems/AudioManager.js'; +import { SafeStorage, Settings } from '../../app/static/js/systems/Settings.js'; +import { SYNTH_RECIPES } from '../../app/static/js/systems/Synth.js'; + +const ASSET_DIR = join(import.meta.dirname, '..', '..', 'app', 'static', 'assets', AUDIO_PATH); + +// ------------------------------------------------------------ minimaler AudioContext-Ersatz + +class FakeParam { + constructor(value = 1) { + this.value = value; + } + setValueAtTime(v) { + this.value = v; + return this; + } + exponentialRampToValueAtTime() { + return this; + } + setTargetAtTime(v) { + this.value = v; + return this; + } +} + +class FakeNode { + constructor(ctx) { + this.ctx = ctx; + } + connect(node) { + return node; + } + disconnect() {} +} + +class FakeContext { + constructor() { + this.state = 'running'; + this.currentTime = 0; + this.sampleRate = 8000; + this.destination = new FakeNode(this); + this.created = { oscillator: 0, source: 0 }; + this.startedBuffers = []; + } + createGain() { + return Object.assign(new FakeNode(this), { gain: new FakeParam(1) }); + } + createOscillator() { + this.created.oscillator += 1; + return Object.assign(new FakeNode(this), { frequency: new FakeParam(440), type: 'sine', start() {}, stop() {} }); + } + createBufferSource() { + this.created.source += 1; + const ctx = this; + return Object.assign(new FakeNode(this), { + playbackRate: new FakeParam(1), + buffer: null, + start() { + ctx.startedBuffers.push(this.buffer); + }, + stop() {}, + }); + } + createBiquadFilter() { + return Object.assign(new FakeNode(this), { frequency: new FakeParam(350), Q: new FakeParam(1), type: 'lowpass' }); + } + createBuffer(_channels, length) { + const data = new Float32Array(length); + return { getChannelData: () => data }; + } + decodeAudioData(bytes) { + return Promise.resolve({ decodedFrom: bytes.byteLength }); + } + resume() { + this.state = 'running'; + return Promise.resolve(); + } +} + +function memorySettings() { + const data = new Map(); + return new Settings(new SafeStorage({ getItem: (k) => data.get(k) ?? null, setItem: (k, v) => data.set(k, v) })); +} + +const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); + +// ------------------------------------------------------------------------------ Tests + +describe('AudioAssets', () => { + it('verweist nur auf vorhandene Dateien', () => { + const missing = allSoundFiles().filter((file) => !existsSync(join(ASSET_DIR, file))); + expect(missing).toEqual([]); + }); + + it('hat für jeden Effekt einen synthetischen Ersatz (Spiel bleibt ohne Dateien hörbar)', () => { + const withoutRecipe = Object.keys(SOUND_FILES).filter((name) => typeof SYNTH_RECIPES[name] !== 'function'); + expect(withoutRecipe).toEqual([]); + }); + + it('hat für jeden Effekt Abspieloptionen mit gültiger Lautstärke', () => { + for (const name of Object.keys(SOUND_FILES)) { + const volume = SOUND_OPTIONS[name]?.volume ?? 1; + expect(volume, name).toBeGreaterThan(0); + expect(volume, name).toBeLessThanOrEqual(1); + } + }); +}); + +describe('AudioManager', () => { + beforeEach(() => { + vi.stubGlobal('AudioContext', FakeContext); + }); + afterEach(() => { + vi.unstubAllGlobals(); + vi.useRealTimers(); + }); + + it('bleibt vor der ersten Nutzeraktion stumm, ohne Fehler', () => { + const audio = new AudioManager(memorySettings(), { fetchImpl: vi.fn() }); + expect(() => audio.play('shot-carbine')).not.toThrow(); + expect(audio.context).toBeNull(); + }); + + it('lädt Dateien vorab und spielt sie nach dem Entsperren ab', async () => { + const fetchImpl = vi.fn(async () => ({ ok: true, arrayBuffer: async () => new ArrayBuffer(16) })); + const audio = new AudioManager(memorySettings(), { staticBase: '/glory/static/', fetchImpl }); + audio.preload(); + expect(fetchImpl).toHaveBeenCalledWith(`/glory/static/assets/${AUDIO_PATH}laserSmall_000.ogg`); + expect(fetchImpl).toHaveBeenCalledTimes(allSoundFiles().length); + + audio.unlock(); + await flush(); + await flush(); + audio.play('shot-carbine'); + expect(audio.context.startedBuffers).toHaveLength(1); + expect(audio.context.startedBuffers[0]).toEqual({ decodedFrom: 16 }); + }); + + it('weicht auf den Synthesizer aus, wenn Dateien fehlen', async () => { + const fetchImpl = vi.fn(async () => ({ ok: false })); + const audio = new AudioManager(memorySettings(), { fetchImpl }); + audio.preload(); + audio.unlock(); + await flush(); + audio.play('explosion-big'); + // Gespielt wurde nur Rauschen aus dem Synthesizer, keine dekodierte Datei. + expect(audio.context.startedBuffers.filter((b) => b && 'decodedFrom' in b)).toHaveLength(0); + expect(audio.context.created.oscillator).toBeGreaterThan(0); + }); + + it('begrenzt schnelle Wiederholungen desselben Effekts', () => { + const audio = new AudioManager(memorySettings(), { fetchImpl: vi.fn() }); + audio.unlock(); + const before = audio.context.created.oscillator; + audio.play('combo-step'); + audio.play('combo-step'); + expect(audio.context.created.oscillator - before).toBe(1); + }); + + it('überträgt Lautstärkeänderungen sofort auf die Kanäle', () => { + const settings = memorySettings(); + const audio = new AudioManager(settings, { fetchImpl: vi.fn() }); + audio.unlock(); + settings.setVolume('music', 0.2); + settings.setVolume('master', 0.6); + expect(audio.gains.music.gain.value).toBe(0.2); + expect(audio.gains.master.gain.value).toBe(0.6); + }); + + it('startet vorgemerkte Musik erst nach dem Entsperren und stoppt sie wieder', () => { + vi.useFakeTimers(); + const audio = new AudioManager(memorySettings(), { fetchImpl: vi.fn() }); + audio.startMusic(); + expect(audio.music).toBeNull(); + audio.unlock(); + expect(audio.music).not.toBeNull(); + vi.advanceTimersByTime(200); + expect(audio.context.created.oscillator).toBeGreaterThan(0); + audio.stopMusic(); + expect(audio.music).toBeNull(); + expect(audio.musicWanted).toBe(false); + }); + + it('senkt die Musik in der Pause ab', () => { + const audio = new AudioManager(memorySettings(), { fetchImpl: vi.fn() }); + audio.unlock(); + audio.duck(true); + expect(audio.gains.duck.gain.value).toBeLessThan(1); + audio.duck(false); + expect(audio.gains.duck.gain.value).toBe(1); + }); +}); + +describe('Marschmuster', () => { + const all = Array.from({ length: TOTAL_STEPS }, (_, step) => eventsAtStep(step)); + const count = (instrument) => all.flat().filter((e) => e.instrument === instrument).length; + + it('hat 8 Takte à 16 Schritte', () => { + expect(TOTAL_STEPS).toBe(BARS * STEPS_PER_BAR); + expect(CHORD_ROOTS).toHaveLength(BARS); + }); + + it('schlägt die große Trommel auf 1 und 3 jedes Takts', () => { + expect(count('kick')).toBe(BARS * 2); + for (let bar = 0; bar < BARS; bar += 1) { + expect(all[bar * STEPS_PER_BAR].some((e) => e.instrument === 'kick')).toBe(true); + expect(all[bar * STEPS_PER_BAR + 8].some((e) => e.instrument === 'kick')).toBe(true); + } + }); + + it('spielt die Melodie nur mit Tönen aus C-Dur', () => { + const cMajor = new Set([0, 2, 4, 5, 7, 9, 11]); + const melody = all.flat().filter((e) => e.instrument === 'lead'); + expect(melody.length).toBeGreaterThan(20); + for (const event of melody) expect(cMajor.has(event.notes[0] % 12)).toBe(true); + }); + + it('wiederholt sich nahtlos', () => { + expect(eventsAtStep(TOTAL_STEPS)).toEqual(eventsAtStep(0)); + expect(eventsAtStep(-1)).toEqual(eventsAtStep(TOTAL_STEPS - 1)); + }); + + it('rechnet MIDI-Töne in Frequenzen um', () => { + expect(midiToFrequency(69)).toBeCloseTo(440); + expect(midiToFrequency(57)).toBeCloseTo(220); + expect(midiToFrequency(60)).toBeCloseTo(261.63, 1); + }); +}); diff --git a/tests/js/comboInput.test.js b/tests/js/comboInput.test.js new file mode 100644 index 0000000..bfbc243 --- /dev/null +++ b/tests/js/comboInput.test.js @@ -0,0 +1,126 @@ +import { describe, expect, it } from 'vitest'; + +import { ORBITAL } from '../../app/static/js/config.js'; +import { + codeToDirection, + ComboInput, + isPrefix, + validateCommands, +} from '../../app/static/js/logic/comboInput.js'; + +const COMMANDS = [ + { id: 'strike', sequence: ['up', 'right', 'down', 'down'] }, + { id: 'supply', sequence: ['down', 'down', 'up', 'right'] }, + { id: 'turret', sequence: ['down', 'up', 'right', 'right', 'up'] }, +]; + +const typeAll = (combo, dirs) => dirs.map((d) => combo.push(d)); + +describe('codeToDirection', () => { + it('bildet Pfeiltasten und WASD (physische Position) ab', () => { + expect(codeToDirection('ArrowUp')).toBe('up'); + expect(codeToDirection('KeyW')).toBe('up'); + expect(codeToDirection('KeyA')).toBe('left'); + expect(codeToDirection('ArrowRight')).toBe('right'); + expect(codeToDirection('KeyS')).toBe('down'); + expect(codeToDirection('KeyQ')).toBeNull(); + }); +}); + +describe('isPrefix', () => { + it('erkennt Anfänge von Folgen', () => { + expect(isPrefix([], ['up'])).toBe(true); + expect(isPrefix(['up'], ['up', 'down'])).toBe(true); + expect(isPrefix(['down'], ['up', 'down'])).toBe(false); + expect(isPrefix(['up', 'down', 'up'], ['up', 'down'])).toBe(false); + }); +}); + +describe('validateCommands', () => { + it('akzeptiert die Befehle aus der Konfiguration', () => { + expect(() => validateCommands(ORBITAL.commands)).not.toThrow(); + }); + + it('lehnt Folgen ab, die Anfang einer anderen sind', () => { + expect(() => + validateCommands([ + { id: 'a', sequence: ['up', 'down'] }, + { id: 'b', sequence: ['up', 'down', 'left'] }, + ]), + ).toThrow(/Anfang/); + }); + + it('lehnt doppelte IDs, leere Folgen und unbekannte Richtungen ab', () => { + expect(() => validateCommands([{ id: 'a', sequence: ['up'] }, { id: 'a', sequence: ['down'] }])).toThrow(); + expect(() => validateCommands([{ id: 'a', sequence: [] }])).toThrow(); + expect(() => validateCommands([{ id: 'a', sequence: ['oben'] }])).toThrow(); + }); +}); + +describe('ComboInput', () => { + it('ignoriert Eingaben, solange die Halte-Taste nicht gedrückt ist', () => { + const combo = new ComboInput(COMMANDS); + expect(combo.push('up').status).toBe('inactive'); + }); + + it('erkennt eine vollständige Folge', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + const results = typeAll(combo, ['up', 'right', 'down', 'down']); + expect(results.slice(0, 3).map((r) => r.status)).toEqual(['progress', 'progress', 'progress']); + expect(results[3]).toEqual({ status: 'match', commandId: 'strike' }); + expect(combo.buffer).toEqual([]); + }); + + it('meldet passende Kandidaten während der Eingabe', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + expect(combo.push('down')).toEqual({ status: 'progress', candidates: ['supply', 'turret'] }); + expect(combo.push('up')).toEqual({ status: 'progress', candidates: ['turret'] }); + }); + + it('meldet Fehleingaben und erlaubt direkt einen neuen Versuch', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + combo.push('up'); + expect(combo.push('up').status).toBe('fail'); + expect(combo.buffer).toEqual([]); + const retry = typeAll(combo, ['down', 'down', 'up', 'right']); + expect(retry.at(-1)).toEqual({ status: 'match', commandId: 'supply' }); + }); + + it('erlaubt mehrere Befehle hintereinander, solange die Taste gehalten wird', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + expect(typeAll(combo, ['up', 'right', 'down', 'down']).at(-1).commandId).toBe('strike'); + expect(typeAll(combo, ['down', 'up', 'right', 'right', 'up']).at(-1).commandId).toBe('turret'); + }); + + it('verwirft halbe Eingaben beim Loslassen', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + typeAll(combo, ['up', 'right']); + combo.end(); + combo.begin(); + expect(combo.push('down').status).toBe('progress'); + expect(combo.buffer).toEqual(['down']); + }); + + it('ignoriert unbekannte Richtungen ohne den Puffer zu verändern', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + combo.push('up'); + expect(combo.push('diagonal').status).toBe('ignored'); + expect(combo.buffer).toEqual(['up']); + }); + + it('zeigt den Fortschritt je Befehl für das HUD', () => { + const combo = new ComboInput(COMMANDS); + combo.begin(); + typeAll(combo, ['down', 'down']); + expect(combo.progressFor('supply')).toBe(2); + expect(combo.progressFor('turret')).toBe(0); + expect(combo.progressFor('strike')).toBe(0); + expect(combo.progressFor('unbekannt')).toBe(0); + }); +}); diff --git a/tests/js/config.test.js b/tests/js/config.test.js new file mode 100644 index 0000000..c021a4c --- /dev/null +++ b/tests/js/config.test.js @@ -0,0 +1,114 @@ +/** + * Plausibilitätsprüfungen der Balancing-Werte: fängt Tippfehler ab, bevor sie im + * Spiel als seltsames Verhalten auffallen. + */ +import { describe, expect, it } from 'vitest'; + +import { + ENEMY_TYPES, + FACTIONS, + HIGHSCORE, + ORBITAL, + PLAYER, + SCORING, + WAVES, + WEAPONS, +} from '../../app/static/js/config.js'; +import { validateCommands } from '../../app/static/js/logic/comboInput.js'; + +/** Findet NaN, negative Zahlen und fehlende Werte in verschachtelten Objekten. */ +function assertSaneNumbers(obj, path = '') { + for (const [key, value] of Object.entries(obj)) { + const here = `${path}.${key}`; + if (typeof value === 'number') { + expect(Number.isFinite(value), here).toBe(true); + expect(value, here).toBeGreaterThanOrEqual(0); + } else if (value && typeof value === 'object') { + assertSaneNumbers(value, here); + } + } +} + +describe('config', () => { + it('enthält nur endliche, nicht-negative Zahlen', () => { + for (const [name, section] of Object.entries({ PLAYER, WEAPONS, ENEMY_TYPES, WAVES, SCORING, ORBITAL })) { + assertSaneNumbers(section, name); + } + }); + + it('hat je Fraktion genau einen kleinen, mittleren und Elite-Gegner', () => { + for (const faction of Object.keys(FACTIONS)) { + const tiers = Object.values(ENEMY_TYPES) + .filter((t) => t.faction === faction) + .map((t) => t.tier) + .sort(); + expect(tiers, faction).toEqual(['elite', 'medium', 'small']); + } + }); + + it('verwendet konsistente IDs und gültige Gruppengrößen', () => { + for (const [key, type] of Object.entries(ENEMY_TYPES)) { + expect(type.id).toBe(key); + expect(type.groupSize.min).toBeLessThanOrEqual(type.groupSize.max); + expect(type.groupSize.min).toBeGreaterThanOrEqual(1); + } + for (const [key, weapon] of Object.entries(WEAPONS)) expect(weapon.id).toBe(key); + }); + + it('lässt Fernkämpfer nur schießen, wenn sie in ihrem Abstandsband sind', () => { + for (const type of Object.values(ENEMY_TYPES)) { + if (!type.range) continue; + expect(type.range.min, type.id).toBeLessThan(type.range.max); + expect(type.attack.maxDistance, type.id).toBeGreaterThanOrEqual(type.range.max); + } + }); + + it('verweist nur auf existierende Waffen und Brut-Typen', () => { + for (const slot of PLAYER.weaponSlots) expect(WEAPONS[slot]).toBeDefined(); + expect(ENEMY_TYPES[ENEMY_TYPES.brutmutter.brood.childType]).toBeDefined(); + }); + + it('hat mindestens drei gültige Orbital-Befehle mit Verzögerung und Abklingzeit', () => { + expect(ORBITAL.commands.length).toBeGreaterThanOrEqual(3); + expect(() => validateCommands(ORBITAL.commands)).not.toThrow(); + for (const command of ORBITAL.commands) { + expect(command.delayMs, command.id).toBeGreaterThan(0); + expect(command.cooldownMs, command.id).toBeGreaterThan(command.delayMs); + } + const ids = ORBITAL.commands.map((c) => c.id); + expect(ids).toEqual(expect.arrayContaining(['strike', 'supply', 'turret'])); + }); + + it('verwendet eigene Befehlscodes statt Codes aus bekannten Spielen', () => { + // Codes, die in einem bekannten Koop-Shooter mit ähnlicher Mechanik belegt sind + // (vom unabhängigen Review als zu nah beanstandet). Keiner unserer Codes darf gleich sein. + const taken = [ + ['down', 'down', 'up', 'right'], + ['down', 'up', 'right', 'right', 'up'], + ['up', 'down', 'right', 'left', 'up'], + ['up', 'right', 'down', 'down', 'down'], + ['right', 'right', 'up'], + ['down', 'up', 'right', 'left'], + ].map((s) => s.join(',')); + for (const command of ORBITAL.commands) { + expect(taken, command.id).not.toContain(command.sequence.join(',')); + } + // Jeder Code beginnt mit einer anderen Richtung – schon der erste Tastendruck ist eindeutig. + const starts = ORBITAL.commands.map((c) => c.sequence[0]); + expect(new Set(starts).size).toBe(starts.length); + }); + + it('nutzt als Halte-Taste weder Strg (Strg+W schließt den Tab) noch Shift (Einrastfunktion)', () => { + expect(['CTRL', 'CONTROL', 'SHIFT']).not.toContain(ORBITAL.holdKey.toUpperCase()); + }); + + it('hält das Wellenbudget mindestens so hoch wie die teuerste Elite in Elite-Wellen', () => { + const maxEliteCost = Math.max(...Object.values(ENEMY_TYPES).filter((t) => t.tier === 'elite').map((t) => t.cost)); + const firstEliteBudget = WAVES.firstBudget + WAVES.budgetGrowth * Math.pow(WAVES.eliteEvery - 1, WAVES.budgetExponent); + expect(firstEliteBudget).toBeGreaterThan(maxEliteCost); + }); + + it('stimmt die maximale Namenslänge mit dem Backend ab', () => { + expect(HIGHSCORE.nameMaxLength).toBe(16); + }); +}); diff --git a/tests/js/cooldowns.test.js b/tests/js/cooldowns.test.js new file mode 100644 index 0000000..2379db8 --- /dev/null +++ b/tests/js/cooldowns.test.js @@ -0,0 +1,41 @@ +import { describe, expect, it } from 'vitest'; + +import { CooldownTracker } from '../../app/static/js/logic/cooldowns.js'; + +describe('CooldownTracker', () => { + it('ist für unbekannte Fähigkeiten sofort bereit', () => { + const cd = new CooldownTracker(); + expect(cd.isReady('dodge', 0)).toBe(true); + expect(cd.remaining('dodge', 0)).toBe(0); + expect(cd.progress('dodge', 0)).toBe(1); + }); + + it('läuft nach dem Auslösen ab', () => { + const cd = new CooldownTracker(); + cd.trigger('dodge', 1000, 5000); + expect(cd.isReady('dodge', 5000)).toBe(false); + expect(cd.remaining('dodge', 5250)).toBe(750); + expect(cd.progress('dodge', 5250)).toBeCloseTo(0.25); + expect(cd.isReady('dodge', 6000)).toBe(true); + expect(cd.progress('dodge', 9000)).toBe(1); + }); + + it('verwaltet mehrere Fähigkeiten unabhängig', () => { + const cd = new CooldownTracker(); + cd.trigger('a', 100, 0); + cd.trigger('b', 1000, 0); + expect(cd.isReady('a', 150)).toBe(true); + expect(cd.isReady('b', 150)).toBe(false); + }); + + it('lässt sich zurücksetzen', () => { + const cd = new CooldownTracker(); + cd.trigger('a', 100, 0); + cd.trigger('b', 100, 0); + cd.reset('a'); + expect(cd.isReady('a', 0)).toBe(true); + expect(cd.isReady('b', 0)).toBe(false); + cd.reset(); + expect(cd.isReady('b', 0)).toBe(true); + }); +}); diff --git a/tests/js/enemyAi.test.js b/tests/js/enemyAi.test.js new file mode 100644 index 0000000..650b578 --- /dev/null +++ b/tests/js/enemyAi.test.js @@ -0,0 +1,165 @@ +import { describe, expect, it } from 'vitest'; + +import { ENEMY_TYPES } from '../../app/static/js/config.js'; +import { + attackStep, + broodStep, + createAttackState, + createBrain, + flankVelocity, + leaperStep, + swarmVelocity, + updateStrafe, + volleyAngles, +} from '../../app/static/js/logic/enemyAi.js'; +import { degToRad, distance, length } from '../../app/static/js/logic/math.js'; +import { createRng } from '../../app/static/js/logic/rng.js'; + +const player = { x: 0, y: 0 }; + +describe('createBrain', () => { + it('verzögert den ersten Angriff und ist reproduzierbar', () => { + const a = createBrain(createRng(1), 1000, { firstAttackDelayMs: 800 }); + const b = createBrain(createRng(1), 1000, { firstAttackDelayMs: 800 }); + expect(a).toEqual(b); + expect(a.attack.nextAttackAt).toBeGreaterThanOrEqual(1400); + expect(a.attack.nextAttackAt).toBeLessThan(2200); + }); +}); + +describe('swarmVelocity', () => { + const type = ENEMY_TYPES.krabbler; + + it('steuert aus der Distanz den eigenen Umzingelungsplatz an', () => { + const brain = { slotAngle: Math.PI / 2 }; // Platz unterhalb des Spielers + const v = swarmVelocity(brain, { x: 800, y: 0 }, player, 100, type); + // Ziel ist (0, encircleRadius): nach links UND nach unten. + expect(v.x).toBeLessThan(0); + expect(v.y).toBeGreaterThan(0); + }); + + it('greift in Reichweite direkt an', () => { + const v = swarmVelocity({ slotAngle: Math.PI / 2 }, { x: 100, y: 0 }, player, 100, type); + expect(v.x).toBeCloseTo(-100); + expect(v.y).toBeCloseTo(0); + }); +}); + +describe('leaperStep', () => { + const { leap } = ENEMY_TYPES.sprungkralle; + + it('verfolgt außerhalb der Sprungreichweite', () => { + const brain = createBrain(createRng(1), 0); + const r = leaperStep(brain, { x: 1000, y: 0 }, player, 0, 120, leap); + expect(r.telegraph).toBe(false); + expect(r.velocity.x).toBeCloseTo(-120); + }); + + it('durchläuft Ansetzen → Sprung → Abklingzeit', () => { + const brain = createBrain(createRng(1), 0); + const self = { x: 200, y: 0 }; + + const windup = leaperStep(brain, self, player, 0, 120, leap); + expect(windup).toMatchObject({ telegraph: true, leaping: false, velocity: { x: 0, y: 0 } }); + + // Spieler bewegt sich während des Ansetzens: Die Sprungrichtung bleibt fest. + const moved = { x: 0, y: 500 }; + const jump = leaperStep(brain, self, moved, leap.windupMs, 120, leap); + expect(jump.leaping).toBe(true); + expect(jump.velocity.x).toBeCloseTo(-leap.speed); + expect(jump.velocity.y).toBeCloseTo(0); + + const landed = leaperStep(brain, self, player, leap.windupMs + leap.durationMs, 120, leap); + expect(landed.leaping).toBe(false); + expect(landed.telegraph).toBe(false); + + // Während der Abklingzeit kein neuer Sprung, obwohl in Reichweite. + const cooling = leaperStep(brain, self, player, leap.windupMs + leap.durationMs + 10, 120, leap); + expect(cooling.telegraph).toBe(false); + const again = leaperStep(brain, self, player, leap.windupMs + leap.durationMs + leap.cooldownMs, 120, leap); + expect(again.telegraph).toBe(true); + }); +}); + +describe('flankVelocity', () => { + it('schwenkt seitlich ein statt frontal anzulaufen', () => { + const type = ENEMY_TYPES.blechsoldat; + const self = { x: 600, y: 0 }; + const left = flankVelocity({ flankSide: 1 }, self, player, 80, type); + const right = flankVelocity({ flankSide: -1 }, self, player, 80, type); + expect(Math.sign(left.y)).not.toBe(Math.sign(right.y)); + expect(length(left)).toBeCloseTo(80); + }); + + it('hält an der Flankenposition Abstand zum Spieler', () => { + const type = ENEMY_TYPES.blechsoldat; + const angle = degToRad(type.flankAngleDeg); + // Genau an der Flankenposition relativ zu sich selbst gibt es keinen festen Punkt, + // daher: sehr nah am Spieler → muss zurückweichen oder seitlich ausweichen. + const self = { x: Math.cos(angle) * 100, y: Math.sin(angle) * 100 }; + const v = flankVelocity({ flankSide: 1 }, self, player, 80, type); + expect(distance({ x: self.x + v.x, y: self.y + v.y }, player)).toBeGreaterThanOrEqual(distance(self, player) - 1); + }); +}); + +describe('updateStrafe', () => { + it('wechselt die Richtung nach Ablauf des Intervalls', () => { + const brain = { strafeDirection: 1, nextStrafeSwitchAt: 100 }; + updateStrafe(brain, 50, { min: 1000, max: 1000 }, createRng(1)); + expect(brain.strafeDirection).toBe(1); + updateStrafe(brain, 100, { min: 1000, max: 1000 }, createRng(1)); + expect(brain.strafeDirection).toBe(-1); + expect(brain.nextStrafeSwitchAt).toBe(1100); + }); +}); + +describe('attackStep', () => { + const attack = { cooldownMs: 1000, burst: 3, burstIntervalMs: 100, maxDistance: 400 }; + + it('feuert nicht außerhalb der Reichweite', () => { + const state = createAttackState(0); + expect(attackStep(state, 0, 401, attack)).toBe(false); + }); + + it('feuert eine Salve mit Abständen und wartet dann die Abklingzeit ab', () => { + const state = createAttackState(0); + const shots = []; + for (let t = 0; t <= 1200; t += 50) { + if (attackStep(state, t, 100, attack)) shots.push(t); + } + expect(shots).toEqual([0, 100, 200, 1000, 1100, 1200]); + }); + + it('respektiert die Verzögerung des ersten Angriffs', () => { + const state = createAttackState(500); + expect(attackStep(state, 499, 100, attack)).toBe(false); + expect(attackStep(state, 500, 100, attack)).toBe(true); + }); +}); + +describe('volleyAngles', () => { + it('liefert bei einem Projektil genau die Zielrichtung', () => { + expect(volleyAngles(1.2, 1, 40)).toEqual([1.2]); + }); + + it('verteilt einen Fächer symmetrisch um die Zielrichtung', () => { + const angles = volleyAngles(0, 5, 40); + expect(angles).toHaveLength(5); + expect(angles[0]).toBeCloseTo(-degToRad(20)); + expect(angles[2]).toBeCloseTo(0); + expect(angles[4]).toBeCloseTo(degToRad(20)); + }); +}); + +describe('broodStep', () => { + const brood = { intervalMs: 1000, spawnCount: 3, maxChildren: 5 }; + + it('brütet im Takt und respektiert die Obergrenze', () => { + const brain = { nextBroodAt: 0 }; + expect(broodStep(brain, 0, 0, brood)).toBe(3); + expect(broodStep(brain, 500, 3, brood)).toBe(0); + expect(broodStep(brain, 1000, 3, brood)).toBe(2); + expect(broodStep(brain, 2000, 5, brood)).toBe(0); + expect(broodStep(brain, 3000, 9, brood)).toBe(0); + }); +}); diff --git a/tests/js/format.test.js b/tests/js/format.test.js new file mode 100644 index 0000000..c1feccb --- /dev/null +++ b/tests/js/format.test.js @@ -0,0 +1,75 @@ +import { describe, expect, it } from 'vitest'; + +import { + formatCooldown, + formatDuration, + formatMultiplier, + formatScore, + formatSequence, + sanitizeName, + validateName, +} from '../../app/static/js/logic/format.js'; + +describe('Formatierung', () => { + it('formatiert Punkte mit Tausenderpunkt', () => { + expect(formatScore(0)).toBe('0'); + expect(formatScore(1234567)).toBe('1.234.567'); + expect(formatScore(-5)).toBe('0'); + }); + + it('formatiert Dauer als m:ss', () => { + expect(formatDuration(0)).toBe('0:00'); + expect(formatDuration(65_400)).toBe('1:05'); + expect(formatDuration(3_600_000)).toBe('60:00'); + }); + + it('formatiert Richtungsfolgen als Pfeile', () => { + expect(formatSequence(['up', 'right', 'down', 'left'])).toBe('↑ → ↓ ←'); + expect(formatSequence(['left', 'left'], ' ')).toBe('← ←'); + expect(formatSequence(['quer'])).toBe('?'); + }); + + it('formatiert Multiplikator und Abklingzeit mit Dezimalkomma', () => { + expect(formatMultiplier(1)).toBe('×1'); + expect(formatMultiplier(2.5)).toBe('×2,5'); + expect(formatCooldown(0)).toBe(''); + expect(formatCooldown(12_100)).toBe('13'); + expect(formatCooldown(800)).toBe('0,8'); + }); +}); + +// Dieselben Fälle wie tests/test_validation.py – Frontend und Backend müssen gleich bereinigen. +describe('sanitizeName (gleich wie Backend)', () => { + const ZWSP = String.fromCodePoint(0x200b); + const RLO = String.fromCodePoint(0x202e); + const cases = [ + ['Ada', 'Ada'], + [' Max Muster ', 'Max Muster'], + ['Jürg Größli', 'Jürg Größli'], + ['Fullwidth', 'Fullwidth'], + ['Null\u0000Byte', 'NullByte'], + [`Zero${ZWSP}Width`, 'ZeroWidth'], + [`Bidi${RLO}Trick`, 'BidiTrick'], + ['Tab\tNeu\nZeile', 'TabNeuZeile'], + ['', 'scriptalert1script'], + ["O'Neil-Test!?", "O'Neil-Test!?"], + ['Emoji 🚀 Held', 'Emoji Held'], + ['', ''], + ]; + it.each(cases)('%j → %j', (raw, expected) => { + expect(sanitizeName(raw)).toBe(expected); + }); +}); + +describe('validateName', () => { + it('akzeptiert gültige Namen bis 16 Zeichen', () => { + expect(validateName(' Kadettin Ada ')).toEqual({ ok: true, name: 'Kadettin Ada' }); + expect(validateName('N'.repeat(16)).ok).toBe(true); + }); + + it('lehnt leere und zu lange Namen ab', () => { + expect(validateName(' ').ok).toBe(false); + expect(validateName('<>').ok).toBe(false); + expect(validateName('N'.repeat(17)).ok).toBe(false); + }); +}); diff --git a/tests/js/keyboard.test.js b/tests/js/keyboard.test.js new file mode 100644 index 0000000..de550ad --- /dev/null +++ b/tests/js/keyboard.test.js @@ -0,0 +1,28 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { oncePerEvent } from '../../app/static/js/systems/keyboard.js'; + +describe('oncePerEvent', () => { + it('lässt dasselbe Ereignisobjekt nur einmal durch', () => { + const handler = vi.fn(); + const wrapped = oncePerEvent(handler); + const first = { code: 'ArrowDown' }; + const second = { code: 'ArrowDown' }; + // Phaser meldet bei mehreren Ereignissen pro Frame frühere Ereignisse erneut. + wrapped(first); + wrapped(first); + wrapped(second); + wrapped(first); + wrapped(second); + expect(handler).toHaveBeenCalledTimes(2); + expect(handler.mock.calls.map(([event]) => event)).toEqual([first, second]); + }); + + it('funktioniert auch ohne Ereignisobjekt (z. B. Zeiger-Aufrufe)', () => { + const handler = vi.fn(); + const wrapped = oncePerEvent(handler); + wrapped(undefined); + wrapped(undefined); + expect(handler).toHaveBeenCalledTimes(2); + }); +}); diff --git a/tests/js/mathRng.test.js b/tests/js/mathRng.test.js new file mode 100644 index 0000000..a1090bd --- /dev/null +++ b/tests/js/mathRng.test.js @@ -0,0 +1,88 @@ +import { describe, expect, it } from 'vitest'; + +import { + angleTo, + clamp, + clampLength, + directionFromKeys, + distance, + inCircle, + length, + normalize, + rotate, +} from '../../app/static/js/logic/math.js'; +import { createRng, pick, randFloat, randInt } from '../../app/static/js/logic/rng.js'; + +describe('math', () => { + it('clamp begrenzt Werte', () => { + expect(clamp(5, 0, 3)).toBe(3); + expect(clamp(-1, 0, 3)).toBe(0); + expect(clamp(2, 0, 3)).toBe(2); + }); + + it('normalize lässt den Nullvektor unverändert', () => { + expect(normalize({ x: 0, y: 0 })).toEqual({ x: 0, y: 0 }); + expect(length(normalize({ x: 3, y: 4 }))).toBeCloseTo(1); + }); + + it('clampLength kürzt nur zu lange Vektoren', () => { + expect(length(clampLength({ x: 30, y: 40 }, 10))).toBeCloseTo(10); + expect(clampLength({ x: 1, y: 1 }, 10)).toEqual({ x: 1, y: 1 }); + }); + + it('rotate und angleTo passen zusammen', () => { + const r = rotate({ x: 1, y: 0 }, Math.PI / 2); + expect(r.x).toBeCloseTo(0); + expect(r.y).toBeCloseTo(1); + expect(angleTo({ x: 0, y: 0 }, { x: 0, y: 5 })).toBeCloseTo(Math.PI / 2); + }); + + it('inCircle berücksichtigt die Ausdehnung des Objekts', () => { + expect(inCircle({ x: 110, y: 0 }, { x: 0, y: 0 }, 100)).toBe(false); + expect(inCircle({ x: 110, y: 0 }, { x: 0, y: 0 }, 100, 12)).toBe(true); + expect(distance({ x: 0, y: 0 }, { x: 3, y: 4 })).toBe(5); + }); + + it('directionFromKeys normalisiert Diagonalen (8-Wege-Bewegung)', () => { + expect(directionFromKeys({ up: true, down: false, left: false, right: false })).toEqual({ x: 0, y: -1 }); + const diag = directionFromKeys({ up: true, down: false, left: false, right: true }); + expect(length(diag)).toBeCloseTo(1); + expect(diag.x).toBeGreaterThan(0); + expect(diag.y).toBeLessThan(0); + expect(directionFromKeys({ up: true, down: true, left: true, right: true })).toEqual({ x: 0, y: 0 }); + }); +}); + +describe('rng', () => { + it('ist mit gleichem Seed deterministisch und liegt in [0, 1)', () => { + const a = createRng(123); + const b = createRng(123); + for (let i = 0; i < 1000; i += 1) { + const value = a(); + expect(value).toBe(b()); + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThan(1); + } + }); + + it('randInt deckt die Grenzen ab und bleibt im Intervall', () => { + const rng = createRng(7); + const seen = new Set(); + for (let i = 0; i < 500; i += 1) { + const n = randInt(rng, 1, 3); + expect(n).toBeGreaterThanOrEqual(1); + expect(n).toBeLessThanOrEqual(3); + seen.add(n); + } + expect(seen).toEqual(new Set([1, 2, 3])); + }); + + it('randFloat und pick verhalten sich korrekt', () => { + const rng = createRng(9); + const f = randFloat(rng, 5, 6); + expect(f).toBeGreaterThanOrEqual(5); + expect(f).toBeLessThan(6); + expect(['a', 'b']).toContain(pick(rng, ['a', 'b'])); + expect(() => pick(rng, [])).toThrow(); + }); +}); diff --git a/tests/js/scoring.test.js b/tests/js/scoring.test.js new file mode 100644 index 0000000..4f3b2d2 --- /dev/null +++ b/tests/js/scoring.test.js @@ -0,0 +1,88 @@ +import { describe, expect, it } from 'vitest'; + +import { SCORING } from '../../app/static/js/config.js'; +import { multiplierForStreak, ScoreKeeper, waveBonus } from '../../app/static/js/logic/scoring.js'; + +describe('multiplierForStreak', () => { + it('steigt alle stepKills Abschüsse um stepValue', () => { + expect(multiplierForStreak(0)).toBe(1); + expect(multiplierForStreak(1)).toBe(1); + expect(multiplierForStreak(SCORING.stepKills - 1)).toBe(1); + expect(multiplierForStreak(SCORING.stepKills)).toBe(1 + SCORING.stepValue); + expect(multiplierForStreak(SCORING.stepKills * 2)).toBe(1 + 2 * SCORING.stepValue); + }); + + it('ist nach oben gedeckelt', () => { + expect(multiplierForStreak(10_000)).toBe(SCORING.maxMultiplier); + }); +}); + +describe('waveBonus', () => { + it('wächst linear mit der Welle', () => { + expect(waveBonus(1)).toBe(SCORING.waveBonusPerWave); + expect(waveBonus(7)).toBe(7 * SCORING.waveBonusPerWave); + }); +}); + +describe('ScoreKeeper', () => { + const cfg = { ...SCORING, streakWindowMs: 1000, stepKills: 2, stepValue: 1, maxMultiplier: 3 }; + + it('zählt Abschüsse ohne Serie mit Faktor 1', () => { + const keeper = new ScoreKeeper(cfg); + expect(keeper.registerKill(10, 0)).toEqual({ awarded: 10, multiplier: 1, streak: 1 }); + expect(keeper.registerKill(10, 5000)).toEqual({ awarded: 10, multiplier: 1, streak: 1 }); + expect(keeper.score).toBe(20); + expect(keeper.kills).toBe(2); + }); + + it('baut innerhalb des Fensters eine Serie mit Multiplikator auf', () => { + const keeper = new ScoreKeeper(cfg); + const results = [0, 500, 900, 1400, 1800].map((t) => keeper.registerKill(10, t)); + expect(results.map((r) => r.multiplier)).toEqual([1, 2, 2, 3, 3]); + expect(keeper.score).toBe(10 + 20 + 20 + 30 + 30); + expect(keeper.bestStreak).toBe(5); + }); + + it('lässt die Serie nach Ablauf des Fensters verfallen', () => { + const keeper = new ScoreKeeper(cfg); + keeper.registerKill(10, 0); + keeper.registerKill(10, 100); + expect(keeper.multiplierAt(500)).toBe(2); + expect(keeper.multiplierAt(1200)).toBe(1); + expect(keeper.registerKill(10, 1200).streak).toBe(1); + expect(keeper.bestStreak).toBe(2); + }); + + it('beendet die Serie bei Treffern am Präsidenten', () => { + const keeper = new ScoreKeeper(cfg); + keeper.registerKill(10, 0); + keeper.registerKill(10, 100); + keeper.breakStreak(); + expect(keeper.multiplierAt(200)).toBe(1); + expect(keeper.registerKill(10, 200)).toEqual({ awarded: 10, multiplier: 1, streak: 1 }); + }); + + it('vergibt Bonuspunkte ohne Multiplikator und ignoriert negative Werte', () => { + const keeper = new ScoreKeeper(cfg); + keeper.registerKill(10, 0); + keeper.registerKill(10, 10); + expect(keeper.addBonus(100)).toBe(100); + expect(keeper.addBonus(-50)).toBe(0); + expect(keeper.score).toBe(10 + 20 + 100); + }); + + it('liefert eine Momentaufnahme mit Restzeit der Serie', () => { + const keeper = new ScoreKeeper(cfg); + keeper.registerKill(10, 0); + const snap = keeper.snapshot(250); + expect(snap).toMatchObject({ score: 10, kills: 1, streak: 1, multiplier: 1, bestStreak: 1 }); + expect(snap.streakTimeLeft).toBeCloseTo(0.75); + expect(keeper.snapshot(5000)).toMatchObject({ streak: 0, streakTimeLeft: 0 }); + }); + + it('rundet Punkte bei gebrochenen Multiplikatoren', () => { + const keeper = new ScoreKeeper({ ...cfg, stepValue: 0.5 }); + keeper.registerKill(7, 0); + expect(keeper.registerKill(7, 10).awarded).toBe(Math.round(7 * 1.5)); + }); +}); diff --git a/tests/js/settings.test.js b/tests/js/settings.test.js new file mode 100644 index 0000000..5cb883a --- /dev/null +++ b/tests/js/settings.test.js @@ -0,0 +1,100 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { AUDIO, STORAGE_KEYS } from '../../app/static/js/config.js'; +import { SafeStorage, Settings } from '../../app/static/js/systems/Settings.js'; + +/** Einfacher localStorage-Ersatz. */ +function memoryBackend(initial = {}) { + const data = new Map(Object.entries(initial)); + return { + getItem: (key) => (data.has(key) ? data.get(key) : null), + setItem: (key, value) => data.set(key, String(value)), + data, + }; +} + +/** localStorage, der jeden Zugriff verweigert (z. B. blockierte Website-Daten). */ +const throwingBackend = { + getItem: () => { + throw new Error('SecurityError'); + }, + setItem: () => { + throw new Error('QuotaExceededError'); + }, +}; + +describe('SafeStorage', () => { + it('speichert JSON-Werte', () => { + const storage = new SafeStorage(memoryBackend()); + expect(storage.set('a', { x: 1 })).toBe(true); + expect(storage.get('a', null)).toEqual({ x: 1 }); + }); + + it('liefert den Standardwert bei fehlenden oder kaputten Einträgen', () => { + const storage = new SafeStorage(memoryBackend({ kaputt: '{nicht json' })); + expect(storage.get('fehlt', 42)).toBe(42); + expect(storage.get('kaputt', 'fallback')).toBe('fallback'); + }); + + it('funktioniert ohne localStorage für die laufende Sitzung weiter', () => { + for (const backend of [null, throwingBackend]) { + const storage = new SafeStorage(backend); + expect(storage.set('k', 'v')).toBe(false); + expect(storage.get('k', null)).toBe('v'); + } + }); +}); + +describe('Settings', () => { + it('merkt sich die Disclaimer-Bestätigung', () => { + const backend = memoryBackend(); + const settings = new Settings(new SafeStorage(backend)); + expect(settings.isDisclaimerAccepted()).toBe(false); + settings.acceptDisclaimer(); + expect(new Settings(new SafeStorage(backend)).isDisclaimerAccepted()).toBe(true); + expect(backend.data.get(STORAGE_KEYS.disclaimerAccepted)).toBe('true'); + }); + + it('startet mit Standardlautstärken und begrenzt Werte auf 0..1', () => { + const settings = new Settings(new SafeStorage(memoryBackend())); + expect(settings.getVolume('music')).toBe(AUDIO.defaultVolumes.music); + settings.setVolume('music', 5); + expect(settings.getVolume('music')).toBe(1); + settings.setVolume('sfx', -1); + expect(settings.getVolume('sfx')).toBe(0); + settings.setVolume('sfx', Number.NaN); + expect(settings.getVolume('sfx')).toBe(0); + }); + + it('ignoriert ungültige gespeicherte Lautstärken', () => { + const backend = memoryBackend({ [STORAGE_KEYS.volumes]: JSON.stringify({ master: 'laut', music: 0.25, sfx: 9 }) }); + const settings = new Settings(new SafeStorage(backend)); + expect(settings.getVolume('master')).toBe(AUDIO.defaultVolumes.master); + expect(settings.getVolume('music')).toBe(0.25); + expect(settings.getVolume('sfx')).toBe(1); + }); + + it('berechnet die effektive Lautstärke inklusive Gesamtregler', () => { + const settings = new Settings(new SafeStorage(memoryBackend())); + settings.setVolume('master', 0.5); + settings.setVolume('sfx', 0.5); + expect(settings.effectiveVolume('sfx')).toBeCloseTo(0.25); + }); + + it('benachrichtigt Zuhörer bei Lautstärkeänderungen', () => { + const settings = new Settings(new SafeStorage(memoryBackend())); + const listener = vi.fn(); + const unsubscribe = settings.onVolumeChange(listener); + settings.setVolume('master', 0.3); + expect(listener).toHaveBeenCalledWith('master', 0.3); + unsubscribe(); + settings.setVolume('master', 0.4); + expect(listener).toHaveBeenCalledTimes(1); + }); + + it('speichert den letzten Namen gekürzt', () => { + const settings = new Settings(new SafeStorage(memoryBackend())); + settings.setLastName('A'.repeat(40)); + expect(settings.getLastName()).toHaveLength(16); + }); +}); diff --git a/tests/js/steering.test.js b/tests/js/steering.test.js new file mode 100644 index 0000000..a69142e --- /dev/null +++ b/tests/js/steering.test.js @@ -0,0 +1,110 @@ +import { describe, expect, it } from 'vitest'; + +import { distance, length } from '../../app/static/js/logic/math.js'; +import { + combine, + encirclePoint, + flankPoint, + flee, + keepDistance, + seek, + separation, + steerTowards, +} from '../../app/static/js/logic/steering.js'; + +const close = (actual, expected) => { + expect(actual.x).toBeCloseTo(expected.x); + expect(actual.y).toBeCloseTo(expected.y); +}; + +describe('seek / flee', () => { + it('bewegt sich mit voller Geschwindigkeit zum Ziel bzw. davon weg', () => { + close(seek({ x: 0, y: 0 }, { x: 10, y: 0 }, 5), { x: 5, y: 0 }); + close(flee({ x: 0, y: 0 }, { x: 0, y: 10 }, 3), { x: 0, y: -3 }); + }); + + it('steht still, wenn es bereits am Ziel ist', () => { + expect(seek({ x: 4, y: 4 }, { x: 4, y: 4 }, 100)).toEqual({ x: 0, y: 0 }); + }); +}); + +describe('separation', () => { + it('stößt nahe Nachbarn ab und ignoriert entfernte', () => { + const self = { x: 0, y: 0 }; + const push = separation(self, [self, { x: 10, y: 0 }, { x: 500, y: 0 }], 20); + expect(push.x).toBeLessThan(0); + expect(push.y).toBeCloseTo(0); + }); + + it('trennt exakt übereinanderliegende Gegner ohne NaN', () => { + const push = separation({ x: 5, y: 5 }, [{ x: 5, y: 5 }], 20); + expect(Number.isFinite(push.x) && Number.isFinite(push.y)).toBe(true); + expect(length(push)).toBeGreaterThan(0); + }); + + it('drückt stärker, je näher der Nachbar ist', () => { + const near = separation({ x: 0, y: 0 }, [{ x: 2, y: 0 }], 20); + const far = separation({ x: 0, y: 0 }, [{ x: 18, y: 0 }], 20); + expect(length(near)).toBeGreaterThan(length(far)); + }); +}); + +describe('keepDistance', () => { + const band = { min: 200, max: 300 }; + const target = { x: 0, y: 0 }; + + it('nähert sich an, wenn es zu weit weg ist', () => { + const v = keepDistance({ x: 500, y: 0 }, target, band, 10, 1); + close(v, { x: -10, y: 0 }); + }); + + it('weicht zurück, wenn es zu nah ist', () => { + const v = keepDistance({ x: 100, y: 0 }, target, band, 10, 1); + close(v, { x: 10, y: 0 }); + }); + + it('weicht im Wohlfühlbereich seitlich aus (senkrecht zur Linie)', () => { + const cw = keepDistance({ x: 250, y: 0 }, target, band, 10, 1, 0.5); + const ccw = keepDistance({ x: 250, y: 0 }, target, band, 10, -1, 0.5); + expect(cw.x).toBeCloseTo(0); + expect(Math.abs(cw.y)).toBeCloseTo(5); + expect(ccw.y).toBeCloseTo(-cw.y); + }); +}); + +describe('flankPoint / encirclePoint', () => { + it('liegt im gewünschten Abstand seitlich versetzt', () => { + const target = { x: 0, y: 0 }; + const enemy = { x: 100, y: 0 }; + const p = flankPoint(target, enemy, Math.PI / 2, 50); + expect(distance(p, target)).toBeCloseTo(50); + close(p, { x: 0, y: 50 }); + const other = flankPoint(target, enemy, -Math.PI / 2, 50); + close(other, { x: 0, y: -50 }); + }); + + it('verteilt Umzingelungsplätze auf einem Kreis', () => { + const target = { x: 10, y: 10 }; + close(encirclePoint(target, 0, 100), { x: 110, y: 10 }); + close(encirclePoint(target, Math.PI, 100), { x: -90, y: 10 }); + }); +}); + +describe('combine / steerTowards', () => { + it('gewichtet Anteile und begrenzt auf die Höchstgeschwindigkeit', () => { + const v = combine( + [ + { vector: { x: 10, y: 0 }, weight: 1 }, + { vector: { x: 0, y: 10 }, weight: 2 }, + ], + 15, + ); + expect(length(v)).toBeCloseTo(15); + expect(v.y).toBeGreaterThan(v.x); + }); + + it('nähert sich der Wunschgeschwindigkeit schrittweise an', () => { + close(steerTowards({ x: 0, y: 0 }, { x: 10, y: -10 }, 0.25), { x: 2.5, y: -2.5 }); + close(steerTowards({ x: 3, y: 3 }, { x: 10, y: -10 }, 1), { x: 10, y: -10 }); + }); +}); diff --git a/tests/js/waveDirector.test.js b/tests/js/waveDirector.test.js new file mode 100644 index 0000000..b8b6532 --- /dev/null +++ b/tests/js/waveDirector.test.js @@ -0,0 +1,110 @@ +import { describe, expect, it } from 'vitest'; + +import { WAVES } from '../../app/static/js/config.js'; +import { createRng } from '../../app/static/js/logic/rng.js'; +import { WaveDirector } from '../../app/static/js/logic/waveDirector.js'; + +/** Minimaler Spielersatz: zählt gespawnte Gegner und lässt sie auf Befehl sterben. */ +function harness(cfgOverrides = {}) { + const log = { spawned: 0, started: [], cleared: [] }; + let alive = 0; + const director = new WaveDirector({ + rng: createRng(1), + cfg: { ...WAVES, ...cfgOverrides }, + spawnGroup: (group) => { + log.spawned += group.count; + alive += group.count; + }, + aliveCount: () => alive, + onWaveStart: (plan) => log.started.push(plan.number), + onWaveCleared: (n) => log.cleared.push(n), + }); + return { + director, + log, + killAll: () => { + alive = 0; + }, + get alive() { + return alive; + }, + }; +} + +/** Lässt die Zeit in 50-ms-Schritten laufen. */ +function run(director, from, until, step = 50) { + let now = from; + while (now < until) { + now += step; + director.update(now, step); + } + return now; +} + +describe('WaveDirector', () => { + it('startet die erste Welle nach der Startverzögerung', () => { + const { director, log } = harness(); + director.start(0); + expect(director.state).toBe('intermission'); + run(director, 0, WAVES.firstWaveDelayMs - 50); + expect(log.started).toEqual([]); + run(director, WAVES.firstWaveDelayMs - 50, WAVES.firstWaveDelayMs); + expect(log.started).toEqual([1]); + expect(director.state).toBe('active'); + }); + + it('spawnt alle Gruppen der Welle nach Plan', () => { + const { director, log } = harness(); + director.start(0); + const now = run(director, 0, WAVES.firstWaveDelayMs); + const planned = director.plan.totalEnemies; + run(director, now, now + 60_000); + expect(log.spawned).toBe(planned); + expect(director.pendingEnemies).toBe(0); + }); + + it('meldet eine Welle erst als geschafft, wenn alle Gegner besiegt sind', () => { + const h = harness(); + h.director.start(0); + let now = run(h.director, 0, 60_000); + expect(h.log.cleared).toEqual([]); + h.killAll(); + now = run(h.director, now, now + 100); + expect(h.log.cleared).toEqual([1]); + expect(h.director.state).toBe('intermission'); + expect(h.director.intermissionRemaining(now)).toBeGreaterThan(WAVES.intermissionMs - 200); + }); + + it('startet nach der Pause die nächste, größere Welle', () => { + const h = harness(); + h.director.start(0); + let now = run(h.director, 0, 60_000); + const firstSize = h.director.plan.totalEnemies; + h.killAll(); + now = run(h.director, now, now + WAVES.intermissionMs + 200); + expect(h.log.started).toEqual([1, 2]); + run(h.director, now, now + 60_000); + expect(h.director.plan.totalEnemies).toBeGreaterThan(firstSize); + }); + + it('hält den Spawn-Ablauf an, solange zu viele Gegner leben', () => { + const h = harness({ maxAliveEnemies: 3 }); + h.director.start(0); + // Wellenstart plus ein Frame: Die erste Gruppe (≥4 Krabbler) überschreitet das Limit sofort. + let now = run(h.director, 0, WAVES.firstWaveDelayMs + 50); + const spawnedBefore = h.log.spawned; + expect(h.alive).toBeGreaterThanOrEqual(3); + now = run(h.director, now, now + 60_000); + expect(h.log.spawned).toBe(spawnedBefore); + h.killAll(); + run(h.director, now, now + 60_000); + expect(h.log.spawned).toBeGreaterThan(spawnedBefore); + }); + + it('tut vor dem Start nichts', () => { + const { director, log } = harness(); + run(director, 0, 10_000); + expect(log.started).toEqual([]); + expect(director.pendingEnemies).toBe(0); + }); +}); diff --git a/tests/js/waves.test.js b/tests/js/waves.test.js new file mode 100644 index 0000000..0960122 --- /dev/null +++ b/tests/js/waves.test.js @@ -0,0 +1,185 @@ +import { describe, expect, it } from 'vitest'; + +import { ENEMY_TYPES, WAVES } from '../../app/static/js/config.js'; +import { createRng } from '../../app/static/js/logic/rng.js'; +import { + EDGES, + eliteCount, + generateWave, + spawnPointOnEdge, + waveBudget, + waveFactions, + waveMultipliers, +} from '../../app/static/js/logic/waves.js'; + +const cost = (plan) => plan.groups.reduce((sum, g) => sum + g.count * ENEMY_TYPES[g.type].cost, 0); +const factionsIn = (plan) => new Set(plan.groups.map((g) => ENEMY_TYPES[g.type].faction)); +const tiersIn = (plan) => plan.groups.map((g) => ENEMY_TYPES[g.type].tier); + +describe('waveBudget', () => { + it('beginnt mit dem Startbudget und wächst streng monoton', () => { + expect(waveBudget(1)).toBe(WAVES.firstBudget); + for (let n = 1; n < 50; n += 1) { + expect(waveBudget(n + 1)).toBeGreaterThan(waveBudget(n)); + } + }); +}); + +describe('waveFactions', () => { + it('führt die Fraktionen nacheinander ein', () => { + expect(waveFactions(1)).toEqual(['swarm']); + expect(waveFactions(2)).toEqual(['swarm']); + expect(waveFactions(3)).toEqual(['legion']); + expect(waveFactions(4)).toEqual(['legion']); + expect(waveFactions(5)).toEqual(['swarm', 'legion']); + expect(waveFactions(30)).toEqual(['swarm', 'legion']); + }); +}); + +describe('eliteCount', () => { + it('bringt Eliten nur in jeder n-ten Welle und begrenzt ihre Zahl', () => { + expect(eliteCount(4)).toBe(0); + expect(eliteCount(5)).toBe(1); + expect(eliteCount(7)).toBe(0); + expect(eliteCount(10)).toBe(2); + expect(eliteCount(WAVES.eliteEvery * 50)).toBe(WAVES.maxElitesPerWave); + }); +}); + +describe('waveMultipliers', () => { + it('lässt frühe Wellen unverändert', () => { + expect(waveMultipliers(1)).toEqual({ hp: 1, speed: 1 }); + expect(waveMultipliers(WAVES.scalingFromWave - 1)).toEqual({ hp: 1, speed: 1 }); + }); + + it('macht spätere Wellen zäher, deckelt aber das Tempo', () => { + expect(waveMultipliers(WAVES.scalingFromWave).hp).toBeGreaterThan(1); + expect(waveMultipliers(20).hp).toBeGreaterThan(waveMultipliers(10).hp); + expect(waveMultipliers(500).speed).toBe(WAVES.speedScaleMax); + }); +}); + +describe('generateWave', () => { + it('ist mit gleichem Seed reproduzierbar', () => { + expect(generateWave(7, createRng(42))).toEqual(generateWave(7, createRng(42))); + }); + + it('liefert mit anderem Seed eine andere Welle', () => { + expect(generateWave(7, createRng(1))).not.toEqual(generateWave(7, createRng(2))); + }); + + it('wirft bei ungültiger Wellennummer', () => { + expect(() => generateWave(0, createRng(1))).toThrow(RangeError); + expect(() => generateWave(1.5, createRng(1))).toThrow(RangeError); + }); + + it('schickt in Welle 1–2 nur Schwärmer und in Welle 3–4 nur die Blechlegion', () => { + for (let seed = 0; seed < 20; seed += 1) { + expect(factionsIn(generateWave(1, createRng(seed)))).toEqual(new Set(['swarm'])); + expect(factionsIn(generateWave(2, createRng(seed)))).toEqual(new Set(['swarm'])); + expect(factionsIn(generateWave(3, createRng(seed)))).toEqual(new Set(['legion'])); + expect(factionsIn(generateWave(4, createRng(seed)))).toEqual(new Set(['legion'])); + } + }); + + it('mischt ab Welle 6 beide Fraktionen', () => { + const seen = new Set(); + for (let seed = 0; seed < 20; seed += 1) { + for (const faction of factionsIn(generateWave(6, createRng(seed)))) seen.add(faction); + } + expect(seen).toEqual(new Set(['swarm', 'legion'])); + }); + + it('enthält Eliten genau in Elite-Wellen', () => { + for (let n = 1; n <= 20; n += 1) { + const plan = generateWave(n, createRng(n)); + const elites = tiersIn(plan).filter((t) => t === 'elite').length; + expect(elites, `Welle ${n}`).toBe(eliteCount(n)); + } + }); + + it('wechselt die Elite-Fraktion zwischen Elite-Wellen', () => { + const eliteFaction = (n) => + generateWave(n, createRng(3)) + .groups.map((g) => ENEMY_TYPES[g.type]) + .find((t) => t.tier === 'elite').faction; + expect(eliteFaction(5)).toBe('swarm'); + expect(eliteFaction(10)).toBe('legion'); + }); + + it('schöpft das Budget in Wellen ohne Eliten fast vollständig aus', () => { + const cheapest = Math.min(...Object.values(ENEMY_TYPES).map((t) => t.cost)); + for (const n of [1, 2, 3, 4, 6, 7, 8, 13]) { + for (let seed = 0; seed < 10; seed += 1) { + const plan = generateWave(n, createRng(seed)); + expect(cost(plan)).toBeLessThanOrEqual(plan.budget); + // Rest kleiner als der teuerste Kleingegner einer Fraktion (Legion: 2). + expect(plan.budget - cost(plan)).toBeLessThan(cheapest + 2); + } + } + }); + + it('hält die Gruppengrößen der Gegnertypen ein', () => { + for (let n = 1; n <= 25; n += 1) { + for (const group of generateWave(n, createRng(n * 7)).groups) { + const { groupSize } = ENEMY_TYPES[group.type]; + expect(group.count).toBeGreaterThanOrEqual(1); + expect(group.count).toBeLessThanOrEqual(groupSize.max); + } + } + }); + + it('plant Spawns zeitlich aufsteigend ab 0 ms und an gültigen Rändern', () => { + const plan = generateWave(12, createRng(99)); + expect(plan.groups[0].atMs).toBe(0); + for (let i = 1; i < plan.groups.length; i += 1) { + expect(plan.groups[i].atMs).toBeGreaterThanOrEqual(plan.groups[i - 1].atMs); + } + for (const group of plan.groups) expect(EDGES).toContain(group.edge); + }); + + it('zählt die Gegner korrekt und wird mit der Zeit größer', () => { + const early = generateWave(2, createRng(5)); + const late = generateWave(15, createRng(5)); + expect(early.totalEnemies).toBe(early.groups.reduce((s, g) => s + g.count, 0)); + expect(late.totalEnemies).toBeGreaterThan(early.totalEnemies); + }); + + it('setzt mehr mittlere Gegner in späten Wellen ein', () => { + const mediumShare = (n) => { + let medium = 0; + let total = 0; + for (let seed = 0; seed < 30; seed += 1) { + const plan = generateWave(n, createRng(seed)); + for (const g of plan.groups) { + const t = ENEMY_TYPES[g.type]; + if (t.tier === 'medium') medium += g.count * t.cost; + total += g.count * t.cost; + } + } + return medium / total; + }; + expect(mediumShare(12)).toBeGreaterThan(mediumShare(2)); + }); +}); + +describe('spawnPointOnEdge', () => { + const world = { width: 2000, height: 1000 }; + + it('setzt Punkte an den richtigen Rand innerhalb der Welt', () => { + const rng = createRng(1); + expect(spawnPointOnEdge('north', world, 40, rng).y).toBe(40); + expect(spawnPointOnEdge('south', world, 40, rng).y).toBe(960); + expect(spawnPointOnEdge('west', world, 40, rng).x).toBe(40); + expect(spawnPointOnEdge('east', world, 40, rng).x).toBe(1960); + for (let i = 0; i < 100; i += 1) { + const p = spawnPointOnEdge('north', world, 40, rng); + expect(p.x).toBeGreaterThanOrEqual(40); + expect(p.x).toBeLessThanOrEqual(1960); + } + }); + + it('wirft bei unbekanntem Rand', () => { + expect(() => spawnPointOnEdge('oben', world, 40, createRng(1))).toThrow(RangeError); + }); +}); diff --git a/tests/js/weapon.test.js b/tests/js/weapon.test.js new file mode 100644 index 0000000..a61730e --- /dev/null +++ b/tests/js/weapon.test.js @@ -0,0 +1,129 @@ +import { describe, expect, it } from 'vitest'; + +import { WEAPONS } from '../../app/static/js/config.js'; +import { degToRad } from '../../app/static/js/logic/math.js'; +import { createRng } from '../../app/static/js/logic/rng.js'; +import { pelletOffsets, WeaponState } from '../../app/static/js/logic/weapon.js'; + +const def = { + id: 'test', + name: 'Test', + magazineSize: 3, + reserveStart: 4, + reserveMax: 10, + fireIntervalMs: 100, + reloadMs: 500, + damage: 1, + pellets: 1, + spreadDeg: 0, + bulletSpeed: 1, + rangePx: 1, + automatic: true, +}; +const rng = createRng(1); + +describe('WeaponState', () => { + it('startet mit vollem Magazin und Startreserve', () => { + const w = new WeaponState(def); + expect(w.magazine).toBe(3); + expect(w.reserve).toBe(4); + expect(w.isReloading).toBe(false); + }); + + it('respektiert die Feuerrate', () => { + const w = new WeaponState(def); + expect(w.fire(0, rng)).toHaveLength(1); + expect(w.fire(50, rng)).toBeNull(); + expect(w.fire(100, rng)).toHaveLength(1); + expect(w.magazine).toBe(1); + }); + + it('lädt bei leerem Magazin automatisch nach und kann währenddessen nicht feuern', () => { + const w = new WeaponState(def); + w.fire(0, rng); + w.fire(100, rng); + w.fire(200, rng); + expect(w.magazine).toBe(0); + expect(w.isReloading).toBe(true); + expect(w.fire(300, rng)).toBeNull(); + expect(w.update(699)).toBe(false); + expect(w.update(700)).toBe(true); + expect(w.magazine).toBe(3); + expect(w.reserve).toBe(1); + }); + + it('lädt bei knapper Reserve nur teilweise nach und ist danach leer', () => { + const w = new WeaponState({ ...def, reserveStart: 1 }); + w.fire(0, rng); + w.fire(100, rng); + w.fire(200, rng); + w.update(10_000); + expect(w.magazine).toBe(1); + expect(w.reserve).toBe(0); + w.fire(10_100, rng); + expect(w.isEmpty).toBe(true); + expect(w.startReload(10_200)).toBe(false); + }); + + it('lädt nicht nach, wenn das Magazin voll ist', () => { + const w = new WeaponState(def); + expect(w.startReload(0)).toBe(false); + }); + + it('bricht das Nachladen beim Waffenwechsel ohne Verlust ab', () => { + const w = new WeaponState(def); + w.fire(0, rng); + expect(w.startReload(100)).toBe(true); + w.cancelReload(); + w.update(10_000); + expect(w.magazine).toBe(2); + expect(w.reserve).toBe(4); + }); + + it('zeigt den Nachladefortschritt', () => { + const w = new WeaponState(def); + w.fire(0, rng); + w.startReload(1000); + expect(w.reloadProgress(1250)).toBeCloseTo(0.5); + w.update(1500); + expect(w.reloadProgress(1600)).toBe(1); + }); + + it('füllt die Reserve per Nachschub auf', () => { + const w = new WeaponState(def); + w.refill(); + expect(w.reserve).toBe(10); + }); + + it('hat bei der Dienstpistole unbegrenzte Reserve', () => { + const pistol = new WeaponState(WEAPONS.pistol); + expect(pistol.hasInfiniteReserve).toBe(true); + let t = 0; + for (let i = 0; i < 100; i += 1) { + t += 10_000; + pistol.update(t); + pistol.fire(t, rng); + } + expect(pistol.isEmpty).toBe(false); + pistol.refill(); + expect(pistol.reserve).toBe(Infinity); + }); +}); + +describe('pelletOffsets', () => { + it('streut ein Einzelprojektil innerhalb des Fächers', () => { + for (let i = 0; i < 50; i += 1) { + const [offset] = pelletOffsets(1, 10, rng); + expect(Math.abs(offset)).toBeLessThanOrEqual(degToRad(5)); + } + }); + + it('verteilt Schrot über den ganzen Fächer', () => { + const offsets = pelletOffsets(8, 24, rng); + expect(offsets).toHaveLength(8); + const spread = degToRad(24); + expect(Math.min(...offsets)).toBeLessThan(-spread / 3); + expect(Math.max(...offsets)).toBeGreaterThan(spread / 3); + for (const o of offsets) expect(Math.abs(o)).toBeLessThanOrEqual(spread / 2 + spread / 7); + }); +}); diff --git a/tests/test_api_highscores.py b/tests/test_api_highscores.py new file mode 100644 index 0000000..2ff47fc --- /dev/null +++ b/tests/test_api_highscores.py @@ -0,0 +1,298 @@ +"""Tests für die Highscore-API: Lesen, Einreichen, Validierung, Tokens, Rate-Limit.""" + +from __future__ import annotations + +from collections.abc import Callable + +import pytest +from flask import Flask +from flask.testing import FlaskClient + +from app.models import get_db, insert_score + + +def _seed(app: Flask, entries: list[tuple[str, int]]) -> None: + with app.app_context(): + db = get_db() + for name, score in entries: + insert_score(db, name, score, wave=1, duration_s=60) + + +# ------------------------------------------------------------------ GET /api/highscores + + +def test_highscores_empty(client: FlaskClient) -> None: + response = client.get("/api/highscores") + assert response.status_code == 200 + assert response.get_json() == {"highscores": []} + assert response.headers["Cache-Control"] == "no-store" + + +def test_highscores_sorted_and_limited_to_top_10(app: Flask, client: FlaskClient) -> None: + _seed(app, [(f"Spieler {i}", i * 100) for i in range(15)]) + scores = client.get("/api/highscores").get_json()["highscores"] + assert len(scores) == 10 + assert [entry["score"] for entry in scores] == [1400 - i * 100 for i in range(10)] + assert [entry["rank"] for entry in scores] == list(range(1, 11)) + assert set(scores[0]) == {"rank", "name", "score", "wave", "created_at"} + + +def test_highscore_ties_keep_older_entry_first(app: Flask, client: FlaskClient) -> None: + _seed(app, [("Erster", 500), ("Zweiter", 500)]) + names = [entry["name"] for entry in client.get("/api/highscores").get_json()["highscores"]] + assert names == ["Erster", "Zweiter"] + + +# ----------------------------------------------------------------- POST /api/runs + + +def test_start_run_returns_token(client: FlaskClient) -> None: + response = client.post("/api/runs") + assert response.status_code == 201 + token = response.get_json()["run_token"] + assert isinstance(token, str) and len(token) > 20 + assert client.post("/api/runs").get_json()["run_token"] != token + + +# ----------------------------------------------------------- POST /api/highscores: Erfolg + + +def test_submit_valid_highscore(client: FlaskClient, valid_payload: Callable[..., dict]) -> None: + response = client.post("/api/highscores", json=valid_payload()) + assert response.status_code == 201 + body = response.get_json() + assert body["rank"] == 1 + assert body["name"] == "Kadettin Ada" + assert body["highscores"][0]["score"] == 1234 + + listed = client.get("/api/highscores").get_json()["highscores"] + assert listed[0]["name"] == "Kadettin Ada" + assert listed[0]["wave"] == 3 + + +def test_submit_returns_rank_below_existing( + app: Flask, client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + _seed(app, [("Profi", 5000), ("Mittel", 1500), ("Anfänger", 100)]) + body = client.post("/api/highscores", json=valid_payload(score=1000)).get_json() + assert body["rank"] == 3 + + +def test_submit_sanitizes_name(client: FlaskClient, valid_payload: Callable[..., dict]) -> None: + payload = valid_payload(name=" Jürg\u200b Größli \x00 ") + body = client.post("/api/highscores", json=payload).get_json() + assert body["name"] == "bJürgb Größli" + + +# ------------------------------------------------------ POST /api/highscores: Validierung + + +@pytest.mark.parametrize( + ("overrides", "field"), + [ + ({"name": ""}, "name"), + ({"name": " "}, "name"), + ({"name": "<>{}"}, "name"), + ({"name": "A" * 17}, "name"), + ({"name": "A" * 500}, "name"), + ({"name": 42}, "name"), + ({"name": None}, "name"), + ({"score": -1}, "score"), + ({"score": "1000"}, "score"), + ({"score": 12.5}, "score"), + ({"score": True}, "score"), + ({"score": None}, "score"), + ({"score": 10**12}, "score"), + ({"wave": 0}, "wave"), + ({"wave": "3"}, "wave"), + ({"wave": 100_000}, "wave"), + ({"duration_s": -5}, "duration_s"), + ({"duration_s": 10**9}, "duration_s"), + ({"run_token": ""}, "run_token"), + ({"run_token": 123}, "run_token"), + ({"run_token": "x" * 2000}, "run_token"), + ], +) +def test_submit_rejects_invalid_fields( + client: FlaskClient, valid_payload: Callable[..., dict], overrides: dict, field: str +) -> None: + response = client.post("/api/highscores", json=valid_payload(**overrides)) + assert response.status_code == 400 + body = response.get_json() + assert body["error"] == "validation_failed" + assert field in body["fields"] + + +def test_submit_reports_all_invalid_fields_at_once(client: FlaskClient) -> None: + response = client.post("/api/highscores", json={}) + assert response.status_code == 400 + assert set(response.get_json()["fields"]) == { + "name", + "score", + "wave", + "duration_s", + "run_token", + } + + +@pytest.mark.parametrize( + "kwargs", + [ + {"data": "kein json", "content_type": "application/json"}, + {"data": "name=Ada&score=5", "content_type": "application/x-www-form-urlencoded"}, + {"json": ["liste", "statt", "objekt"]}, + {"json": "nur ein string"}, + ], +) +def test_submit_rejects_non_object_bodies(client: FlaskClient, kwargs: dict) -> None: + response = client.post("/api/highscores", **kwargs) + assert response.status_code == 400 + assert response.get_json()["error"] == "invalid_json" + + +def test_submit_rejects_oversized_body(client: FlaskClient) -> None: + response = client.post("/api/highscores", data="x" * 20_000, content_type="application/json") + assert response.status_code == 413 + assert response.is_json + + +# ------------------------------------------------------ POST /api/highscores: Run-Token + + +def test_submit_rejects_forged_token( + client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + response = client.post("/api/highscores", json=valid_payload(run_token="gefälscht.token.xyz")) + assert response.status_code == 422 + assert response.get_json()["error"] == "run_token_invalid" + + +def test_submit_rejects_token_signed_with_other_key( + client: FlaskClient, valid_payload: Callable[..., dict], db_path +) -> None: + from app import create_app + + other = create_app( + {"TESTING": True, "SECRET_KEY": "anderer-key", "DATABASE_PATH": str(db_path)} + ).test_client() + foreign_token = other.post("/api/runs").get_json()["run_token"] + response = client.post("/api/highscores", json=valid_payload(run_token=foreign_token)) + assert response.get_json()["error"] == "run_token_invalid" + + +def test_submit_rejects_expired_token( + app: Flask, + client: FlaskClient, + issue_token: Callable[..., str], + valid_payload: Callable[..., dict], +) -> None: + token = issue_token(started_ago=app.config["RUN_TOKEN_MAX_AGE_SECONDS"] + 60) + response = client.post("/api/highscores", json=valid_payload(run_token=token)) + assert response.status_code == 422 + assert response.get_json()["error"] == "run_token_expired" + + +def test_submit_rejects_reused_token( + client: FlaskClient, issue_token: Callable[..., str], valid_payload: Callable[..., dict] +) -> None: + token = issue_token(started_ago=200) + assert client.post("/api/highscores", json=valid_payload(run_token=token)).status_code == 201 + response = client.post("/api/highscores", json=valid_payload(run_token=token)) + assert response.status_code == 409 + assert response.get_json()["error"] == "run_token_used" + + +# -------------------------------------------------- POST /api/highscores: Plausibilität + + +def test_submit_rejects_duration_longer_than_run( + client: FlaskClient, issue_token: Callable[..., str], valid_payload: Callable[..., dict] +) -> None: + token = issue_token(started_ago=60) + response = client.post( + "/api/highscores", json=valid_payload(run_token=token, duration_s=600, score=10) + ) + assert response.status_code == 422 + assert response.get_json()["error"] == "implausible_score" + + +def test_submit_rejects_score_too_high_for_duration( + client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + response = client.post("/api/highscores", json=valid_payload(score=5_000_000, duration_s=60)) + assert response.status_code == 422 + assert response.get_json()["error"] == "implausible_score" + + +def test_submit_rejects_wave_unreachable_in_duration( + client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + response = client.post("/api/highscores", json=valid_payload(wave=80, duration_s=30, score=10)) + assert response.status_code == 422 + + +def test_implausible_submission_does_not_burn_token( + client: FlaskClient, issue_token: Callable[..., str], valid_payload: Callable[..., dict] +) -> None: + token = issue_token(started_ago=120) + bad = client.post("/api/highscores", json=valid_payload(run_token=token, score=9_999_999)) + assert bad.status_code == 422 + good = client.post("/api/highscores", json=valid_payload(run_token=token)) + assert good.status_code == 201 + + +# ------------------------------------------------------------------------ Rate-Limit + + +def test_rate_limit_blocks_after_max_attempts( + client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + for _ in range(5): + assert client.post("/api/highscores", json=valid_payload()).status_code == 201 + response = client.post("/api/highscores", json=valid_payload()) + assert response.status_code == 429 + body = response.get_json() + assert body["error"] == "rate_limited" + retry_after = int(response.headers["Retry-After"]) + assert 1 <= retry_after <= 600 + assert body["retry_after"] == retry_after + + +def test_rate_limit_counts_invalid_requests_too(client: FlaskClient) -> None: + for _ in range(5): + assert client.post("/api/highscores", json={}).status_code == 400 + assert client.post("/api/highscores", json={}).status_code == 429 + + +def test_rate_limit_is_per_client(client: FlaskClient, valid_payload: Callable[..., dict]) -> None: + for _ in range(5): + client.post("/api/highscores", json={}, environ_base={"REMOTE_ADDR": "10.0.0.1"}) + blocked = client.post("/api/highscores", json={}, environ_base={"REMOTE_ADDR": "10.0.0.1"}) + assert blocked.status_code == 429 + other = client.post( + "/api/highscores", json=valid_payload(), environ_base={"REMOTE_ADDR": "10.0.0.2"} + ) + assert other.status_code == 201 + + +def test_rate_limit_window_expires( + app: Flask, client: FlaskClient, monkeypatch: pytest.MonkeyPatch +) -> None: + import app.api as api_module + + fake_now = [1_000_000.0] + monkeypatch.setattr(api_module, "_now", lambda: fake_now[0]) + for _ in range(5): + client.post("/api/highscores", json={}) + assert client.post("/api/highscores", json={}).status_code == 429 + + fake_now[0] += app.config["RATE_LIMIT_WINDOW_SECONDS"] + 1 + assert client.post("/api/highscores", json={}).status_code == 400 + + +def test_rate_limit_does_not_store_plain_ip(app: Flask, client: FlaskClient) -> None: + client.post("/api/highscores", json={}, environ_base={"REMOTE_ADDR": "203.0.113.7"}) + with app.app_context(): + hashes = [row[0] for row in get_db().execute("SELECT client_hash FROM submission_log")] + assert hashes + assert all("203.0.113.7" not in value for value in hashes) diff --git a/tests/test_assets.py b/tests/test_assets.py new file mode 100644 index 0000000..f01dab7 --- /dev/null +++ b/tests/test_assets.py @@ -0,0 +1,119 @@ +"""Prüft Assets und Inhalte: Lizenzdokumentation vollständig, Verweise gültig, +SVGs harmlos, keine Namen aus anderen Spielen oder Filmen.""" + +from __future__ import annotations + +import re +import xml.etree.ElementTree as ET +from pathlib import Path + +import pytest + +from app.config import PROJECT_ROOT + +STATIC = PROJECT_ROOT / "app" / "static" +ASSETS = STATIC / "assets" +ASSETS_DOC = PROJECT_ROOT / "docs" / "ASSETS.md" +JS_ROOT = STATIC / "js" + +#: Begriffe aus Helldivers bzw. Starship Troopers, die im Spiel nicht vorkommen dürfen +#: (Groß-/Kleinschreibung egal). Der allgemeine Tonfall darf inspiriert sein, Namen nicht. +FORBIDDEN_TERMS = [ + "helldiver", + "super earth", + "super-erde", + "supererde", + "stratagem", + "hellpod", + "terminid", + "automaton", + "illuminate", + "managed democracy", + "gelenkte demokratie", + "liber-tea", + "would you like to know more", + "möchten sie mehr erfahren", + "mobile infantry", + "arachnid", + "federation", + "föderation", + "service guarantees citizenship", + "rico", + "klendathu", +] + + +def _asset_files() -> list[Path]: + return sorted(p for p in ASSETS.rglob("*") if p.is_file()) + + +def test_asset_folder_is_not_empty() -> None: + assert _asset_files(), "Keine Assets gefunden" + + +@pytest.mark.parametrize("path", _asset_files(), ids=lambda p: p.relative_to(ASSETS).as_posix()) +def test_every_asset_is_documented(path: Path) -> None: + documented = ASSETS_DOC.read_text(encoding="utf-8") + relative = path.relative_to(ASSETS).as_posix() + assert relative in documented, f"{relative} fehlt in docs/ASSETS.md" + + +def test_referenced_asset_files_exist() -> None: + manifest = (JS_ROOT / "systems" / "Assets.js").read_text(encoding="utf-8") + referenced = re.findall(r"file: '([^']+)'", manifest) + assert len(referenced) >= 15 + missing = [f for f in referenced if not (ASSETS / f).is_file()] + assert missing == [] + + +@pytest.mark.parametrize("path", sorted(ASSETS.rglob("*.svg")), ids=lambda p: p.name) +def test_svgs_are_well_formed_and_self_contained(path: Path) -> None: + source = path.read_text(encoding="utf-8") + root = ET.fromstring(source) # noqa: S314 – eigene, versionierte Dateien + assert root.tag.endswith("svg") + lowered = source.lower() + # Keine Skripte, keine externen Verweise: SVGs sollen reine Grafik sein. + assert " None: + phaser = JS_ROOT / "lib" / "phaser.min.js" + assert phaser.is_file() + assert phaser.stat().st_size > 500_000 + head = phaser.read_text(encoding="utf-8", errors="ignore")[:100_000] + assert '"3.90.0"' in head or "3.90.0" in head + assert (JS_ROOT / "lib" / "PHASER_LICENSE.md").is_file() + + +def test_no_external_urls_in_page_or_scripts() -> None: + """Das Spiel lädt nichts von fremden Servern (kein CDN, kein Tracking).""" + offenders = [] + for path in [*JS_ROOT.rglob("*.js"), *(PROJECT_ROOT / "app" / "templates").rglob("*.html")]: + if "lib" in path.relative_to(STATIC if path.is_relative_to(STATIC) else PROJECT_ROOT).parts: + continue + text = path.read_text(encoding="utf-8") + for match in re.findall(r"""(?:src|href)=["'](https?://[^"']+)""", text): + offenders.append(f"{path.name}: {match}") + if re.search(r"""\b(?:import|fetch)\s*\(?\s*["']https?://""", text): + offenders.append(f"{path.name}: externer Import/Fetch") + assert offenders == [] + + +def test_no_names_from_other_games_or_films() -> None: + sources = [ + *JS_ROOT.rglob("*.js"), + *(PROJECT_ROOT / "app" / "templates").rglob("*.html"), + *ASSETS.rglob("*.svg"), + ] + hits = [] + for path in sources: + if "lib" in path.parts: + continue + text = path.read_text(encoding="utf-8").lower() + for term in FORBIDDEN_TERMS: + if re.search(rf"\b{re.escape(term)}\b", text): + hits.append(f"{path.relative_to(PROJECT_ROOT).as_posix()}: {term}") + assert hits == [] diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..d0af2b1 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,122 @@ +"""Tests für das Laden der Konfiguration aus Umgebungsvariablen.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from app import config as config_module +from app import create_app +from app.config import ( + PROJECT_ROOT, + ensure_secret_key, + env_bool, + env_int, + load_config, + load_or_create_secret_key, + resolve_project_path, +) + + +def test_relative_paths_are_anchored_at_project_root() -> None: + assert resolve_project_path("instance/x.sqlite3") == PROJECT_ROOT / "instance" / "x.sqlite3" + + +def test_absolute_paths_stay_unchanged(tmp_path: Path) -> None: + assert resolve_project_path(tmp_path / "db.sqlite3") == tmp_path / "db.sqlite3" + + +def test_env_int(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("GD_TEST_INT", raising=False) + assert env_int("GD_TEST_INT", 7) == 7 + monkeypatch.setenv("GD_TEST_INT", " 12 ") + assert env_int("GD_TEST_INT", 7) == 12 + monkeypatch.setenv("GD_TEST_INT", "zwölf") + with pytest.raises(ValueError, match="ganze Zahl"): + env_int("GD_TEST_INT", 7) + monkeypatch.setenv("GD_TEST_INT", "0") + with pytest.raises(ValueError, match="mindestens"): + env_int("GD_TEST_INT", 7, minimum=1) + + +@pytest.mark.parametrize( + ("raw", "expected"), [("1", True), ("ja", True), ("0", False), ("", False)] +) +def test_env_bool(monkeypatch: pytest.MonkeyPatch, raw: str, expected: bool) -> None: + monkeypatch.setenv("GD_TEST_BOOL", raw) + assert env_bool("GD_TEST_BOOL", default=False) is expected + + +def test_secret_key_file_is_created_once(tmp_path: Path) -> None: + key_file = tmp_path / "instance" / "secret_key" + first = load_or_create_secret_key(key_file) + second = load_or_create_secret_key(key_file) + assert first == second + assert len(first) == 64 + + +def test_load_config_reads_environment(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + monkeypatch.setenv("SECRET_KEY", "aus-der-umgebung") + monkeypatch.setenv("GLORY_DB_PATH", str(tmp_path / "x.sqlite3")) + monkeypatch.setenv("GLORY_RATE_LIMIT_MAX", "9") + monkeypatch.setenv("GLORY_RATE_LIMIT_WINDOW", "30") + config = load_config() + assert config["SECRET_KEY"] == "aus-der-umgebung" + assert config["DATABASE_PATH"] == str(tmp_path / "x.sqlite3") + assert config["RATE_LIMIT_MAX_SUBMISSIONS"] == 9 + assert config["RATE_LIMIT_WINDOW_SECONDS"] == 30 + + +def test_generated_secret_is_created_only_when_needed( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """Ohne SECRET_KEY entsteht die Schlüsseldatei erst beim ersten Bedarf. + + Befehle im cPanel-Terminal (Datenbank anlegen, Ehrentafel moderieren) dürfen keine + überflüssige Schlüsseldatei erzeugen. + """ + monkeypatch.delenv("SECRET_KEY", raising=False) + key_file = tmp_path / "secret_key" + monkeypatch.setattr(config_module, "SECRET_KEY_FILE", key_file) + config = load_config() + assert config["SECRET_KEY"] is None + assert not key_file.exists() + + key = ensure_secret_key(config) + assert key == key_file.read_text(encoding="utf-8") + assert config["SECRET_KEY"] == key + assert ensure_secret_key(config) == key + + +def test_app_without_secret_creates_key_on_first_token( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + monkeypatch.delenv("SECRET_KEY", raising=False) + key_file = tmp_path / "secret_key" + monkeypatch.setattr(config_module, "SECRET_KEY_FILE", key_file) + app = create_app({"DATABASE_PATH": str(tmp_path / "db.sqlite3")}) + client = app.test_client() + + assert client.get("/").status_code == 200 + assert client.get("/healthz").status_code == 200 + assert app.test_cli_runner().invoke(args=["scores", "list"]).exit_code == 0 + assert not key_file.exists() + + assert client.post("/api/runs").status_code == 201 + assert key_file.exists() + assert app.config["SECRET_KEY"] == key_file.read_text(encoding="utf-8") + + +def test_blocklist_path_from_environment(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + monkeypatch.setenv("GLORY_NAME_BLOCKLIST", str(tmp_path / "sperre.txt")) + assert load_config()["NAME_BLOCKLIST_PATH"] == str(tmp_path / "sperre.txt") + monkeypatch.delenv("GLORY_NAME_BLOCKLIST") + assert load_config()["NAME_BLOCKLIST_PATH"] == str( + PROJECT_ROOT / "instance" / "name_blocklist.txt" + ) + + +def test_overrides_take_precedence(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("SECRET_KEY", "aus-der-umgebung") + assert load_config({"SECRET_KEY": "override"})["SECRET_KEY"] == "override" diff --git a/tests/test_deploy_zip.py b/tests/test_deploy_zip.py new file mode 100644 index 0000000..c649531 --- /dev/null +++ b/tests/test_deploy_zip.py @@ -0,0 +1,86 @@ +"""Tests für das Upload-Paket (scripts/build_deploy_zip.py). + +Prüft, dass das Paket vollständig ist, keine Geheimnisse oder Caches enthält, nur +„/“ als Pfadtrenner nutzt und nach dem Entpacken wie auf cPanel startet. +""" + +from __future__ import annotations + +import importlib.util +import os +import subprocess +import sys +import zipfile +from pathlib import Path +from types import ModuleType + +from app.config import PROJECT_ROOT + + +def _load_builder() -> ModuleType: + spec = importlib.util.spec_from_file_location( + "build_deploy_zip", PROJECT_ROOT / "scripts" / "build_deploy_zip.py" + ) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_zip_contains_everything_the_server_needs(tmp_path: Path) -> None: + target = tmp_path / "paket.zip" + names = _load_builder().build_zip(target) + with zipfile.ZipFile(target) as archive: + archived = set(archive.namelist()) + assert archived == set(names) + for required in ( + "passenger_wsgi.py", + "requirements.txt", + "app/__init__.py", + "app/templates/index.html", + "app/static/js/main.js", + "app/static/js/lib/phaser.min.js", + "app/static/assets/sprites/president.svg", + ): + assert required in archived, required + + +def test_zip_has_no_secrets_caches_or_backslashes(tmp_path: Path) -> None: + target = tmp_path / "paket.zip" + names = _load_builder().build_zip(target) + assert all("\\" not in name for name in names) + assert not any(name == ".env" or name.startswith("instance/") for name in names) + assert not any("__pycache__" in name or name.endswith(".pyc") for name in names) + assert not any(name.startswith(("tests/", "node_modules/", ".venv/")) for name in names) + + +def test_unpacked_zip_starts_like_on_cpanel(tmp_path: Path) -> None: + """Das entpackte Paket allein reicht: passenger_wsgi importiert die App und liefert Seiten.""" + target = tmp_path / "paket.zip" + _load_builder().build_zip(target) + deploy_root = tmp_path / "glory_defense" + with zipfile.ZipFile(target) as archive: + archive.extractall(deploy_root) + + env = {k: v for k, v in os.environ.items() if not k.startswith(("GLORY_", "SECRET_KEY"))} + env["SECRET_KEY"] = "deploy-test" + script = ( + "import runpy\n" + f"app = runpy.run_path({str(deploy_root / 'passenger_wsgi.py')!r})['application']\n" + "c = app.test_client()\n" + "print(c.get('/').status_code, c.get('/static/js/lib/phaser.min.js').status_code," + " c.get('/api/highscores').status_code)\n" + ) + result = subprocess.run( + [sys.executable, "-c", script], + cwd=tmp_path, + env=env, + capture_output=True, + text=True, + timeout=60, + check=False, + ) + assert result.returncode == 0, result.stderr + assert result.stdout.strip() == "200 200 200" + # Datenbank entsteht im entpackten Projekt, nicht im Arbeitsverzeichnis. + assert (deploy_root / "instance" / "glory_defense.sqlite3").exists() diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..dcf3c30 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,107 @@ +"""Tests für Datenbank-Initialisierung und die SQLite-Hilfsfunktionen.""" + +from __future__ import annotations + +import sqlite3 +from pathlib import Path + +import pytest +from flask import Flask + +from app import create_app +from app.models import ( + SCHEMA_VERSION, + connect, + consume_run_token, + init_db, + insert_score, + rank_of, + register_submission_attempt, + top_scores, +) + + +def _tables(path: Path) -> set[str]: + with sqlite3.connect(path) as conn: + rows = conn.execute("SELECT name FROM sqlite_master WHERE type = 'table'").fetchall() + return {row[0] for row in rows} + + +def test_create_app_initializes_database(app: Flask, db_path: Path) -> None: + assert db_path.exists() + assert {"highscores", "submission_log", "used_run_tokens"} <= _tables(db_path) + + +def test_init_db_creates_missing_parent_directories(tmp_path: Path) -> None: + target = tmp_path / "tief" / "verschachtelt" / "scores.sqlite3" + init_db(target) + assert target.exists() + with sqlite3.connect(target) as conn: + assert conn.execute("PRAGMA user_version").fetchone()[0] == SCHEMA_VERSION + + +def test_init_db_is_idempotent_and_keeps_data(tmp_path: Path) -> None: + target = tmp_path / "scores.sqlite3" + init_db(target) + conn = connect(target) + insert_score(conn, "Bleibt", 42, wave=1, duration_s=10) + conn.close() + + init_db(target) + init_db(target) + conn = connect(target) + assert [row["name"] for row in top_scores(conn, 10)] == ["Bleibt"] + conn.close() + + +def test_db_path_from_environment(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + target = tmp_path / "env" / "glory.sqlite3" + monkeypatch.setenv("GLORY_DB_PATH", str(target)) + monkeypatch.setenv("SECRET_KEY", "env-secret") + app = create_app() + assert Path(app.config["DATABASE_PATH"]) == target + assert target.exists() + + +def test_init_db_cli_command(app: Flask, db_path: Path) -> None: + db_path.unlink() + result = app.test_cli_runner().invoke(args=["init-db"]) + assert result.exit_code == 0 + assert "Datenbank bereit" in result.output + assert db_path.exists() + + +def test_rank_of_matches_top_scores_order(tmp_path: Path) -> None: + target = tmp_path / "rank.sqlite3" + init_db(target) + conn = connect(target) + ids = [ + insert_score(conn, name, score, 1, 1) + for name, score in [("A", 300), ("B", 500), ("C", 300), ("D", 100)] + ] + ranks = [rank_of(conn, score_id) for score_id in ids] + assert ranks == [2, 1, 3, 4] + conn.close() + + +def test_register_submission_attempt_limits_and_recovers(tmp_path: Path) -> None: + target = tmp_path / "limit.sqlite3" + init_db(target) + conn = connect(target) + now = 5_000.0 + results = [register_submission_attempt(conn, "client", now + i, 60, 3) for i in range(4)] + assert [allowed for allowed, _ in results] == [True, True, True, False] + # Ältester Versuch bei t=5000 fällt bei t=5060 aus dem Fenster; Anfrage kam bei t=5003. + assert results[3][1] == 57 + assert register_submission_attempt(conn, "client", now + 61, 60, 3)[0] is True + conn.close() + + +def test_consume_run_token_only_once(tmp_path: Path) -> None: + target = tmp_path / "tokens.sqlite3" + init_db(target) + conn = connect(target) + assert consume_run_token(conn, "run-1", 100.0, 3600) is True + assert consume_run_token(conn, "run-1", 101.0, 3600) is False + assert consume_run_token(conn, "run-2", 101.0, 3600) is True + conn.close() diff --git a/tests/test_moderation.py b/tests/test_moderation.py new file mode 100644 index 0000000..8bc55e8 --- /dev/null +++ b/tests/test_moderation.py @@ -0,0 +1,140 @@ +"""Tests für die Moderation der Ehrentafel: CLI-Befehle und Sperrliste für Namen.""" + +from __future__ import annotations + +from collections.abc import Callable +from pathlib import Path + +import pytest +from flask import Flask +from flask.testing import FlaskClient + +from app import create_app +from app.models import get_db, insert_score, top_scores +from app.validation import is_name_blocked, load_blocklist, normalize_for_blocklist + + +def _seed(app: Flask, entries: list[tuple[str, int]]) -> list[int]: + with app.app_context(): + return [ + insert_score(get_db(), name, score, wave=1, duration_s=60) for name, score in entries + ] + + +def _names(app: Flask) -> list[str]: + with app.app_context(): + return [entry["name"] for entry in top_scores(get_db(), 100)] + + +# --------------------------------------------------------------------------- CLI + + +def test_scores_list_shows_ids_and_names(app: Flask) -> None: + ids = _seed(app, [("Ada", 300), ("Grace", 500)]) + result = app.test_cli_runner().invoke(args=["scores", "list"]) + assert result.exit_code == 0 + lines = result.output.splitlines() + assert "Name" in lines[0] + assert str(ids[1]) in lines[1] and "Grace" in lines[1] + assert str(ids[0]) in lines[2] and "Ada" in lines[2] + + +def test_scores_list_when_empty(app: Flask) -> None: + result = app.test_cli_runner().invoke(args=["scores", "list"]) + assert result.exit_code == 0 + assert "Keine Einträge" in result.output + + +def test_scores_delete_by_id(app: Flask) -> None: + ids = _seed(app, [("Bleibt", 100), ("Weg", 200), ("AuchWeg", 300)]) + result = app.test_cli_runner().invoke( + args=["scores", "delete", str(ids[1]), str(ids[2]), "999"] + ) + assert result.exit_code == 0 + assert "2 Eintrag/Einträge gelöscht" in result.output + assert _names(app) == ["Bleibt"] + + +def test_scores_delete_requires_ids(app: Flask) -> None: + result = app.test_cli_runner().invoke(args=["scores", "delete"]) + assert result.exit_code != 0 + + +def test_scores_delete_name_is_case_insensitive(app: Flask) -> None: + _seed(app, [("Unerwünscht", 100), ("unerwünscht", 200), ("Ada", 300)]) + # Auch Umlaute zählen ohne Groß-/Kleinschreibung (SQLites NOCASE könnte das nicht). + result = app.test_cli_runner().invoke(args=["scores", "delete-name", "UNERWÜNSCHT"]) + assert result.exit_code == 0 + assert "2 Eintrag/Einträge" in result.output + assert _names(app) == ["Ada"] + + +# --------------------------------------------------------------------- Sperrliste + + +@pytest.mark.parametrize( + ("raw", "expected"), + [ + ("Max Muster", "maxmuster"), + ("M.a.x-Muster!", "maxmuster"), + ("MAX", "max"), + ("Jürg", "jürg"), + ], +) +def test_normalize_for_blocklist(raw: str, expected: str) -> None: + assert normalize_for_blocklist(raw) == expected + + +def test_load_blocklist_ignores_comments_and_blank_lines(tmp_path: Path) -> None: + path = tmp_path / "sperre.txt" + path.write_text("# Kommentar\n\n Max Muster \nbeleidigung\n#noch einer\n", encoding="utf-8") + assert load_blocklist(path) == ["maxmuster", "beleidigung"] + + +def test_missing_blocklist_blocks_nothing(tmp_path: Path) -> None: + assert load_blocklist(tmp_path / "gibt-es-nicht.txt") == [] + assert is_name_blocked("Irgendwer", []) is False + + +def test_blocked_terms_cannot_be_bypassed_by_spacing_or_case() -> None: + terms = ["maxmuster"] + assert is_name_blocked("Max Muster", terms) + assert is_name_blocked("xX.MAX.muster.Xx", terms) + assert not is_name_blocked("Max Mustang", terms) + + +@pytest.fixture() +def blocklist_app(tmp_path: Path) -> Flask: + blocklist = tmp_path / "name_blocklist.txt" + blocklist.write_text("Max Muster\n", encoding="utf-8") + return create_app( + { + "TESTING": True, + "SECRET_KEY": "test-secret-key", + "DATABASE_PATH": str(tmp_path / "db.sqlite3"), + "NAME_BLOCKLIST_PATH": str(blocklist), + } + ) + + +def test_api_rejects_blocked_name(blocklist_app: Flask) -> None: + client: FlaskClient = blocklist_app.test_client() + token = client.post("/api/runs").get_json()["run_token"] + payload = {"name": "max.muster", "score": 10, "wave": 1, "duration_s": 0, "run_token": token} + response = client.post("/api/highscores", json=payload) + assert response.status_code == 400 + assert response.get_json()["fields"] == {"name": "Dieser Name ist nicht zulässig."} + assert _names(blocklist_app) == [] + + +def test_api_accepts_other_names_with_blocklist(blocklist_app: Flask) -> None: + client: FlaskClient = blocklist_app.test_client() + token = client.post("/api/runs").get_json()["run_token"] + payload = {"name": "Ada", "score": 10, "wave": 1, "duration_s": 0, "run_token": token} + assert client.post("/api/highscores", json=payload).status_code == 201 + + +def test_api_without_blocklist_file_accepts_names( + client: FlaskClient, valid_payload: Callable[..., dict] +) -> None: + assert client.post("/api/highscores", json=valid_payload(name="Max Muster")).status_code == 201 diff --git a/tests/test_passenger_wsgi.py b/tests/test_passenger_wsgi.py new file mode 100644 index 0000000..b6e5b2b --- /dev/null +++ b/tests/test_passenger_wsgi.py @@ -0,0 +1,85 @@ +"""Tests für den Passenger-Einstiegspunkt (cPanel „Setup Python App“).""" + +from __future__ import annotations + +import importlib.util +import os +import subprocess +import sys +from collections.abc import Iterator +from pathlib import Path + +import pytest +from flask import Flask + +from app.config import PROJECT_ROOT + +PASSENGER_FILE = PROJECT_ROOT / "passenger_wsgi.py" + + +def _clean_env(tmp_path: Path) -> dict[str, str]: + env = {k: v for k, v in os.environ.items() if not k.startswith(("GLORY_", "SECRET_KEY"))} + env["SECRET_KEY"] = "passenger-test" + env["GLORY_DB_PATH"] = str(tmp_path / "passenger.sqlite3") + return env + + +@pytest.fixture() +def isolated_environ() -> Iterator[None]: + """Stellt os.environ nach dem Test wieder her. + + passenger_wsgi.py lädt eine vorhandene .env-Datei in os.environ. Ohne diese + Isolation würden deren Werte (z. B. GLORY_RATE_LIMIT_MAX) in spätere Tests durchsickern. + """ + saved = dict(os.environ) + yield + os.environ.clear() + os.environ.update(saved) + + +@pytest.mark.usefixtures("isolated_environ") +def test_passenger_file_exposes_wsgi_application( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setenv("SECRET_KEY", "passenger-test") + monkeypatch.setenv("GLORY_DB_PATH", str(tmp_path / "passenger.sqlite3")) + spec = importlib.util.spec_from_file_location("passenger_wsgi_under_test", PASSENGER_FILE) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + application = module.application + assert isinstance(application, Flask) + client = application.test_client() + assert client.get("/").status_code == 200 + assert client.get("/healthz").get_json() == {"status": "ok"} + + +def test_passenger_import_works_from_foreign_working_directory(tmp_path: Path) -> None: + """Passenger startet nicht zwingend im Projektordner – der Import muss trotzdem klappen.""" + script = ( + "import runpy, sys\n" + f"ns = runpy.run_path({str(PASSENGER_FILE)!r})\n" + "app = ns['application']\n" + "print(type(app).__name__, app.test_client().get('/healthz').status_code)\n" + ) + result = subprocess.run( + [sys.executable, "-c", script], + cwd=tmp_path, + env=_clean_env(tmp_path), + capture_output=True, + text=True, + timeout=60, + check=False, + ) + assert result.returncode == 0, result.stderr + assert result.stdout.strip() == "Flask 200" + assert (tmp_path / "passenger.sqlite3").exists() + + +def test_passenger_file_uses_only_relative_project_paths() -> None: + source = PASSENGER_FILE.read_text(encoding="utf-8") + assert "application = create_app()" in source + # Keine fest verdrahteten Pfade (z. B. /home/user/...), sonst bricht es beim Umzug. + assert "/home/" not in source + assert "C:\\" not in source diff --git a/tests/test_routes.py b/tests/test_routes.py new file mode 100644 index 0000000..09592cd --- /dev/null +++ b/tests/test_routes.py @@ -0,0 +1,127 @@ +"""Tests für die HTML-Seiten, den Health-Check und allgemeine HTTP-Eigenschaften.""" + +from __future__ import annotations + +from pathlib import Path + +from flask.testing import FlaskClient + +from app import create_app + + +def test_index_serves_game_page(client: FlaskClient) -> None: + response = client.get("/") + assert response.status_code == 200 + html = response.get_data(as_text=True) + assert 'id="game"' in html + assert "js/lib/phaser.min.js" in html + assert 'type="module"' in html + # Der Disclaimer-Text ist für die Einblendung im Spiel eingebettet. + assert "Satire und reine Fiktion" in html + + +def test_index_passes_urls_to_frontend(client: FlaskClient) -> None: + html = client.get("/").get_data(as_text=True) + assert 'data-api-highscores="/api/highscores"' in html + assert 'data-api-runs="/api/runs"' in html + assert 'data-static-base="/static/"' in html + + +def test_index_respects_mount_prefix(client: FlaskClient) -> None: + """Unter cPanel kann die App unter einer Unter-URL laufen (SCRIPT_NAME).""" + html = client.get("/", base_url="http://localhost/glory").get_data(as_text=True) + assert 'data-api-highscores="/glory/api/highscores"' in html + assert 'data-static-base="/glory/static/"' in html + assert 'src="/glory/static/js/main.js"' in html + + +def test_disclaimer_page(client: FlaskClient) -> None: + response = client.get("/disclaimer") + assert response.status_code == 200 + html = response.get_data(as_text=True) + for phrase in ( + "Satire und reine Fiktion", + "frei erfunden", + "nicht beabsichtigt", + "keine politische Position", + ): + assert phrase in html + assert 'href="/"' in html + + +def test_healthz(client: FlaskClient) -> None: + response = client.get("/healthz") + assert response.status_code == 200 + assert response.get_json() == {"status": "ok"} + + +def test_security_headers_present(client: FlaskClient) -> None: + response = client.get("/") + csp = response.headers["Content-Security-Policy"] + assert "script-src 'self'" in csp + assert "object-src 'none'" in csp + assert response.headers["X-Content-Type-Options"] == "nosniff" + + +def test_unknown_page_returns_404_html(client: FlaskClient) -> None: + response = client.get("/gibt-es-nicht") + assert response.status_code == 404 + assert response.mimetype == "text/html" + + +def test_unknown_api_route_returns_json_404(client: FlaskClient) -> None: + response = client.get("/api/gibt-es-nicht") + assert response.status_code == 404 + assert response.is_json + assert response.get_json()["error"] == "not_found" + + +def test_wrong_method_on_api_returns_json_405(client: FlaskClient) -> None: + response = client.delete("/api/highscores") + assert response.status_code == 405 + assert response.get_json()["error"] == "method_not_allowed" + + +def test_forwarded_headers_are_ignored_without_trusted_proxy(client: FlaskClient) -> None: + """Ohne GLORY_TRUST_PROXY kann ein Client sein Rate-Limit nicht per Header umgehen.""" + for i in range(5): + client.post("/api/highscores", json={}, headers={"X-Forwarded-For": f"198.51.100.{i}"}) + blocked = client.post("/api/highscores", json={}, headers={"X-Forwarded-For": "198.51.100.99"}) + assert blocked.status_code == 429 + + +def test_trusted_proxy_uses_client_ip_but_not_host_or_prefix(tmp_path: Path) -> None: + app = create_app( + { + "TESTING": True, + "SECRET_KEY": "k", + "DATABASE_PATH": str(tmp_path / "db.sqlite3"), + "TRUST_PROXY": True, + } + ) + client = app.test_client() + # Host und Präfix aus Headern dürfen nicht in die erzeugten URLs gelangen. + html = client.get( + "/", headers={"X-Forwarded-Prefix": "//evil.example", "X-Forwarded-Host": "evil.example"} + ).get_data(as_text=True) + assert "evil.example" not in html + assert 'src="/static/js/main.js"' in html + # Die weitergeleitete Client-IP zählt dagegen fürs Rate-Limit. + for _ in range(5): + client.post("/api/highscores", json={}, headers={"X-Forwarded-For": "198.51.100.1"}) + first = client.post("/api/highscores", json={}, headers={"X-Forwarded-For": "198.51.100.1"}) + other = client.post("/api/highscores", json={}, headers={"X-Forwarded-For": "198.51.100.2"}) + assert first.status_code == 429 + assert other.status_code == 400 + + +def test_api_responses_keep_field_order(client: FlaskClient) -> None: + body = client.post("/api/highscores", json={}).get_data(as_text=True) + assert body.index('"error"') < body.index('"message"') < body.index('"fields"') + + +def test_static_phaser_and_main_are_served(client: FlaskClient) -> None: + for path in ("/static/js/lib/phaser.min.js", "/static/js/main.js", "/static/css/site.css"): + response = client.get(path) + assert response.status_code == 200, path + response.close() diff --git a/tests/test_validation.py b/tests/test_validation.py new file mode 100644 index 0000000..241ff9b --- /dev/null +++ b/tests/test_validation.py @@ -0,0 +1,94 @@ +"""Tests für Namensbereinigung und Plausibilitätsprüfung (ohne Flask).""" + +from __future__ import annotations + +import pytest + +from app.config import GAME_RULE_DEFAULTS +from app.validation import ( + NAME_MAX_LENGTH, + PlausibilityRules, + ScoreSubmission, + SubmissionError, + check_plausibility, + parse_submission, + sanitize_name, +) + +RULES = PlausibilityRules.from_config(GAME_RULE_DEFAULTS) + + +@pytest.mark.parametrize( + ("raw", "expected"), + [ + ("Ada", "Ada"), + (" Max Muster ", "Max Muster"), + ("Jürg Größli", "Jürg Größli"), + ("Fullwidth", "Fullwidth"), + ("Null\x00Byte", "NullByte"), + ("Zero\u200bWidth", "ZeroWidth"), + ("Bidi\u202eTrick", "BidiTrick"), + ("Tab\tNeu\nZeile", "TabNeuZeile"), + ("", "scriptalert1script"), + ("O'Neil-Test!?", "O'Neil-Test!?"), + ("Emoji 🚀 Held", "Emoji Held"), + ("", ""), + ], +) +def test_sanitize_name(raw: str, expected: str) -> None: + assert sanitize_name(raw) == expected + + +def _payload(**overrides: object) -> dict: + payload: dict = {"name": "Ada", "score": 100, "wave": 2, "duration_s": 60, "run_token": "t"} + payload.update(overrides) + return payload + + +def test_parse_submission_valid() -> None: + submission = parse_submission(_payload(name=" Ada "), RULES) + assert submission == ScoreSubmission("Ada", 100, 2, 60, "t") + + +def test_parse_submission_name_exactly_max_length() -> None: + name = "N" * NAME_MAX_LENGTH + assert parse_submission(_payload(name=name), RULES).name == name + + +def test_parse_submission_collects_errors() -> None: + with pytest.raises(SubmissionError) as info: + parse_submission(_payload(name="", score=-1, wave=0), RULES) + assert set(info.value.fields) == {"name", "score", "wave"} + + +def _submission(score: int, wave: int, duration_s: int) -> ScoreSubmission: + return ScoreSubmission("Ada", score, wave, duration_s, "t") + + +def test_plausible_submission() -> None: + assert check_plausibility(_submission(2_000, 3, 120), elapsed_s=150, rules=RULES) is None + + +def test_duration_may_be_shorter_than_elapsed_because_of_pauses() -> None: + assert check_plausibility(_submission(500, 2, 60), elapsed_s=3_000, rules=RULES) is None + + +def test_duration_longer_than_elapsed_is_implausible() -> None: + assert check_plausibility(_submission(500, 2, 600), elapsed_s=100, rules=RULES) is not None + + +def test_duration_within_tolerance_is_accepted() -> None: + tolerance = RULES.duration_tolerance_seconds + assert check_plausibility(_submission(500, 2, 100 + tolerance), 100, RULES) is None + + +def test_score_ceiling_depends_on_duration() -> None: + ceiling = RULES.score_flat_allowance + 100 * RULES.score_max_points_per_second + assert check_plausibility(_submission(ceiling, 5, 100), 200, RULES) is None + assert check_plausibility(_submission(ceiling + 1, 5, 100), 200, RULES) is not None + + +def test_high_wave_needs_minimum_time() -> None: + assert check_plausibility(_submission(10, 50, 10), 500, RULES) is not None + min_time = 49 * RULES.wave_min_seconds + assert check_plausibility(_submission(10, 50, min_time), min_time + 10, RULES) is None diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 0000000..57900cb --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +// Die Spiellogik unter app/static/js/logic ist Phaser-frei und läuft direkt in Node. +export default defineConfig({ + test: { + include: ['tests/js/**/*.test.js'], + environment: 'node', + }, +});

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 E12x5=f&c&j literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/explosionCrunch_003.ogg b/app/static/assets/kenney/audio/explosionCrunch_003.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b13529a0e62053ffbd53a50b4baa549ee730d47c GIT binary patch literal 54824 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 OvMd0Ab-0x+eFOj}%6z;4 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactMetal_light_000.ogg b/app/static/assets/kenney/audio/impactMetal_light_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7d49262cc9f69eb517cf644f61940ace16714f22 GIT binary patch literal 7651 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactMetal_light_001.ogg b/app/static/assets/kenney/audio/impactMetal_light_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ff73e4a5443245f00f8ec3f211040ee51faf22b0 GIT binary patch literal 6967 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactMetal_light_002.ogg b/app/static/assets/kenney/audio/impactMetal_light_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c18f397662e730412a137a6759d53abcd9202e30 GIT binary patch literal 6804 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 XpN4LH*nH^3%^QdAo!InKZP5P%>Jo5A literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactPunch_heavy_000.ogg b/app/static/assets/kenney/audio/impactPunch_heavy_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..55e70b52ca082c89326bac62a02505c0ba750260 GIT binary patch literal 11617 zcmeHtcU03$x9Eff2-N@y1_V#&0fG_;ND&Q4=$!;Z6b+#xB1KSCG*s!*q>C7e5J8Co z3O0HXP!MT~im0I2uG3%-hX%2Fl*1up4q?IeI_^u1h@kM@Vm@- ztN?FmM;BphVbOacSV58eApy(!-zecL$d_Qw{FQ$f{z@3sTfHXIT)Obrzm**L%2wJC z20bV&aGi5R04^km<*`fvXN%L*CF<$w>FVR~&bvc{!Xo@4{X+L@@<~ZRf97sfTX(9N zyW&kH*?<;73zx%@C)^e@ZRg^i(|#$ti5;pxyOX=4aE6J?AeW@ zMn(k$;qd$R?OV5(59&njjq(lJv(9JFZcUir%4ca>Z1I2rB(yQn0oTJG$)*8-0)VNi zDVgVQt680Y3LjIHZ^MUrbW@A+Q+u#J8N}Yd8XUJ+)8^2+tC?#W|=BPqMztZWl z2vM!tig;1Ieq4fs-t($FCzI#3m02c>_@)sHF`cH{b`HdG51+GFg}e?$-ZWk)``w5v zp92Sdi-nM!FUkVR-#$gNrYHj1YUNlsz=nVR%&4`5nPk#$Z&R;!bs> zK_$v-YqZ~Fbkt;YtY=Zuwo9>|my)(kC3$^L^2R3ru3uswe&*NZqvK$pLdCe?u_i}Z zo-=36fhQ){3jkj}OK>8&%9^>Awl)62XM;*x0?)MU9z0JNJTJbC0%;6_|23c@sHEoq zs{Wn@e*b+X2li_LGQ`WiaD~2bRf?NxUj#vTnZx}6k}27Z&=WzjjwJO(ZiK4!Udw@e zhv5$ntNs!KU+e&oi3&a83Ih-~+;qkw47Ns^O-4FSLag9(_S=rSkxVXt_RPT*nJ~PEh)v(f7DxV6yU0(S11z139Yp=T#kV z6NcZBoZpj1WhkyBM|X_ZC?;x5*3aG0Ys|oJjOI5U?Kj=xx9wuAXUlJcSuvZ3lTrV$ z9KMMt8)rSX$wmCjaw_myb4FPzwz;aFx#}?m0jVW*#pTcIIHLb%Ie}@Xi_%V~q%EXm z;ZqBOQcJk4oRAx5U$p(V^>53uj!=avWI2=w)qhw{J5gZ^WKHJ@j_+5_Xf_HlbT4J~ zKLr3ld$zd!vLA7E(;0U&7%u#I5g=wos&&UT5!_VHZWxL@8uW|l6yaaD=%*k9HG1=x3_{cAU_su9U1ttuD3 zl@RoI(g|=e&_p?eY{Q>e==e*op$}Pdkf{+FO$-*;IF=aHN%H3Y=O4!gfDID{Y#?)k z{P#Ci+DHRnl1UPl2 zFIU0kF1DT39t2PVHGSOAQ)rgoJ5K;$wjBm=?MRb>+VjXYj+d4ITK>E;NP%=A!`qHn zE$$<2A$rQ&!NNw#*Ue2!vs%Lsm67x8`b|}yZ@Z)775vd8~TtZ4!C<`0Sr0oBw z{xCMQhK>4tLov+o{tbnT{`1!IulvjYPiTs0VA!!B87;ouDZhrA z5xt0n}UFBW(3G;SaS_Inyh!F$m+H1Wx=#UcSuO}difg0*DJRwY$T*+xJ3R< ztO~h2VGgC2kj&(K{+c+InCo@}TEU-y$f;G|Sy_SSXTo-Me@|5B=esShMJ}hv&{dS5 zsY*k-o9_m#OM+;u6L!#*6>TB1GLfGP;Z^^hfCxeR|DJ#dLEEgXfB=39 zew>fX2bSA9J_L1F+LeiFh!8ZmGQ=kYb${=-Oeo(?Yo!ahUpU|Usc7kRJL#X@C}54& zb09Cp875+6 z^e9>5!BXOyvI=+VA{n9sz*;a1xvy!UtjsBX{A}q95RsBo(j*$2OD#{Ef-eBrxUo}G z0_TlPHf|zYSX$ZGIXJmM?hUpa3CRG4M6O&o`F$jE+R3B(PL?*zn<+GT)1u;ad@BZ!|V4$!Hm+y0p;%f#2@S4WZ(0ZVqGaZ zTqrEiK9U>6MuR|G;2I8-JgM7spYU@4YggaQ#`&!t5x0a-Jrlp9c~8A*@bX!em(^$8 zTO0!m_jy@Q*~jA8Oo6<3SYRo@ZCqE-5q#c93`(?CLhB-xy3x^OE^GVOpg2BxEHtS zrNy(h5{DSmk)yFVQ0%YUghDo{0*o)>62ZIbTI;8uiGA{E@lB`u?LF95Fz`wrAnYbF zRPjPyB?j-c)rGjdH)|pe=#o^%Sctpjuqs;@NqZ6EXRk#M%v1_4<%*qx?!yWx;PEzn zgD}Z%@@i?ioaDvT7hKz3-`_qIcIj#n#3h^d5eqP)47W*hg>AC8iFo+&q#~Wf6d$Y8 z@?d6SXIX0qPAC0ajYhBCZCUyUcnG|6auI{a$;y%4Z1TJO$ZRYbAIzqkJ#Xa%b(u5#!z^&f&tVIhxbST^|H&K5AFiGk7j-rSjU30B<*ZaCtcaPbp z-J1Mo=d)&IsAsiWv^l}e7pAb$(Vsj_&v>UR%cs-KeWV)9(IhKNgjD*N+@*{_Nwu5a zqnvnU<{AXCr6Q#^aNzurq(9fB`d7DYrC6mjdC*Q=FT3nP^E%#zpYI+rO5+IUC#9 zB4J(FAx~`pwaUnNEoM_nZ&oz?36rh5`C8xmius_;*Lg>eS5A;aUMpX#qBpxblskZ% z+Mh3pBXT1u4vRnNKJ4I(zBQPNco*@{&O4ObD%U%{zF<4Nh$Sg0S?BiFS3Nq6WNV$6 zBa$Mbk_VV7QzgLxuG_XX<7;S?aXKZ_ydg971fAE+qzTr05*?-LeUyqkI*=_KI2hf{BTna;7CEXOx$b!Ve^Feu4vaq9GfpJ<_s*9yc76x`29OxfMR068ZGB~nC9rX1H6^m?0N6p6y0?E6nU~7cimn(fxDz-u!X!jdbaz}skrvG3Stv>pU7UD z53Xx3o6T1i(_R+JTkNNi0(pTmPc?WDZUV`AC{#y@_qY`=RB;SF=0d~NbGec*8XU=L z;;>Nl(R~KiQE!|jyOFeuM>;YE$UQ6xQI6K97w`7EY_^k_Yx?x(u+>|!l1e2kNvk)7 z8_(Q!ltMl#$YN?Qy%z{E*N$f?aw~W^F7}?XA*0*kUeI=HucKzXCC#Z^jVtIkTYF!- z-D-9DKDSE*Amb}~2qqSEog8tqRbKt%DQi;a&%Qkl7mZgfT|?%y)cSc(>O@3a#+1%- ztcrpK@hIV+C1&4MNbty)oKtPVTaMX-@Y9c`Dn&~nCLy1ML0Y^Qa;I>Xn) z0kId08jpV@FQYr3Z01V;^6fniFR@~KU96%;q+Cxy>#uOT|5GtLqhHEa1PdJ@5Yyaa>mt_iY>Z7bJttX@{g$+c(|5u9C{87ompMo-(Oul)fO~fq&IlDyzH5H zAltlQ-02n7k{D8-%(y7EO}?O(N$V-84jMOU3LM3Aa207ObSk3Ky?#p%y;7M@CL=C( zt$mjoa_Gq5WRjv(ASQ#Efq83?RVHElT!geWlH_?Q>S-Li8LQHQt$)@nkVZUwA)#F* zi*!9e3emwJu-_b<4?dhQvsFB9HvMUpp{=)*v#(!~FA%WTR67{_adoF9tUYn$ z!l?GEeZKcEioC&Mysu;w;#}sAdz<^2=fAFlX;if1z}n!eF9TE%Greb*m|lO&TvK z(Sl=x50bmA54^If4ly@Z;&%+ilr69MTG{sKw?qGsOjb$B~Uzn55~{M2EaK zWEpbPxq$8N$B$E{AnO(}0Urzim` zV~TFwMT$lNM4~?{7jm-bUF}Tq6!`=Rt%Bs*q$zT;GT$q$Yjax$#XmB#mx~#H;yHWRFuS?zTf!7 zEE-W^4z7t@eRDA8mfv@EW}M@**oT7$*FD|<6FUS4SQ{s2wRxOjk1WbGMarrik*5kN zJ9OuReBD7BqKiaySW_?LjWA+aSmgILZr^nDsmKJOekzb&RKV=Hou+w{l5gC^#GpnP zy!4&dYhzxeXni z(}q?nz8KyBKpfAwDk3ZlWv}E!86xxwi=j~Zd5Ljs=Rb;*zwI$KHDc8>`KUp8-KUsK+c-4QcISm6SO|ph;^4L_Chkkqmj6$Jm z7ud?g=Jz>o_SK%2o;V|C_6O)I{$ACyST~{W{qhm?q~t;?MKRf)$D1uP7PkV#NO&pO zGx90UwcQN1cHof0z4`K<&s#d=m5Y!0+?%=Z-Q;o%zlp(z{2IlIOiOH<#}9=nmZgZD7w^Xea|cEovfmC3PYQImFf311{bNF@Tqg(g>L+_geV6u0c z7)979xu+G2n+4`#sk|Ck0#39CdwLG?sk=q+-+fd2KcShTj{i@p|Y7N%x_GZ-H zt)No~jU(Qct`t{u0HaD}!n9?@n2OwZ7*8!_CeElbBvQQK0v+&}=?1}9+XZ$C2qP;n zDA17`>C`rD;bN)H_Bbtx`&bv5*&jOkBzvTI@5yd@dmxpfZL!r)x|922e|golvw6l+ z)MkK!k#`9i=>uJW6ktwCQ+l`(&^1^Wj5z)wzav5^M=-$eaKG0kClCfBffP}8rofK< z-=jPS$I8AXU|Oq}zPvbJaN78@uy(}YRsc?)jtEnoZx=J_iSx|ZC#%BD)y+G@PxZ{4R!=}oo+p@cw;h+vODAcTpr9`I2U<^4ZOBsN=BWr4TCwR}El0@e!V(xY!CZ)BazPdUM(?P^fY_}r)7Z-p2Lj)JR`;Dd?lCu=dH=x{Q>I7%uimQr zV&cp|wu{9ol`BgM%P$Own|q-26Ds@{2L7*OCwJ>@T=h$IW_s?y`1tJb{kxN6xJ`lI zuj&|c$UWi-y$|o@s)$mDmN0RypZ+KK@%m;$a*x;89X#_PTz~?unlJWroVbf;nflJq{Y{(Qwa}{vCPgNXzqw$V zf^mhN;Yy|tv<}@lEB)2*;K}=r8asGPog-rr{SW@tbyFJjIjZm99>gdM(< z-HyK&@O|^S+n15Eg>1iLW{-cx9DhIo*Aaw+P*lri)N1P+ZLR6@Z>> zXrNtk%t>6_^^T-e0WwWYkDw%OL?AcfSv`0Lns!=JEU+Pka;BMrX{e2_?PYsCkR*&s zNgJFtN+U}R)8r!Nug@ELB56IC!{26>oE9G%xHj}Cr(i1kOAV#*fC~btY@s7B56D3` z>D8}~nFrgq{&-QpdgAda-svv_N(P{!vU_2dqN33sI4#i%mV`?^90}Nn3JJ3OfV~8c zjV9*^vP98U-~n{DH@uKe@jE-yjSv2e?fvzB?V$P)`A2ing@s?aQHup4xM*Qv;pka3 zOIX<7UpTk8*c^JL^Fbim@pSDX!(v%Z+Nqi-szg^C3(I2QJQ|zSlS_h`Ojc1rVE1@T z#k=9H@Arlt-53(Cptm8ZwM(yM%jm?8{XXfa_bziR&HrJXWPTAfIZyNVLoI| zNK#aQwAdZe;RMKi8zMmdVBxIIV>h<61&&=*law@E5bVv^>S|tJhh%E1dpN?SU=4Iv zgn5*s(w2qQS8*<{Ix2$~CboHRuRG&bptQ$SUh7rs*$sq;XFqj#!d3ULAI2$x3VEOd zlw1N&?>qc%w@u!S?-X+GlJ!z*B&Gd^7M!9$88 z3}$h?X~&bRmo_vIj&6)GE&pnIZmqH7LpF#xboMh7Y=TZ0pwpp{-Lc_s=rac3j`P#Y zgf0Q1FpDMo813)x5B=`N5dpJy7MA(aHw5wpL%id-m@@@MvcYsIOalv}&9yqpv)NgD z;mIH;ZRc^B=Rd+;`=5)A-IZ0Z)4=;Wuk=xr&P6hAy(*ABpQf?*eay+q=~q@#$t5%S zBU(&(4+mFby=K2M{(Pj(I$6VOL<_2JSmmoFox+r%x3z^wgkP*q+}{S}AhTkDru`1j zPB7L2GJ=%6K?O;!^Mi&uPw=Fi+p1d%CZ625lznklz{7DqyWN|xw?O=RnEaBFZS;4rV z#|Y;m0fTTq%SUnIBNlS(xSrYWTjV?AqF)e5$u_H^05&{(-Di!1FTeeS|6;kQD2keZ9sb`x2Fetz zQ4L$C|MNhT$dH7z(GloSZ3zh~M4~YC_$R9Z-Q=NQ3jJT04baU-OXEOwV!VsF{T7UU zsg8qqvt-Sw;QKC?jueSUoH35p?VD>}Wp96R6}KrxWu9aiX|Z8aEeh1e2fI>SNXph> z^}&;u&7M3B3YzZu87+(d$cVk0pyXw8BmWv^%bemiwM6I0$gau#X)i8J)!SYBsQz>J z)+mB!TlV`84^=j7TA(lF`yaSVb#5#+>il!ML{I6D!?>fXp4lE`gdYDk_rW0V(dVdw zi4&?58ZPih?fml{c7QdTgMGzszYzuR2*GC7FE+@)D#|1sUgFf}alI_bAt=Egau5I& z92QlI27I^-ZqywTFF3A*v*==p(T>M+Qgi|d$SL|a)_QpjjwPGFlli)PAg|y22>exYpTD~;SM_jm+}c^%d18=mrttMAzJ@hkIHtsA zVGf#qm`EMP8S?QVm%kx?RIgE%wNX=_Cl5(V4zUQm4th{lKm}lD#ybj(EhxA}qLfO| z>A6iMbl+AV3C;{oXHj4@j1E4HPH16aNNKQp@%?e%9VsD^rstPDBL@dgsI~;UjL>)K zco@V3p?cA7+nXvix%acK{NSy3zMSNsN59@`6OMEHhO3HtzF+NCyg3Ou|v*-IRi;MPLp=&TJ z09+0S+vNW})*dqiU}b$7*Z0)L%i-AXmwm=8R3N`GBst_TG{l08i=2-DwY61H++mt) z8X4BcWyU)u*D|=65tvDjvb-x#%C(1KNo{oWq+}h+K6BgnYGLkPn*)BOk=<@CFKeE- zEN-Utillbttwt4ax3BuclVmHN>-UxEnf+lrFnq&v_mK8SHTueRQgbs8((V`~ukLKV zcJZfl4O~U3s$X=Ay}N(qix06s+BlzW2gE0u1@ZC`$Tjv3Hm|6K@4n>?#r0j>USsDo zYTGXR$BFyl0z%jP4($vMgF7sR$~`QUp8+yg3Zo%km_0`>v&(SjC1CZ_rS$coL@qhV z2McN{YKjcm)p1OgSUoq2GLq)uLp#kJpJ4KEEfQSPi&W|2K-Zk;{RYlS1IChDF$oeJ z1LaV!%QRe6-{zprEpi*>Y-3B0i7*hvK(wyZCc%O(wd-H^{M=@yGj-{3lMI3w9~c6w zi~C@X$}ZcZr6XH?o2AfeFzFL>?%`W*__v#r)q_?lW*P$r)~=uMY22R~`En<3x*Pfz zsOSy(&+IF|uiyDOrv&{H9QHeO((F>gVoQ?t<8LoJ6sZ?=uHb{UMcN&n;^y14+!W|T z(0!x07zSM<>Dnv_ty(URb%EJKa@|E2tuZ(uYmPysH_)kQS~o5b6JkC-<>4YltrIw_ zkhQ9yr*&PyWjCwS)vt1ot;hQiFWne-Hj4?_Ir4BxHF9>Q*;hr`1Y=GmK@Vsi1T2Dv zpRx7t*q489$^Fk0^C5fVt}khv9e8?9_qawuT849IgJyHzRqNX~OfO)RibP}dy5S`^ yy&XT{zWH{PopIXNA-_h^0oZ|ZznMep_t^pAe!b9Zg{Eqd!{jI0D}{YS;Qs(Qr<|t% literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactPunch_heavy_001.ogg b/app/static/assets/kenney/audio/impactPunch_heavy_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6655951d3bb43d8b06bd23b8ae60580fd7584406 GIT binary patch literal 10861 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 q>2mVj12YB7FZcXs=ge=;%=egY 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 f{YM4K51%fl%$&G5 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 Aod5s; literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/impactSoft_medium_002.ogg b/app/static/assets/kenney/audio/impactSoft_medium_002.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5409c005dde29cf8de3873cab7f501a12dba9efb GIT binary patch literal 5358 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 W_HQeu@l#6|FHT#NGxcqw+y4P|$;)a0 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/jingles_HIT11.ogg b/app/static/assets/kenney/audio/jingles_HIT11.ogg new file mode 100644 index 0000000000000000000000000000000000000000..72dd8d3b6d9dc8537f029e76344d62f992b1fe64 GIT binary patch literal 17932 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/jingles_HIT15.ogg b/app/static/assets/kenney/audio/jingles_HIT15.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5f0a0e87d1dc3331ad35950f33475eb424191775 GIT binary patch literal 19626 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/kenney/audio/jingles_PIZZI07.ogg b/app/static/assets/kenney/audio/jingles_PIZZI07.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e3f2c49c227328f4de9ba18a79953dff742db2cd GIT binary patch literal 19137 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
Qg>__`WpRJ|_{4&E;tNB)5{QG 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