diff --git a/demos/AOTAI_Hike/INTRODUCTION_EN.md b/demos/AOTAI_Hike/INTRODUCTION_EN.md new file mode 100644 index 000000000..019d86141 --- /dev/null +++ b/demos/AOTAI_Hike/INTRODUCTION_EN.md @@ -0,0 +1,448 @@ +# 鳌太线徒步模拟器(AoTai Hike)Demo + +> A pixel-art interactive narrative game demo based on the MemOS multi-view memory system + +## 📖 Project Overview + +**鳌太线徒步模拟器(AoTai Hike)** is a Web game demo showcasing MemOS’s multi-view memory capabilities. Players can create multiple roles, lead a team across the dangerous AoTai route (a classic hiking trail connecting Ao Mountain and Taibai Mountain), and experience memory-based intelligent NPC dialogues and dynamic storytelling. + +### Key Highlights + +- 🎮 **Multi-role roleplay**: Create and switch between multiple roles, each with an independent memory space +- 🧠 **Multi-view memory**: Fully integrated MemOS multi-view memory system, where each role remembers experiences from their own perspective +- 💬 **Intelligent NPC dialogue**: Generate personality-consistent dialogue based on role memory, world memory, and role persona +- 🗺️ **Fixed route exploration**: Follow the real AoTai route and experience the full journey from Tangkou to Baxian Platform +- 🎨 **Pixel-art UI**: Use Phaser 3 to render pixel-art maps and role animations, paired with a retro chat interface +- 📸 **Sharing feature**: Generate a beautifully designed share image at the end of the game, recording key journey memories + +## 🎯 Core Features + +### 1. Multi-role System + +Players can create multiple roles to form a team, and each role has: + +- **Base attributes**: stamina, mood, experience, risk_tolerance, supplies +- **Role persona**: personality description text used to generate personality-consistent dialogue and behaviors +- **Independent memory space**: each role’s memory is fully isolated and extracted from that role’s first-person perspective + +**Default roles**: +- **阿鳌**: A lantern-bearing pathfinder, cautious and steady, highly experienced +- **太白**: Outwardly a devotee of gear and data, secretly harboring selfish motives +- **小山**: A smiling newcomer with a hidden agenda + +### 2. MemOS Multi-view Memory Integration + +The game fully integrates MemOS’s multi-view memory system: + +#### World Memory +- **Purpose**: Store global game events, accessible to all roles +- **Cube ID**: `cube_{user_id}_world` +- **Content**: game events, scene changes, team decisions, etc. + +#### Role Memory +- **Purpose**: An independent memory space for each role +- **Cube ID**: `cube_{role_id}_{role_id}` +- **Characteristics**: + - Extracted from the role’s first-person perspective + - Only keeps information relevant to that role + - Supports role-personalized dialogue generation + +#### Automatic Multi-view Mode Detection +When a message contains `role_id` or `role_name`, MemOS automatically: +1. Switches to `multi_view` mode +2. Extracts memories from the role’s first-person perspective +3. Filters out irrelevant information +4. Keeps role memories isolated + +### 3. Intelligent NPC Dialogue Generation + +Each NPC’s dialogue is based on: + +- **Role memory**: the role’s own experiences and thoughts +- **World memory**: global game events as context +- **Role persona**: the role’s personality, motives, background +- **Current state**: location, weather, time, team status + +Dialogue generation flow: +``` +1. Retrieve world memory (provides global context) +2. Retrieve role memory (the role's personal experiences) +3. Build system prompt (includes role persona, current state, memory snippets) +4. Call MemOS chat_complete API to generate a reply +5. Write the dialogue back to role memory (multi-view extraction) +``` + +### 4. Gameplay + +#### Core Actions +- **Move Forward (MOVE_FORWARD)**: Move along the route to the next node +- **Rest (REST)**: Rest in place, recover stamina but consume time +- **Camp (CAMP)**: Camp overnight, recover stamina but consume supplies +- **Observe (OBSERVE)**: Observe the surroundings, possibly discovering clues +- **Say (SAY)**: Speak as the active role, triggering NPC responses + +#### Game Phases +- **Free phase (FREE)**: Normal gameplay flow +- **Await player speech (AWAIT_PLAYER_SAY)**: Requires player input dialogue +- **Camp meeting decision (CAMP_MEETING_DECIDE)**: Team discusses the next route step +- **Night vote (NIGHT_VOTE)**: Choose the leader for the night +- **Junction decision (JUNCTION_DECISION)**: Make a choice at route forks + +#### Route System +- **Fixed route**: Designed based on the real AoTai hiking route +- **Key nodes**: Tangkou start → Forest gentle slope → 2800 camp → Stone sea edge → Windy ridge → Daye Lake → Baxian Platform → Finish +- **Bailout points**: Some nodes support descending/retreating, providing different game endings + +### 5. Sharing Feature + +A beautiful share image can be generated after the game ends: + +- **Game result**: successful crossing, mid-route retreat, failure, etc. +- **Journey stats**: total distance, number of days, visited node count +- **Key events**: record important events during the journey +- **Role memory highlights**: key memory snippets extracted from role memories + +## 🏗️ Technical Architecture + +### Backend Architecture + +backend/ +├── aotai_hike/ +│ ├── router.py # FastAPI route definitions +│ ├── schemas.py # Pydantic data models +│ ├── services/ +│ │ └── game_service.py # Core game logic +│ ├── adapters/ +│ │ ├── memory.py # MemOS memory adapter +│ │ ├── companion.py # NPC dialogue generation +│ │ └── background.py # Background asset provider +│ ├── world/ +│ │ └── map_data.py # Map data +│ ├── stores/ +│ │ └── session_store.py # Session storage +│ └── utils/ +│ └── share_image.py # Share image generation +└── app.py # FastAPI app entry + +#### Core Components + +**GameService**: Main game service +- Coordinates game logic and the memory system +- Handles player actions +- Manages game state + +**MemoryAdapter**: Memory adapter +- Wraps MemOS API calls +- Supports multi-view memory writing and retrieval +- Handles world memory and role memory + +**CompanionBrain**: NPC dialogue generation +- Generates dialogue based on role memory +- Uses MemOS chat_complete API +- Supports role switching and memory write-back + +### Frontend Architecture + +frontend/ +├── index.html # Main page +├── main.js # Entry file +├── src/ +│ ├── state.js # State management +│ ├── phaser_view.js # Phaser 3 scene rendering +│ ├── dom.js # DOM UI components +│ ├── actions.js # Action handling +│ ├── render.js # Rendering logic +│ ├── minimap.js # Minimap +│ ├── phase_ui.js # Phase UI +│ └── utils.js # Utilities +├── assets/ # Asset files +│ ├── scenes/ # Scene backgrounds +│ ├── sprites/ # Role sprites +│ └── avatars/ # Role avatars +└── vendor/ # Third-party libraries +└── phaser-3.90.0.min.js # Phaser 3 + +#### Tech Stack + +- **Phaser 3**: Pixel-art map and role animation rendering +- **Vanilla JavaScript**: Lightweight, no build tools required +- **CSS**: Pixel-style UI styling +- **Fetch API**: Communication with backend + +### Memory Flow + +Player performs an action +↓ +GameService.act() +↓ +├─ 1. Execute game logic (update world state) +├─ 2. Write world event memory +│ └─ MemoryAdapter.add_event() +│ └─ MemOSMemoryClient.add_memory() +│ └─ POST /product/add (with role_id/role_name) +│ └─ MemOS automatically enables multi_view mode +│ +├─ 3. Retrieve world memory (as NPC dialogue context) +│ └─ MemoryAdapter.search() +│ └─ MemOSMemoryClient.search_memory() +│ └─ POST /product/search +│ +└─ 4. Generate NPC dialogue +└─ CompanionBrain.generate() +├─ Retrieve role memory (each NPC’s own memory) +├─ Call chat_complete to generate a reply +└─ Write the dialogue back to role memory (multi-view extraction) + +## 🚀 Quick Start + +### Requirements + +- Python 3.8+ +- MemOS service (local or remote) + +### Installation Steps + +1. **Clone repository** +```bash +cd demos/AOTAI_Hike +``` + +2. **Install backend dependencies** +```bash +cd backend +python -m venv .venv +source .venv/bin/activate # Windows: .venv\Scripts\activate +pip install -r requirements.txt +``` + +3. **Configure MemOS service address** +```bash +# Set environment variable (or modify the default in code) +export MEMOS_API_BASE_URL=http://localhost:8002 +``` + +4. **Start backend service** +```bash +uvicorn app:app --host 0.0.0.0 --port 8010 --reload +``` + +5. **Access the game** +Open your browser and visit: `http://localhost:8010/demo/ao-tai/` + +### Development Mode + +Frontend files are located in the `frontend/` directory and can be edited directly. The backend supports hot reload (`--reload` flag). + +## 📡 API Documentation + +### Core Endpoints + +#### 1. Get map information +```http +GET /api/demo/ao-tai/map +``` + +Returns nodes and edges for the fixed route. + +#### 2. Create a new session +```http +POST /api/demo/ao-tai/session/new +Content-Type: application/json + +{ + "user_id": "user_123" +} +``` + +#### 3. Create/Update a role +```http +POST /api/demo/ao-tai/roles/upsert +Content-Type: application/json + +{ + "session_id": "session_123", + "role": { + "role_id": "r_abc", + "name": "Test Role", + "avatar_key": "green", + "persona": "A test role", + "attrs": { + "stamina": 80, + "mood": 70, + "experience": 50, + "risk_tolerance": 60, + "supplies": 75 + } + } +} +``` + +#### 4. Quick-create default roles +```http +POST /api/demo/ao-tai/roles/quickstart +Content-Type: application/json + +{ + "session_id": "session_123", + "overwrite": true +} +``` + +Creates the default 3 roles (阿鳌, 太白, 小山). + +#### 5. Switch active role +```http +PUT /api/demo/ao-tai/session/active_role +Content-Type: application/json + +{ + "session_id": "session_123", + "active_role_id": "r_abc" +} +``` + +#### 6. Perform an action (core endpoint) +```http +POST /api/demo/ao-tai/act +Content-Type: application/json + +{ + "session_id": "session_123", + "action": "MOVE_FORWARD", + "payload": {} +} +``` + +**Supported action types**: +- `MOVE_FORWARD`: Move forward +- `REST`: Rest +- `CAMP`: Camp +- `OBSERVE`: Observe +- `SAY`: Say (requires `payload.text`) +- `DECIDE`: Decide (requires `payload.kind` and specific parameters) + +**Response example**: +```json +{ + "world_state": { + "session_id": "session_123", + "current_node_id": "camp_2800", + "day": 1, + "time_of_day": "afternoon", + "weather": "sunny", + "roles": [...], + "active_role_id": "r_abc" + }, + "messages": [ + { + "message_id": "m_123", + "role_id": "r_abc", + "role_name": "Test Role", + "kind": "speech", + "content": "Let's keep moving!", + "emote": "happy", + "timestamp_ms": 1234567890 + } + ], + "background": { + "scene_id": "camp", + "asset_url": "/assets/scenes/camp.png" + }, + "share_image": { + "is_game_finished": false + } +} +``` + +#### 7. Get share image +```http +GET /api/demo/ao-tai/session/{session_id}/share_image +``` + +Returns the share image after the game ends (PNG format). + +#### 8. Get current share image +```http +GET /api/demo/ao-tai/session/{session_id}/share_image/current +``` + +Returns the share image for the current game state (supports unfinished games). + +## 🎮 Gameplay Guide + +### Starting the Game + +1. **Create a session**: Click "New Game" to create a new session +2. **Create roles**: Use "Quick Start" to create the default 3 roles, or manually create custom roles +3. **Select a role**: Click a role avatar to switch the active role you are playing +4. **Start hiking**: Click the "Move Forward" button to begin the journey + +### Strategy Tips + +- **Stamina management**: Watch stamina values and rest or camp at the right times +- **Weather changes**: Bad weather affects team status +- **Role switching**: Different roles have different attributes and memories; switching roles lets you experience different perspectives +- **Decision timing**: Make decisions at key nodes (e.g., junctions, camps) +- **Memory accumulation**: Each role's memories will influence future dialogue and behavior + +### Game Endings + +- **Successful crossing**: Complete the full route and reach Baxian Platform +- **Mid-route retreat**: Choose to retreat at nodes that support retreat +- **Failure**: The team fails due to poor overall condition + +## 🔧 Configuration & Extension + +### Environment Variables + +- `MEMOS_API_BASE_URL`: MemOS service address (default: `http://0.0.0.0:8002`) + +### Extensible Interfaces + +The game is designed to be "lightweight but extensible"; all intelligence-related features are isolated via adapters: + +1. **MemoryAdapter** (`adapters/memory.py`) + - Can swap in different memory systems + - Supports different memory strategies + +2. **CompanionBrain** (`adapters/companion.py`) + - Currently uses MemOS chat_complete API + - Can be replaced with other LLM services + +3. **BackgroundProvider** (`adapters/background.py`) + - Currently uses static background assets + - Can be replaced with image generation services + +### Custom Roles + +You can create custom roles via the API and set: +- Role name and avatar +- Role persona +- Attribute values (stamina, mood, experience, etc.) + +## 📚 Related Documents + +- [Multi-view memory integration doc](./PR_MULTI_VIEW_MEMORY_INTEGRATION.md) - Detailed technical implementation notes +- [Memory system interaction guide](./backend/MEMORY_INTEGRATION.md) - How the game interacts with the memory system +- [PRD](./PRD.md) - Product requirements document + +## 🎯 Project Goals + +This project aims to demonstrate: + +1. **MemOS multi-view memory capability**: How to create independent memory spaces for multiple roles +2. **Memory-based intelligent dialogue**: How to use memory to generate personality-consistent dialogue +3. **Fusion of games and AI**: How to integrate an AI memory system into gameplay +4. **Extensible architecture**: How to design pluggable adapter interfaces + +## 🤝 Contributing + +Issues and Pull Requests are welcome! + +## 📄 License + +This project follows the license of the MemOS project. + +--- + +**Enjoy your AoTai hike!** 🏔️ diff --git a/demos/AOTAI_Hike/INTRODUCTION_ZH.md b/demos/AOTAI_Hike/INTRODUCTION_ZH.md new file mode 100644 index 000000000..e723dc0fa --- /dev/null +++ b/demos/AOTAI_Hike/INTRODUCTION_ZH.md @@ -0,0 +1,454 @@ +# 鳌太线徒步模拟器(AoTai Hike)Demo + +> 一个基于 MemOS 多视角记忆系统的像素风互动叙事游戏 Demo + +## 📖 项目概述 + +**鳌太线徒步模拟器(AoTai Hike)** 是一个展示 MemOS 多视角记忆能力的 Web 游戏 Demo。玩家可以创建多个角色,带领队伍穿越危险的鳌太线(连接鳌山和太白山的经典徒步路线),体验基于记忆的智能 NPC 对话和动态叙事。 + +### 核心亮点 + +- 🎮 **多角色扮演**:创建并切换多个角色,每个角色拥有独立的记忆空间 +- 🧠 **多视角记忆**:完整集成 MemOS 多视角记忆系统,每个角色从自己的视角记住经历 +- 💬 **智能 NPC 对话**:基于角色记忆、世界记忆和角色人设生成符合性格的对话 +- 🗺️ **固定路线探索**:沿着真实的鳌太线路线,体验从塘口起点到拔仙台的完整旅程 +- 🎨 **像素风格 UI**:使用 Phaser 3 渲染像素风地图和角色动画,搭配复古聊天界面 +- 📸 **分享功能**:游戏结束后生成精美的分享图片,记录旅程关键记忆 + +## 🎯 核心特性 + +### 1. 多角色系统 + +玩家可以创建多个角色组成队伍,每个角色拥有: + +- **基础属性**:体力(stamina)、情绪(mood)、经验(experience)、风险偏好(risk_tolerance)、物资(supplies) +- **角色人设**:性格描述文本,用于生成符合角色的对话和行为 +- **独立记忆空间**:每个角色的记忆完全隔离,从该角色的第一人称视角提取 + +**默认角色**: +- **阿鳌**:持灯的领路者,谨慎稳重,经验丰富 +- **太白**:表面是器材与数据的虔信者,实际暗藏私心 +- **小山**:笑容背后的新人,隐藏着不为人知的目的 + +### 2. MemOS 多视角记忆集成 + +游戏完整集成了 MemOS 的多视角记忆系统: + +#### 世界记忆(World Memory) +- **用途**:存储全局游戏事件,所有角色可访问 +- **Cube ID**:`cube_{user_id}_world` +- **内容**:游戏事件、场景变化、队伍决策等 + +#### 角色记忆(Role Memory) +- **用途**:每个角色独立的记忆空间 +- **Cube ID**:`cube_{role_id}_{role_id}` +- **特点**: + - 从角色第一人称视角提取记忆 + - 只保留与该角色相关的信息 + - 支持角色个性化对话生成 + +#### 自动多视角模式检测 +当消息包含 `role_id` 或 `role_name` 时,MemOS 自动: +1. 切换到 `multi_view` 模式 +2. 从角色第一人称视角提取记忆 +3. 过滤掉不相关的信息 +4. 保持角色记忆隔离 + +### 3. 智能 NPC 对话生成 + +每个 NPC 的对话基于: + +- **角色记忆**:该角色自己的经历和想法 +- **世界记忆**:全局游戏事件作为上下文 +- **角色人设**:角色的性格、动机、背景 +- **当前状态**:位置、天气、时间、队伍状态 + +对话生成流程: +``` +1. 检索世界记忆(提供全局上下文) +2. 检索角色记忆(该角色的个人经历) +3. 构建系统提示(包含角色人设、当前状态、记忆片段) +4. 调用 MemOS chat_complete API 生成回复 +5. 将对话写回角色记忆(多视角提取) +``` + +### 4. 游戏玩法 + +#### 核心动作 +- **前进(MOVE_FORWARD)**:沿着路线前进到下一个节点 +- **休息(REST)**:原地休息,恢复体力但消耗时间 +- **扎营(CAMP)**:扎营过夜,恢复体力但消耗物资 +- **观察(OBSERVE)**:观察周围环境,可能发现线索 +- **发言(SAY)**:当前角色发言,触发 NPC 回应 + +#### 游戏阶段 +- **自由阶段(FREE)**:正常游戏流程 +- **等待玩家发言(AWAIT_PLAYER_SAY)**:需要玩家输入对话 +- **营地决策(CAMP_MEETING_DECIDE)**:队伍讨论下一步路线 +- **夜间投票(NIGHT_VOTE)**:选择当晚的队长 +- **岔路决策(JUNCTION_DECISION)**:在路线分叉处做选择 + +#### 路线系统 +- **固定路线**:基于真实鳌太线路线设计 +- **关键节点**:塘口起点 → 林间缓坡 → 2800营地 → 石海边缘 → 风口山脊 → 大爷海 → 拔仙台 → 终点 +- **下撤点**:部分节点支持下撤,提供不同的游戏结局 + +### 5. 分享功能 + +游戏结束后可以生成精美的分享图片: + +- **游戏结果**:成功穿越、中途下撤、失败等 +- **旅程统计**:总距离、天数、访问节点数 +- **关键事件**:记录旅程中的重要事件 +- **角色记忆亮点**:从角色记忆中提取的关键记忆片段 + +## 🏗️ 技术架构 + +### 后端架构 + +``` +backend/ +├── aotai_hike/ +│ ├── router.py # FastAPI 路由定义 +│ ├── schemas.py # Pydantic 数据模型 +│ ├── services/ +│ │ └── game_service.py # 游戏核心逻辑 +│ ├── adapters/ +│ │ ├── memory.py # MemOS 记忆适配器 +│ │ ├── companion.py # NPC 对话生成 +│ │ └── background.py # 背景资源提供 +│ ├── world/ +│ │ └── map_data.py # 地图数据 +│ ├── stores/ +│ │ └── session_store.py # 会话存储 +│ └── utils/ +│ └── share_image.py # 分享图片生成 +└── app.py # FastAPI 应用入口 +``` + +#### 核心组件 + +**GameService**:游戏主服务 +- 协调游戏逻辑与记忆系统 +- 处理玩家动作 +- 管理游戏状态 + +**MemoryAdapter**:记忆适配器 +- 封装 MemOS API 调用 +- 支持多视角记忆写入和检索 +- 处理世界记忆和角色记忆 + +**CompanionBrain**:NPC 对话生成 +- 基于角色记忆生成对话 +- 使用 MemOS chat_complete API +- 支持角色切换和记忆回写 + +### 前端架构 + +``` +frontend/ +├── index.html # 主页面 +├── main.js # 入口文件 +├── src/ +│ ├── state.js # 状态管理 +│ ├── phaser_view.js # Phaser 3 场景渲染 +│ ├── dom.js # DOM UI 组件 +│ ├── actions.js # 动作处理 +│ ├── render.js # 渲染逻辑 +│ ├── minimap.js # 小地图 +│ ├── phase_ui.js # 阶段 UI +│ └── utils.js # 工具函数 +├── assets/ # 资源文件 +│ ├── scenes/ # 场景背景 +│ ├── sprites/ # 角色精灵 +│ └── avatars/ # 角色头像 +└── vendor/ # 第三方库 + └── phaser-3.90.0.min.js # Phaser 3 +``` + +#### 技术栈 + +- **Phaser 3**:像素风地图和角色动画渲染 +- **原生 JavaScript**:轻量级,无需构建工具 +- **CSS**:像素风格 UI 样式 +- **Fetch API**:与后端通信 + +### 记忆流程 + +``` +玩家执行动作 + ↓ +GameService.act() + ↓ +├─ 1. 执行游戏逻辑(更新世界状态) +├─ 2. 写入世界事件记忆 +│ └─ MemoryAdapter.add_event() +│ └─ MemOSMemoryClient.add_memory() +│ └─ POST /product/add (带 role_id/role_name) +│ └─ MemOS 自动启用 multi_view 模式 +│ +├─ 3. 检索世界记忆(作为 NPC 对话上下文) +│ └─ MemoryAdapter.search() +│ └─ MemOSMemoryClient.search_memory() +│ └─ POST /product/search +│ +└─ 4. 生成 NPC 对话 + └─ CompanionBrain.generate() + ├─ 检索角色记忆(每个 NPC 自己的记忆) + ├─ 调用 chat_complete 生成回复 + └─ 将对话写回角色记忆(多视角提取) +``` + +## 🚀 快速开始 + +### 环境要求 + +- Python 3.8+ +- MemOS 服务(本地或远程) + +### 安装步骤 + +1. **克隆仓库** +```bash +cd demos/AOTAI_Hike +``` + +2. **安装后端依赖** +```bash +cd backend +python -m venv .venv +source .venv/bin/activate # Windows: .venv\Scripts\activate +pip install -r requirements.txt +``` + +3. **配置 MemOS 服务地址** +```bash +# 设置环境变量(或修改代码中的默认值) +export MEMOS_API_BASE_URL=http://localhost:8002 +``` + +4. **启动后端服务** +```bash +uvicorn app:app --host 0.0.0.0 --port 8010 --reload +``` + +5. **访问游戏** +打开浏览器访问:`http://localhost:8010/demo/ao-tai/` + +### 开发模式 + +前端文件位于 `frontend/` 目录,可以直接编辑。后端支持热重载(`--reload` 参数)。 + +## 📡 API 文档 + +### 核心接口 + +#### 1. 获取地图信息 +```http +GET /api/demo/ao-tai/map +``` + +返回固定路线的节点和边信息。 + +#### 2. 创建新会话 +```http +POST /api/demo/ao-tai/session/new +Content-Type: application/json + +{ + "user_id": "user_123" +} +``` + +#### 3. 创建/更新角色 +```http +POST /api/demo/ao-tai/roles/upsert +Content-Type: application/json + +{ + "session_id": "session_123", + "role": { + "role_id": "r_abc", + "name": "测试角色", + "avatar_key": "green", + "persona": "一个测试角色", + "attrs": { + "stamina": 80, + "mood": 70, + "experience": 50, + "risk_tolerance": 60, + "supplies": 75 + } + } +} +``` + +#### 4. 快速创建默认角色 +```http +POST /api/demo/ao-tai/roles/quickstart +Content-Type: application/json + +{ + "session_id": "session_123", + "overwrite": true +} +``` + +创建默认的 3 个角色(阿鳌、太白、小山)。 + +#### 5. 切换当前角色 +```http +PUT /api/demo/ao-tai/session/active_role +Content-Type: application/json + +{ + "session_id": "session_123", + "active_role_id": "r_abc" +} +``` + +#### 6. 执行动作(核心接口) +```http +POST /api/demo/ao-tai/act +Content-Type: application/json + +{ + "session_id": "session_123", + "action": "MOVE_FORWARD", + "payload": {} +} +``` + +**支持的动作类型**: +- `MOVE_FORWARD`:前进 +- `REST`:休息 +- `CAMP`:扎营 +- `OBSERVE`:观察 +- `SAY`:发言(需要 `payload.text`) +- `DECIDE`:决策(需要 `payload.kind` 和具体参数) + +**响应示例**: +```json +{ + "world_state": { + "session_id": "session_123", + "current_node_id": "camp_2800", + "day": 1, + "time_of_day": "afternoon", + "weather": "sunny", + "roles": [...], + "active_role_id": "r_abc" + }, + "messages": [ + { + "message_id": "m_123", + "role_id": "r_abc", + "role_name": "测试角色", + "kind": "speech", + "content": "我们继续前进吧!", + "emote": "happy", + "timestamp_ms": 1234567890 + } + ], + "background": { + "scene_id": "camp", + "asset_url": "/assets/scenes/camp.png" + }, + "share_image": { + "is_game_finished": false + } +} +``` + +#### 7. 获取分享图片 +```http +GET /api/demo/ao-tai/session/{session_id}/share_image +``` + +返回游戏结束后的分享图片(PNG 格式)。 + +#### 8. 获取当前分享图片 +```http +GET /api/demo/ao-tai/session/{session_id}/share_image/current +``` + +返回当前游戏状态的分享图片(支持未完成的游戏)。 + +## 🎮 游戏玩法指南 + +### 开始游戏 + +1. **创建会话**:点击"新建游戏"创建新会话 +2. **创建角色**:使用"快速开始"创建默认 3 个角色,或手动创建自定义角色 +3. **选择角色**:点击角色头像切换当前扮演的角色 +4. **开始徒步**:点击"前进"按钮开始旅程 + +### 游戏策略 + +- **体力管理**:注意角色的体力值,适时休息或扎营 +- **天气变化**:恶劣天气会影响队伍状态 +- **角色切换**:不同角色有不同的属性和记忆,切换角色可以体验不同的视角 +- **决策时机**:在关键节点(如岔路、营地)需要做出决策 +- **记忆积累**:每个角色的记忆会影响后续对话和行为 + +### 游戏结局 + +- **成功穿越**:完成整条路线,到达拔仙台 +- **中途下撤**:在支持下撤的节点选择下撤 +- **失败**:队伍状态过差导致失败 + +## 🔧 配置与扩展 + +### 环境变量 + +- `MEMOS_API_BASE_URL`:MemOS 服务地址(默认:`http://0.0.0.0:8002`) + +### 可扩展接口 + +游戏设计为"轻量但可扩展",所有智能相关功能都通过 adapter 隔离: + +1. **MemoryAdapter** (`adapters/memory.py`) + - 可以替换不同的记忆系统 + - 支持不同的记忆策略 + +2. **CompanionBrain** (`adapters/companion.py`) + - 当前使用 MemOS chat_complete API + - 可以替换为其他 LLM 服务 + +3. **BackgroundProvider** (`adapters/background.py`) + - 当前使用静态背景资源 + - 可以替换为图像生成服务 + +### 自定义角色 + +可以通过 API 创建自定义角色,设置: +- 角色名称和头像 +- 角色人设(persona) +- 属性值(体力、情绪、经验等) + +## 📚 相关文档 + +- [多视角记忆集成文档](./PR_MULTI_VIEW_MEMORY_INTEGRATION.md) - 详细的技术实现说明 +- [记忆系统交互说明](./backend/MEMORY_INTEGRATION.md) - 游戏与记忆系统的交互方式 +- [PRD 文档](./PRD.md) - 项目需求文档 + +## 🎯 项目目标 + +本项目旨在展示: + +1. **MemOS 多视角记忆能力**:如何为多个角色创建独立的记忆空间 +2. **基于记忆的智能对话**:如何利用记忆生成符合角色性格的对话 +3. **游戏与 AI 的融合**:如何将 AI 记忆系统集成到游戏体验中 +4. **可扩展架构**:如何设计可插拔的 adapter 接口 + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 📄 许可证 + +本项目遵循 MemOS 项目的许可证。 + +--- + +**享受你的鳌太线之旅!** 🏔️ diff --git a/demos/AOTAI_Hike/PR_DESCRIPTION.md b/demos/AOTAI_Hike/PR_DESCRIPTION.md new file mode 100644 index 000000000..b4ac72bd8 --- /dev/null +++ b/demos/AOTAI_Hike/PR_DESCRIPTION.md @@ -0,0 +1,73 @@ +# Integrate AoTai Hike Demo with MemOS Multi-View Memory System + +## Summary + +This PR integrates the AoTai Hike game demo with MemOS's multi-view memory capabilities, demonstrating how multiple game roles can maintain independent memory spaces and extract memories from their own first-person perspectives. + +## Key Features + +### 1. Multi-View Memory Integration +- **World Memory**: Stores global game events accessible to all roles (`cube_{user_id}_world`) +- **Role Memory**: Each role has an independent memory space (`cube_{role_id}_{role_id}`) +- **Automatic Mode Detection**: MemOS automatically enables `multi_view` mode when messages contain `role_id` or `role_name` fields + +### 2. Memory Flow +``` +GameService.act + ├─ add_event (world memory write with role_id/role_name) + ├─ search (world memory retrieval) + └─ CompanionBrain.generate + ├─ search_memory (role memory retrieval) + ├─ chat_complete (LLM generation) + └─ add_memory (role memory write-back with multi-view extraction) +``` + +### 3. Core Implementation + +**MemoryAdapter** (`adapters/memory.py`): +- Wraps MemOS API calls (`/product/add`, `/product/search`, `/product/chat/complete`) +- Supports multi-view memory writing and retrieval +- Handles world memory and role memory isolation + +**CompanionBrain** (`adapters/companion.py`): +- Generates NPC dialogue based on role memory +- Uses MemOS `chat_complete` API with role-specific context +- Writes dialogue back to role memory with multi-view extraction + +**GameService** (`services/game_service.py`): +- Coordinates game logic with memory system +- Formats and writes game events to memory +- Retrieves world memory for NPC dialogue context + +## Technical Details + +### Multi-View Memory Detection +When messages contain `role_id` or `role_name`, MemOS automatically: +1. Switches to `multi_view` mode +2. Extracts memories from the role's first-person perspective +3. Filters irrelevant information +4. Maintains role memory isolation + +### Memory Namespace +- Role memory: `cube_{role_id}_{role_id}` +- World memory: `cube_{user_id}_world` + +## Files Changed + +- `demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py` - MemOS memory adapter +- `demos/AOTAI_Hike/backend/aotai_hike/adapters/companion.py` - NPC dialogue generation +- `demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py` - Game service with memory integration +- `demos/AOTAI_Hike/backend/aotai_hike/router.py` - API routes +- `demos/AOTAI_Hike/README.md` - Updated documentation +- `demos/AOTAI_Hike/INTRODUCTION_ZH.md` - Chinese documentation +- `demos/AOTAI_Hike/INTRODUCTION_EN.md` - English documentation + +## Related Issue + +Closes #[ISSUE_NUMBER] + +## Documentation + +- [Memory Integration Guide](./backend/MEMORY_INTEGRATION.md) +- [Complete Introduction (中文)](./INTRODUCTION_ZH.md) +- [Complete Introduction (English)](./INTRODUCTION_EN.md) diff --git a/demos/AOTAI_Hike/README.md b/demos/AOTAI_Hike/README.md new file mode 100644 index 000000000..c9661af51 --- /dev/null +++ b/demos/AOTAI_Hike/README.md @@ -0,0 +1,96 @@ +# 鳌太线徒步模拟器(AoTai Hike)Demo + +> A pixel-art interactive narrative game demo based on the MemOS multi-view memory system + +
+ AoTai Hike × MemOS - Multi-View Memory +
+ +## 📖 Overview + +**鳌太线徒步模拟器(AoTai Hike)** is a Web game demo showcasing MemOS's multi-view memory capabilities. Players can create multiple roles, lead a team across the dangerous AoTai route, and experience memory-based intelligent NPC dialogues and dynamic storytelling. + +### Key Highlights + +- 🎮 **Multi-role roleplay**: Create and switch between multiple roles, each with an independent memory space +- 🧠 **Multi-view memory**: Fully integrated MemOS multi-view memory system +- 💬 **Intelligent NPC dialogue**: Generate personality-consistent dialogue based on role memory +- 🗺️ **Fixed route exploration**: Follow the real AoTai route and experience the full journey +- 🎨 **Pixel-art UI**: Use Phaser 3 to render pixel-art maps and role animations + +**📚 For detailed documentation, see: [INTRODUCTION_ZH.md](./INTRODUCTION_ZH.md) | [INTRODUCTION_EN.md](./INTRODUCTION_EN.md)** + +## 🚀 Quick Start + +### Requirements + +- Python 3.8+ +- MemOS service (local or remote) + +### Installation Steps + +1. **Install backend dependencies** +```bash +cd backend +python -m venv .venv && source .venv/bin/activate +pip install -r requirements.txt +``` + +2. **Configure MemOS service address (optional)** +```bash +export MEMOS_API_BASE_URL=http://localhost:8002 +``` + +3. **Start the service** +```bash +uvicorn app:app --host 0.0.0.0 --port 8010 --reload +``` + +4. **Access the game** +Open your browser and visit: `http://localhost:8010/demo/ao-tai/` + +## 📡 Core API + +- `GET /api/demo/ao-tai/map` - Get map information +- `POST /api/demo/ao-tai/session/new` - Create a new session +- `POST /api/demo/ao-tai/roles/upsert` - Create/Update a role +- `POST /api/demo/ao-tai/roles/quickstart` - Quick-create default roles +- `PUT /api/demo/ao-tai/session/active_role` - Switch active role +- `POST /api/demo/ao-tai/act` - Perform an action (core endpoint) + +For detailed API documentation, see [INTRODUCTION_EN.md](./INTRODUCTION_EN.md#-api-documentation) + +## 🏗️ Project Structure + +``` +demos/AOTAI_Hike/ +├── backend/ # FastAPI backend +│ ├── aotai_hike/ # Game core code +│ │ ├── router.py # API routes +│ │ ├── services/ # Game services +│ │ ├── adapters/ # Adapters (memory/dialogue/background) +│ │ └── world/ # Map data +│ └── app.py # Application entry +├── frontend/ # Frontend (Phaser 3 + DOM UI) +│ ├── src/ # Source code +│ └── assets/ # Asset files +└── README.md # This file +``` + +## 🔧 Extensible Interfaces + +The game is designed to be "lightweight but extensible"; all intelligence-related features are isolated via adapters: + +- `adapters/memory.py` - **MemoryAdapter**: Interface with MemOS memory system +- `adapters/companion.py` - **CompanionBrain**: NPC dialogue generation (based on MemOS chat_complete) +- `adapters/background.py` - **BackgroundProvider**: Background asset provider + +## 📚 Related Documents + +- [INTRODUCTION_ZH.md](./INTRODUCTION_ZH.md) - **Complete project introduction (中文)** +- [INTRODUCTION_EN.md](./INTRODUCTION_EN.md) - **Complete project introduction (English)** +- [backend/MEMORY_INTEGRATION.md](./backend/MEMORY_INTEGRATION.md) - Memory system interaction guide +--- + +**Enjoy your AoTai hike!** 🏔️ diff --git a/demos/AOTAI_Hike/backend/MEMORY_INTEGRATION.md b/demos/AOTAI_Hike/backend/MEMORY_INTEGRATION.md new file mode 100644 index 000000000..04377a0a8 --- /dev/null +++ b/demos/AOTAI_Hike/backend/MEMORY_INTEGRATION.md @@ -0,0 +1,109 @@ +# 游戏系统与记忆系统交互说明(AoTai Hike) + +本文说明 AoTai Hike 中游戏系统与记忆系统的交互方式,并给出关键代码位置。 + +## 总体流程概览 + +一次 `act` 的主链路如下: + +1. 游戏处理阶段门控与动作执行(更新世界状态)。 +2. 写入世界事件记忆(world cube)。 +3. 检索世界记忆,作为 NPC 对话上下文。 +4. 若触发 NPC 对话: + - 每个 NPC 检索自身记忆(role cube) + - 调用 chat 生成回复 + - 将对话写回角色记忆 +5. 写入 `chat_history` 供后续对话使用。 + +## 关键交互点与代码位置 + +### 1) 游戏事件写入(world 记忆) + +- 位置:`GameService.act` +- 作用:把本轮事件结构化写入记忆系统(world cube) + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py` + - `GameService.act()` 内: + - `mem_event = self._format_memory_event(...)` + - `self._memory.add_event(...)` + +### 2) 世界记忆检索(world 记忆) + +- 位置:`GameService.act` +- 作用:为 NPC 对话提供全局上下文 + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py` + - `mem_res = self._memory.search(...)` + +### 3) NPC 对话(角色记忆检索 + chat + 回写) + +- 位置:`MemoryCompanionBrain._generate_role_reply` +- 作用:每个 NPC 走完整记忆链路生成发言 + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/adapters/companion.py` + - `self._memory.search_memory(...)` 角色记忆检索 + - `self._memory.chat_complete(...)` 调用算法 chat + - `self._memory.add_memory(...)` 写回角色记忆 + +### 4) 记忆命名空间(cube_id) + +- 位置:`MemoryNamespace` +- 规则: + - 角色记忆:`cube_{user_id}_{role_id}` + - 世界记忆:`cube_{user_id}_world` + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py` + +### 5) 记忆适配与客户端 + +- 位置:`MemOSMemoryClient` / `MemOSMemoryAdapter` +- 作用:封装 MemOS `/product/add`、`/product/search`、`/product/chat/complete` + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py` + +### 6) 对话历史记录 + +- 位置:`GameService._append_chat_history` +- 作用:将系统/发言消息转为 `chat_history`,供后续对话使用 + +代码位置: +- `demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py` + +## 算法回放脚本(调试用) + +脚本 `algorithm_tuning.py` 以 1:1 的方式调用 `GameService.act`,并打印记忆/对话日志: + +- `demos/AOTAI_Hike/backend/aotai_hike/scripts/algorithm_tuning.py` + +常用参数: +- `--user-id`:指定用户 +- `--base-url`:MemOS 服务地址 +- `--log-world-search`:打印 world 搜索 +- `--log-full-prompt`:打印完整 prompt + +## 简要链路图 + +``` +GameService.act + ├─ add_event (world add) + ├─ search (world search) + └─ MemoryCompanionBrain.generate + ├─ search_memory (role search) + ├─ chat_complete (LLM) + └─ add_memory (role add) +``` + +## 多视角记忆集成 + +本游戏完整集成了 MemOS 的多视角记忆系统,实现了每个角色拥有独立记忆空间、从角色视角提取记忆的功能。 + +**核心特性**: +- ✅ 自动多视角模式检测(通过 `role_id` 和 `role_name` 字段) +- ✅ 角色记忆隔离(每个角色独立的记忆空间) +- ✅ 第一人称视角记忆提取 +- ✅ 基于记忆的智能 NPC 对话生成 diff --git a/demos/AOTAI_Hike/backend/aotai_hike/__init__.py b/demos/AOTAI_Hike/backend/aotai_hike/__init__.py new file mode 100644 index 000000000..849bcd96c --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/__init__.py @@ -0,0 +1 @@ +"""AoTai line pixel-hiking demo (single-player, multi-role).""" diff --git a/demos/AOTAI_Hike/backend/aotai_hike/adapters/background.py b/demos/AOTAI_Hike/backend/aotai_hike/adapters/background.py new file mode 100644 index 000000000..d5b103992 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/adapters/background.py @@ -0,0 +1,144 @@ +from __future__ import annotations + +import os +import zlib + +from dataclasses import dataclass +from pathlib import Path +from typing import ClassVar +from urllib.parse import quote + +from aotai_hike.schemas import BackgroundAsset + + +@dataclass +class BackgroundRequest: + scene_id: str + style: str = "pixel" + animate: bool = False + + +class BackgroundProvider: + def get_background(self, req: BackgroundRequest) -> BackgroundAsset: + raise NotImplementedError + + +class StaticBackgroundProvider(BackgroundProvider): + """Pick a background from the user's local pixel asset library. + + Rules (demo-friendly): + - Prefer user-provided raster assets under `frontend/assets/` (png/jpg/webp/gif). + - Exclude avatars and legacy `bg_*.svg`. + - Deterministically map `scene_id` -> one asset, so the same scene is stable. + + You can refine selection by setting env vars: + - AOTAI_BG_INCLUDE: substring that must appear in filename (case-insensitive) + - AOTAI_BG_EXCLUDE: substring that must NOT appear in filename (case-insensitive) + """ + + _IMG_EXTS: ClassVar[frozenset[str]] = frozenset( + {".png", ".jpg", ".jpeg", ".webp", ".gif", ".svg"} + ) + + def __init__( + self, + *, + base_url: str = "/demo/ao-tai/assets", + assets_dir: Path | None = None, + ): + self._base_url = base_url.rstrip("/") + + if assets_dir is None: + # .../AOTAI_Hike/backend/aotai_hike/adapters/background.py -> parents[3] is demo root + assets_dir = Path(__file__).resolve().parents[3] / "frontend" / "assets" + self._assets_dir = assets_dir + + inc = os.getenv("AOTAI_BG_INCLUDE", "") + exc = os.getenv("AOTAI_BG_EXCLUDE", "tilemap") + self._include = inc.strip().lower() if inc else "" + self._exclude = exc.strip().lower() if exc else "" + + self._candidates = self._discover_candidates() + + def _discover_candidates(self) -> list[str]: + if not self._assets_dir.exists(): + return [] + + out: list[str] = [] + for p in sorted(self._assets_dir.rglob("*")): + if not p.is_file(): + continue + if p.suffix.lower() not in self._IMG_EXTS: + continue + + rel = p.relative_to(self._assets_dir).as_posix() + low = rel.lower() + + # Skip avatars + if low.startswith("avatars/"): + continue + + # Skip legacy demo backgrounds + if low.startswith("bg_") and low.endswith(".svg"): + continue + + # Optional include/exclude substrings + if self._include and (self._include not in low): + continue + if self._exclude and (self._exclude in low): + continue + + # Skip mock-up style sheets by default + if "mock up" in low or "mock_up" in low: + continue + + out.append(rel) + + # If filtering is too strict and yields nothing, fall back to all non-avatar images except legacy bg_*.svg + if not out: + for p in sorted(self._assets_dir.rglob("*")): + if not p.is_file(): + continue + if p.suffix.lower() not in self._IMG_EXTS: + continue + rel = p.relative_to(self._assets_dir).as_posix() + low = rel.lower() + if low.startswith("avatars/"): + continue + if low.startswith("bg_") and low.endswith(".svg"): + continue + out.append(rel) + + return out + + def _pick(self, scene_id: str) -> str | None: + if not self._candidates: + return None + h = zlib.crc32(scene_id.encode("utf-8")) + return self._candidates[h % len(self._candidates)] + + def get_background(self, req: BackgroundRequest) -> BackgroundAsset: + chosen = self._pick(req.scene_id) + if not chosen: + # last resort: legacy + return BackgroundAsset( + scene_id=req.scene_id, + asset_url=f"{self._base_url}/bg_{req.scene_id}.svg", + type="svg", + meta={"style": req.style, "animate": req.animate, "fallback": True}, + ) + + ext = Path(chosen).suffix.lower().lstrip(".") + # URL encode each segment (handles spaces) + encoded = "/".join(quote(seg) for seg in chosen.split("/")) + return BackgroundAsset( + scene_id=req.scene_id, + asset_url=f"{self._base_url}/{encoded}", + type=ext if ext in {"png", "jpg", "jpeg", "webp", "gif", "svg"} else "none", + meta={ + "style": req.style, + "animate": req.animate, + "picked": chosen, + "candidates": len(self._candidates), + }, + ) diff --git a/demos/AOTAI_Hike/backend/aotai_hike/adapters/companion.py b/demos/AOTAI_Hike/backend/aotai_hike/adapters/companion.py new file mode 100644 index 000000000..d2b8cffe3 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/adapters/companion.py @@ -0,0 +1,730 @@ +from __future__ import annotations + +import random +import time + +from dataclasses import dataclass +from typing import Any, ClassVar + +from aotai_hike.adapters.memory import MemoryNamespace, MemOSMemoryClient +from aotai_hike.schemas import Message, Role, WorldState +from aotai_hike.theme import ( + _lang, + _theme, + companion_action_labels, + companion_action_message_content, + format_user_action_for_memory, + mem_leader_vote_player_chose, + mem_leader_vote_search_prefix, + mem_player_action_label, + mem_round_event_header, + mem_round_no_dialogue, + mem_round_no_npc, + mem_search_weather_time, + mem_speaker_action, + mem_speaker_said, + prompt_bailout_suffix, + prompt_dialogue_prefix_narrator, + prompt_dialogue_prefix_teammate, + prompt_dialogue_prefix_you, + prompt_leader_line, + prompt_location_line, + prompt_night_vote_intro, + prompt_night_vote_output_requirement, + prompt_night_vote_query, + prompt_no_key_dialogue, + prompt_no_recent_dialogue, + prompt_none, + prompt_player_role_line, + prompt_role_focus_line, + prompt_route_line, + prompt_section_candidates, + prompt_section_dialogue, + prompt_section_memories, + prompt_story_context_line, + prompt_terrain_hint_none, + prompt_unknown_altitude, +) +from aotai_hike.world.map_data import get_graph + + +@dataclass +class CompanionOutput: + messages: list[Message] + requires_player_say: bool = False + + +class CompanionBrain: + def generate( + self, + *, + world_state: WorldState, + active_role: Role | None, + memory_snippets: list[str], + user_action: str, + ) -> CompanionOutput: + raise NotImplementedError + + def leader_vote( + self, + *, + world_state: WorldState, + voter: Role, + candidates: list[Role], + player_vote_id: str | None = None, + ) -> tuple[str | None, str]: + raise NotImplementedError + + +class MockCompanionBrain(CompanionBrain): + _EMOTES: ClassVar[tuple[str, ...]] = ("calm", "tired", "happy", "panic", "focused", "grumpy") + _ACTION_TAGS: ClassVar[tuple[str, ...]] = ( + "walk", + "sit", + "lookaround", + "adjust_pack", + "drink", + "check_map", + ) + + def __init__(self, seed: int | None = None): + self._rng = random.Random(seed) + + def generate( + self, + *, + world_state: WorldState, + active_role: Role | None, + memory_snippets: list[str], + user_action: str, + ) -> CompanionOutput: + now_ms = int(time.time() * 1000) + active_id = active_role.role_id if active_role else None + others = [r for r in world_state.roles if r.role_id != active_id] + if not others: + return CompanionOutput(messages=[]) + + # --- "step chat" cadence --- + # - Always at least 1 NPC speaks (if there is any NPC). + # - After the first speaker, other NPCs may speak in a random order with a probability. + first = self._rng.choice(others) + rest = [r for r in others if r.role_id != first.role_id] + self._rng.shuffle(rest) + follow_p = 0.45 + speakers = [first] + [r for r in rest if self._rng.random() < follow_p] + lang = _lang(world_state) + mem_hint = "" + if memory_snippets: + hint = memory_snippets[-1] + mem_hint = f"(想起:{hint[:24]}…)" if lang != "en" else f"(Recall: {hint[:24]}…)" + + templates = [ + "这段路感觉{adj},我们保持节奏。", + "我有点{adj},但还能撑。{mem}", + "风好大,注意别走散。{mem}", + "我看前面地形有变化,慢一点。{mem}", + "要不要{suggestion}一下?", + ] + adjs = ["稳", "吃力", "顺", "危险", "安静", "诡异"] + suggestions = ["休息", "补水", "检查路线", "扎营", "等等队友"] + if lang == "en": + templates = [ + "This stretch feels {adj}; let's keep the pace.", + "I'm a bit {adj}, but I can manage. {mem}", + "The wind is strong; stay close. {mem}", + "The terrain ahead looks different; slow down. {mem}", + "Want to {suggestion}?", + ] + adjs = ["steady", "rough", "smooth", "risky", "quiet", "eerie"] + suggestions = ["rest", "rehydrate", "check the route", "camp", "wait for others"] + + out: list[Message] = [] + action_labels = companion_action_labels(lang) + for sp in speakers: + t = self._rng.choice(templates) + text = ( + t.replace("{adj}", self._rng.choice(adjs)) + .replace("{suggestion}", self._rng.choice(suggestions)) + .replace("{mem}", mem_hint) + ) + out.append( + Message( + message_id=f"m-{world_state.session_id}-{now_ms}-{sp.role_id}", + role_id=sp.role_id, + role_name=sp.name, + kind="speech", + content=text, + emote=self._rng.choice(self._EMOTES), + action_tag=None, + timestamp_ms=now_ms, + ) + ) + out.append( + Message( + message_id=f"a-{world_state.session_id}-{now_ms}-{sp.role_id}", + role_id=sp.role_id, + role_name=sp.name, + kind="action", + content=companion_action_message_content( + lang, sp.name, self._rng.choice(action_labels) + ), + emote=None, + action_tag=self._rng.choice(self._ACTION_TAGS), + timestamp_ms=now_ms, + ) + ) + # Some turns require the player to respond before the world can proceed. + require_p = 0.22 + requires_player_say = bool(active_role) and (self._rng.random() < require_p) + return CompanionOutput(messages=out, requires_player_say=requires_player_say) + + +@dataclass +class MemoryChatConfig: + memory_top_k: int = 5 + history_max_items: int = 20 + mode: str = "fine" + max_response_chars: int = 180 + + +class MemoryCompanionBrain(CompanionBrain): + _EMOTES: ClassVar[tuple[str, ...]] = ("calm", "tired", "happy", "panic", "focused", "grumpy") + _ACTION_TAGS: ClassVar[tuple[str, ...]] = ( + "walk", + "sit", + "lookaround", + "adjust_pack", + "drink", + "check_map", + ) + + def __init__( + self, + *, + memory: MemOSMemoryClient, + config: MemoryChatConfig | None = None, + seed: int | None = None, + ): + self._memory = memory + self._rng = random.Random(seed) + self._config = config or MemoryChatConfig() + + def generate( + self, + *, + world_state: WorldState, + active_role: Role | None, + memory_snippets: list[str], + user_action: str, + ) -> CompanionOutput: + now_ms = int(time.time() * 1000) + active_id = active_role.role_id if active_role else None + others = [r for r in world_state.roles if r.role_id != active_id] + if not others: + return CompanionOutput(messages=[]) + + first = self._rng.choice(others) + rest = [r for r in others if r.role_id != first.role_id] + self._rng.shuffle(rest) + follow_p = 0.45 + speakers = [first] + [r for r in rest if self._rng.random() < follow_p] + + base_history = list(world_state.chat_history or []) + current_history: list[dict[str, Any]] = list(base_history) + + out: list[Message] = [] + for sp in speakers: + text = self._generate_role_reply( + world_state=world_state, + role=sp, + user_action=user_action, + world_memories=memory_snippets, + history=current_history, + ) + if not text: + continue + speech_msg = Message( + message_id=f"m-{world_state.session_id}-{now_ms}-{sp.role_id}", + role_id=sp.role_id, + role_name=sp.name, + kind="speech", + content=text, + emote=self._rng.choice(self._EMOTES), + action_tag=None, + timestamp_ms=now_ms, + ) + action_labels = companion_action_labels(_lang(world_state)) + action_msg = Message( + message_id=f"a-{world_state.session_id}-{now_ms}-{sp.role_id}", + role_id=sp.role_id, + role_name=sp.name, + kind="action", + content=companion_action_message_content( + _lang(world_state), sp.name, self._rng.choice(action_labels) + ), + emote=None, + action_tag=self._rng.choice(self._ACTION_TAGS), + timestamp_ms=now_ms, + ) + out.append(speech_msg) + out.append(action_msg) + + current_history = list(current_history) + current_history.append( + { + "role": "assistant", + "content": text, + "speaker_name": sp.name, + "kind": "speech", + "chat_time": self._format_time_ms(), + } + ) + + if out: + round_mem = self._format_round_memory(world_state, out, user_action=user_action) + chat_time = self._format_time_ms() + for role in world_state.roles or []: + cube_id = MemoryNamespace.role_cube_id(user_id=role.role_id, role_id=role.role_id) + self._memory.add_memory( + user_id=role.role_id, + cube_id=cube_id, + session_id=world_state.session_id, + async_mode="async", + mode=self._config.mode, + messages=[ + { + "role": "user", + "content": round_mem, + "chat_time": chat_time, + "role_id": role.role_id, + "role_name": role.name, + } + ], + info={ + "event": "npc_round", + "user_action": format_user_action_for_memory( + _lang(world_state), user_action + ), + "weather": world_state.weather, + "time_of_day": world_state.time_of_day, + "scene_id": world_state.current_node_id, + }, + ) + + require_p = 0.22 + requires_player_say = bool(active_role) and (self._rng.random() < require_p) + return CompanionOutput(messages=out, requires_player_say=requires_player_say) + + def leader_vote( + self, + *, + world_state: WorldState, + voter: Role, + candidates: list[Role], + player_vote_id: str | None = None, + ) -> tuple[str | None, str]: + lang = _lang(world_state) + if ( + player_vote_id + and world_state.active_role_id + and voter.role_id == world_state.active_role_id + ): + return player_vote_id, mem_leader_vote_player_chose(lang) + + cube_id = MemoryNamespace.role_cube_id(user_id=voter.role_id, role_id=voter.role_id) + + search_query = ( + f"{voter.persona} {mem_leader_vote_search_prefix(lang)}" + f"{mem_search_weather_time(lang, world_state.weather, world_state.time_of_day)}" + ) + memories = self._memory.search_memory( + user_id=voter.role_id, + cube_id=cube_id, + query=search_query, + top_k=self._config.memory_top_k, + session_id=world_state.session_id, + ).snippets + + cand_lines = [] + cand_ids: list[str] = [] + for r in candidates: + cand_ids.append(r.role_id) + cand_lines.append(f"- {r.name} (id={r.role_id}):{r.persona}") + candidates_block = "\n".join(cand_lines) + + lang = _lang(world_state) + history = list(world_state.chat_history or [])[-8:] + dialogue_lines: list[str] = [] + for h in history: + content = str(h.get("content") or "").strip() + if not content: + continue + speaker_name = str(h.get("speaker_name") or "").strip() + role_tag = str(h.get("role") or "").strip() or "assistant" + if role_tag == "system": + prefix = prompt_dialogue_prefix_narrator(lang) + elif role_tag == "user": + prefix = prompt_dialogue_prefix_you(lang) + else: + prefix = ( + f"[{speaker_name}]" if speaker_name else prompt_dialogue_prefix_teammate(lang) + ) + dialogue_lines.append(f"{prefix}{content}") + dialogue_block = ( + "\n".join(dialogue_lines) if dialogue_lines else prompt_no_recent_dialogue(lang) + ) + + memories_block = ( + "\n".join(f"- {m}" for m in memories[:8]) if memories else prompt_none(lang) + ) + system_prompt = ( + prompt_night_vote_intro(lang) + f"{prompt_section_candidates(lang)}\n" + f"{candidates_block}\n\n" + f"{prompt_section_memories(lang)}\n" + f"{memories_block}\n\n" + f"{prompt_section_dialogue(lang)}\n" + f"{dialogue_block}\n\n" + f"{prompt_night_vote_output_requirement(lang)}" + ) + + vote_query = prompt_night_vote_query(lang, voter.name) + + raw = self._memory.chat_complete( + user_id=voter.role_id, + cube_id=cube_id, + query=vote_query, + system_prompt=system_prompt, + history=None, + session_id=world_state.session_id, + top_k=1, + mode=self._config.mode, + add_message_on_answer=False, + ) + raw = (raw or "").strip() + + vote_id, reason = self._parse_leader_vote_response(raw, candidates_ids=cand_ids) + return vote_id, reason + + def _generate_role_reply( + self, + *, + world_state: WorldState, + role: Role, + user_action: str, + world_memories: list[str], + history: list[dict[str, Any]] | None = None, + ) -> str: + lang = _lang(world_state) + user_action_str = format_user_action_for_memory(lang, user_action) + + cube_id = MemoryNamespace.role_cube_id(user_id=role.role_id, role_id=role.role_id) + search_query = f"{role.persona} {user_action_str}{mem_search_weather_time(lang, world_state.weather, world_state.time_of_day)}" + memories = self._memory.search_memory( + user_id=role.role_id, + cube_id=cube_id, + query=search_query, + top_k=self._config.memory_top_k, + session_id=world_state.session_id, + ).snippets + combined_memories = [*world_memories, *memories] + + if history is None: + history = list(world_state.chat_history or []) + system_prompt = self._build_system_prompt( + world_state=world_state, + role=role, + memories=combined_memories, + history=history, + ) + + response = self._memory.chat_complete( + user_id=role.role_id, + cube_id=cube_id, + query=user_action_str, + system_prompt=system_prompt, + history=None, + session_id=world_state.session_id, + top_k=1, + mode=self._config.mode, + add_message_on_answer=False, + ) + response = (response or "").strip() + if not response: + return "" + + if len(response) > self._config.max_response_chars: + response = response[: self._config.max_response_chars].rstrip() + "…" + return response + + def _format_round_memory( + self, world_state: WorldState, messages: list[Message], *, user_action: str + ) -> str: + """Compress all NPC dialogues and actions in this round into a single memory entry (lang-aware).""" + lang = _lang(world_state) + if not messages: + return mem_round_no_npc(lang) + + try: + node = get_graph(_theme(world_state)).get_node(world_state.current_node_id) + location_name = node.name if node else world_state.current_node_id + except Exception: + location_name = world_state.current_node_id + + header = ( + mem_round_event_header( + lang, location_name, world_state.weather, world_state.time_of_day + ) + + mem_player_action_label(lang) + + format_user_action_for_memory(lang, user_action) + + "." + ) + + lines: list[str] = [] + teammate = "teammate" if lang == "en" else "队员" + for m in messages: + speaker = m.role_name or m.role_id or teammate + if m.kind == "speech": + lines.append(f"{speaker}{mem_speaker_said(lang)}{m.content}") + elif m.kind == "action": + lines.append(f"{speaker}{mem_speaker_action(lang)}{m.content}") + + body = " ".join(lines) if lines else mem_round_no_dialogue(lang) + return f"{header} {body}" + + def _build_system_prompt( + self, + *, + world_state: WorldState, + role: Role, + memories: list[str], + history: list[dict[str, Any]] | None = None, + ) -> str: + lang = _lang(world_state) + # Get current node name + altitude + terrain hint + try: + node = get_graph(_theme(world_state)).get_node(world_state.current_node_id) + location_name = node.name if node else world_state.current_node_id + altitude = ( + f"{node.altitude_m}m" + if node and getattr(node, "altitude_m", None) is not None + else prompt_unknown_altitude(lang) + ) + terrain_hint = getattr(node, "hint", "") or "" + except Exception: + location_name = world_state.current_node_id + altitude = prompt_unknown_altitude(lang) + terrain_hint = "" + + # Build NPC info section (current role + other roles) + all_roles = world_state.roles or [] + npc_info_lines = [] + for r in all_roles: + attrs = r.attrs + if lang == "en": + npc_info_lines.append( + f"```|<{r.name}>|\n" + f"# {r.name} persona: {r.persona}\n" + f"State: stamina{attrs.stamina}/100, mood{attrs.mood}/100, exp{attrs.experience}/100, risk{attrs.risk_tolerance}/100, supplies{attrs.supplies}/100\n" + f"```" + ) + else: + npc_info_lines.append( + f"```|<{r.name}>|\n" + f"# {r.name}设定:{r.persona}\n" + f"当前状态:体力{attrs.stamina}/100,情绪{attrs.mood}/100,经验{attrs.experience}/100,风险偏好{attrs.risk_tolerance}/100,物资{attrs.supplies}/100\n" + f"```" + ) + npc_info_section = "\n".join(npc_info_lines) + # Build memories section + mem_lines = "\n".join(f"- {m}" for m in memories[:12]) if memories else prompt_none(lang) + + # Build recent dialogue section (who said what). + recent_history = (history or [])[-8:] + dialogue_lines_b: list[str] = [] + for h in recent_history: + content = str(h.get("content") or "").strip() + if not content: + continue + role_tag = str(h.get("role") or "").strip() or "assistant" + speaker_name = str(h.get("speaker_name") or "").strip() + if role_tag == "system": + prefix = "|<" + prompt_dialogue_prefix_narrator(lang).strip("[]") + ">|" + elif role_tag == "user": + prefix = "|<" + prompt_dialogue_prefix_you(lang).strip("[]") + ">|" + else: + prefix = ( + f"|<{speaker_name}>|" + if speaker_name + else "|<" + prompt_dialogue_prefix_teammate(lang).strip("[]") + ">|" + ) + dialogue_lines_b.append(f"{prefix}{content}") + dialogue_block = ( + "\n".join(dialogue_lines_b) if dialogue_lines_b else prompt_no_key_dialogue(lang) + ) + + # Get active role name + active_role = next((r for r in all_roles if r.role_id == world_state.active_role_id), None) + active_name = active_role.name if active_role else ("Player" if lang == "en" else "玩家") + + # Build story background + leader_role = next((r for r in all_roles if r.role_id == world_state.leader_role_id), None) + leader_name = leader_role.name if leader_role else ("Unknown" if lang == "en" else "未知") + + # Build simple textual map overview and mark current node. + route_nodes = [ + "start", + "slope_forest", + "camp_2800", + "stone_sea", + "ridge_wind", + "da_ye_hai", + "ba_xian_tai", + "end_exit", + ] + # Map of mainline nodes to their bailout exits + bailout_map = { + "camp_2800": "bailout_2800", + "ridge_wind": "bailout_ridge", + } + + def _label_node(nid: str) -> str: + try: + n = get_graph(_theme(world_state)).get_node(nid) + base = n.name + except Exception: + base = nid + if nid == world_state.current_node_id: + return f"[{base}]" + return base + + def _format_route_node(nid: str) -> str: + label = _label_node(nid) + if nid in bailout_map: + bailout_id = bailout_map[nid] + bailout_label = _label_node(bailout_id) + return f"{label}{prompt_bailout_suffix(lang, bailout_label)}" + return label + + mainline_str = " → ".join(_format_route_node(nid) for nid in route_nodes) + terrain_str = terrain_hint or prompt_terrain_hint_none(lang) + + if lang == "en": + return ( + "# Task\n" + "You are the narrative engine of an interactive story. Based on the script, character settings and context, respond to user input. Keep logic and character consistency.\n" + "1. Flow: your output -> other characters -> ... -> your output -> user input.\n" + "2. Each output should acknowledge the user, advance the plot, and set up the next step.\n" + "3. Keep reply under 120 words.\n" + "\n" + "(expression) dialogue\n" + "\n\n" + "\n" + f"{npc_info_section}\n" + "\n\n" + "\n" + f"{prompt_story_context_line(lang, world_state.day, world_state.time_of_day, world_state.weather)}" + f"{prompt_location_line(lang, location_name, altitude, terrain_str)}" + f"{prompt_leader_line(lang, leader_name)}" + f"{prompt_player_role_line(lang, active_name)}" + f"{prompt_role_focus_line(lang, role.name)}" + f"{prompt_route_line(lang, mainline_str)}" + "\n\n" + "\n" + f"{dialogue_block}\n" + "\n\n" + "\n" + f"{mem_lines}\n" + "\n\n" + "# Output rules\n" + "1. Keep plot logic and character consistency.\n" + "2. Speak according to character persona and growth.\n" + '3. Address the user as "you"; do not speak for the user.\n' + f"4. Current speaker is {role.name}; respond as {role.name}.\n" + "5. Create tension and choices around characters' goals; reveal gradually.\n" + "6. Weave in weather, time, location and state naturally.\n" + "7. Keep tone natural and concise.\n" + ) + + return ( + "# 任务描述\n" + "你是互动剧情游戏的叙事引擎,根据提供的剧本/<本章剧情>、人物设定/<主演NPC信息介绍>和上下文,针对用户输入进行情节演绎。输出内容须符合剧本描述,逻辑连贯,人物发言符合其设定和成长轨迹。\n" + "1. 游戏流程:你的输出->其他角色输入->...->你的输出->用户输入。\n" + "2. 每次输出应:对用户输入有承接、中段推进剧情、末段提供铺垫,确保用户有明确目标感。\n" + "3. 回复的字数不超过120字。\n" + "<符号与格式>\n" + "(神态描写)台词\n" + "\n\n" + "<你的信息介绍>\n" + f"{npc_info_section}\n" + "\n\n" + "<故事背景>\n" + f"{prompt_story_context_line(lang, world_state.day, world_state.time_of_day, world_state.weather)}" + f"{prompt_location_line(lang, location_name, altitude, terrain_str)}" + f"{prompt_leader_line(lang, leader_name)}" + f"{prompt_player_role_line(lang, active_name)}" + f"{prompt_role_focus_line(lang, role.name)}" + f"{prompt_route_line(lang, mainline_str)}" + "\n\n" + "<对话记录>\n" + f"{dialogue_block}\n" + "\n\n" + "<相关记忆>\n" + f"{mem_lines}\n" + "\n\n" + "# 剧情输出规则\n" + "1. 保持情节逻辑、人物塑造与情感连贯性\n" + "2. 发言符合人物设定和成长轨迹,包括表面人设与隐藏动机。\n" + '3. 以用户为核心展开剧情,使用"你"指代用户,禁止代替用户发言或使用"用户"一词。\n' + f"4. 当前发言角色是{role.name},请以{role.name}的身份和口吻进行回应。\n" + "5. 在推进剧情时,要有意识地围绕各角色的真实目的制造冲突与选择,但不要一次性泄露全部真相,应通过多轮对话逐步显露。\n" + "6. 结合当前天气、时间、位置和角色状态,让事件合理发生,例如在恶劣天气或体力不足时暴露队伍分歧或私心。\n" + "7. 回复用简短自然的口吻,不要罗列条目。" + ) + + @staticmethod + def _parse_leader_vote_response( + text: str, *, candidates_ids: list[str] + ) -> tuple[str | None, str]: + if not text: + return None, "" + + cleaned = text.strip() + if cleaned.startswith("```"): + cleaned = cleaned.strip("`") + lines = cleaned.splitlines() + if lines and lines[0].lstrip().startswith("json"): + lines = lines[1:] + cleaned = "\n".join(lines).strip() + + import json + + try: + data = json.loads(cleaned) + if isinstance(data, list) and data: + data = data[0] + except Exception: + data = None + + vote_id: str | None = None + reason: str = "" + + if isinstance(data, dict): + if isinstance(data.get("vote_role_id"), str): + vote_id = data.get("vote_role_id") or None + elif isinstance(data.get("leader_role_id"), str): + vote_id = data.get("leader_role_id") or None + if isinstance(data.get("reason"), str): + reason = data.get("reason") or "" + + # Validate that vote_id is in the candidates list + if vote_id not in candidates_ids: + vote_id = None + + if not reason: + reason = cleaned if len(cleaned) <= 80 else cleaned[:80] + "…" + + return vote_id, reason + + @staticmethod + def _format_time_ms() -> str: + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) diff --git a/demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py b/demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py new file mode 100644 index 000000000..f08c4d61e --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/adapters/memory.py @@ -0,0 +1,289 @@ +from __future__ import annotations + +import json + +from dataclasses import dataclass +from typing import Any + +import requests + +from loguru import logger + + +@dataclass +class MemorySearchResult: + snippets: list[str] + + +@dataclass(frozen=True) +class MemoryNamespace: + @staticmethod + def role_cube_id(*, user_id: str, role_id: str) -> str: + return f"cube_{user_id}_{role_id}" + + @staticmethod + def world_cube_id(*, user_id: str) -> str: + return f"cube_{user_id}_world" + + +class MemOSMemoryClient: + def __init__( + self, + *, + base_url: str, + timeout_s: float = 20.0, + default_mode: str = "fine", + default_top_k: int = 5, + ): + self._base_url = base_url.rstrip("/") + self._timeout_s = timeout_s + self._default_mode = default_mode + self._default_top_k = default_top_k + + def add_memory( + self, + *, + user_id: str, + cube_id: str, + memory_content: str | None = None, + messages: list[dict[str, Any]] | None = None, + session_id: str | None = None, + async_mode: str = "async", + mode: str | None = None, + info: dict[str, Any] | None = None, + custom_tags: list[str] | None = None, + chat_history: list[dict[str, Any]] | None = None, + source: str | None = None, + ) -> None: + payload: dict[str, Any] = { + "user_id": user_id, + "writable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + "async_mode": async_mode, + } + if session_id: + payload["session_id"] = session_id + if mode: + payload["mode"] = mode + if memory_content: + payload["memory_content"] = memory_content + if messages: + payload["messages"] = messages + if chat_history is not None: + payload["chat_history"] = chat_history + if info: + payload["info"] = info + if custom_tags: + payload["custom_tags"] = custom_tags + if source: + payload["source"] = source + self._post("/product/add", payload) + + def search_memory( + self, + *, + user_id: str, + cube_id: str, + query: str, + top_k: int | None = None, + session_id: str | None = None, + ) -> MemorySearchResult: + payload: dict[str, Any] = { + "user_id": user_id, + "query": query, + "top_k": top_k if top_k is not None else self._default_top_k, + "readable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + } + if session_id: + payload["session_id"] = session_id + data = self._post("/product/search", payload) + snippets: list[str] = [] + try: + mem_data = (data or {}).get("data", {}) + for entry in mem_data.get("text_mem", []) or []: + for mem in entry.get("memories", []) or []: + text = mem.get("memory") + if text: + snippets.append(text) + except Exception: + logger.exception("Failed to parse search response") + return MemorySearchResult(snippets=snippets) + + def chat_complete( + self, + *, + user_id: str, + cube_id: str, + query: str, + system_prompt: str | None = None, + history: list[dict[str, Any]] | None = None, + session_id: str | None = None, + top_k: int | None = None, + mode: str | None = None, + add_message_on_answer: bool = False, + model_name_or_path: str | None = None, + temperature: float | None = None, + max_tokens: int | None = None, + ) -> str: + safe_top_k = self._default_top_k if top_k is None else max(1, int(top_k)) + payload: dict[str, Any] = { + "user_id": user_id, + "query": query, + "readable_cube_ids": [cube_id], + "writable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + "top_k": safe_top_k, + "mode": mode or self._default_mode, + "add_message_on_answer": add_message_on_answer, + } + if system_prompt: + payload["system_prompt"] = system_prompt + if history is not None: + payload["history"] = history + if session_id: + payload["session_id"] = session_id + if model_name_or_path: + payload["model_name_or_path"] = model_name_or_path + if temperature is not None: + payload["temperature"] = temperature + if max_tokens is not None: + payload["max_tokens"] = max_tokens + data = self._post("/product/chat/complete", payload) + return ((data or {}).get("data") or {}).get("response") or "" + + def _post(self, path: str, payload: dict[str, Any]) -> dict[str, Any]: + url = f"{self._base_url}{path}" + pretty = json.dumps(payload, ensure_ascii=False, indent=2) + logger.info("[MemOS] POST {} payload:\n{}", url, pretty) + system_prompt = payload.get("system_prompt") + if isinstance(system_prompt, str): + logger.info("[MemOS] system_prompt:\n{}", system_prompt) + resp = requests.post( + url, + headers={"Content-Type": "application/json"}, + data=json.dumps(payload), + timeout=self._timeout_s, + ) + if resp.status_code >= 400: + logger.error("MemOS error {}: {}", resp.status_code, resp.text) + resp.raise_for_status() + try: + post_results = resp.json() + pretty_resp = json.dumps(post_results, ensure_ascii=False, indent=2) + logger.info("[MemOS] POST {} response:\n{}", url, pretty_resp) + return post_results + except Exception: + logger.error("Invalid MemOS response: {}", resp.text) + + +class MemoryAdapter: + def add_event( + self, + *, + user_id: str, + session_id: str, + content: str, + role_id: str | None = None, + role_name: str | None = None, + ) -> None: + raise NotImplementedError + + def search( + self, *, user_id: str, session_id: str, query: str, top_k: int = 5 + ) -> MemorySearchResult: + raise NotImplementedError + + +class InMemoryMemoryAdapter(MemoryAdapter): + def __init__(self): + self._items: list[tuple[str, str, str]] = [] + + def add_event( + self, + *, + user_id: str, + session_id: str, + content: str, + role_id: str | None = None, + role_name: str | None = None, + ) -> None: + # For in-memory adapter we ignore role info, but keep API compatible + self._items.append((user_id, session_id, content)) + + def search( + self, *, user_id: str, session_id: str, query: str, top_k: int = 5 + ) -> MemorySearchResult: + snippets: list[str] = [] + for uid, sid, c in reversed(self._items): + if uid == user_id and sid == session_id: + snippets.append(c) + if len(snippets) >= top_k: + break + return MemorySearchResult(snippets=list(reversed(snippets))) + + +class MemOSMemoryAdapter(MemoryAdapter): + def __init__(self, client: MemOSMemoryClient): + self._client = client + + def add_event( + self, + *, + user_id: str, + session_id: str, + content: str, + role_id: str | None = None, + role_name: str | None = None, + ) -> None: + effective_user_id = role_id or user_id + + if role_id: + cube_id = MemoryNamespace.role_cube_id(user_id=effective_user_id, role_id=role_id) + else: + cube_id = MemoryNamespace.world_cube_id(user_id=effective_user_id) + + logger.info( + "[MemOS][add_event] user_id={} effective_user_id={} role_id={} role_name={} cube_id={}", + user_id, + effective_user_id, + role_id, + role_name, + cube_id, + ) + + msg: dict[str, Any] = {"role": "user", "content": content} + # Attach multi-view fields so mem_reader can detect per-role memories when needed + if role_id is not None: + msg["role_id"] = role_id + if role_name is not None: + msg["role_name"] = role_name + self._client.add_memory( + user_id=effective_user_id, + cube_id=cube_id, + session_id=session_id, + messages=[msg], + async_mode="async", + mode="fine", + source="aotai_hike_world", + ) + + def search( + self, *, user_id: str, session_id: str, query: str, top_k: int = 5 + ) -> MemorySearchResult: + cube_id = MemoryNamespace.world_cube_id(user_id=user_id) + logger.info( + "[MemOS][search] user_id={} cube_id={} session_id={} top_k={} query={}", + user_id, + cube_id, + session_id, + top_k, + query, + ) + return self._client.search_memory( + user_id=user_id, + cube_id=cube_id, + query=query, + top_k=top_k, + session_id=session_id, + ) diff --git a/demos/AOTAI_Hike/backend/aotai_hike/router.py b/demos/AOTAI_Hike/backend/aotai_hike/router.py new file mode 100644 index 000000000..28d9514b0 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/router.py @@ -0,0 +1,608 @@ +from __future__ import annotations + +import base64 +import os +import uuid + +from fastapi import APIRouter, HTTPException +from fastapi.responses import Response +from loguru import logger + +from aotai_hike.adapters.background import BackgroundRequest, StaticBackgroundProvider +from aotai_hike.adapters.companion import MemoryCompanionBrain +from aotai_hike.adapters.memory import MemoryNamespace, MemOSMemoryAdapter, MemOSMemoryClient +from aotai_hike.schemas import ( + ActRequest, + ActResponse, + BackgroundAsset, + MapResponse, + Role, + RoleAttrs, + RolesQuickstartRequest, + RoleUpsertRequest, + RoleUpsertResponse, + SessionNewRequest, + SessionNewResponse, + SetActiveRoleRequest, + SetSessionLangRequest, + SetSessionThemeRequest, + ShareImageData, + WorldState, +) +from aotai_hike.services.game_service import GameService +from aotai_hike.stores.session_store import InMemorySessionStore +from aotai_hike.utils.share_image import generate_share_image +from aotai_hike.world.map_data import ( + AOTAI_EDGE_LABELS_EN, + AOTAI_NODE_NAMES_EN, + get_graph, +) + + +router = APIRouter(prefix="/api/demo/ao-tai", tags=["AoTai Demo"]) + +_sessions = InMemorySessionStore() +_background = StaticBackgroundProvider() +_memory_client = MemOSMemoryClient(base_url=os.getenv("MEMOS_API_BASE_URL", "http://0.0.0.0:8001")) +_game = GameService( + memory=MemOSMemoryAdapter(_memory_client), + companion=MemoryCompanionBrain(memory=_memory_client), + background=_background, +) + +# Default 3 roles per theme (server-owned config). One map = one set of default personas. +# Each set has zh and en versions (name + persona). + +# 鳌太线 (AoTai): 阿鳌/太白/小山 — zh & en name + persona +_AOTAI_ROLES: list[dict] = [ + { + "name": "阿鳌", + "name_en": "Ao", + "avatar_key": "green", + "persona_zh": "阿鳌:持灯的领路者,熟知鳌太古道与太白山脉。谨慎、稳重,誓要带队抵达太白之巅。", + "persona_en": "Ao: The guide with the lamp. Knows the AoTai trail and Taibai range. Cautious and steady, determined to lead the team to the summit.", + "attrs": { + "stamina": 85, + "mood": 65, + "experience": 45, + "risk_tolerance": 30, + "supplies": 85, + }, + }, + { + "name": "太白", + "name_en": "Taibai", + "avatar_key": "blue", + "persona_zh": '太白:表面是器材与数据的虔信者,经验丰厚、言辞克制。暗闻2800下撤口藏有金矿,欲借"体力不支"脱队潜行。', + "persona_en": "Taibai: On the surface a believer in gear and data, experienced and reserved. Secretly heard of a stash at the evacuation point and plans to slip away by feigning exhaustion.", + "attrs": { + "stamina": 60, + "mood": 70, + "experience": 50, + "risk_tolerance": 55, + "supplies": 75, + }, + }, + { + "name": "小山", + "name_en": "Xiaoshan", + "avatar_key": "red", + "persona_zh": "小山:笑容背后的新人徒步者,乐观只是外壳。多年前真主在2800下撤口埋下金矿,此行只为取回;若同伴相助便分金,不助则将其永远留在此地。", + "persona_en": "Xiaoshan: A newcomer behind the smile; optimism is just a shell. Years ago something was left at the evacuation point; this trek is to retrieve it. Help and share; refuse and be left behind forever.", + "attrs": { + "stamina": 75, + "mood": 80, + "experience": 15, + "risk_tolerance": 75, + "supplies": 70, + }, + }, +] + +# 乞力马扎罗 (Kilimanjaro): 利奥/Leo, 山姆/Sam, 杰德/Jade — zh & en name + persona +_KILI_ROLES: list[dict] = [ + { + "name_zh": "利奥", + "name_en": "Leo", + "avatar_key": "green", + "persona_zh": "利奥:持灯的领队,熟悉乞力马扎罗路线与高山环境。谨慎稳重,立志带队登顶。", + "persona_en": "Leo: The guide with the lamp. Knows the Kilimanjaro routes and the mountain. Cautious and steady, determined to lead the team to the summit.", + "attrs": { + "stamina": 85, + "mood": 65, + "experience": 45, + "risk_tolerance": 30, + "supplies": 85, + }, + }, + { + "name_zh": "山姆", + "name_en": "Sam", + "avatar_key": "blue", + "persona_zh": "山姆:表面信奉装备与数据,经验丰富、言辞克制。暗中听说某下撤点有藏物,欲借「体力不支」脱队独行。", + "persona_en": "Sam: On the surface a believer in gear and data, experienced and reserved. Secretly heard of a stash at the evacuation point and plans to slip away by feigning exhaustion.", + "attrs": { + "stamina": 60, + "mood": 70, + "experience": 50, + "risk_tolerance": 55, + "supplies": 75, + }, + }, + { + "name_zh": "杰德", + "name_en": "Jade", + "avatar_key": "red", + "persona_zh": "杰德:笑容背后的新人,乐观只是外壳。多年前在某下撤点留下东西,此行要取回;相助则分享,不助则永留此地。", + "persona_en": "Jade: A newcomer behind the smile; optimism is just a shell. Years ago something was left at the evacuation point; this trek is to retrieve it. Help and share; refuse and be left behind forever.", + "attrs": { + "stamina": 75, + "mood": 80, + "experience": 15, + "risk_tolerance": 75, + "supplies": 70, + }, + }, +] + + +def _get_default_roles(theme: str | None, lang: str | None) -> list[dict]: + """One map = one set of default roles. theme=kili -> Kilimanjaro set; theme=aotai -> AoTai set. Persona by lang.""" + if theme == "kili": + use_zh = lang == "zh" + return [ + { + "name": r["name_zh"] if use_zh else r["name_en"], + "avatar_key": r["avatar_key"], + "persona": r["persona_zh"] if use_zh else r["persona_en"], + "attrs": r["attrs"], + } + for r in _KILI_ROLES + ] + use_zh = lang != "en" + return [ + { + "name": r["name_en"] if lang == "en" else r["name"], + "avatar_key": r["avatar_key"], + "persona": r["persona_zh"] if use_zh else r["persona_en"], + "attrs": r["attrs"], + } + for r in _AOTAI_ROLES + ] + + +def _get_ws(session_id: str) -> WorldState: + ws = _sessions.get(session_id) + if ws is None: + raise HTTPException(status_code=404, detail=f"Unknown session_id: {session_id}") + return ws + + +@router.get("/map", response_model=MapResponse) +def get_map(theme: str | None = None, lang: str | None = None): + graph = get_graph(theme) + nodes = list(graph.nodes()) + edges = list(graph.edges()) + # When theme is aotai and lang is en, return English node names and edge labels + if theme == "aotai" and lang == "en": + nodes = [ + n.model_copy(update={"name": AOTAI_NODE_NAMES_EN.get(n.node_id, n.name)}) for n in nodes + ] + edges = [ + e.model_copy( + update={"label": AOTAI_EDGE_LABELS_EN.get((e.from_node_id, e.to_node_id), e.label)} + ) + for e in edges + ] + return MapResponse(start_node_id=graph.start_node_id, nodes=nodes, edges=edges) + + +@router.get("/background/{scene_id}", response_model=BackgroundAsset) +def get_background(scene_id: str): + return _background.get_background(BackgroundRequest(scene_id=scene_id)) + + +@router.post("/session/new", response_model=SessionNewResponse) +def session_new(req: SessionNewRequest): + ws = _sessions.new_session(user_id=req.user_id, lang=req.lang, theme=req.theme) + _sessions.save(ws) + return SessionNewResponse(session_id=ws.session_id, world_state=ws) + + +@router.get("/session/{session_id}", response_model=WorldState) +def get_session(session_id: str): + return _get_ws(session_id) + + +@router.put("/session/lang", response_model=WorldState) +def set_session_lang(req: SetSessionLangRequest): + ws = _get_ws(req.session_id) + ws.lang = req.lang + _sessions.save(ws) + return ws + + +@router.put("/session/theme", response_model=WorldState) +def set_session_theme(req: SetSessionThemeRequest): + ws = _get_ws(req.session_id) + ws.theme = req.theme + _sessions.save(ws) + return ws + + +@router.post("/roles/upsert", response_model=RoleUpsertResponse) +def roles_upsert(req: RoleUpsertRequest): + ws = _get_ws(req.session_id) + existing_ids = {r.role_id for r in ws.roles} + is_new_role = req.role.role_id not in existing_ids + + resp = _game.upsert_role(ws, req) + + if is_new_role: + role = req.role + cube_id = MemoryNamespace.role_cube_id(user_id=role.role_id, role_id=role.role_id) + intro = ( + f"Role: {role.name}. Persona: {role.persona or 'No setting'}." + if ws.lang == "en" + else f"角色名:{role.name}。人设:{role.persona or '暂无设定'}。" + ) + _memory_client.add_memory( + user_id=role.role_id, + cube_id=cube_id, + session_id=req.session_id, + messages=[ + { + "role": "user", + "content": intro, + "role_id": role.role_id, + "role_name": role.name, + } + ], + async_mode="async", + mode="fine", + source="aotai_hike_role_init", + ) + _sessions.save(ws) + return resp + + +@router.post("/roles/quickstart", response_model=RoleUpsertResponse) +def roles_quickstart(req: RolesQuickstartRequest): + """ + Create the default 3 roles for a session. + This keeps the default role configuration on the backend. + """ + ws = _get_ws(req.session_id) + + if req.overwrite: + ws.roles = [] + ws.active_role_id = None + + # If not overwriting, only add defaults that don't already exist by name. + existing_names = {r.name for r in ws.roles} + default_roles = _get_default_roles(ws.theme, ws.lang) + + new_roles: list[Role] = [] + for tmpl in default_roles: + if not req.overwrite and tmpl["name"] in existing_names: + continue + # Get attrs from template - _DEFAULT_ROLES should always have "attrs" key with a dict + # For default roles, attrs MUST exist, so use direct access instead of .get() + logger.info( + f"[roles_quickstart] Processing template for role: {tmpl.get('name')}, template keys: {list(tmpl.keys())}" + ) + if "attrs" not in tmpl or not isinstance(tmpl["attrs"], dict): + logger.error( + f"Missing or invalid attrs for default role: {tmpl.get('name')}, tmpl={tmpl}" + ) + raise ValueError(f"Default role {tmpl.get('name')} is missing 'attrs' key") + attrs_dict = tmpl["attrs"] + logger.info(f"[roles_quickstart] attrs_dict for {tmpl['name']}: {attrs_dict}") + # Create RoleAttrs directly from template dict - this preserves all custom values from _DEFAULT_ROLES + # The attrs_dict should contain all 5 fields: stamina, mood, experience, risk_tolerance, supplies + # Use **attrs_dict to unpack all values directly from the template + role_attrs = RoleAttrs(**attrs_dict) + # Debug: verify attrs were set correctly + logger.info( + f"[roles_quickstart] RoleAttrs created for {tmpl['name']}: stamina={role_attrs.stamina}, mood={role_attrs.mood}, experience={role_attrs.experience}, risk_tolerance={role_attrs.risk_tolerance}, supplies={role_attrs.supplies}" + ) + role = Role( + role_id=f"r_{uuid.uuid4().hex[:8]}", + name=tmpl["name"], + avatar_key=tmpl.get("avatar_key") or "default", + persona=tmpl.get("persona") or "", + attrs=role_attrs, + ) + # Verify role.attrs after creation + logger.info( + f"[roles_quickstart] Role {role.name} created with attrs: stamina={role.attrs.stamina}, mood={role.attrs.mood}, experience={role.attrs.experience}, risk_tolerance={role.attrs.risk_tolerance}, supplies={role.attrs.supplies}" + ) + # Pass the role to upsert_role - it should preserve custom attrs since they don't match defaults + _game.upsert_role(ws, RoleUpsertRequest(session_id=req.session_id, role=role)) + # Get the role from world_state after upsert to ensure we have the final version + # (in case upsert_role modified it, though it shouldn't for default roles) + updated_role = next((r for r in ws.roles if r.role_id == role.role_id), role) + new_roles.append(updated_role) + + for role in new_roles: + cube_id = MemoryNamespace.role_cube_id(user_id=role.role_id, role_id=role.role_id) + intro = ( + f"Role: {role.name}. Persona: {role.persona or 'No setting'}." + if ws.lang == "en" + else f"角色名:{role.name}。人设:{role.persona or '暂无设定'}。" + ) + _memory_client.add_memory( + user_id=role.role_id, + cube_id=cube_id, + session_id=req.session_id, + messages=[ + { + "role": "user", + "content": intro, + "role_id": role.role_id, + "role_name": role.name, + } + ], + async_mode="async", + mode="fine", + source="aotai_hike_role_init", + ) + + _sessions.save(ws) + return RoleUpsertResponse(roles=ws.roles, active_role_id=ws.active_role_id) + + +@router.put("/session/active_role", response_model=WorldState) +def set_active_role(req: SetActiveRoleRequest): + ws = _get_ws(req.session_id) + ws = _game.set_active_role(ws, req) + _sessions.save(ws) + return ws + + +@router.post("/act", response_model=ActResponse) +def act(req: ActRequest): + ws = _get_ws(req.session_id) + resp = _game.act(ws, req) + _sessions.save(ws) + + # Check if game is finished and generate share image + share_result = generate_share_image(ws) + if share_result: + image_bytes, json_data = share_result + image_base64 = base64.b64encode(image_bytes).decode("utf-8") + resp.share_image = ShareImageData( + image_base64=image_base64, + json_data=json_data, + is_game_finished=True, + ) + else: + resp.share_image = ShareImageData(is_game_finished=False) + + return resp + + +@router.get("/session/{session_id}/share_image") +def get_share_image(session_id: str): + """ + Get share image for a finished game session. + Returns PNG image that can be downloaded. + """ + ws = _get_ws(session_id) + share_result = generate_share_image(ws) + if share_result is None: + raise HTTPException(status_code=404, detail="Game is not finished yet") + + image_bytes, _ = share_result + return Response(content=image_bytes, media_type="image/png") + + +@router.get("/session/{session_id}/share_data") +def get_share_data(session_id: str): + """ + Get structured JSON data for a finished game session. + """ + ws = _get_ws(session_id) + share_result = generate_share_image(ws) + if share_result is None: + raise HTTPException(status_code=404, detail="Game is not finished yet") + + _, json_data = share_result + return json_data + + +@router.get("/session/{session_id}/share_image/current") +def get_current_share_image(session_id: str): + """ + Get share image for current game state (works for both finished and in-progress games). + This endpoint can be called at any time to generate an up-to-date share image. + Returns PNG image that can be displayed in a modal/popup. + """ + ws = _get_ws(session_id) + active_role_id = ws.active_role_id or (ws.roles[0].role_id if ws.roles else None) + highlights: list[str] = [] + if active_role_id: + try: + cube_id = MemoryNamespace.role_cube_id(user_id=active_role_id, role_id=active_role_id) + res = _memory_client.search_memory( + user_id=active_role_id, + cube_id=cube_id, + query="关键记忆", + top_k=2, + session_id=ws.session_id, + ) + for txt in res.snippets[:2]: + s = str(txt or "").strip() + if not s: + continue + if len(s) > 24: + s = s[:24] + "…" + highlights.append(s) + except Exception: + highlights = [] + + ws.stats.memory_highlights = highlights + + from aotai_hike.utils.share_image import generate_current_share_image + + image_bytes, json_data = generate_current_share_image(ws) + return Response(content=image_bytes, media_type="image/png") + + +@router.get("/session/{session_id}/share_data/current") +def get_current_share_data(session_id: str): + """ + Get structured JSON data for current game state (works for both finished and in-progress games). + This endpoint can be called at any time to get up-to-date share data. + """ + from aotai_hike.utils.share_image import generate_current_share_image + + ws = _get_ws(session_id) + _, json_data = generate_current_share_image(ws) + return json_data + + +@router.get("/test/share_image") +def get_test_share_image(): + """ + Generate a test share image for preview purposes. + Creates a mock finished game state and returns the share image. + """ + from aotai_hike.schemas import Role, RoleAttrs + from aotai_hike.utils.share_image import GameOutcome, ShareImageGenerator + from aotai_hike.world.map_data import get_graph + + graph = get_graph("zh") # Test uses AoTai map + # Create mock world state with finished game + roles = [ + Role( + role_id="r_test_001", + name="阿鳌", + avatar_key="green", + persona="阿鳌:持灯的领路者,熟知鳌太古道与太白山脉。谨慎、稳重,誓要带队抵达太白之巅。", + attrs=RoleAttrs( + stamina=65, + mood=70, + experience=40, + risk_tolerance=35, + supplies=60, + ), + ), + Role( + role_id="r_test_002", + name="太白", + avatar_key="blue", + persona='太白:表面是器材与数据的虔信者,经验丰厚、言辞克制。暗闻2800下撤口藏有金矿,欲借"体力不支"脱队潜行。', + attrs=RoleAttrs( + stamina=58, + mood=65, + experience=45, + risk_tolerance=45, + supplies=55, + ), + ), + Role( + role_id="r_test_003", + name="小山", + avatar_key="red", + persona="小山:笑容背后的新人徒步者,乐观只是外壳。多年前真主在2800下撤口埋下金矿,此行只为取回。", + attrs=RoleAttrs( + stamina=72, + mood=75, + experience=15, + risk_tolerance=65, + supplies=70, + ), + ), + ] + + visited_nodes = [ + "start", + "slope_forest", + "camp_2800", + "stone_sea", + "ridge_wind", + "da_ye_hai", + "ba_xian_tai", + "end_exit", + ] + + # Calculate total distance + total_distance = 0.0 + for i in range(len(visited_nodes) - 1): + from_id = visited_nodes[i] + to_id = visited_nodes[i + 1] + edges = graph.outgoing(from_id) + for edge in edges: + if edge.to_node_id == to_id: + total_distance += getattr(edge, "distance_km", 1.0) + break + + try: + current_node = graph.get_node("end_exit") + current_node_name = current_node.name + except Exception: + current_node_name = "end_exit" + + outcome = GameOutcome( + is_success=True, + outcome_type="cross_success", + total_distance_km=total_distance, + current_node_id="end_exit", + current_node_name=current_node_name, + days_spent=3, + roles=roles, + visited_nodes=visited_nodes, + journey_summary={ + "total_nodes_visited": len(visited_nodes), + "key_events": [ + "队伍从塘口起点出发", + "经过林间缓坡,天气转好", + "在2800营地扎营休息", + "继续前进,遇到石海", + "成功穿越风口山脊", + "抵达大爷海", + "登顶拔仙台", + "完成穿越,安全下撤", + ], + "final_weather": "sunny", + "final_time": "morning", + }, + is_finished=True, + failure_reason=None, + ) + + # Create mock world state for generator + mock_world_state = WorldState( + session_id="test_session", + user_id="test_user", + roles=roles, + current_node_id="end_exit", + visited_node_ids=visited_nodes, + day=3, + time_of_day="morning", + weather="sunny", + recent_events=[ + "队伍从塘口起点出发", + "经过林间缓坡,天气转好", + "在2800营地扎营休息", + "继续前进,遇到石海", + "成功穿越风口山脊", + "抵达大爷海", + "登顶拔仙台", + "完成穿越,安全下撤", + ], + ) + + try: + generator = ShareImageGenerator() + image_bytes, _ = generator.generate(mock_world_state, outcome) + return Response(content=image_bytes, media_type="image/png") + except Exception as e: + from loguru import logger + + logger.exception("Failed to generate test share image") + raise HTTPException( + status_code=500, + detail=f"Failed to generate test image: {e!s}", + ) from e diff --git a/demos/AOTAI_Hike/backend/aotai_hike/schemas.py b/demos/AOTAI_Hike/backend/aotai_hike/schemas.py new file mode 100644 index 000000000..df52bdfc6 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/schemas.py @@ -0,0 +1,218 @@ +from __future__ import annotations + +from enum import Enum +from typing import Any, Literal + +from pydantic import BaseModel, Field + + +class ActionType(str, Enum): + CONTINUE = "CONTINUE" + MOVE_FORWARD = "MOVE_FORWARD" + REST = "REST" + CAMP = "CAMP" + OBSERVE = "OBSERVE" + SAY = "SAY" + DECIDE = "DECIDE" + + +class Phase(str, Enum): + FREE = "free" + AWAIT_PLAYER_SAY = "await_player_say" + AWAIT_CAMP_DECISION = "await_camp_decision" # After SAY, leader can choose to camp + NIGHT_WAIT_PLAYER = "night_wait_player" + NIGHT_VOTE_READY = "night_vote_ready" + CAMP_MEETING_DECIDE = "camp_meeting_decide" + JUNCTION_DECISION = "junction_decision" + + +class LockStrength(str, Enum): + SOFT = "soft" + HARD = "hard" + IRON = "iron" + + +class CampMeetingState(BaseModel): + active: bool = False + options_next_node_ids: list[str] = Field(default_factory=list) + proposals_order_role_ids: list[str] = Field(default_factory=list) + proposed_at_ms: int | None = None + + +class AoTaiNode(BaseModel): + node_id: str + name: str + altitude_m: int | None = None + scene_id: str = Field(..., description="Background scene identifier") + hint: str | None = None + + # For frontend map rendering (0-100 coordinate space, scaled by client) + x: int = Field(0, ge=0, le=100) + y: int = Field(0, ge=0, le=100) + kind: Literal["main", "camp", "lake", "peak", "exit", "junction", "start", "end"] = "main" + + +class AoTaiEdge(BaseModel): + from_node_id: str + to_node_id: str + kind: Literal["main", "branch", "exit"] = "main" + label: str | None = None + distance_km: float = Field(1.0, gt=0, description="Distance along this segment (km)") + + +class RoleAttrs(BaseModel): + stamina: int = Field(70, ge=0, le=100) + mood: int = Field(60, ge=0, le=100) + experience: int = Field(10, ge=0, le=100) + risk_tolerance: int = Field(50, ge=0, le=100) + supplies: int = Field(80, ge=0, le=100, description="物资储备,扎营会消耗物资") + + +class Role(BaseModel): + role_id: str + name: str + avatar_key: str = "default" + persona: str = "普通徒步爱好者,话不多但靠谱。" + attrs: RoleAttrs = Field(default_factory=RoleAttrs) + + +class WorldStats(BaseModel): + """Aggregated stats for share-card / summary.""" + + total_distance_km: float = 0.0 + decision_times: int = 0 + leader_times: int = 0 + vote_times: int = 0 + bad_weather_steps: int = 0 + memory_highlights: list[str] = Field(default_factory=list) + + +class WorldState(BaseModel): + session_id: str + user_id: str + lang: Literal["zh", "en"] = "zh" + theme: Literal["aotai", "kili"] = "aotai" + + active_role_id: str | None = None + roles: list[Role] = Field(default_factory=list) + + # Party governance / phase machine + phase: Phase = Phase.FREE + leader_role_id: str | None = None + lock_strength: LockStrength = LockStrength.SOFT + consensus_next_node_id: str | None = None + camp_meeting: CampMeetingState = Field(default_factory=CampMeetingState) + + # Aggregated stats for summary/share-card + stats: WorldStats = Field(default_factory=WorldStats) + + # Map state (graph-based) + current_node_id: str = "start" + visited_node_ids: list[str] = Field(default_factory=lambda: ["start"]) + available_next_node_ids: list[str] = Field(default_factory=list) + + # Transit state (step-by-step walking) + in_transit_from_node_id: str | None = None + in_transit_to_node_id: str | None = None + in_transit_progress_km: float = 0.0 + in_transit_total_km: float = 0.0 + + # Backward compatibility: interpreted as progress count + route_node_index: int = 0 + + day: int = 1 + time_of_day: Literal["morning", "noon", "afternoon", "evening", "night"] = "morning" + time_step_counter: int = 0 + weather: Literal["sunny", "cloudy", "windy", "rainy", "snowy", "foggy"] = "rainy" + recent_events: list[str] = Field(default_factory=list) + chat_history: list[dict[str, str]] = Field(default_factory=list) + + +class Message(BaseModel): + message_id: str + role_id: str | None = None + role_name: str | None = None + kind: Literal["system", "speech", "action"] = "speech" + content: str + emote: str | None = None + action_tag: str | None = None + timestamp_ms: int + + +class BackgroundAsset(BaseModel): + scene_id: str + asset_url: str | None = None + type: Literal["svg", "png", "gif", "spritesheet", "none"] = "none" + meta: dict[str, Any] = Field(default_factory=dict) + + +class MapResponse(BaseModel): + start_node_id: str + nodes: list[AoTaiNode] + edges: list[AoTaiEdge] + + +class SessionNewRequest(BaseModel): + user_id: str = "demo_user" + seed: int | None = None + lang: Literal["zh", "en"] | None = None + theme: Literal["aotai", "kili"] | None = None + + +class SessionNewResponse(BaseModel): + session_id: str + world_state: WorldState + + +class RoleUpsertRequest(BaseModel): + session_id: str + role: Role + + +class RoleUpsertResponse(BaseModel): + roles: list[Role] + active_role_id: str | None = None + + +class RolesQuickstartRequest(BaseModel): + session_id: str + overwrite: bool = Field( + default=False, + description="If true, replace existing roles with the default 3 roles.", + ) + + +class SetActiveRoleRequest(BaseModel): + session_id: str + active_role_id: str + + +class SetSessionLangRequest(BaseModel): + session_id: str + lang: Literal["zh", "en"] + + +class SetSessionThemeRequest(BaseModel): + session_id: str + theme: Literal["aotai", "kili"] + + +class ActRequest(BaseModel): + session_id: str + action: ActionType + payload: dict[str, Any] = Field(default_factory=dict) + + +class ShareImageData(BaseModel): + """Share image data when game ends.""" + + image_base64: str | None = None + json_data: dict[str, Any] | None = None + is_game_finished: bool = False + + +class ActResponse(BaseModel): + world_state: WorldState + messages: list[Message] + background: BackgroundAsset + share_image: ShareImageData | None = None diff --git a/demos/AOTAI_Hike/backend/aotai_hike/scripts/__init__.py b/demos/AOTAI_Hike/backend/aotai_hike/scripts/__init__.py new file mode 100644 index 000000000..3ff374df1 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/scripts/__init__.py @@ -0,0 +1 @@ +"""Local scripts for tuning AoTai Hike algorithms.""" diff --git a/demos/AOTAI_Hike/backend/aotai_hike/scripts/algorithm_tuning.py b/demos/AOTAI_Hike/backend/aotai_hike/scripts/algorithm_tuning.py new file mode 100644 index 000000000..a1aa349eb --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/scripts/algorithm_tuning.py @@ -0,0 +1,464 @@ +#!/usr/bin/env python3 + +""" +Algorithm script that 1:1 replays the online AoTai Hike behavior. +It drives `GameService.act()` end-to-end so memory/search/chat flows +match the runtime server logic. + +Run: + python -m aotai_hike.scripts.algorithm_tuning \ + --user-id demo_user \ + --session-id demo_session \ + --base-url http://0.0.0.0:8001 +""" + +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +import uuid + +from dataclasses import dataclass + +from loguru import logger + +from aotai_hike.adapters.background import StaticBackgroundProvider +from aotai_hike.adapters.companion import MemoryCompanionBrain +from aotai_hike.adapters.memory import ( + MemoryNamespace, + MemorySearchResult, + MemOSMemoryAdapter, + MemOSMemoryClient, +) +from aotai_hike.schemas import ( + ActionType, + ActRequest, + Role, + RoleAttrs, + RoleUpsertRequest, + SetActiveRoleRequest, + WorldState, +) +from aotai_hike.services.game_service import GameService + + +@dataclass(frozen=True) +class ActionStep: + action: ActionType + payload: dict[str, object] + note: str = "" + + +def _now_str() -> str: + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + + +class LoggingMemoryClient: + def __init__( + self, + base: MemOSMemoryClient, + *, + user_id: str, + log_world_search: bool, + log_full_prompt: bool, + ): + self._base = base + self._user_id = user_id + self._log_world_search = log_world_search + self._log_full_prompt = log_full_prompt + + def add_memory(self, **kwargs): + cube_id = str(kwargs.get("cube_id") or "") + payload = { + "user_id": kwargs.get("user_id") or self._user_id, + "writable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + "async_mode": kwargs.get("async_mode") or "sync", + } + if kwargs.get("session_id"): + payload["session_id"] = kwargs.get("session_id") + if kwargs.get("mode"): + payload["mode"] = kwargs.get("mode") + if kwargs.get("memory_content"): + payload["memory_content"] = kwargs.get("memory_content") + if kwargs.get("messages"): + payload["messages"] = kwargs.get("messages") + if kwargs.get("chat_history") is not None: + payload["chat_history"] = kwargs.get("chat_history") + if kwargs.get("info"): + payload["info"] = kwargs.get("info") + if kwargs.get("custom_tags"): + payload["custom_tags"] = kwargs.get("custom_tags") + if kwargs.get("source"): + payload["source"] = kwargs.get("source") + resp = self._base._post("/product/add", payload) + logger.info( + "[mem:add to cube: {}] response={}", + cube_id, + json.dumps(resp, ensure_ascii=False), + ) + return resp + + def search_memory(self, **kwargs): + cube_id = str(kwargs.get("cube_id") or "") + query = kwargs.get("query") or "" + suppress = (not self._log_world_search) and cube_id.endswith("_world") + payload = { + "user_id": kwargs.get("user_id") or self._user_id, + "query": query, + "top_k": kwargs.get("top_k") + if kwargs.get("top_k") is not None + else getattr(self._base, "_default_top_k", 5), + "readable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + "include_skill_memory": False, + "include_preference": False, + } + if kwargs.get("session_id"): + payload["session_id"] = kwargs.get("session_id") + data = self._base._post("/product/search", payload) + snippets: list[str] = [] + try: + mem_data = (data or {}).get("data", {}) + for entry in mem_data.get("text_mem", []) or []: + for mem in entry.get("memories", []) or []: + text = mem.get("memory") + if text: + snippets.append(text) + except Exception: + snippets = [] + snippet_preview = " | ".join(s[:1000] for s in snippets[:5]) + if not suppress: + logger.info( + "[mem:search from cube: {}] hits={} query={} snippets={}", + cube_id, + len(snippets), + query, + snippet_preview, + ) + return MemorySearchResult(snippets=snippets) + + def chat_complete(self, **kwargs): + cube_id = str(kwargs.get("cube_id") or "") + query = kwargs.get("query") or "" + payload = { + "user_id": kwargs.get("user_id") or self._user_id, + "query": query, + "readable_cube_ids": [cube_id], + "writable_cube_ids": [cube_id], + "mem_cube_id": cube_id, + "top_k": max(1, int(kwargs.get("top_k") or 1)), + "mode": kwargs.get("mode") or getattr(self._base, "_default_mode", "fine"), + "add_message_on_answer": kwargs.get("add_message_on_answer", False), + } + if kwargs.get("system_prompt"): + payload["system_prompt"] = kwargs.get("system_prompt") + if kwargs.get("history") is not None: + payload["history"] = kwargs.get("history") + if kwargs.get("session_id"): + payload["session_id"] = kwargs.get("session_id") + if kwargs.get("model_name_or_path"): + payload["model_name_or_path"] = kwargs.get("model_name_or_path") + if kwargs.get("temperature") is not None: + payload["temperature"] = kwargs.get("temperature") + if kwargs.get("max_tokens") is not None: + payload["max_tokens"] = kwargs.get("max_tokens") + data = self._base._post("/product/chat/complete", payload) + response = ((data or {}).get("data") or {}).get("response") or "" + system_prompt = kwargs.get("system_prompt") or "" + if self._log_full_prompt: + logger.info( + "[mem:chat with cube: {}] prompt(full)={}", + cube_id, + system_prompt, + ) + else: + head = system_prompt[:500] + tail = system_prompt[-500:] if len(system_prompt) > 500 else "" + logger.info( + "[mem:chat with cube: {}] prompt(len={}) head={}{}{}", + cube_id, + len(system_prompt), + head, + " ... " if tail else "", + tail, + ) + logger.info( + "[mem:chat with cube: {}] output={}{}", + cube_id, + response[:500], + "…" if len(response) > 500 else "", + ) + return response + + def __getattr__(self, item): + return getattr(self._base, item) + + +def build_roles() -> list[Role]: + return [ + Role( + role_id="r_ao", + name="阿鳌", + avatar_key="green", + persona="阿鳌:队伍领队,路线熟悉,偏谨慎。", + attrs=RoleAttrs(stamina=75, mood=58, experience=35, risk_tolerance=35), + ), + Role( + role_id="r_tb", + name="太白", + avatar_key="blue", + persona="太白:装备党,喜欢记录数据与天气变化。", + attrs=RoleAttrs(stamina=68, mood=62, experience=42, risk_tolerance=45), + ), + Role( + role_id="r_xs", + name="小山", + avatar_key="red", + persona="小山:乐观的新人徒步者,敢想敢冲但听劝。", + attrs=RoleAttrs(stamina=70, mood=72, experience=12, risk_tolerance=65), + ), + ] + + +def seed_memories( + *, + client: MemOSMemoryClient, + user_id: str, + session_id: str, + world_cube_id: str, + role_cube_ids: dict[str, str], +) -> None: + logger.info("[seed] writing initial memories...") + client.add_memory( + user_id=user_id, + cube_id=world_cube_id, + session_id=session_id, + async_mode="sync", + mode="fine", + messages=[ + { + "role": "user", + "content": "队伍即将进入多云、有风的上坡路段。", + } + ], + source="aotai_hike_seed", + ) + client.add_memory( + user_id=user_id, + cube_id=role_cube_ids["r_tb"], + session_id=session_id, + async_mode="sync", + mode="fine", + messages=[ + { + "role": "user", + "content": "太白喜欢记录温度、风速,并提醒大家补水。", + "role_id": "r_tb", + "role_name": "太白", + } + ], + source="aotai_hike_seed", + ) + + +def run_scenario( + *, + client: MemOSMemoryClient, + user_id: str, + session_id: str, + max_steps: int, + log_world_search: bool, + log_full_prompt: bool, +) -> list[dict[str, str]]: + logger.info("[init] user_id={} session_id={}", user_id, session_id) + logging_client = LoggingMemoryClient( + client, + user_id=user_id, + log_world_search=log_world_search, + log_full_prompt=log_full_prompt, + ) + memory = MemOSMemoryAdapter(logging_client) + companion = MemoryCompanionBrain(memory=logging_client) + game = GameService( + memory=memory, + companion=companion, + background=StaticBackgroundProvider(), + ) + + roles = build_roles() + world_state = WorldState( + session_id=session_id, + user_id=user_id, + weather="windy", + time_of_day="afternoon", + current_node_id="start", + recent_events=[], + chat_history=[], + ) + + role_cube_ids = { + role.role_id: MemoryNamespace.role_cube_id(user_id=user_id, role_id=role.role_id) + for role in roles + } + world_cube_id = MemoryNamespace.world_cube_id(user_id=user_id) + + seed_memories( + client=logging_client, + user_id=user_id, + session_id=session_id, + world_cube_id=world_cube_id, + role_cube_ids=role_cube_ids, + ) + logger.info("[init] roles={} active_role={}", len(roles), roles[0].role_id) + + for role in roles: + game.upsert_role(world_state, RoleUpsertRequest(session_id=session_id, role=role)) + game.set_active_role( + world_state, SetActiveRoleRequest(session_id=session_id, active_role_id=roles[0].role_id) + ) + + logs: list[dict[str, str]] = [] + action_queue: list[ActionStep] = [] + + for idx in range(1, max_steps + 1): + if not action_queue: + phase = str(getattr(world_state.phase, "value", world_state.phase) or "free").lower() + if phase == "free": + action_queue.append( + ActionStep(action=ActionType.CONTINUE, payload={}, note="auto_continue") + ) + elif phase in ("await_player_say", "night_wait_player"): + say_text = "" + while not say_text: + say_text = input("[input] SAY> ").strip() + action_queue.append( + ActionStep( + action=ActionType.SAY, + payload={"text": say_text}, + note="player_say", + ) + ) + elif phase == "night_vote_ready": + leader_id = world_state.leader_role_id or world_state.active_role_id + if not leader_id and world_state.roles: + leader_id = world_state.roles[0].role_id + action_queue.append( + ActionStep( + action=ActionType.DECIDE, + payload={ + "kind": "night_vote", + "leader_role_id": leader_id, + }, + note="night_vote", + ) + ) + elif phase == "junction_decision": + options = list(world_state.available_next_node_ids or []) + if not options: + logger.warning( + "[step {}] phase=junction_decision but no options; stopping.", idx + ) + break + logger.info("[input] 路线可选: {}", ", ".join(options)) + picked = "" + while picked not in options: + picked = input("[input] 选择 next_node_id> ").strip() + action_queue.append( + ActionStep( + action=ActionType.MOVE_FORWARD, + payload={"next_node_id": picked}, + note="junction_pick", + ) + ) + else: + logger.warning("[step {}] phase={} no action generated; stopping.", idx, phase) + break + + step = action_queue.pop(0) + logger.info( + "[step {}] action={} payload={}", + idx, + step.action, + json.dumps(step.payload, ensure_ascii=False), + ) + resp = game.act( + world_state, + ActRequest(session_id=session_id, action=step.action, payload=step.payload), + ) + logger.info( + "[step {}] messages={} phase={} time={} weather={}", + idx, + len(resp.messages), + resp.world_state.phase, + resp.world_state.time_of_day, + resp.world_state.weather, + ) + for msg in resp.messages: + if msg.kind != "speech": + continue + logger.info( + "[npc] {}: {}{}", + msg.role_name or msg.role_id, + msg.content[:120], + "…" if len(msg.content) > 120 else "", + ) + logs.append( + { + "role_id": msg.role_id or "", + "role_name": msg.role_name or "", + "content": msg.content, + "chat_time": _now_str(), + } + ) + + return logs + + +def main() -> None: + parser = argparse.ArgumentParser(description="AoTai Hike memory+chat tuning script") + parser.add_argument("--user-id", default="demo_user_14") + parser.add_argument("--session-id", default=f"algo-{uuid.uuid4().hex[:6]}") + parser.add_argument( + "--base-url", default=os.getenv("MEMOS_API_BASE_URL", "http://0.0.0.0:8002") + ) + parser.add_argument("--max-steps", type=int, default=8) + parser.add_argument( + "--log-world-search", + action="store_true", + help="Log world-cube searches (default: off)", + ) + parser.add_argument( + "--log-full-prompt", + action="store_true", + help="Log full system prompt (default: truncated)", + ) + parser.add_argument("--output", default="", help="Optional JSONL output path") + args = parser.parse_args() + + logger.remove() + logger.add(sys.stdout, level="INFO", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}") + logger.info("[config] base_url={}", args.base_url) + client = MemOSMemoryClient(base_url=args.base_url) + logs = run_scenario( + client=client, + user_id=args.user_id, + session_id=args.session_id, + max_steps=args.max_steps, + log_world_search=args.log_world_search, + log_full_prompt=args.log_full_prompt, + ) + + if args.output: + with open(args.output, "w", encoding="utf-8") as f: + for item in logs: + f.write(json.dumps(item, ensure_ascii=False) + "\n") + else: + logger.info(json.dumps({"responses": logs}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/demos/AOTAI_Hike/backend/aotai_hike/scripts/test_output/share_image_cross_success.png b/demos/AOTAI_Hike/backend/aotai_hike/scripts/test_output/share_image_cross_success.png new file mode 100644 index 000000000..af8e289e8 Binary files /dev/null and b/demos/AOTAI_Hike/backend/aotai_hike/scripts/test_output/share_image_cross_success.png differ diff --git a/demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py b/demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py new file mode 100644 index 000000000..76730370a --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/services/game_service.py @@ -0,0 +1,1431 @@ +from __future__ import annotations + +import random +import time +import uuid + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any + +from aotai_hike.adapters.background import BackgroundProvider, BackgroundRequest +from aotai_hike.schemas import ( + ActionType, + ActRequest, + ActResponse, + AoTaiEdge, + BackgroundAsset, + CampMeetingState, + Message, + Phase, + Role, + RoleUpsertRequest, + RoleUpsertResponse, + SetActiveRoleRequest, + WorldState, +) +from aotai_hike.theme import ( + _lang, + _theme, + event_arrived_phrases, + event_arrived_phrases_start, + event_camp_label, + event_camp_phrases, + event_observe_label, + event_observe_phrases, + event_rest_phrases, + mem_memory_action_map, + mem_memory_event_action_label, + mem_memory_event_day_line, + mem_memory_event_dialogue_label, + mem_memory_event_recent_label, + mem_memory_query_action_label, + mem_memory_query_events_label, + mem_memory_query_persona_label, + mem_memory_time_map, + mem_memory_weather_map, + mem_teammate_label, + prompt_memory_tag_by_theme, + sys_advance_km_arrived, + sys_advance_km_en_route, + sys_at_junction_choose_leader, + sys_at_junction_leader_chose, + sys_camp_meeting, + sys_camp_meeting_result_vote, + sys_camp_or_forward, + sys_camp_proposal_dest, + sys_camp_proposal_rest, + sys_decide_camp, + sys_depart_for_advance, + sys_end_no_route, + sys_location_weather_time, + sys_need_say_first, + sys_night_camp_meeting, + sys_night_fall_say_first, + sys_night_vote_ready, + sys_only_leader_camp, + sys_rainy_no_retreat_back, + sys_rainy_no_retreat_main, + sys_received_say_choose_leader, + sys_received_say_leader_camp_or_forward, + sys_received_say_party_forward, + sys_retreat_rain, + sys_silence, + sys_start_leader_vote, + sys_teammate_look_at_you, + sys_today_leader, + sys_unimplemented_action, + sys_unknown_decision, + sys_vote_action, + sys_vote_action_short, + sys_vote_failed_empty, + sys_vote_result_change, + sys_vote_result_keep, + sys_you_choose_rest, +) +from aotai_hike.world.map_data import get_graph, get_node_display_name +from loguru import logger + + +if TYPE_CHECKING: + from aotai_hike.adapters.companion import CompanionBrain + from aotai_hike.adapters.memory import MemoryAdapter + + +def _is_junction(node_id: str, theme: str | None = None) -> bool: + return len(get_graph(theme).outgoing(node_id)) > 1 + + +@dataclass +class GameConfig: + memory_top_k: int = 5 + chat_history_max_len: int = 40 + + +class GameService: + def __init__( + self, + *, + memory: MemoryAdapter, + companion: CompanionBrain, + background: BackgroundProvider, + rng_seed: int | None = None, + config: GameConfig | None = None, + ): + self._memory = memory + self._companion = companion + self._background = background + self._rng = random.Random(rng_seed) + self._config = config or GameConfig() + + def upsert_role(self, world_state: WorldState, req: RoleUpsertRequest) -> RoleUpsertResponse: + role = req.role + found = False + for i, r in enumerate(world_state.roles): + if r.role_id == role.role_id: + world_state.roles[i] = role + found = True + break + if not found: + # Check if this is a default role by name (AoTai: 阿鳌/太白/小山; Kilimanjaro: 利奥/山姆/杰德 or Leo/Sam/Jade) + # For default roles, ALWAYS preserve the attrs as-is, never modify them + _default_names = ("阿鳌", "太白", "小山", "利奥", "山姆", "杰德", "Leo", "Sam", "Jade") + is_default_role = role.name in _default_names + + if is_default_role: + # Default roles from _DEFAULT_ROLES - preserve attrs exactly as passed + # Do not modify or randomize them under any circumstances + logger.info( + f"Adding default role {role.name} with attrs: stamina={role.attrs.stamina}, mood={role.attrs.mood}, experience={role.attrs.experience}, risk_tolerance={role.attrs.risk_tolerance}, supplies={role.attrs.supplies}" + ) + world_state.roles.append(role) + else: + # For new user-created roles (not from default templates), initialize attrs with random values if not provided + from aotai_hike.schemas import RoleAttrs + + default_attrs = RoleAttrs() + + # Only randomize if: + # 1. attrs is None, OR + # 2. All values match defaults (user didn't provide custom attrs) + if role.attrs is None: + # Generate random attributes within reasonable ranges + stamina = self._rng.randint(50, 90) + mood = self._rng.randint(40, 80) + experience = self._rng.randint(5, 40) + risk_tolerance = self._rng.randint(20, 70) + supplies = self._rng.randint(60, 90) + role.attrs = RoleAttrs( + stamina=stamina, + mood=mood, + experience=experience, + risk_tolerance=risk_tolerance, + supplies=supplies, + ) + elif ( + role.attrs.stamina == default_attrs.stamina + and role.attrs.mood == default_attrs.mood + and role.attrs.experience == default_attrs.experience + and role.attrs.risk_tolerance == default_attrs.risk_tolerance + and role.attrs.supplies == default_attrs.supplies + ): + # All values match defaults (stamina=70, mood=60, experience=10, risk_tolerance=50, supplies=80) + # User likely didn't provide custom attrs - randomize them + stamina = self._rng.randint(50, 90) + mood = self._rng.randint(40, 80) + experience = self._rng.randint(5, 40) + risk_tolerance = self._rng.randint(20, 70) + supplies = self._rng.randint(60, 90) + role.attrs = RoleAttrs( + stamina=stamina, + mood=mood, + experience=experience, + risk_tolerance=risk_tolerance, + supplies=supplies, + ) + # If attrs has custom values, keep them as-is + world_state.roles.append(role) + if world_state.active_role_id is None: + world_state.active_role_id = role.role_id + # Leader is assigned at runtime (random default on first act), not during role creation. + return RoleUpsertResponse( + roles=world_state.roles, active_role_id=world_state.active_role_id + ) + + def set_active_role(self, world_state: WorldState, req: SetActiveRoleRequest) -> WorldState: + if not any(r.role_id == req.active_role_id for r in world_state.roles): + raise ValueError(f"Unknown role_id: {req.active_role_id}") + world_state.active_role_id = req.active_role_id + return world_state + + def act(self, world_state: WorldState, req: ActRequest) -> ActResponse: + now_ms = int(time.time() * 1000) + active = self._get_active_role(world_state) + messages: list[Message] = [] + logger.info("[act] action={} phase={}", req.action, world_state.phase) + + # Random default leader (assigned on first act after roles exist). + if world_state.roles and world_state.leader_role_id is None: + world_state.leader_role_id = self._rng.choice(world_state.roles).role_id + leader = next( + (r for r in world_state.roles if r.role_id == world_state.leader_role_id), None + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_today_leader( + _lang(world_state), + leader.name if leader else world_state.leader_role_id, + ), + timestamp_ms=now_ms, + ) + ) + + # Phase gates: some phases only accept specific actions. + if world_state.phase == Phase.NIGHT_WAIT_PLAYER and req.action != ActionType.SAY: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_night_fall_say_first(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + if world_state.phase == Phase.NIGHT_VOTE_READY and req.action != ActionType.DECIDE: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_night_vote_ready(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + if world_state.phase == Phase.AWAIT_PLAYER_SAY and req.action != ActionType.SAY: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_need_say_first(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + if world_state.phase == Phase.AWAIT_CAMP_DECISION and req.action not in ( + ActionType.CAMP, + ActionType.MOVE_FORWARD, + ): + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_camp_or_forward(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + if req.action == ActionType.DECIDE: + world_state.stats.decision_times = int(world_state.stats.decision_times or 0) + 1 + user_action_desc = self._apply_decision(world_state, req, now_ms, messages) + else: + user_action_desc = self._apply_action(world_state, req, now_ms, messages, active) + + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + + mem_event = self._format_memory_event( + world_state, req, node_after, user_action_desc, messages + ) + logger.info( + "[mem:event] user_id={} role_id={} role_name={} {}", + world_state.user_id, + active.role_id if active else None, + active.name if active else None, + mem_event, + ) + self._memory.add_event( + user_id=world_state.user_id, + session_id=world_state.session_id, + content=mem_event, + role_id=active.role_id if active else None, + role_name=active.name if active else None, + ) + + query = self._build_memory_query(world_state, req, node_after, user_action_desc) + logger.info( + "[mem:search] user_id={} role_id={} role_name={} query={}", + world_state.user_id, + active.role_id if active else None, + active.name if active else None, + query, + ) + mem_res = self._memory.search( + user_id=world_state.user_id, + session_id=world_state.session_id, + query=query, + top_k=self._config.memory_top_k, + ) + + # Night arrival: pause, darken, and require player speech before voting. + # Skip NPC chat if we're entering night vote phase. + is_entering_night_vote = ( + world_state.time_of_day == "night" and world_state.phase == Phase.FREE + ) + if is_entering_night_vote: + world_state.phase = Phase.NIGHT_WAIT_PLAYER + else: + # Per-step NPC cadence: + # - Only trigger NPC chatter after a MOVE_FORWARD step. + # - It may gate further progress until the player replies. + # - Skip chat if we're already in night vote phases. + if ( + req.action == ActionType.MOVE_FORWARD + and user_action_desc.startswith("MOVE_FORWARD") + and world_state.phase != Phase.NIGHT_WAIT_PLAYER + and world_state.phase != Phase.NIGHT_VOTE_READY + and world_state.phase != Phase.JUNCTION_DECISION + ): + comp = self._companion.generate( + world_state=world_state, + active_role=active, + memory_snippets=mem_res.snippets, + user_action=user_action_desc, + ) + messages.extend(comp.messages) + for m in comp.messages: + if m.kind == "speech": + logger.info("[npc] {}: {}", m.role_name or m.role_id, m.content) + self._apply_message_effects(world_state, comp.messages) + if getattr(comp, "requires_player_say", False): + world_state.phase = Phase.AWAIT_PLAYER_SAY + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_teammate_look_at_you(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + + # If we were in AWAIT_CAMP_DECISION and player chose to continue (MOVE_FORWARD), + # return to FREE phase + if world_state.phase == Phase.AWAIT_CAMP_DECISION and req.action == ActionType.MOVE_FORWARD: + world_state.phase = Phase.FREE + + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + def _apply_decision( + self, world_state: WorldState, req: ActRequest, now_ms: int, messages: list[Message] + ) -> str: + kind = str(req.payload.get("kind") or "").strip() + if kind == "night_vote": + player_vote_id = str(req.payload.get("leader_role_id") or "").strip() or None + self._run_leader_vote(world_state, now_ms, messages, player_vote_id=player_vote_id) + # Night finishes: light recovery, new day, weather update. + self._tweak_party(world_state, stamina_delta=6, mood_delta=2, exp_delta=0) + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + self._maybe_change_weather(world_state) + world_state.phase = Phase.FREE + return "DECIDE:night_vote" + if kind == "camp_meeting": + next_id = str(req.payload.get("consensus_next_node_id") or "").strip() or None + leader_id = str(req.payload.get("leader_role_id") or "").strip() or None + lock_strength = str(req.payload.get("lock_strength") or "").strip() or "soft" + + if next_id and next_id not in (world_state.camp_meeting.options_next_node_ids or []): + raise ValueError(f"Invalid consensus_next_node_id: {next_id}") + if leader_id and not any(r.role_id == leader_id for r in world_state.roles): + raise ValueError(f"Invalid leader_role_id: {leader_id}") + + world_state.consensus_next_node_id = next_id + world_state.leader_role_id = leader_id or world_state.leader_role_id + world_state.lock_strength = lock_strength # pydantic will validate enum + + # Write a "consensus memory" into recent events (memory adapter will store the act payload anyway). + who = next( + (r.name for r in world_state.roles if r.role_id == world_state.leader_role_id), + "未知", + ) + theme = getattr(world_state, "theme", "aotai") + lang = _lang(world_state) + node_name = get_node_display_name(theme, lang, world_state.current_node_id) + plan_name = ( + get_node_display_name(theme, lang, next_id) + if next_id + else ("(not selected)" if lang == "en" else "(未选择)") + ) + ev = f"营地共识:在 {node_name},共识路线=去 {plan_name},锁强度={world_state.lock_strength},次日团长={who}" + self._push_event(world_state, ev) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=ev, + timestamp_ms=now_ms, + ) + ) + + # Overnight settlement (light recovery; lock_strength can add small stress) + base_stamina = 8 + base_mood = 3 + mood_penalty = 0 + if str(world_state.lock_strength) == "hard": + mood_penalty = 1 + if str(world_state.lock_strength) == "iron": + mood_penalty = 2 + self._tweak_party( + world_state, + stamina_delta=base_stamina, + mood_delta=base_mood - mood_penalty, + exp_delta=0, + ) + + # Advance to next morning + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + self._maybe_change_weather(world_state) + + # Exit meeting + world_state.camp_meeting = CampMeetingState() + world_state.phase = Phase.FREE + return "DECIDE:camp_meeting" + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_unknown_decision(_lang(world_state), kind), + timestamp_ms=now_ms, + ) + ) + return f"DECIDE:{kind or 'unknown'}" + + def _run_leader_vote( + self, + world_state: WorldState, + now_ms: int, + messages: list[Message], + *, + player_vote_id: str | None = None, + ) -> None: + """ + Mock voting process with optional forced leader choice: + - each role casts one vote (action message + reason) + - system announces result and updates leader_role_id + """ + if not world_state.roles: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_vote_failed_empty(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + return + + old = world_state.leader_role_id + old_name = next((r.name for r in world_state.roles if r.role_id == old), "(无)") + + candidates = [r.role_id for r in world_state.roles] + vote_order = candidates[:] + self._rng.shuffle(vote_order) + tally: dict[str, int] = dict.fromkeys(candidates, 0) + + def _fallback_pick_vote(voter_id: str) -> str: + # Player selection is only the player's vote, not a forced result. + if player_vote_id and voter_id == world_state.active_role_id: + return player_vote_id + # Small incumbency bias (keep the current leader). + if old and self._rng.random() < 0.28: + return old + return self._rng.choice(candidates) + + def _fallback_pick_reason(voter_id: str, choice_id: str) -> str: + pool = [ + "路况判断更稳。", + "更能照顾大家节奏。", + "今天状态最好。", + "路线经验更足。", + "愿意承担风险。", + "团队更信服。", + ] + if player_vote_id and voter_id == world_state.active_role_id: + return "玩家选择。" + if choice_id == old: + return "延续昨日安排。" + return self._rng.choice(pool) + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_start_leader_vote(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + + for voter_id in vote_order: + voter = next((r for r in world_state.roles if r.role_id == voter_id), None) + if not voter: + continue + + choice: str | None = None + reason: str = "" + try: + leader_vote_fn = getattr(self._companion, "leader_vote", None) + if callable(leader_vote_fn): + choice, reason = leader_vote_fn( + world_state=world_state, + voter=voter, + candidates=world_state.roles, + player_vote_id=player_vote_id, + ) + except Exception: + logger.exception( + "leader_vote via companion failed; falling back to heuristic vote." + ) + choice, reason = None, "" + + if not choice or choice not in candidates: + choice = _fallback_pick_vote(voter_id) + reason = _fallback_pick_reason(voter_id, choice) + + tally[choice] = int(tally.get(choice, 0)) + 1 + choice_name = next((r.name for r in world_state.roles if r.role_id == choice), choice) + messages.append( + Message( + message_id=f"v-{world_state.session_id}-{now_ms}-{voter_id}", + role_id=voter_id, + role_name=voter.name, + kind="action", + content=sys_vote_action(_lang(world_state), voter.name, choice_name, reason), + timestamp_ms=now_ms, + ) + ) + + max_votes = max(tally.values()) if tally else 0 + winners = [rid for rid, n in tally.items() if n == max_votes] if tally else [] + if winners: + world_state.leader_role_id = self._rng.choice(winners) + + new_name = next( + (r.name for r in world_state.roles if r.role_id == world_state.leader_role_id), + world_state.leader_role_id, + ) + + world_state.stats.vote_times = int(world_state.stats.vote_times or 0) + 1 + if world_state.active_role_id and world_state.leader_role_id == world_state.active_role_id: + world_state.stats.leader_times = int(world_state.stats.leader_times or 0) + 1 + + if world_state.leader_role_id != old: + self._push_event(world_state, f"票选团长:{old_name} → {new_name}") + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_vote_result_change(_lang(world_state), old_name, new_name), + timestamp_ms=now_ms, + ) + ) + else: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_vote_result_keep(_lang(world_state), new_name), + timestamp_ms=now_ms, + ) + ) + + def _enter_camp_meeting( + self, world_state: WorldState, now_ms: int, messages: list[Message] + ) -> None: + # Prepare meeting options: from current node, use outgoing edges as "tomorrow proposals". + outgoing = get_graph(getattr(world_state, "theme", "aotai")).outgoing( + world_state.current_node_id + ) + opts = [e.to_node_id for e in outgoing] + order = [r.role_id for r in world_state.roles] + self._rng.shuffle(order) + + world_state.camp_meeting = CampMeetingState( + active=True, + options_next_node_ids=opts, + proposals_order_role_ids=order, + proposed_at_ms=now_ms, + ) + world_state.phase = Phase.CAMP_MEETING_DECIDE + + # Step 1: proposals (one per role, random order) + for rid in order: + role = next((r for r in world_state.roles if r.role_id == rid), None) + if not role: + continue + # Very light mock proposal: pick one option (or "stay" if none) + if opts: + pick = self._rng.choice(opts) + dest = get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + pick, + ) + text = sys_camp_proposal_dest(_lang(world_state), dest) + else: + text = sys_camp_proposal_rest(_lang(world_state)) + messages.append( + Message( + message_id=f"m-{world_state.session_id}-{now_ms}-{rid}", + role_id=rid, + role_name=role.name, + kind="speech", + content=text, + timestamp_ms=now_ms, + ) + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_camp_meeting(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + + def _auto_camp_meeting( + self, world_state: WorldState, now_ms: int, messages: list[Message] + ) -> None: + """ + Auto camp meeting: + - random proposal order + - optional leader change (mock) + - overnight settlement + - advance to next morning + """ + if not world_state.roles: + # Nothing to do; still advance to next morning + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + self._maybe_change_weather(world_state) + return + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_night_camp_meeting(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + + outgoing = get_graph(getattr(world_state, "theme", "aotai")).outgoing( + world_state.current_node_id + ) + opts = [e.to_node_id for e in outgoing] + + order = [r.role_id for r in world_state.roles] + self._rng.shuffle(order) + for rid in order: + role = next((r for r in world_state.roles if r.role_id == rid), None) + if not role: + continue + if opts: + pick = self._rng.choice(opts) + dest = get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + pick, + ) + text = sys_camp_proposal_dest(_lang(world_state), dest) + else: + text = sys_camp_proposal_rest(_lang(world_state)) + messages.append( + Message( + message_id=f"m-{world_state.session_id}-{now_ms}-{rid}", + role_id=rid, + role_name=role.name, + kind="speech", + content=text, + timestamp_ms=now_ms, + ) + ) + + # Vote for leader (mock): each role casts one vote in random order. + old = world_state.leader_role_id + old_name = next((r.name for r in world_state.roles if r.role_id == old), "(无)") + + candidates = [r.role_id for r in world_state.roles] + vote_order = candidates[:] + self._rng.shuffle(vote_order) + tally: dict[str, int] = dict.fromkeys(candidates, 0) + + def _pick_vote(voter_id: str) -> str: + # Small incumbency bias (keep the current leader). + if old and self._rng.random() < 0.28: + return old + # Otherwise, random vote among candidates. + return self._rng.choice(candidates) + + for voter_id in vote_order: + voter = next((r for r in world_state.roles if r.role_id == voter_id), None) + if not voter: + continue + choice = _pick_vote(voter_id) + tally[choice] = tally.get(choice, 0) + 1 + choice_name = next((r.name for r in world_state.roles if r.role_id == choice), choice) + messages.append( + Message( + message_id=f"v-{world_state.session_id}-{now_ms}-{voter_id}", + role_id=voter_id, + role_name=voter.name, + kind="action", + content=sys_vote_action_short(_lang(world_state), voter.name, choice_name), + timestamp_ms=now_ms, + ) + ) + + # Winner: max votes; tie-break randomly among tied. + max_votes = max(tally.values()) if tally else 0 + winners = [rid for rid, n in tally.items() if n == max_votes] if tally else [] + if winners: + world_state.leader_role_id = self._rng.choice(winners) + + new_name = next( + (r.name for r in world_state.roles if r.role_id == world_state.leader_role_id), + world_state.leader_role_id, + ) + + if world_state.leader_role_id != old: + self._push_event(world_state, f"营地会议:更换团长 {old_name} → {new_name}(票选)") + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_camp_meeting_result_vote( + _lang(world_state), old_name, new_name, world_state.leader_role_id != old + ), + timestamp_ms=now_ms, + ) + ) + + # Overnight settlement then advance to next morning. + self._tweak_party(world_state, stamina_delta=8, mood_delta=3, exp_delta=0) + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + self._maybe_change_weather(world_state) + + def _apply_message_effects(self, world_state: WorldState, messages: list[Message]) -> None: + # Minimal, deterministic mapping from emote/action_tag -> attr deltas. + # (This is a placeholder for LLM-driven state updates.) + by_role: dict[str, dict[str, int]] = {} + for m in messages: + if not m.role_id: + continue + if m.kind not in ("speech", "action"): + continue + rid = str(m.role_id) + d = by_role.setdefault(rid, {"stamina": 0, "mood": 0, "experience": 0}) + em = (m.emote or "").strip() + if em == "tired": + d["stamina"] -= 1 + d["mood"] -= 1 + elif em == "happy": + d["mood"] += 2 + elif em == "panic": + d["mood"] -= 2 + d["stamina"] -= 1 + elif em == "focused": + d["experience"] += 1 + elif em == "grumpy": + d["mood"] -= 1 + elif em == "calm": + d["mood"] += 1 + + tag = (m.action_tag or "").strip() + if tag in ("check_map", "lookaround"): + d["experience"] += 1 + if tag in ("drink",): + d["mood"] += 1 + + for r in world_state.roles: + delta = by_role.get(r.role_id) + if not delta: + continue + r.attrs.stamina = max(0, min(100, r.attrs.stamina + int(delta["stamina"]))) + r.attrs.mood = max(0, min(100, r.attrs.mood + int(delta["mood"]))) + r.attrs.experience = max(0, min(100, r.attrs.experience + int(delta["experience"]))) + + def _safe_get_background(self, scene_id: str) -> BackgroundAsset: + try: + return self._background.get_background(BackgroundRequest(scene_id=scene_id)) + except Exception: + return BackgroundAsset(scene_id=scene_id, asset_url=None, type="none", meta={}) + + def _get_active_role(self, world_state: WorldState) -> Role | None: + if not world_state.active_role_id: + return None + for r in world_state.roles: + if r.role_id == world_state.active_role_id: + return r + return None + + def _apply_action( + self, + world_state: WorldState, + req: ActRequest, + now_ms: int, + messages: list[Message], + active: Role | None, + ) -> str: + time.sleep(2) + # Alias: CONTINUE means "advance one step" (same as MOVE_FORWARD with default payload). + if req.action == ActionType.CONTINUE: + req.action = ActionType.MOVE_FORWARD + + # UI-only; we keep it empty in the auto-run flow unless we explicitly need a user choice. + world_state.available_next_node_ids = [] + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_location_weather_time( + _lang(world_state), + get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + world_state.current_node_id, + ), + world_state.weather, + world_state.day, + world_state.time_of_day, + ), + timestamp_ms=now_ms, + ) + ) + + if req.action == ActionType.SAY: + text = str(req.payload.get("text") or "").strip() or sys_silence(_lang(world_state)) + if active is not None: + messages.append( + Message( + message_id=f"u-{uuid.uuid4().hex[:8]}", + role_id=active.role_id, + role_name=active.name, + kind="speech", + content=text, + timestamp_ms=now_ms, + ) + ) + # Night flow: player speech unlocks the vote button (do NOT resume auto-run yet). + if world_state.phase == Phase.NIGHT_WAIT_PLAYER: + world_state.phase = Phase.NIGHT_VOTE_READY + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_received_say_choose_leader(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + return f"SAY:{text[:80]}" + # If we were waiting for the player to respond, a SAY clears the gate. + if world_state.phase == Phase.AWAIT_PLAYER_SAY: + # If player is leader, allow them to decide whether to camp + if active and active.role_id == world_state.leader_role_id: + world_state.phase = Phase.AWAIT_CAMP_DECISION + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_received_say_leader_camp_or_forward(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + else: + world_state.phase = Phase.FREE + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_received_say_party_forward(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + return f"SAY:{text[:80]}" + + if req.action == ActionType.MOVE_FORWARD: + step_km = float(req.payload.get("step_km") or 1.0) + if step_km <= 0: + step_km = 1.0 + + # If already in transit, keep advancing along the same segment. + if world_state.in_transit_to_node_id: + world_state.in_transit_progress_km += step_km + self._advance_time(world_state) + # Moving forward consumes stamina, mood, and supplies + self._tweak_party( + world_state, stamina_delta=-3, mood_delta=-1, exp_delta=0, supplies_delta=-5 + ) + + # If we are on an exit route and it turns rainy, retreat back to the junction. + try: + edge_kind = None + if world_state.in_transit_from_node_id and world_state.in_transit_to_node_id: + for e in get_graph(getattr(world_state, "theme", "aotai")).outgoing( + world_state.in_transit_from_node_id + ): + if e.to_node_id == world_state.in_transit_to_node_id: + edge_kind = getattr(e, "kind", None) + break + if edge_kind == "exit" and str(world_state.weather) == "rainy": + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_retreat_rain(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + world_state.in_transit_from_node_id = None + world_state.in_transit_to_node_id = None + world_state.in_transit_progress_km = 0.0 + world_state.in_transit_total_km = 0.0 + world_state.available_next_node_ids = get_graph( + getattr(world_state, "theme", "aotai") + ).next_node_ids(world_state.current_node_id) + return "MOVE_FORWARD:retreat_rain" + except Exception: + pass + + if world_state.in_transit_progress_km + 1e-6 >= world_state.in_transit_total_km: + # Arrive + next_id = world_state.in_transit_to_node_id + world_state.current_node_id = next_id + if next_id not in world_state.visited_node_ids: + world_state.visited_node_ids.append(next_id) + world_state.route_node_index = len(world_state.visited_node_ids) - 1 + + # Clear transit + world_state.in_transit_from_node_id = None + world_state.in_transit_to_node_id = None + world_state.in_transit_progress_km = 0.0 + world_state.in_transit_total_km = 0.0 + + world_state.available_next_node_ids = get_graph( + getattr(world_state, "theme", "aotai") + ).next_node_ids(next_id) + + ev = self._rng.choice(event_arrived_phrases(_lang(world_state))) + self._push_event(world_state, ev) + node_name = get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + next_id, + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_advance_km_arrived( + _lang(world_state), step_km, node_name, ev + ), + timestamp_ms=now_ms, + ) + ) + if world_state.time_of_day == "night": + world_state.time_of_day = "evening" + return f"MOVE_FORWARD:arrive:{next_id}" + else: + left = max( + 0.0, world_state.in_transit_total_km - world_state.in_transit_progress_km + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_advance_km_en_route( + _lang(world_state), + step_km, + world_state.in_transit_progress_km, + world_state.in_transit_total_km, + left, + ), + timestamp_ms=now_ms, + ) + ) + world_state.available_next_node_ids = [] + return "MOVE_FORWARD:step" + + # Not in transit: choose next edge from current node. + outgoing = get_graph(getattr(world_state, "theme", "aotai")).outgoing( + world_state.current_node_id + ) + if not outgoing: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_end_no_route(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + return "MOVE_FORWARD:end" + + next_edge = None + if len(outgoing) == 1: + next_edge = outgoing[0] + else: + picked = str(req.payload.get("next_node_id") or "").strip() + valid = {e.to_node_id: e for e in outgoing} + if picked and picked in valid: + next_edge = valid[picked] + else: + # If player is the leader, require manual selection. + if ( + world_state.leader_role_id and world_state.active_role_id + ) and world_state.leader_role_id == world_state.active_role_id: + world_state.available_next_node_ids = [e.to_node_id for e in outgoing] + world_state.phase = Phase.JUNCTION_DECISION + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_at_junction_choose_leader(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + return "MOVE_FORWARD:await_choice" + + # Auto junction pick by leader (NPC). + leader_name = next( + ( + r.name + for r in world_state.roles + if r.role_id == world_state.leader_role_id + ), + "团长", + ) + next_edge = self._rng.choice(outgoing) + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_at_junction_leader_chose( + _lang(world_state), + leader_name, + get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + next_edge.to_node_id, + ), + ), + timestamp_ms=now_ms, + ) + ) + + # If choosing a bailout route, it can fail and force a retreat. + if getattr(next_edge, "kind", None) == "exit": + prev_id = None + if world_state.visited_node_ids and len(world_state.visited_node_ids) >= 2: + prev_id = world_state.visited_node_ids[-2] + rainy_fail = str(world_state.weather) == "rainy" + if rainy_fail: + non_exit = [e for e in outgoing if getattr(e, "kind", None) != "exit"] + if non_exit: + next_edge = self._rng.choice(non_exit) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_rainy_no_retreat_main(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + elif prev_id: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_rainy_no_retreat_back(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + next_edge = AoTaiEdge( + from_node_id=world_state.current_node_id, + to_node_id=prev_id, + kind="main", + label="回撤", + distance_km=float(getattr(next_edge, "distance_km", 1.0) or 1.0), + ) + + # Start transit along chosen edge + world_state.phase = Phase.FREE + world_state.in_transit_from_node_id = world_state.current_node_id + world_state.in_transit_to_node_id = next_edge.to_node_id + world_state.in_transit_total_km = float(getattr(next_edge, "distance_km", 1.0) or 1.0) + world_state.in_transit_progress_km = 0.0 + world_state.available_next_node_ids = [] + + # Immediately take first step + world_state.in_transit_progress_km += step_km + self._advance_time(world_state) + # Moving forward consumes stamina, mood, and supplies + self._tweak_party( + world_state, stamina_delta=-3, mood_delta=-1, exp_delta=0, supplies_delta=-5 + ) + if str(world_state.weather) in ("rainy", "snowy", "windy", "foggy"): + world_state.stats.bad_weather_steps = ( + int(world_state.stats.bad_weather_steps or 0) + 1 + ) + if str(world_state.weather) in ("rainy", "snowy", "windy", "foggy"): + world_state.stats.bad_weather_steps = ( + int(world_state.stats.bad_weather_steps or 0) + 1 + ) + + if world_state.in_transit_progress_km + 1e-6 >= world_state.in_transit_total_km: + # Arrive in the same action + next_id = world_state.in_transit_to_node_id + world_state.current_node_id = next_id + world_state.visited_node_ids.append(next_id) + world_state.route_node_index = len(world_state.visited_node_ids) - 1 + + world_state.in_transit_from_node_id = None + world_state.in_transit_to_node_id = None + world_state.in_transit_progress_km = 0.0 + world_state.in_transit_total_km = 0.0 + + world_state.available_next_node_ids = get_graph( + getattr(world_state, "theme", "aotai") + ).next_node_ids(next_id) + + ev = self._rng.choice(event_arrived_phrases_start(_lang(world_state))) + self._push_event(world_state, ev) + node_name = get_node_display_name( + getattr(world_state, "theme", "aotai"), _lang(world_state), next_id + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_advance_km_arrived(_lang(world_state), step_km, node_name, ev), + timestamp_ms=now_ms, + ) + ) + if world_state.time_of_day == "night": + world_state.time_of_day = "evening" + return f"MOVE_FORWARD:arrive:{next_id}" + + left = max(0.0, world_state.in_transit_total_km - world_state.in_transit_progress_km) + to_name = get_node_display_name( + getattr(world_state, "theme", "aotai"), + _lang(world_state), + next_edge.to_node_id, + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_depart_for_advance( + _lang(world_state), + to_name, + step_km, + world_state.in_transit_progress_km, + world_state.in_transit_total_km, + left, + ), + timestamp_ms=now_ms, + ) + ) + return "MOVE_FORWARD:start" + + if req.action == ActionType.REST: + self._advance_time(world_state) + self._tweak_party(world_state, stamina_delta=10, mood_delta=4, exp_delta=0) + ev = self._rng.choice(event_rest_phrases(_lang(world_state))) + self._push_event(world_state, ev) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_you_choose_rest(_lang(world_state), ev), + timestamp_ms=now_ms, + ) + ) + return "REST" + + if req.action == ActionType.CAMP: + # Only leader can decide to camp + if not active or active.role_id != world_state.leader_role_id: + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_only_leader_camp(_lang(world_state)), + timestamp_ms=now_ms, + ) + ) + node_after = get_graph(getattr(world_state, "theme", "aotai")).get_node( + world_state.current_node_id + ) + bg = self._safe_get_background(node_after.scene_id) + self._append_chat_history(world_state, messages) + return ActResponse(world_state=world_state, messages=messages, background=bg) + + world_state.time_of_day = "night" + ev = self._rng.choice(event_camp_phrases(_lang(world_state))) + self._push_event(world_state, event_camp_label(_lang(world_state), ev)) + # Camping: restore stamina and mood, but consume more supplies + self._tweak_party( + world_state, stamina_delta=18, mood_delta=6, exp_delta=0, supplies_delta=-25 + ) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_decide_camp(_lang(world_state), active.name, ev), + timestamp_ms=now_ms, + ) + ) + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + self._maybe_change_weather(world_state) + # After camping, return to FREE phase + if world_state.phase == Phase.AWAIT_CAMP_DECISION: + world_state.phase = Phase.FREE + return "CAMP" + + if req.action == ActionType.OBSERVE: + self._advance_time(world_state) + self._tweak_party(world_state, stamina_delta=-3, mood_delta=2, exp_delta=1) + obs = self._rng.choice(event_observe_phrases(_lang(world_state))) + self._push_event(world_state, event_observe_label(_lang(world_state), obs)) + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=obs, + timestamp_ms=now_ms, + ) + ) + return "OBSERVE" + + messages.append( + Message( + message_id=f"sys-{uuid.uuid4().hex[:8]}", + kind="system", + content=sys_unimplemented_action(_lang(world_state), str(req.action)), + timestamp_ms=now_ms, + ) + ) + return str(req.action) + + def _push_event(self, world_state: WorldState, event: str) -> None: + world_state.recent_events.append(event) + world_state.recent_events = world_state.recent_events[-10:] + + def _advance_time(self, world_state: WorldState) -> None: + # Slow down time: advance only every 2 steps. + world_state.time_step_counter = int(world_state.time_step_counter or 0) + 1 + if world_state.time_step_counter % 2 != 0: + return + order = ["morning", "noon", "afternoon", "evening", "night"] + idx = order.index(world_state.time_of_day) + if idx < len(order) - 1: + world_state.time_of_day = order[idx + 1] # type: ignore[assignment] + else: + world_state.day += 1 + world_state.time_of_day = "morning" + world_state.time_step_counter = 0 + # Weather can change on every time advance. + self._maybe_change_weather(world_state) + + def _tweak_party( + self, + world_state: WorldState, + *, + stamina_delta: int = 0, + mood_delta: int = 0, + exp_delta: int = 0, + supplies_delta: int = 0, + ) -> None: + for r in world_state.roles: + r.attrs.stamina = max(0, min(100, r.attrs.stamina + stamina_delta)) + r.attrs.mood = max(0, min(100, r.attrs.mood + mood_delta)) + r.attrs.experience = max(0, min(100, r.attrs.experience + exp_delta)) + # Ensure supplies are consumed correctly - update the value directly + if supplies_delta != 0: + r.attrs.supplies = max(0, min(100, r.attrs.supplies + supplies_delta)) + + def _maybe_change_weather(self, world_state: WorldState) -> None: + if self._rng.random() < 0.7: + world_state.weather = self._rng.choice( + ["sunny", "cloudy", "windy", "rainy", "snowy", "foggy"] + ) + + def _format_memory_event( + self, + world_state: WorldState, + req: ActRequest, + node, + user_action_desc: str, + messages: list[Message], + ) -> str: + lang = _lang(world_state) + time_map = mem_memory_time_map(lang) + weather_map = mem_memory_weather_map(lang) + action_map = mem_memory_action_map(lang) + + action_name = getattr(req.action, "name", str(req.action)) + action_str = action_map.get(action_name, action_name) + + day = world_state.day + tod = time_map.get(world_state.time_of_day, str(world_state.time_of_day)) + weather = weather_map.get(world_state.weather, str(world_state.weather)) + node_name = getattr(node, "name", "") + + pieces: list[str] = [] + pieces.append(mem_memory_event_day_line(lang, day, tod, weather, node_name)) + pieces.append(mem_memory_event_action_label(lang) + action_str) + + recent_events = world_state.recent_events[-3:] if world_state.recent_events else [] + if recent_events: + sep = "; " if lang == "en" else ";" + pieces.append(mem_memory_event_recent_label(lang) + sep.join(recent_events) + ".") + + dialogue_msgs = [m for m in messages if m.kind != "system"] + dialogue_parts: list[str] = [] + teammate = mem_teammate_label(lang) + for m in dialogue_msgs[:3]: + speaker = m.role_name or m.role_id or teammate + dialogue_parts.append( + f"{speaker}: {m.content[:40]}" if lang == "en" else f"{speaker}:{m.content[:40]}" + ) + if dialogue_parts: + sep = "; " if lang == "en" else ";" + pieces.append(mem_memory_event_dialogue_label(lang) + sep.join(dialogue_parts) + ".") + + return " ".join(pieces) + + def _build_memory_query( + self, world_state: WorldState, req: ActRequest, node, user_action_desc: str + ) -> str: + lang = _lang(world_state) + active = self._get_active_role(world_state) + persona = (active.persona if active else "")[:80] + sep = "; " if lang == "en" else ";" + ev = sep.join(world_state.recent_events[-3:]) + tag = prompt_memory_tag_by_theme(_theme(world_state)) + action_label = mem_memory_query_action_label(lang) + events_label = mem_memory_query_events_label(lang) + persona_label = mem_memory_query_persona_label(lang) + return f"{tag} {node.name} {world_state.weather} {world_state.time_of_day} {action_label}{req.action} {user_action_desc} {events_label}{ev} {persona_label}{persona}" + + def _append_chat_history(self, world_state: WorldState, messages: list[Message]) -> None: + if not messages: + return + history = list(world_state.chat_history or []) + for msg in messages: + if msg.kind == "action": + continue + if msg.kind == "system": + role = "system" + elif msg.role_id and msg.role_id == world_state.active_role_id: + role = "user" + else: + role = "assistant" + item: dict[str, Any] = { + "role": role, + "content": msg.content, + } + # Preserve speaker identity for prompt reconstruction. + if msg.role_id: + item["speaker_id"] = msg.role_id + if msg.role_name: + item["speaker_name"] = msg.role_name + if msg.kind: + item["kind"] = msg.kind + if msg.timestamp_ms: + item["chat_time"] = time.strftime( + "%Y-%m-%d %H:%M:%S", time.localtime(msg.timestamp_ms / 1000) + ) + history.append(item) + max_len = self._config.chat_history_max_len + if max_len and len(history) > max_len: + history = history[-max_len:] + world_state.chat_history = history diff --git a/demos/AOTAI_Hike/backend/aotai_hike/stores/session_store.py b/demos/AOTAI_Hike/backend/aotai_hike/stores/session_store.py new file mode 100644 index 000000000..9d977abc6 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/stores/session_store.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import threading +import time +import uuid + +from dataclasses import dataclass + +from aotai_hike.schemas import WorldState + + +@dataclass +class SessionRecord: + world_state: WorldState + created_at_ms: int + updated_at_ms: int + + +class InMemorySessionStore: + def __init__(self): + self._lock = threading.Lock() + self._sessions: dict[str, SessionRecord] = {} + + def new_session( + self, *, user_id: str, lang: str | None = None, theme: str | None = None + ) -> WorldState: + now_ms = int(time.time() * 1000) + session_id = f"ao-tai-{uuid.uuid4().hex[:10]}" + ws_lang = "en" if lang == "en" else "zh" + ws_theme = "kili" if theme == "kili" else "aotai" + ws = WorldState(session_id=session_id, user_id=user_id, lang=ws_lang, theme=ws_theme) + with self._lock: + self._sessions[session_id] = SessionRecord(ws, now_ms, now_ms) + return ws + + def get(self, session_id: str) -> WorldState | None: + with self._lock: + rec = self._sessions.get(session_id) + return rec.world_state if rec else None + + def save(self, world_state: WorldState) -> None: + now_ms = int(time.time() * 1000) + with self._lock: + rec = self._sessions.get(world_state.session_id) + if rec is None: + self._sessions[world_state.session_id] = SessionRecord(world_state, now_ms, now_ms) + else: + rec.world_state = world_state + rec.updated_at_ms = now_ms diff --git a/demos/AOTAI_Hike/backend/aotai_hike/theme.py b/demos/AOTAI_Hike/backend/aotai_hike/theme.py new file mode 100644 index 000000000..3f9b5dbd9 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/theme.py @@ -0,0 +1,1029 @@ +""" +Theme and prompt copy for zh (鳌太线) vs en (决胜乞力马扎罗 / Conquer Kilimanjaro). +All prompt and display strings that depend on the trek theme are centralized here. +""" + +from __future__ import annotations + +from typing import Literal + + +Lang = Literal["zh", "en"] + + +def _lang(ws: object) -> Lang: + """Get lang from world_state-like object; default zh.""" + return getattr(ws, "lang", None) or "zh" + + +def _theme(ws: object) -> str: + """Get theme (aotai | kili) from world_state-like object; default aotai.""" + return getattr(ws, "theme", None) or "aotai" + + +# ----- Theme names (for prompts and share card) ----- + + +def theme_trek_name(lang: Lang) -> str: + """Short trek name in the story language.""" + if lang == "en": + return "Kilimanjaro" + return "鳌太线" + + +def theme_trek_name_full(lang: Lang) -> str: + """Full theme title for share card / UI.""" + if lang == "en": + return "Conquer Kilimanjaro" # 决胜乞力马扎罗 + return "鳌太线" + + +def share_title(theme: str | None, lang: Lang) -> str: + """Share image main title; depends on current map (theme), not just language.""" + if theme == "kili": + if lang == "en": + return "Kilimanjaro Trek Record" + return "乞力马扎罗徒步记录" + if lang == "en": + return "AoTai Hike Record" + return "鳌太线徒步记录" + + +def share_outcome_success_cross(lang: Lang, node_name: str) -> str: + if lang == "en": + return f"✓ Summit success - Reached {node_name}" + return f"✓ 穿越成功 - 成功到达{node_name}" + + +def share_outcome_success_retreat(lang: Lang, node_name: str) -> str: + if lang == "en": + return f"✓ Retreat success - Evacuated to {node_name}" + return f"✓ 下撤成功 - 成功下撤至{node_name}" + + +def share_outcome_fail(lang: Lang, reason: str | None) -> str: + if lang == "en": + return f"✗ {reason}" if reason else "✗ Challenge failed" + return f"✗ {reason}" if reason else "✗ 挑战失败" + + +def share_status_running(lang: Lang) -> str: + if lang == "en": + return "In progress..." + return "进行中..." + + +def share_result_finished_success(lang: Lang) -> str: + if lang == "en": + return "Summit success" + return "穿越成功" + + +def share_result_finished_fail(lang: Lang) -> str: + if lang == "en": + return "Challenge failed" + return "挑战失败" + + +def share_failure_challenge_failed(lang: Lang) -> str: + if lang == "en": + return "Challenge failed" + return "挑战失败" + + +def share_failure_all_stamina(lang: Lang) -> str: + if lang == "en": + return "All members ran out of stamina" + return "所有人体力耗尽失败" + + +def share_result_running(lang: Lang) -> str: + if lang == "en": + return "In progress..." + return "进行中..." + + +def share_stat_distance(lang: Lang) -> str: + if lang == "en": + return "Total distance" + return "总距离" + + +def share_stat_days(lang: Lang) -> str: + if lang == "en": + return "Days" + return "用时" + + +def share_stat_location(lang: Lang) -> str: + if lang == "en": + return "Current location" + return "当前位置" + + +def share_role_leader(lang: Lang) -> str: + if lang == "en": + return "Leader" + return "队长" + + +def share_team_stat_stamina(lang: Lang) -> str: + if lang == "en": + return "Avg stamina" + return "体力均值" + + +def share_team_stat_mood(lang: Lang) -> str: + if lang == "en": + return "Avg mood" + return "士气均值" + + +def share_team_stat_risk(lang: Lang) -> str: + if lang == "en": + return "Avg risk" + return "风险均值" + + +def share_team_members_label(lang: Lang) -> str: + if lang == "en": + return "Team members:" + return "队伍成员:" + + +def share_route_nodes_label(lang: Lang) -> str: + if lang == "en": + return "Route nodes:" + return "路线节点:" + + +def share_journey_summary_label(lang: Lang) -> str: + if lang == "en": + return "Journey summary:" + return "旅程摘要:" + + +def share_key_memories_label(lang: Lang) -> str: + if lang == "en": + return "Key memories:" + return "关键记忆:" + + +def share_role_line(lang: Lang, name: str, stamina: int, mood: int) -> str: + if lang == "en": + return f"· {name}: Stamina {stamina}/100, Mood {mood}/100" + return f"· {name}:体力 {stamina}/100,情绪 {mood}/100" + + +def share_summary_nodes_events(lang: Lang, total_nodes: int, key_events_count: int) -> str: + if lang == "en": + return f"Reached {total_nodes} node(s), {key_events_count} key event(s)." + return f"共到达 {total_nodes} 个节点,记录 {key_events_count} 次关键事件。" + + +def share_final_weather_time(lang: Lang, weather: str, time_of_day: str) -> str: + if lang == "en": + return f"Final weather: {weather or 'unknown'}, Final time: {time_of_day or 'unknown'}." + return f"最终天气:{weather or '未知'},最终时间:{time_of_day or '未知'}。" + + +def share_unknown(lang: Lang) -> str: + if lang == "en": + return "unknown" + return "未知" + + +def share_footer(lang: Lang) -> str: + if lang == "en": + return "Generated by MemOS AoTai Hike Demo" + return "Generated by MemOS AoTai Hike Demo" + + +def share_stat_sep(lang: Lang) -> str: + if lang == "en": + return ": " + return ":" + + +def share_days_unit(lang: Lang) -> str: + if lang == "en": + return "days" + return "天" + + +# ----- Share image epithet & lore (by outcome / stats) ----- + + +def share_epithet_retreat_snow(lang: Lang) -> str: + if lang == "en": + return "Retreater in the snow" + return "风雪中的撤退者" + + +def share_lore_retreat_snow(lang: Lang) -> str: + if lang == "en": + return "The storm beat your steps back, but a safe retreat was no small feat." + return "风雪压倒了脚步,但能安全撤回,已是不易。" + + +def share_epithet_retreat_fail(lang: Lang) -> str: + if lang == "en": + return "The regretful hiker" + return "遗憾的行者" + + +def share_lore_retreat_fail(lang: Lang) -> str: + if lang == "en": + return "The summit eluded you this time, but the mountain remains, and so does the story." + return "这次没能抵达终点,但山依旧在,故事仍在继续。" + + +def share_epithet_veteran(lang: Lang) -> str: + if lang == "en": + return "Veteran under the snowline" + return "雪线下的老练者" + + +def share_lore_veteran(lang: Lang) -> str: + if lang == "en": + return "Long ridges have taught your feet every rise and fall." + return "漫长的山脊之行,脚步早已记住了每一处起伏。" + + +def share_epithet_steadfast(lang: Lang) -> str: + if lang == "en": + return "Steadfast under the snowline" + return "雪线下的坚行者" + + +def share_lore_steadfast(lang: Lang) -> str: + if lang == "en": + return "Step by breath, yet not a step back." + return "一步一喘息,却一步也不肯退回头。" + + +def share_epithet_first_timer(lang: Lang) -> str: + if lang == "en": + return "First-timer under the snowline" + return "雪线下的初行者" + + +def share_lore_first_timer(lang: Lang) -> str: + if lang == "en": + return "The first time on this path; the mountain wind will remember your name." + return "第一次踏上这条路,山风也会记住你的名字。" + + +def share_epithet_leader(lang: Lang) -> str: + if lang == "en": + return "Guide under the snowline" + return "雪线下的领路者" + + +def share_lore_leader(lang: Lang) -> str: + if lang == "en": + return ( + "After countless choices, you learned to steady your companions with light and route." + ) + return "无数次抉择之后,你学会用灯光与路线安抚同伴。" + + +def share_epithet_junction(lang: Lang) -> str: + if lang == "en": + return "The one who chose at the junction" + return "岔路口的抉择者" + + +def share_lore_junction(lang: Lang) -> str: + if lang == "en": + return "Every fork has quietly rewritten this team's fate." + return "每一次岔路,都在悄悄改写这支队伍的命运。" + + +def share_epithet_night_walker(lang: Lang) -> str: + if lang == "en": + return "Night walker in snow and fog" + return "风雪中的夜行人" + + +def share_lore_night_walker(lang: Lang) -> str: + if lang == "en": + return "Groping through snow and fog, with only the camp lamp and each other." + return "在风雪与雾气里摸索前行,唯有营灯与彼此作伴。" + + +def share_epithet_storm_walker(lang: Lang) -> str: + if lang == "en": + return "Stubborn one in rain and wind" + return "风雨中的固执者" + + +def share_lore_storm_walker(lang: Lang) -> str: + if lang == "en": + return "Rain and wind kept urging you back; you kept tightening your straps." + return "雨和风一次次劝退你,你却一次次系紧背带。" + + +# ----- Prompt fragments (for companion system prompts) ----- + + +def prompt_story_context_line(lang: Lang, day: int, time_of_day: str, weather: str) -> str: + if lang == "en": + return ( + f"You are a trekking team crossing the dangerous Kilimanjaro route. " + f"Day {day}, current time: {time_of_day}, weather: {weather}.\n" + ) + return f"你们是一支徒步队伍,正在穿越危险的鳌太线。今天是第{day}天,当前时间是{time_of_day},天气:{weather}。\n" + + +def prompt_night_vote_intro(lang: Lang) -> str: + """Night vote system prompt intro.""" + if lang == "en": + return ( + "You are in a Kilimanjaro trek story game. It is night; the team must choose tonight's leader.\n" + "You will play the current speaker. Based on each member's personality, recent state and dialogue, make a rational but subjective choice.\n\n" + ) + return ( + "你正在参与鳌太线徒步剧情游戏,现在是夜晚,需要在队伍中选出一位今晚的队长。\n" + "你将扮演当前说话的队员,根据每个人的性格、人设、最近状态和对话,做出理性但有主观色彩的选择。\n\n" + ) + + +def prompt_night_vote_output_requirement(lang: Lang) -> str: + if lang == "en": + return ( + "【Output requirement】\n" + "1. Choose exactly one leader from the candidate list by id.\n" + "2. Output a JSON object in this exact format:\n" + '{"vote_role_id": "", "reason": ""}\n' + "3. No extra text, no comments, no prefix/suffix.\n" + ) + return ( + "【输出要求】\n" + "1. 只能从候选人列表中的 id 里选择一位作为队长。\n" + "2. 请输出一个 JSON 对象,格式严格为:\n" + '{"vote_role_id": "<候选人id>", "reason": "<不超过40字的中文理由>"}\n' + "3. 不要输出任何多余文字,不要加注释,不要加前后缀。\n" + ) + + +def prompt_night_vote_query(lang: Lang, voter_name: str) -> str: + if lang == "en": + return f'You are team member "{voter_name}". Choose tonight\'s leader from the candidates and give a short reason.' + return f"你是队员「{voter_name}」,请在候选人中选出今晚的队长,并给出一句理由。" + + +def prompt_section_candidates(lang: Lang) -> str: + if lang == "en": + return "【Candidates】" + return "【候选人列表】" + + +def prompt_section_memories(lang: Lang) -> str: + if lang == "en": + return "【Your memory snippets】" + return "【你的记忆片段】" + + +def prompt_section_dialogue(lang: Lang) -> str: + if lang == "en": + return "【Recent dialogue】" + return "【最近对话】" + + +def prompt_memory_tag(lang: Lang) -> str: + """Prefix for memory search / query (e.g. 鳌太线 or Kilimanjaro). Deprecated: use prompt_memory_tag_by_theme.""" + if lang == "en": + return "Kilimanjaro" + return "鳌太线" + + +def prompt_memory_tag_by_theme(theme: str | None) -> str: + """Prefix for memory search by theme (aotai = 鳌太线, kili = Kilimanjaro).""" + return "Kilimanjaro" if theme == "kili" else "鳌太线" + + +# ----- System messages (game_service) ----- + + +def sys_today_leader(lang: Lang, name: str) -> str: + if lang == "en": + return f"Today's leader: {name}" + return f"今日团长:{name}" + + +def sys_location_weather_time(lang: Lang, node_name: str, weather: str, day: int, tod: str) -> str: + if lang == "en": + return f"Location: {node_name} · Weather: {weather} · Time: Day{day}/{tod}" + return f"位置:{node_name} · 天气:{weather} · 时间:Day{day}/{tod}" + + +def sys_night_fall_say_first(lang: Lang) -> str: + if lang == "en": + return "Night has fallen. Please say something first, then the leader vote will start." + return "夜幕降临:请你先发言(发送一句话)后,才能开始票选团长。" + + +def sys_night_vote_ready(lang: Lang) -> str: + if lang == "en": + return "Night vote ready. Please choose a leader to continue." + return "夜晚票选准备就绪:请选择一位队长继续。" + + +def sys_need_say_first(lang: Lang) -> str: + if lang == "en": + return "Please reply with a message first (say something) before continuing." + return "需要你先用「发言」回应队伍(发送一句话)后才能继续。" + + +def sys_camp_or_forward(lang: Lang) -> str: + if lang == "en": + return "Choose: camp to restore stamina, or continue forward." + return "请选择:扎营恢复体力,或继续前进。" + + +def sys_teammate_look_at_you(lang: Lang) -> str: + if lang == "en": + return "Your teammate looks at you: your turn to speak (say something to continue)." + return "队友看向你:轮到你发言了(发一句话后才能继续)。" + + +def sys_unknown_decision(lang: Lang, kind: str) -> str: + if lang == "en": + return f"Unknown decision type: {kind}" + return f"未知决策类型:{kind}" + + +def sys_vote_failed_empty(lang: Lang) -> str: + if lang == "en": + return "Vote failed: party is empty." + return "票选失败:队伍为空。" + + +def sys_start_leader_vote(lang: Lang) -> str: + if lang == "en": + return "Leader vote: everyone casts one vote." + return "开始票选团长:每人投一票。" + + +def sys_vote_action(lang: Lang, voter_name: str, choice_name: str, reason: str) -> str: + if lang == "en": + return f"{voter_name} voted: {choice_name} (reason: {reason})" + return f"{voter_name} 投票:{choice_name}(理由:{reason})" + + +def sys_vote_action_short(lang: Lang, voter_name: str, choice_name: str) -> str: + if lang == "en": + return f"{voter_name} voted: {choice_name}" + return f"{voter_name} 投票:{choice_name}" + + +def sys_vote_result_change(lang: Lang, old_name: str, new_name: str) -> str: + if lang == "en": + return f"Vote result: leader changed {old_name} → {new_name}" + return f"票选结果:更换团长 {old_name} → {new_name}" + + +def sys_vote_result_keep(lang: Lang, new_name: str) -> str: + if lang == "en": + return f"Vote result: {new_name} remains leader." + return f"票选结果:团长继续由 {new_name} 担任。" + + +def sys_camp_meeting(lang: Lang) -> str: + if lang == "en": + return "Camp meeting: choose consensus route, lock strength, and tomorrow's leader, then submit to enter next morning." + return "营地会议:请选择「共识路线/锁强度/明日团长」,提交后进入第二天早晨。" + + +def sys_night_camp_meeting(lang: Lang) -> str: + if lang == "en": + return "Night: camp meeting starts (automatic)." + return "夜晚到来:营地会议开始(自动)。" + + +def sys_camp_proposal_dest(lang: Lang, dest: str) -> str: + if lang == "en": + return f"I suggest we go to {dest} tomorrow." + return f"明天我建议:去 {dest}。" + + +def sys_camp_proposal_rest(lang: Lang) -> str: + if lang == "en": + return "I suggest we rest here and decide tomorrow." + return "明天我建议:先原地休整再决定。" + + +def sys_camp_meeting_result_vote(lang: Lang, old_name: str, new_name: str, changed: bool) -> str: + if lang == "en": + return ( + f"Camp meeting (vote): leader changed {old_name} → {new_name}" + if changed + else f"Camp meeting (vote): {new_name} remains leader." + ) + return ( + f"营地会议结果(票选):更换团长 {old_name} → {new_name}" + if changed + else f"营地会议结果(票选):团长继续由 {new_name} 担任。" + ) + + +def sys_received_say_choose_leader(lang: Lang) -> str: + if lang == "en": + return "Message received. Now choose a leader to start the vote." + return "收到你的发言:现在请选择一位队长开始票选。" + + +def sys_received_say_leader_camp_or_forward(lang: Lang) -> str: + if lang == "en": + return "Message received. As leader, you can camp to restore stamina or continue forward." + return "收到你的回应。作为队长,你可以选择扎营恢复体力,或继续前进。" + + +def sys_received_say_party_forward(lang: Lang) -> str: + if lang == "en": + return "Message received. The party continues forward." + return "收到你的回应,队伍继续前进。" + + +def sys_retreat_rain(lang: Lang) -> str: + if lang == "en": + return "Retreat in rain failed; returning to junction to continue." + return "下撤途中遇雨,撤退失败,返回岔路继续前进。" + + +def sys_advance_km_arrived(lang: Lang, step_km: float, node_name: str, ev: str) -> str: + if lang == "en": + return f"Advanced {step_km:.0f}km, arrived at: {node_name}. {ev}" + return f"前进 {step_km:.0f}km,已抵达:{node_name}。{ev}" + + +def sys_advance_km_en_route( + lang: Lang, step_km: float, progress: float, total: float, left: float +) -> str: + if lang == "en": + return ( + f"Advanced {step_km:.0f}km, en route… ({progress:.0f}/{total:.0f}km, {left:.0f}km left)" + ) + return f"前进 {step_km:.0f}km,路上…({progress:.0f}/{total:.0f}km,剩余 {left:.0f}km)" + + +def sys_depart_for_advance( + lang: Lang, node_name: str, step_km: float, progress: float, total: float, left: float +) -> str: + if lang == "en": + return f"Depart for {node_name}, advance {step_km:.0f}km… ({progress:.0f}/{total:.0f}km, {left:.0f}km left)" + return f"出发去 {node_name},前进 {step_km:.0f}km…({progress:.0f}/{total:.0f}km,剩余 {left:.0f}km)" + + +def sys_end_no_route(lang: Lang) -> str: + if lang == "en": + return "Reached the end / no route forward." + return "已到达终点/无可用前进路线。" + + +def sys_at_junction_choose_leader(lang: Lang) -> str: + if lang == "en": + return "At junction: please choose the route (as leader)." + return "到达岔路:请团长选择路线。" + + +def sys_at_junction_leader_chose(lang: Lang, leader_name: str, node_name: str) -> str: + if lang == "en": + return f"At junction: {leader_name} chose → {node_name}." + return f"到达岔路:{leader_name}做出选择 → {node_name}。" + + +def sys_rainy_no_retreat_main(lang: Lang) -> str: + if lang == "en": + return "Rain: retreat not suitable; taking main route instead." + return "雨天不适合下撤,改走主线路线。" + + +def sys_rainy_no_retreat_back(lang: Lang) -> str: + if lang == "en": + return "Rain: cannot retreat; going back one step." + return "雨天无法下撤,只能回撤上一步。" + + +def sys_only_leader_camp(lang: Lang) -> str: + if lang == "en": + return "Only the leader can decide to camp." + return "只有队长可以决定扎营。" + + +def sys_you_choose_rest(lang: Lang, ev: str) -> str: + if lang == "en": + return f"You chose to rest. {ev}" + return f"你选择休息。{ev}" + + +def sys_decide_camp(lang: Lang, name: str, ev: str) -> str: + if lang == "en": + return f"{name} decided to camp. {ev} Stamina restored, but used more supplies." + return f"{name}决定扎营。{ev} 体力恢复,但消耗了较多物资。" + + +def sys_unimplemented_action(lang: Lang, action: str) -> str: + if lang == "en": + return f"Unimplemented action: {action}" + return f"未实现动作:{action}" + + +def sys_silence(lang: Lang) -> str: + if lang == "en": + return "(silence)" + return "(沉默)" + + +# Event phrases (for Message content / _push_event); lang-aware lists +def event_arrived_phrases(lang: Lang) -> list[str]: + if lang == "en": + return [ + "You see the landmark ahead.", + "Steady steps, you've arrived.", + "The wind fades as you reach the node.", + ] + return ["你终于看见前方地标。", "脚步放轻,稳稳抵达。", "风声渐远,你到达了节点。"] + + +def event_arrived_phrases_start(lang: Lang) -> list[str]: + if lang == "en": + return ["You reach a new landmark.", "The slope underfoot changes.", "The view opens up."] + return ["你来到新的地标。", "脚下坡度变化明显。", "视野忽然开阔。"] + + +def event_rest_phrases(lang: Lang) -> list[str]: + if lang == "en": + return ["Rehydrate and rest.", "Adjust the pack.", "Slow your breath.", "Soak up the sun."] + return ["补水休整。", "调整背负。", "放慢呼吸。", "晒晒太阳。"] + + +def event_camp_phrases(lang: Lang) -> list[str]: + if lang == "en": + return ["Light the stove.", "Pitch the tent.", "Assign watch.", "Check supplies."] + return ["升起炉火。", "搭好帐篷。", "分配守夜。", "检查余粮。"] + + +def event_camp_label(lang: Lang, ev: str) -> str: + if lang == "en": + return f"Camp: {ev}" + return f"扎营:{ev}" + + +def event_observe_phrases(lang: Lang) -> list[str]: + if lang == "en": + return [ + "You observe clouds rolling in the distance.", + "You notice footprints and broken branches.", + "You note a steadier foothold.", + "You hear a faint echo in the wind.", + ] + return [ + "你观察到远处云层翻涌。", + "你发现脚印与折断的灌木。", + "你记录了一个更稳的落脚点。", + "你听见风里隐约的回声。", + ] + + +def event_observe_label(lang: Lang, obs: str) -> str: + if lang == "en": + return f"Observe: {obs}" + return f"观察:{obs}" + + +# ----- Companion action labels (chat action messages: 调整背包, 观察地形, etc.) ----- + + +def companion_action_labels(lang: Lang) -> tuple[str, ...]: + """Labels for NPC action messages (e.g. after speech). Shown in chat as (label).""" + if lang == "en": + return ("Adjust pack", "Observe terrain", "Drink water", "Wipe sweat") + return ("调整背包", "观察地形", "喝水", "擦汗") + + +def companion_action_message_content(lang: Lang, role_name: str, action_label: str) -> str: + """Format 'Name: action' for action message content (frontend may append (action) to previous msg).""" + if lang == "en": + return f"{role_name}: {action_label}" + return f"{role_name}:{action_label}" + + +# ----- Memory / MemOS payload (add_memory, search, chat_complete) ----- + + +def mem_round_no_npc(lang: Lang) -> str: + if lang == "en": + return "No NPC speech this round." + return "本轮无NPC发言。" + + +def mem_round_event_header(lang: Lang, location_name: str, weather: str, time_of_day: str) -> str: + if lang == "en": + return f"Round event: location {location_name}, weather {weather}, time {time_of_day}." + return f"本轮事件:位置 {location_name},天气 {weather},时间段 {time_of_day}。" + + +def mem_player_action_label(lang: Lang) -> str: + if lang == "en": + return " Player action: " + return " 玩家动作:" + + +def mem_speaker_said(lang: Lang) -> str: + if lang == "en": + return " said: " + return "说:" + + +def mem_speaker_action(lang: Lang) -> str: + if lang == "en": + return " action: " + return "动作:" + + +def mem_round_no_dialogue(lang: Lang) -> str: + if lang == "en": + return "No dialogue or actions this round." + return "本轮暂无有效对话或动作。" + + +def mem_leader_vote_player_chose(lang: Lang) -> str: + if lang == "en": + return "Player chose in UI." + return "玩家在界面中明确选择。" + + +def mem_leader_vote_search_prefix(lang: Lang) -> str: + if lang == "en": + return "Choose tonight's leader." + return "选择今晚队长。" + + +def mem_search_weather_time(lang: Lang, weather: str, time_of_day: str) -> str: + if lang == "en": + return f" weather:{weather} time:{time_of_day}" + return f" 天气:{weather} 时间:{time_of_day}" + + +def format_user_action_for_memory(lang: Lang, user_action: str) -> str: + """Format user_action string for MemOS add/search/chat (lang-aware).""" + ua = str(user_action or "").strip() + if not ua: + if lang == "en": + return "No action" + return "无动作" + + if ua.startswith("SAY:"): + text = ua.split(":", 1)[1] if ":" in ua else "" + text = text.strip() + if lang == "en": + return f"Player said: {text}" if text else "Player said" + return f"玩家发言:{text}" if text else "玩家发言" + + if ua.startswith("MOVE_FORWARD:"): + if lang == "en": + if ":arrive:" in ua: + return "Party advanced and arrived at a new node" + if ":retreat_rain" in ua: + return "Retreat in rain failed; party returned to junction" + if ":start" in ua: + return "Party departed from current node, started new segment" + if ":step" in ua: + return "Party continued along the route" + if ":end" in ua: + return "Reached the end or no route forward" + return "Party moved forward" + if ":arrive:" in ua: + return "队伍前进并抵达新的路段节点" + if ":retreat_rain" in ua: + return "下撤途中遇雨,队伍被迫返回岔路" + if ":start" in ua: + return "队伍从当前节点出发,开始新的前进路段" + if ":step" in ua: + return "队伍在路线上继续前进" + if ":end" in ua: + return "已到达终点或无可前进路线" + return "队伍前进" + + if ua == "REST": + return "Party chose to rest and recover" if lang == "en" else "队伍选择原地休息调整状态" + if ua == "CAMP": + return ( + "Leader decided to camp overnight, restore stamina but use supplies" + if lang == "en" + else "队长决定扎营过夜,恢复体力但消耗物资" + ) + if ua == "OBSERVE": + return ( + "Party stopped to observe surroundings and conditions" + if lang == "en" + else "队伍停下观察周围环境与路况" + ) + + if ua.startswith("DECIDE:"): + kind = ua.split(":", 1)[1] if ":" in ua else "" + if lang == "en": + if kind == "night_vote": + return "Night vote to choose leader" + if kind == "camp_meeting": + return "Camp meeting to decide next route" + return f"Decision: {kind or 'unknown'}" + if kind == "night_vote": + return "进行夜间票选决定队长" + if kind == "camp_meeting": + return "讨论并决定下一步路线" + return f"做出决策:{kind or '未知'}" + + return ua + + +def mem_memory_time_map(lang: Lang) -> dict[str, str]: + if lang == "en": + return { + "morning": "morning", + "noon": "noon", + "afternoon": "afternoon", + "evening": "evening", + "night": "night", + } + return { + "morning": "早晨", + "noon": "中午", + "afternoon": "下午", + "evening": "傍晚", + "night": "夜晚", + } + + +def mem_memory_weather_map(lang: Lang) -> dict[str, str]: + if lang == "en": + return { + "sunny": "sunny", + "cloudy": "cloudy", + "windy": "windy", + "rainy": "rainy", + "snowy": "snowy", + "foggy": "foggy", + } + return { + "sunny": "晴", + "cloudy": "多云", + "windy": "有风", + "rainy": "雨", + "snowy": "雪", + "foggy": "雾", + } + + +def mem_memory_action_map(lang: Lang) -> dict[str, str]: + if lang == "en": + return { + "SAY": "say", + "MOVE_FORWARD": "forward", + "REST": "rest", + "CAMP": "camp", + "OBSERVE": "observe", + "DECIDE": "decide", + } + return { + "SAY": "发言", + "MOVE_FORWARD": "前进", + "REST": "休息", + "CAMP": "扎营", + "OBSERVE": "观察", + "DECIDE": "决策", + } + + +def mem_memory_event_day_line(lang: Lang, day: int, tod: str, weather: str, node_name: str) -> str: + if lang == "en": + return f"Day {day}, {tod}, weather {weather}, location: {node_name}." + return f"第{day}天,{tod},天气{weather},位置:{node_name}。" + + +def mem_memory_event_action_label(lang: Lang) -> str: + if lang == "en": + return "Action: " + return "动作:" + + +def mem_memory_event_recent_label(lang: Lang) -> str: + if lang == "en": + return "Recent events: " + return "最近事件:" + + +def mem_memory_event_dialogue_label(lang: Lang) -> str: + if lang == "en": + return "Key dialogue: " + return "关键对话:" + + +def mem_memory_query_action_label(lang: Lang) -> str: + if lang == "en": + return "action:" + return "动作:" + + +def mem_memory_query_events_label(lang: Lang) -> str: + if lang == "en": + return "events:" + return "事件:" + + +def mem_memory_query_persona_label(lang: Lang) -> str: + if lang == "en": + return "persona:" + return "人设:" + + +def mem_teammate_label(lang: Lang) -> str: + if lang == "en": + return "teammate" + return "队员" + + +def prompt_dialogue_prefix_narrator(lang: Lang) -> str: + if lang == "en": + return "[Narrator]" + return "[旁白]" + + +def prompt_dialogue_prefix_you(lang: Lang) -> str: + if lang == "en": + return "[You]" + return "[你]" + + +def prompt_dialogue_prefix_teammate(lang: Lang) -> str: + if lang == "en": + return "[Teammate]" + return "[队友]" + + +def prompt_no_recent_dialogue(lang: Lang) -> str: + if lang == "en": + return "No recent dialogue." + return "(暂无近期对话)" + + +def prompt_none(lang: Lang) -> str: + if lang == "en": + return "None" + return "(暂无)" + + +def prompt_no_key_dialogue(lang: Lang) -> str: + if lang == "en": + return "No key dialogue." + return "(暂无关键对话)" + + +def prompt_unknown_altitude(lang: Lang) -> str: + if lang == "en": + return "unknown altitude" + return "未知海拔" + + +def prompt_terrain_hint_none(lang: Lang) -> str: + if lang == "en": + return "No special hint." + return "无特别提示" + + +def prompt_location_line(lang: Lang, location_name: str, altitude: str, terrain_hint: str) -> str: + if lang == "en": + return f"You are at: {location_name} ({altitude}), terrain hint: {terrain_hint}.\n" + return f"你们现在位于:{location_name}({altitude}),地形提示:{terrain_hint}。\n" + + +def prompt_leader_line(lang: Lang, leader_name: str) -> str: + if lang == "en": + return f"Current leader: {leader_name}.\n" + return f"当前队长是:{leader_name}。\n" + + +def prompt_player_role_line(lang: Lang, active_name: str) -> str: + if lang == "en": + return f"The player is currently playing: {active_name}.\n" + return f"玩家当前扮演的角色是:{active_name}。\n" + + +def prompt_role_focus_line(lang: Lang, role_name: str) -> str: + if lang == "en": + return f"The story focuses on {role_name}; {role_name} should react and speak.\n" + return f"剧情围绕{role_name}展开,{role_name}需要根据当前情况做出反应和发言。\n" + + +def prompt_route_line(lang: Lang, mainline_str: str) -> str: + if lang == "en": + return f"Route: {mainline_str}.\n" + return f"整条路线示意:{mainline_str}。\n" + + +def prompt_bailout_suffix(lang: Lang, bailout_label: str) -> str: + if lang == "en": + return f"(evac to {bailout_label})" + return f"(可下撤至{bailout_label})" diff --git a/demos/AOTAI_Hike/backend/aotai_hike/utils/share_image.py b/demos/AOTAI_Hike/backend/aotai_hike/utils/share_image.py new file mode 100644 index 000000000..860626e10 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/utils/share_image.py @@ -0,0 +1,813 @@ +""" +Independent module for generating share images when the game ends (success or failure). +Generates pixel-style images showing character config, route, journey, distance, outcome, and current location. +""" + +from __future__ import annotations + +import io + +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from aotai_hike.theme import ( + _lang, + _theme, + share_days_unit, + share_epithet_first_timer, + share_epithet_junction, + share_epithet_leader, + share_epithet_night_walker, + share_epithet_retreat_fail, + share_epithet_retreat_snow, + share_epithet_steadfast, + share_epithet_storm_walker, + share_epithet_veteran, + share_failure_all_stamina, + share_failure_challenge_failed, + share_final_weather_time, + share_footer, + share_journey_summary_label, + share_key_memories_label, + share_lore_first_timer, + share_lore_junction, + share_lore_leader, + share_lore_night_walker, + share_lore_retreat_fail, + share_lore_retreat_snow, + share_lore_steadfast, + share_lore_storm_walker, + share_lore_veteran, + share_outcome_fail, + share_outcome_success_cross, + share_outcome_success_retreat, + share_result_finished_fail, + share_result_finished_success, + share_result_running, + share_role_leader, + share_role_line, + share_route_nodes_label, + share_stat_days, + share_stat_distance, + share_stat_location, + share_stat_sep, + share_status_running, + share_summary_nodes_events, + share_team_members_label, + share_team_stat_mood, + share_team_stat_risk, + share_team_stat_stamina, + share_title, +) +from aotai_hike.world.map_data import get_graph, get_node_display_name +from PIL import Image, ImageDraw, ImageFilter, ImageFont + + +if TYPE_CHECKING: + from aotai_hike.schemas import Role, WorldState, WorldStats + + +def _node_exists(node_id: str, theme: str | None = None) -> bool: + """Check if a node exists in the graph.""" + try: + get_graph(theme).get_node(node_id) + return True + except Exception: + return False + + +@dataclass +class GameOutcome: + """Game outcome information.""" + + is_success: bool + outcome_type: str # "cross_success" or "retreat_success" or "failure" or "in_progress" + total_distance_km: float + current_node_id: str + current_node_name: str + days_spent: int + roles: list[Role] + visited_nodes: list[str] + journey_summary: dict[str, Any] + is_finished: bool = False # Whether the game has ended + failure_reason: str | None = None # Detailed failure reason if game failed + + +class ShareImageGenerator: + """Generate pixel-style share images for game completion.""" + + # Pixel art style constants + # Keep share card at strict 3:4 (WIDTH : HEIGHT) to match frontend modal + # and the 3:4 background asset in `frontend/assets/share_background.png`. + WIDTH = 1024 + HEIGHT = 1365 + PIXEL_SIZE = 4 # Scale factor for pixel art effect + BG_COLOR = (240, 240, 230) + TEXT_COLOR = (40, 40, 40) + ACCENT_COLOR = (100, 150, 200) + SUCCESS_COLOR = (80, 180, 100) + FAILURE_COLOR = (200, 100, 100) + + def __init__(self): + """Initialize the generator.""" + self._font_cache: dict[str, ImageFont.FreeTypeFont | ImageFont.ImageFont] = {} + + @staticmethod + def _short_text(s: str, limit: int = 10) -> str: + s = (s or "").strip() + if len(s) <= limit: + return s + return s[:limit] + "…" + + @staticmethod + def _pick_epithet_and_lore( + stats: WorldStats, outcome: GameOutcome, world_state: WorldState + ) -> tuple[str, str]: + """Rule-based epithet + lore (localized by session language).""" + lang = _lang(world_state) + d = float(getattr(stats, "total_distance_km", 0.0) or 0.0) + decisions = int(getattr(stats, "decision_times", 0) or 0) + leader = int(getattr(stats, "leader_times", 0) or 0) + bad_weather = int(getattr(stats, "bad_weather_steps", 0) or 0) + weather = str(world_state.weather) + + # Failure path first + if outcome.is_finished and not outcome.is_success: + if bad_weather > 0: + return (share_epithet_retreat_snow(lang), share_lore_retreat_snow(lang)) + return (share_epithet_retreat_fail(lang), share_lore_retreat_fail(lang)) + + # Base by distance + if d >= 40: + epithet, lore = share_epithet_veteran(lang), share_lore_veteran(lang) + elif d >= 20: + epithet, lore = share_epithet_steadfast(lang), share_lore_steadfast(lang) + else: + epithet, lore = share_epithet_first_timer(lang), share_lore_first_timer(lang) + + # Strategy / leadership + if decisions >= 8 and leader >= 2: + epithet, lore = share_epithet_leader(lang), share_lore_leader(lang) + elif decisions >= 5: + epithet, lore = share_epithet_junction(lang), share_lore_junction(lang) + + # Harsh weather + if bad_weather >= 5: + if weather in {"snowy", "foggy"}: + epithet, lore = share_epithet_night_walker(lang), share_lore_night_walker(lang) + elif weather in {"rainy", "windy"}: + epithet, lore = share_epithet_storm_walker(lang), share_lore_storm_walker(lang) + + return epithet, lore + + def _get_font(self, size: int) -> ImageFont.FreeTypeFont | ImageFont.ImageFont: + """Get or create a font of the specified size that supports Chinese characters.""" + if size not in self._font_cache: + # Try common Chinese fonts on different platforms + font_paths = [ + # macOS + "/System/Library/Fonts/PingFang.ttc", + "/System/Library/Fonts/STHeiti Light.ttc", + "/System/Library/Fonts/STHeiti Medium.ttc", + "/System/Library/Fonts/Supplemental/Songti.ttc", + # Linux + "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc", + "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", + "/usr/share/fonts/truetype/arphic/uming.ttc", + # Windows (common paths) + "C:/Windows/Fonts/msyh.ttc", # Microsoft YaHei + "C:/Windows/Fonts/simhei.ttf", # SimHei + "C:/Windows/Fonts/simsun.ttc", # SimSun + ] + + font_loaded = False + for font_path in font_paths: + try: + # For .ttc files, we need to specify index (0 for first font) + if font_path.endswith(".ttc"): + self._font_cache[size] = ImageFont.truetype(font_path, size, index=0) + else: + self._font_cache[size] = ImageFont.truetype(font_path, size) + font_loaded = True + break + except Exception: + continue + + if not font_loaded: + # Last resort: try to use default font (may not support Chinese) + try: + self._font_cache[size] = ImageFont.load_default() + except Exception: + # If all else fails, create a basic font + self._font_cache[size] = ImageFont.load_default() + return self._font_cache[size] + + def generate( + self, world_state: WorldState, outcome: GameOutcome + ) -> tuple[bytes, dict[str, Any]]: + """ + Generate a share image and return both the image bytes and structured JSON data. + + Returns: + tuple[bytes, dict]: (image_bytes, structured_json_data) + """ + # Create base image: try to use share_background.png, fallback to solid color + img = None + try: + # Backend dir: demos/AOTAI_Hike/backend/aotai_hike/utils/share_image.py + # Frontend assets: demos/AOTAI_Hike/frontend/assets/share_background.png + root = Path(__file__).resolve().parents[3] + bg_path = root / "frontend" / "assets" / "share_background.png" + if bg_path.is_file(): + bg = Image.open(bg_path).convert("RGB") + # Use NEAREST to keep a clear pixel-art look (avoid smoothing) + bg = bg.resize((self.WIDTH, self.HEIGHT), Image.NEAREST) + img = bg + except Exception: + img = None + + if img is None: + img = Image.new("RGB", (self.WIDTH, self.HEIGHT), self.BG_COLOR) + + # Convert to RGBA and add a dark, textured panel behind text + img = img.convert("RGBA") + + # === Dark panel with subtle vignette & texture ======================= + overlay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + + # Panel margins + panel_margin_x = 72 + panel_margin_top = 96 + panel_margin_bottom = 132 + panel_rect = ( + panel_margin_x, + panel_margin_top, + self.WIDTH - panel_margin_x, + self.HEIGHT - panel_margin_bottom, + ) + + base_panel_color_top = (18, 24, 40, 220) + base_panel_color_bottom = (10, 12, 22, 235) + panel = Image.new("RGBA", img.size, (0, 0, 0, 0)) + panel_draw = ImageDraw.Draw(panel) + panel_draw.rectangle(panel_rect, fill=base_panel_color_bottom) + + grad_steps = 32 + top, bottom = panel_rect[1], panel_rect[3] + height_panel = bottom - top + for i in range(grad_steps): + t = i / max(1, grad_steps - 1) + alpha = int(220 + (235 - 220) * t) + r = int( + base_panel_color_top[0] + (base_panel_color_bottom[0] - base_panel_color_top[0]) * t + ) + g = int( + base_panel_color_top[1] + (base_panel_color_bottom[1] - base_panel_color_top[1]) * t + ) + b = int( + base_panel_color_top[2] + (base_panel_color_bottom[2] - base_panel_color_top[2]) * t + ) + y = top + int(height_panel * t) + panel_draw.line([(panel_rect[0], y), (panel_rect[2], y)], fill=(r, g, b, alpha)) + + border_color = (220, 180, 90, 120) + for i in range(2): + inset = i + panel_draw.rectangle( + ( + panel_rect[0] + inset, + panel_rect[1] + inset, + panel_rect[2] - inset, + panel_rect[3] - inset, + ), + outline=border_color, + ) + + vignette = Image.new("L", img.size, 0) + v_draw = ImageDraw.Draw(vignette) + v_draw.ellipse( + ( + panel_rect[0] - 80, + panel_rect[1] - 60, + panel_rect[2] + 80, + panel_rect[3] + 120, + ), + fill=255, + ) + vignette = vignette.filter(ImageFilter.GaussianBlur(60)) + panel.putalpha(vignette) + + overlay = Image.alpha_composite(overlay, panel) + img = Image.alpha_composite(img, overlay) + + draw = ImageDraw.Draw(img) + + # Vertical layout metrics tuned for the new panel + y_offset = panel_rect[1] + 36 + line_height = 34 + section_spacing = 22 + + # Precompute epithet + epithet, lore = self._pick_epithet_and_lore(world_state.stats, outcome, world_state) + + lang = _lang(world_state) + theme = _theme(world_state) + graph = get_graph(theme) + title_font = self._get_font(50) + title_text = share_title(theme, lang) + draw.text( + (self.WIDTH // 2, y_offset), + title_text, + fill=(234, 242, 255), + anchor="mt", + font=title_font, + stroke_width=2, + stroke_fill=(20, 24, 40), + ) + y_offset += 68 + + # Outcome banner (only show if game is finished) + if outcome.is_finished: + if outcome.is_success: + if outcome.outcome_type == "cross_success": + outcome_text = share_outcome_success_cross(lang, outcome.current_node_name) + outcome_color = self.SUCCESS_COLOR + else: # retreat_success + outcome_text = share_outcome_success_retreat(lang, outcome.current_node_name) + outcome_color = self.SUCCESS_COLOR + else: + outcome_text = share_outcome_fail(lang, outcome.failure_reason) + outcome_color = self.FAILURE_COLOR + + outcome_font = self._get_font(32) + draw.text( + (self.WIDTH // 2, y_offset), + outcome_text, + fill=outcome_color, + anchor="mt", + font=outcome_font, + ) + y_offset += 50 + else: + # Game in progress - show status + status_font = self._get_font(32) + status_text = share_status_running(lang) + draw.text( + (self.WIDTH // 2, y_offset), + status_text, + fill=self.ACCENT_COLOR, + anchor="mt", + font=status_font, + ) + y_offset += 50 + + # Epithet + lore block + epithet_font = self._get_font(32) + lore_font = self._get_font(22) + + draw.text( + (self.WIDTH // 2, y_offset + 10), + epithet, + fill=(236, 228, 196), + anchor="mt", + font=epithet_font, + stroke_width=2, + stroke_fill=(20, 18, 12), + ) + y_offset += 52 + + draw.text( + (self.WIDTH // 2, y_offset), + lore, + fill=(210, 208, 222), + anchor="mt", + font=lore_font, + ) + y_offset += 46 + + stats_font = self._get_font(28) + left_x = panel_rect[0] + 36 + sep = share_stat_sep(lang) + days_unit = share_days_unit(lang) + + stats = [ + f"{share_stat_distance(lang)}{sep}{outcome.total_distance_km:.1f} km", + f"{share_stat_days(lang)}{sep}{outcome.days_spent} {days_unit}", + f"{share_stat_location(lang)}{sep}{outcome.current_node_name}", + ] + for stat in stats: + draw.text( + (left_x, y_offset), + stat, + fill=(225, 235, 248), + font=stats_font, + stroke_width=1, + stroke_fill=(10, 12, 20), + ) + y_offset += line_height + y_offset += section_spacing + + # Separator line + sep_y = y_offset - int(section_spacing * 0.4) + draw.line( + (panel_rect[0] + 20, sep_y, panel_rect[2] - 20, sep_y), + fill=(210, 170, 90, 180), + width=1, + ) + + # Roles section + role_font = self._get_font(28) + draw.text( + (left_x, y_offset), + share_team_members_label(lang), + fill=self.ACCENT_COLOR, + font=role_font, + ) + y_offset += line_height + 5 + for role in outcome.roles: + role_text = share_role_line(lang, role.name, role.attrs.stamina, role.attrs.mood) + draw.text( + (left_x + 8, y_offset), + role_text, + fill=(225, 235, 248), + font=role_font, + ) + y_offset += line_height - 5 + y_offset += section_spacing + + # Route section + route_font = self._get_font(28) + draw.text( + (left_x, y_offset), + share_route_nodes_label(lang), + fill=self.ACCENT_COLOR, + font=route_font, + ) + y_offset += line_height + 5 + + # Show visited nodes (limit to fit on image, localized) + visited_display = outcome.visited_nodes[:15] # Limit display + node_names = [] + for nid in visited_display: + node_names.append(get_node_display_name(theme, lang, nid)) + route_text = " → ".join(node_names) + if len(outcome.visited_nodes) > 15: + route_text += " ..." + + # Wrap long route text + max_width = self.WIDTH - 120 + words = route_text.split(" → ") + lines = [] + current_line = "" + for word in words: + test_line = current_line + (" → " if current_line else "") + word + bbox = draw.textbbox((0, 0), test_line, font=route_font) + if bbox[2] - bbox[0] <= max_width: + current_line = test_line + else: + if current_line: + lines.append(current_line) + current_line = word + if current_line: + lines.append(current_line) + + for line in lines[:5]: # Limit to 5 lines + draw.text( + (left_x + 8, y_offset), + line, + fill=(215, 225, 240), + font=route_font, + ) + y_offset += line_height - 5 + y_offset += section_spacing + + # Journey summary as human-readable sentences (no raw JSON) + summary_font = self._get_font(28) + draw.text( + (left_x, y_offset), + share_journey_summary_label(lang), + fill=self.ACCENT_COLOR, + font=summary_font, + ) + y_offset += line_height + 2 + + total_nodes = outcome.journey_summary.get("total_nodes_visited", 0) + key_events = outcome.journey_summary.get("key_events") or [] + final_weather = outcome.journey_summary.get("final_weather", "") + final_time = outcome.journey_summary.get("final_time", "") + + summary_lines = [] + summary_lines.append(share_summary_nodes_events(lang, total_nodes, len(key_events))) + if final_weather or final_time: + summary_lines.append(share_final_weather_time(lang, final_weather, final_time)) + + for line in summary_lines: + draw.text( + (left_x + 8, y_offset), + line, + fill=(200, 210, 230), + font=summary_font, + ) + y_offset += line_height - 6 + + memory_font = self._get_font(24) + highlights = list(getattr(world_state.stats, "memory_highlights", []) or []) + if highlights: + y_offset += section_spacing + draw.text( + (left_x, y_offset), + share_key_memories_label(lang), + fill=self.ACCENT_COLOR, + font=memory_font, + ) + y_offset += line_height + for h in highlights: + draw.text( + (left_x + 8, y_offset), + f"· {self._short_text(h, 24)}", + fill=(210, 220, 235), + font=memory_font, + ) + y_offset += line_height - 4 + + # Footer + footer_font = self._get_font(28) + footer_text = share_footer(lang) + draw.text( + (self.WIDTH // 2, self.HEIGHT - 30), + footer_text, + fill=(150, 150, 150), + anchor="mt", + font=footer_font, + ) + + # Convert to bytes + img_bytes = io.BytesIO() + img.save(img_bytes, format="PNG") + img_bytes.seek(0) + + # Structured JSON data (v2-style, compatible with original info) + result_text = ( + share_result_finished_success(lang) + if outcome.is_finished and outcome.is_success + else ( + share_result_finished_fail(lang) + if outcome.is_finished + else share_result_running(lang) + ) + ) + json_data = { + "summary": { + "title": share_title(theme, lang), + "status": "finished" + if outcome.is_finished and outcome.is_success + else ("failed" if outcome.is_finished else "running"), + "result_text": result_text, + "fail_reason": outcome.failure_reason or "", + "epithet": epithet, + "lore": lore, + }, + "party": [ + { + "role_id": r.role_id, + "name": r.name, + "persona": r.persona, + "persona_short": self._short_text(r.persona, 10), + "role_tag": ( + share_role_leader(lang) if r.role_id == world_state.leader_role_id else "" + ), + "is_player": (r.role_id == world_state.active_role_id), + "attrs": { + "stamina": r.attrs.stamina, + "mood": r.attrs.mood, + "experience": r.attrs.experience, + "risk_tolerance": r.attrs.risk_tolerance, + "supplies": r.attrs.supplies, + }, + } + for r in outcome.roles + ], + "team_stats": [ + { + "label": share_team_stat_stamina(lang), + "value": round( + sum(r.attrs.stamina for r in outcome.roles) / max(1, len(outcome.roles)), 1 + ), + "max": 100, + }, + { + "label": share_team_stat_mood(lang), + "value": round( + sum(r.attrs.mood for r in outcome.roles) / max(1, len(outcome.roles)), 1 + ), + "max": 100, + }, + { + "label": share_team_stat_risk(lang), + "value": round( + sum(r.attrs.risk_tolerance for r in outcome.roles) + / max(1, len(outcome.roles)), + 1, + ), + "max": 100, + }, + ], + "map": { + "distance_km": outcome.total_distance_km, + "current_node": outcome.current_node_name, + "key_nodes": [ + get_node_display_name(theme, lang, nid) + for nid in outcome.visited_nodes + if _node_exists(nid, theme) + and graph.get_node(nid).kind in {"camp", "junction", "exit", "peak", "lake"} + ], + }, + "env": { + "weather_main": world_state.weather, + "road_tags": list( + { + get_node_display_name(theme, lang, nid) + for nid in outcome.visited_nodes + if _node_exists(nid, theme) + } + ), + }, + "memory": { + "tags": [], + "highlight": list(getattr(world_state.stats, "memory_highlights", []) or []), + "count_new": len(getattr(world_state.stats, "memory_highlights", []) or []), + "count_forgot": 0, + }, + "actions": { + "download_enabled": True, + "close_enabled": True, + }, + "watermark": share_footer(lang), + "outcome": { + "is_success": outcome.is_success, + "outcome_type": outcome.outcome_type, + "total_distance_km": outcome.total_distance_km, + "days_spent": outcome.days_spent, + "is_finished": outcome.is_finished, + "failure_reason": outcome.failure_reason, + }, + "current_location": { + "node_id": outcome.current_node_id, + "node_name": outcome.current_node_name, + }, + "route": { + "visited_node_ids": outcome.visited_nodes, + "visited_node_names": [ + get_node_display_name(theme, lang, nid) + for nid in outcome.visited_nodes + if _node_exists(nid, theme) + ], + }, + "journey_summary": outcome.journey_summary, + } + + return img_bytes.getvalue(), json_data + + +def calculate_current_state(world_state: WorldState) -> GameOutcome: + """ + Calculate current game state for sharing (works for both finished and in-progress games). + + Args: + world_state: Current world state + + Returns: + GameOutcome with current state information (node names and failure reasons localized). + """ + theme = _theme(world_state) + lang = _lang(world_state) + graph = get_graph(theme) + current_node_id = world_state.current_node_id + + # Check if reached end nodes + is_end = current_node_id in ("end_exit", "bailout_2800", "bailout_ridge") + + # Check for failure conditions + all_stamina_zero = ( + all(role.attrs.stamina <= 0 for role in world_state.roles) if world_state.roles else False + ) + + # Determine outcome + if is_end: + is_finished = True + if current_node_id == "end_exit": + outcome_type = "cross_success" + is_success = True + failure_reason = None + elif current_node_id in ("bailout_2800", "bailout_ridge"): + outcome_type = "retreat_success" + is_success = True + failure_reason = None + else: + outcome_type = "failure" + is_success = False + failure_reason = share_failure_challenge_failed(lang) + elif all_stamina_zero: + is_finished = True + outcome_type = "failure" + is_success = False + failure_reason = share_failure_all_stamina(lang) + else: + is_finished = False + outcome_type = "in_progress" + is_success = False + failure_reason = None + + # Calculate total distance + total_distance = 0.0 + visited = world_state.visited_node_ids + for i in range(len(visited) - 1): + from_id = visited[i] + to_id = visited[i + 1] + edges = graph.outgoing(from_id) + for edge in edges: + if edge.to_node_id == to_id: + total_distance += getattr(edge, "distance_km", 1.0) + break + + # Add current transit progress if in transit + if world_state.in_transit_progress_km: + total_distance += world_state.in_transit_progress_km + + # Get current node name (localized) + current_node_name = get_node_display_name(theme, lang, current_node_id) + + # Build journey summary + journey_summary = { + "total_nodes_visited": len(visited), + "key_events": world_state.recent_events[-10:], # Last 10 events + "final_weather": world_state.weather, + "final_time": world_state.time_of_day, + "leader_history": [], # Could be expanded to track leader changes + } + + return GameOutcome( + is_success=is_success, + outcome_type=outcome_type, + total_distance_km=total_distance, + current_node_id=current_node_id, + current_node_name=current_node_name, + days_spent=world_state.day, + roles=world_state.roles, + visited_nodes=visited, + journey_summary=journey_summary, + is_finished=is_finished, + failure_reason=failure_reason, + ) + + +def calculate_outcome(world_state: WorldState) -> GameOutcome | None: + """ + Calculate game outcome based on current world state. + Returns None if game is not finished yet. + + Args: + world_state: Current world state + + Returns: + GameOutcome if game is finished, None otherwise + """ + outcome = calculate_current_state(world_state) + if not outcome.is_finished: + return None + return outcome + + +def generate_share_image(world_state: WorldState) -> tuple[bytes, dict[str, Any]] | None: + """ + Main entry point: generate share image if game is finished. + + Args: + world_state: Current world state + + Returns: + tuple[bytes, dict] if game finished: (image_bytes, json_data) + None if game not finished + """ + outcome = calculate_outcome(world_state) + if outcome is None: + return None + + generator = ShareImageGenerator() + return generator.generate(world_state, outcome) + + +def generate_current_share_image(world_state: WorldState) -> tuple[bytes, dict[str, Any]]: + """ + Generate share image for current game state (works for both finished and in-progress games). + + Args: + world_state: Current world state + + Returns: + tuple[bytes, dict]: (image_bytes, json_data) + """ + outcome = calculate_current_state(world_state) + generator = ShareImageGenerator() + return generator.generate(world_state, outcome) diff --git a/demos/AOTAI_Hike/backend/aotai_hike/world/kilimanjaro_map_data.py b/demos/AOTAI_Hike/backend/aotai_hike/world/kilimanjaro_map_data.py new file mode 100644 index 000000000..ca49d6c23 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/world/kilimanjaro_map_data.py @@ -0,0 +1,209 @@ +""" +Kilimanjaro trek map (Conquer Kilimanjaro theme). +Same node_id / edge structure as AoTai for game logic compatibility; +names and labels are Kilimanjaro-themed. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import ClassVar + +from aotai_hike.schemas import AoTaiEdge, AoTaiNode + + +# Same node_ids as AoTai (start, slope_forest, camp_2800, ...) for phase/terminal logic. +# Names and hints are Kilimanjaro route themed (Marangu / Machame style). +KILIMANJARO_NODES: dict[str, AoTaiNode] = { + "start": AoTaiNode( + node_id="start", + name="Marangu Gate", + altitude_m=1879, + scene_id="trailhead", + hint="Gear check, team briefing.", + x=5, + y=55, + kind="start", + ), + "slope_forest": AoTaiNode( + node_id="slope_forest", + name="Forest Trail", + altitude_m=2700, + scene_id="forest", + hint="Dense forest, humidity rises.", + x=18, + y=55, + kind="main", + ), + "camp_2800": AoTaiNode( + node_id="camp_2800", + name="Mandara Hut", + altitude_m=2720, + scene_id="camp", + hint="First camp, rest or evacuate from here.", + x=30, + y=45, + kind="camp", + ), + "stone_sea": AoTaiNode( + node_id="stone_sea", + name="Moorland Zone", + altitude_m=3200, + scene_id="stone", + hint="Rocky terrain, pace yourself.", + x=42, + y=55, + kind="main", + ), + "ridge_wind": AoTaiNode( + node_id="ridge_wind", + name="Horombo / Saddle", + altitude_m=3720, + scene_id="ridge", + hint="Wind exposure, stay together.", + x=55, + y=45, + kind="junction", + ), + "da_ye_hai": AoTaiNode( + node_id="da_ye_hai", + name="Kibo Hut", + altitude_m=4703, + scene_id="lake", + hint="Summit push base, weather can change fast.", + x=66, + y=55, + kind="lake", + ), + "ba_xian_tai": AoTaiNode( + node_id="ba_xian_tai", + name="Uhuru Peak", + altitude_m=5895, + scene_id="summit", + hint="Summit. Proceed with care.", + x=82, + y=45, + kind="peak", + ), + "end_exit": AoTaiNode( + node_id="end_exit", + name="Descent Finish", + altitude_m=1879, + scene_id="end", + hint="Trek complete, memories saved.", + x=95, + y=55, + kind="end", + ), + "bailout_2800": AoTaiNode( + node_id="bailout_2800", + name="Mandara Evacuation", + altitude_m=2720, + scene_id="end", + hint="Evacuation from Mandara Hut (demo).", + x=30, + y=70, + kind="exit", + ), + "bailout_ridge": AoTaiNode( + node_id="bailout_ridge", + name="Horombo Evacuation", + altitude_m=3720, + scene_id="end", + hint="Emergency evacuation from saddle (demo).", + x=55, + y=70, + kind="exit", + ), +} + +KILIMANJARO_EDGES: list[AoTaiEdge] = [ + AoTaiEdge( + from_node_id="start", + to_node_id="slope_forest", + kind="main", + label="Enter forest", + distance_km=4.0, + ), + AoTaiEdge( + from_node_id="slope_forest", + to_node_id="camp_2800", + kind="main", + label="To Mandara", + distance_km=6.0, + ), + AoTaiEdge( + from_node_id="camp_2800", + to_node_id="stone_sea", + kind="main", + label="Continue main route", + distance_km=4.0, + ), + AoTaiEdge( + from_node_id="stone_sea", + to_node_id="ridge_wind", + kind="main", + label="To saddle", + distance_km=6.0, + ), + AoTaiEdge( + from_node_id="ridge_wind", + to_node_id="da_ye_hai", + kind="main", + label="To Kibo Hut", + distance_km=3.0, + ), + AoTaiEdge( + from_node_id="da_ye_hai", + to_node_id="ba_xian_tai", + kind="main", + label="Summit push", + distance_km=8.0, + ), + AoTaiEdge( + from_node_id="ba_xian_tai", + to_node_id="end_exit", + kind="main", + label="Descent", + distance_km=10.0, + ), + AoTaiEdge( + from_node_id="camp_2800", + to_node_id="bailout_2800", + kind="exit", + label="Evacuate", + distance_km=7.0, + ), + AoTaiEdge( + from_node_id="ridge_wind", + to_node_id="bailout_ridge", + kind="exit", + label="Emergency evacuate", + distance_km=9.0, + ), +] + + +@dataclass(frozen=True) +class KilimanjaroGraph: + start_node_id: ClassVar[str] = "start" + + @staticmethod + def get_node(node_id: str) -> AoTaiNode: + return KILIMANJARO_NODES[node_id] + + @staticmethod + def nodes() -> list[AoTaiNode]: + return list(KILIMANJARO_NODES.values()) + + @staticmethod + def edges() -> list[AoTaiEdge]: + return list(KILIMANJARO_EDGES) + + @staticmethod + def outgoing(node_id: str) -> list[AoTaiEdge]: + return [e for e in KILIMANJARO_EDGES if e.from_node_id == node_id] + + @staticmethod + def next_node_ids(node_id: str) -> list[str]: + return [e.to_node_id for e in KilimanjaroGraph.outgoing(node_id)] diff --git a/demos/AOTAI_Hike/backend/aotai_hike/world/map_data.py b/demos/AOTAI_Hike/backend/aotai_hike/world/map_data.py new file mode 100644 index 000000000..088335ff3 --- /dev/null +++ b/demos/AOTAI_Hike/backend/aotai_hike/world/map_data.py @@ -0,0 +1,258 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import ClassVar + +from aotai_hike.schemas import AoTaiEdge, AoTaiNode + + +# NOTE: This is a demo-scale AoTai graph with key landmarks + branches. +# It is not a precise topo map, but it encodes the core "mainline + bailout" structure. + + +NODES: dict[str, AoTaiNode] = { + # Start + "start": AoTaiNode( + node_id="start", + name="塘口起点", + altitude_m=2350, + scene_id="trailhead", + hint="补给检查,确认队伍状态。", + x=5, + y=55, + kind="start", + ), + # Mainline + "slope_forest": AoTaiNode( + node_id="slope_forest", + name="林间缓坡", + altitude_m=2550, + scene_id="forest", + hint="树影摇晃,风开始大了。", + x=18, + y=55, + kind="main", + ), + "camp_2800": AoTaiNode( + node_id="camp_2800", + name="2800营地", + altitude_m=2800, + scene_id="camp", + hint="常见营地节点,可休整/扎营,也可能下撤。", + x=30, + y=45, + kind="camp", + ), + "stone_sea": AoTaiNode( + node_id="stone_sea", + name="石海边缘", + altitude_m=2900, + scene_id="stone", + hint="碎石路更耗体力,注意脚下。", + x=42, + y=55, + kind="main", + ), + "ridge_wind": AoTaiNode( + node_id="ridge_wind", + name="风口山脊", + altitude_m=3150, + scene_id="ridge", + hint="能见度下降,队形别散。", + x=55, + y=45, + kind="junction", + ), + "da_ye_hai": AoTaiNode( + node_id="da_ye_hai", + name="大爷海", + altitude_m=3250, + scene_id="lake", + hint="关键地标,天气变化快。", + x=66, + y=55, + kind="lake", + ), + "ba_xian_tai": AoTaiNode( + node_id="ba_xian_tai", + name="拔仙台(太白最高点)", + altitude_m=3767, + scene_id="summit", + hint="海拔最高点,谨慎推进。", + x=82, + y=45, + kind="peak", + ), + "end_exit": AoTaiNode( + node_id="end_exit", + name="下撤终点", + altitude_m=3200, + scene_id="end", + hint="抵达终点,整理记忆。", + x=95, + y=55, + kind="end", + ), + # Bailout / branch nodes + "bailout_2800": AoTaiNode( + node_id="bailout_2800", + name="2800下撤口", + altitude_m=2700, + scene_id="end", + hint="从 2800营地下撤的出口(demo)。", + x=30, + y=70, + kind="exit", + ), + "bailout_ridge": AoTaiNode( + node_id="bailout_ridge", + name="山脊下撤口", + altitude_m=3000, + scene_id="end", + hint="山脊处紧急下撤节点(demo)。", + x=55, + y=70, + kind="exit", + ), +} + +# English names for AoTai nodes (when lang=en, theme=aotai) +AOTAI_NODE_NAMES_EN: dict[str, str] = { + "start": "Trailhead", + "slope_forest": "Forest Slope", + "camp_2800": "2800 Camp", + "stone_sea": "Stone Sea Edge", + "ridge_wind": "Ridge Wind", + "da_ye_hai": "Da Ye Hai", + "ba_xian_tai": "Ba Xian Tai (Summit)", + "end_exit": "Exit Finish", + "bailout_2800": "2800 Evac", + "bailout_ridge": "Ridge Evac", +} + +# English labels for AoTai edges (from_node_id, to_node_id) -> label +AOTAI_EDGE_LABELS_EN: dict[tuple[str, str], str] = { + ("start", "slope_forest"): "Into forest", + ("slope_forest", "camp_2800"): "To 2800", + ("camp_2800", "stone_sea"): "Main route", + ("stone_sea", "ridge_wind"): "To ridge", + ("ridge_wind", "da_ye_hai"): "To Da Ye Hai", + ("da_ye_hai", "ba_xian_tai"): "Summit push", + ("ba_xian_tai", "end_exit"): "Descent", + ("camp_2800", "bailout_2800"): "Evac", + ("ridge_wind", "bailout_ridge"): "Emergency evac", +} + + +EDGES: list[AoTaiEdge] = [ + # Mainline distances are demo values (km) and can be tuned. + AoTaiEdge( + from_node_id="start", + to_node_id="slope_forest", + kind="main", + label="进入山林", + distance_km=4.0, + ), + AoTaiEdge( + from_node_id="slope_forest", + to_node_id="camp_2800", + kind="main", + label="上到2800", + distance_km=6.0, + ), + AoTaiEdge( + from_node_id="camp_2800", + to_node_id="stone_sea", + kind="main", + label="继续主线", + distance_km=4.0, + ), + AoTaiEdge( + from_node_id="stone_sea", + to_node_id="ridge_wind", + kind="main", + label="上山脊", + distance_km=6.0, + ), + AoTaiEdge( + from_node_id="ridge_wind", + to_node_id="da_ye_hai", + kind="main", + label="去大爷海", + distance_km=3.0, + ), + AoTaiEdge( + from_node_id="da_ye_hai", + to_node_id="ba_xian_tai", + kind="main", + label="冲顶", + distance_km=8.0, + ), + AoTaiEdge( + from_node_id="ba_xian_tai", + to_node_id="end_exit", + kind="main", + label="下撤", + distance_km=10.0, + ), + # Branches / exits + AoTaiEdge( + from_node_id="camp_2800", + to_node_id="bailout_2800", + kind="exit", + label="下撤", + distance_km=7.0, + ), + AoTaiEdge( + from_node_id="ridge_wind", + to_node_id="bailout_ridge", + kind="exit", + label="紧急下撤", + distance_km=9.0, + ), +] + + +@dataclass(frozen=True) +class AoTaiGraph: + start_node_id: ClassVar[str] = "start" + + @staticmethod + def get_node(node_id: str) -> AoTaiNode: + return NODES[node_id] + + @staticmethod + def nodes() -> list[AoTaiNode]: + return list(NODES.values()) + + @staticmethod + def edges() -> list[AoTaiEdge]: + return list(EDGES) + + @staticmethod + def outgoing(node_id: str) -> list[AoTaiEdge]: + return [e for e in EDGES if e.from_node_id == node_id] + + @staticmethod + def next_node_ids(node_id: str) -> list[str]: + return [e.to_node_id for e in AoTaiGraph.outgoing(node_id)] + + +def get_graph(theme: str | None) -> type[AoTaiGraph]: + """Return the map graph for the given theme (aotai = 鳌太线, kili = 乞力马扎罗).""" + from aotai_hike.world.kilimanjaro_map_data import KilimanjaroGraph + + return KilimanjaroGraph if theme == "kili" else AoTaiGraph + + +def get_node_display_name(theme: str | None, lang: str | None, node_id: str) -> str: + """Return the node name for display in messages (localized when theme=aotai and lang=en).""" + graph = get_graph(theme) + try: + node = graph.get_node(node_id) + default_name = node.name + except Exception: + default_name = node_id + if theme == "aotai" and lang == "en": + return AOTAI_NODE_NAMES_EN.get(node_id, default_name) + return default_name diff --git a/demos/AOTAI_Hike/backend/app.py b/demos/AOTAI_Hike/backend/app.py new file mode 100644 index 000000000..e28edfcde --- /dev/null +++ b/demos/AOTAI_Hike/backend/app.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +import sys + +from pathlib import Path + +from aotai_hike.router import router +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from loguru import logger + + +logger.add("demos/AOTAI_Hike/logs/aotai_hike.log", encoding="utf-8", enqueue=True, backtrace=True) + + +ROOT = Path(__file__).resolve().parent.parent +FRONTEND_DIR = ROOT / "frontend" +LOG_DIR = ROOT / "logs" +LOG_DIR.mkdir(exist_ok=True) +LOG_FILE = LOG_DIR / "aotai_hike.log" + +app = FastAPI(title="AoTai Pixel Hike Demo", version="0.1.0") + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # In production, specify actual origins + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +app.include_router(router) +app.mount("/demo/ao-tai", StaticFiles(directory=str(FRONTEND_DIR), html=True), name="ao-tai-demo") + +# Configure logging: both stdout and file +logger.remove() +# Console output +logger.add( + sys.stdout, + level="INFO", + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", + colorize=True, +) +# File output with rotation +logger.add( + LOG_FILE, + level="INFO", + format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name}:{function}:{line} | {message}", + rotation="100 MB", # Rotate when file reaches 100MB + retention="7 days", # Keep logs for 7 days + compression="zip", # Compress old logs + encoding="utf-8", +) diff --git a/demos/AOTAI_Hike/banner.png b/demos/AOTAI_Hike/banner.png new file mode 100644 index 000000000..91d2e8ad3 Binary files /dev/null and b/demos/AOTAI_Hike/banner.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Dark Brick 1.png b/demos/AOTAI_Hike/frontend/assets/Dark Brick 1.png new file mode 100644 index 000000000..44dd64867 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Dark Brick 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Dark Bush 1.png b/demos/AOTAI_Hike/frontend/assets/Dark Bush 1.png new file mode 100644 index 000000000..1d0ecb0b3 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Dark Bush 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Dark Tree 1.png b/demos/AOTAI_Hike/frontend/assets/Dark Tree 1.png new file mode 100644 index 000000000..d2bd08f04 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Dark Tree 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Dark fence 1.png b/demos/AOTAI_Hike/frontend/assets/Dark fence 1.png new file mode 100644 index 000000000..663639812 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Dark fence 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Dark grass 1.png b/demos/AOTAI_Hike/frontend/assets/Dark grass 1.png new file mode 100644 index 000000000..8e886f6c7 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Dark grass 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Fallen Leaves 1.png b/demos/AOTAI_Hike/frontend/assets/Fallen Leaves 1.png new file mode 100644 index 000000000..609056dcc Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Fallen Leaves 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Mock Up 1.png b/demos/AOTAI_Hike/frontend/assets/Mock Up 1.png new file mode 100644 index 000000000..faa2a5f34 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Mock Up 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Pumpkin 1.png b/demos/AOTAI_Hike/frontend/assets/Pumpkin 1.png new file mode 100644 index 000000000..fa3aa4ac5 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Pumpkin 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/Tilemap 1.png b/demos/AOTAI_Hike/frontend/assets/Tilemap 1.png new file mode 100644 index 000000000..1a4e9f28c Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/Tilemap 1.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/avatars/ava_blue.svg b/demos/AOTAI_Hike/frontend/assets/avatars/ava_blue.svg new file mode 100644 index 000000000..04182f61d --- /dev/null +++ b/demos/AOTAI_Hike/frontend/assets/avatars/ava_blue.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/demos/AOTAI_Hike/frontend/assets/avatars/ava_default.svg b/demos/AOTAI_Hike/frontend/assets/avatars/ava_default.svg new file mode 100644 index 000000000..91401cddf --- /dev/null +++ b/demos/AOTAI_Hike/frontend/assets/avatars/ava_default.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/demos/AOTAI_Hike/frontend/assets/avatars/ava_green.svg b/demos/AOTAI_Hike/frontend/assets/avatars/ava_green.svg new file mode 100644 index 000000000..cd7aea506 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/assets/avatars/ava_green.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/demos/AOTAI_Hike/frontend/assets/avatars/ava_red.svg b/demos/AOTAI_Hike/frontend/assets/avatars/ava_red.svg new file mode 100644 index 000000000..5c04296cd --- /dev/null +++ b/demos/AOTAI_Hike/frontend/assets/avatars/ava_red.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_base.png b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_base.png new file mode 100644 index 000000000..8df98ae27 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_base.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_full.png b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_full.png new file mode 100644 index 000000000..514c13c05 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_full.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_props.png b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_props.png new file mode 100644 index 000000000..4f2d2d5c1 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/scenes/scene_base/scene_0_props.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_base.png b/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_base.png new file mode 100644 index 000000000..4ba599eec Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_base.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_props.png b/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_props.png new file mode 100644 index 000000000..ab8d340a5 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/scenes/scene_kilimanjaro/scene_0_props.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/share_background.png b/demos/AOTAI_Hike/frontend/assets/share_background.png new file mode 100644 index 000000000..2767a1346 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/share_background.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/share_frame.png b/demos/AOTAI_Hike/frontend/assets/share_frame.png new file mode 100644 index 000000000..ffaa3c337 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/share_frame.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/share_noise.png b/demos/AOTAI_Hike/frontend/assets/share_noise.png new file mode 100644 index 000000000..18abfdd42 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/share_noise.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_000.png new file mode 100644 index 000000000..426c5896b Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_001.png new file mode 100644 index 000000000..1f3e6330a Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_002.png new file mode 100644 index 000000000..19f1e4cbe Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_003.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_003.png new file mode 100644 index 000000000..98cc056d4 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_003.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_004.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_004.png new file mode 100644 index 000000000..46911492a Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_004.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_005.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_005.png new file mode 100644 index 000000000..3bf5cf6db Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/idle/frame_005.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_000.png new file mode 100644 index 000000000..ebe205d9d Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_001.png new file mode 100644 index 000000000..1e8125836 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_002.png new file mode 100644 index 000000000..3e01e3321 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_003.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_003.png new file mode 100644 index 000000000..39b33e054 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_003.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_004.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_004.png new file mode 100644 index 000000000..51ece9678 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_004.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_005.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_005.png new file mode 100644 index 000000000..422ef0824 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_005.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_006.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_006.png new file mode 100644 index 000000000..346725559 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_006.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_007.png b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_007.png new file mode 100644 index 000000000..d156e8297 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/ao/walk/frame_007.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_000.png new file mode 100644 index 000000000..863b0c096 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_001.png new file mode 100644 index 000000000..863b0c096 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_002.png new file mode 100644 index 000000000..a4a034489 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_003.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_003.png new file mode 100644 index 000000000..accf8ccf0 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_003.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_004.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_004.png new file mode 100644 index 000000000..b9d793218 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_004.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_005.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_005.png new file mode 100644 index 000000000..ea84a536e Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_005.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_006.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_006.png new file mode 100644 index 000000000..4315f10fb Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/idle/frame_006.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_000.png new file mode 100644 index 000000000..7d0fe253c Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_001.png new file mode 100644 index 000000000..b53c1a2b9 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_002.png new file mode 100644 index 000000000..ad9214eb0 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_003.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_003.png new file mode 100644 index 000000000..8c6bb01d8 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_003.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_004.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_004.png new file mode 100644 index 000000000..2f457aea6 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_004.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_005.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_005.png new file mode 100644 index 000000000..a15603bc0 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_005.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_006.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_006.png new file mode 100644 index 000000000..12e2a9768 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_006.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_007.png b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_007.png new file mode 100644 index 000000000..0d1ad9e8b Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/taibai/walk/frame_007.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_000.png new file mode 100644 index 000000000..91c250b59 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_001.png new file mode 100644 index 000000000..eb88d6565 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_002.png new file mode 100644 index 000000000..c33c511f2 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/idle/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_000.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_000.png new file mode 100644 index 000000000..62df148c0 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_000.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_001.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_001.png new file mode 100644 index 000000000..1f720f530 Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_001.png differ diff --git a/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_002.png b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_002.png new file mode 100644 index 000000000..33d82664f Binary files /dev/null and b/demos/AOTAI_Hike/frontend/assets/sprites/xiaoshan/walk/frame_002.png differ diff --git a/demos/AOTAI_Hike/frontend/main.js b/demos/AOTAI_Hike/frontend/main.js new file mode 100644 index 000000000..532b68abd --- /dev/null +++ b/demos/AOTAI_Hike/frontend/main.js @@ -0,0 +1,11 @@ +import { installActionsToWindow } from "./src/actions.js"; +import { bootstrap } from "./src/bootstrap.js"; +import { t } from "./src/i18n.js"; +import { logMsg } from "./src/render.js"; + +installActionsToWindow(); + +bootstrap().catch((err) => { + console.error(err); + logMsg({ kind: "system", content: t("msgStartupFailed") + err.message, timestamp_ms: Date.now() }); +}); diff --git a/demos/AOTAI_Hike/frontend/src/actions.js b/demos/AOTAI_Hike/frontend/src/actions.js new file mode 100644 index 000000000..681769fdc --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/actions.js @@ -0,0 +1,203 @@ +import { getLang, t } from "./i18n.js"; +import { sessionId, setMapData, setSessionId, setWorldState, worldState } from "./state.js"; +import { logMsg, renderBranchChoices, renderPartyStatus, renderRoles, setStatus, checkAndShowShareButton } from "./render.js"; +import { applyPhaseUI, isNightVoteModalBlocking } from "./phase_ui.js"; + +export const API_BASE = "/api/demo/ao-tai"; + +let _autoTimer = null; +let _autoInFlight = false; + +function _isGameOver(ws) { + if (!ws) return false; + const roles = ws.roles || []; + if (roles.length > 0 && roles.every((r) => Number(r?.attrs?.stamina || 0) <= 0)) return true; + const terminalIds = new Set(["end_exit", "bailout_2800", "bailout_ridge"]); + const curId = String(ws.current_node_id || ""); + return terminalIds.has(curId); +} + +function _shouldAutoContinue(ws) { + if (!ws) return false; + if (_isGameOver(ws)) return false; + if (!ws.active_role_id) return false; + const phase = ws.phase || "free"; + if (phase !== "free") return false; + if (isNightVoteModalBlocking?.()) return false; + // Stop when reaching a terminal node (no outgoing edges in this demo). + const terminal = new Set(["end_exit", "bailout_2800", "bailout_ridge"]); + if (terminal.has(String(ws.current_node_id || ""))) return false; + return true; +} + +function _scheduleAutoContinue() { + if (_autoTimer) return; + if (!_shouldAutoContinue(worldState)) return; + _autoTimer = setTimeout(async () => { + _autoTimer = null; + if (_autoInFlight) return; + if (!_shouldAutoContinue(worldState)) return; + _autoInFlight = true; + try { + await apiAct("CONTINUE"); + } finally { + _autoInFlight = false; + } + }, 900); +} + +export function scheduleAutoContinue() { + _scheduleAutoContinue(); +} + +async function api(path, body, method = "POST") { + const resp = await fetch(`${API_BASE}${path}`, { + method, + headers: { "Content-Type": "application/json" }, + body: body ? JSON.stringify(body) : undefined, + }); + if (!resp.ok) { + const text = await resp.text(); + throw new Error(`${resp.status} ${resp.statusText}: ${text}`); + } + return resp.json(); +} + +export async function apiGetMap(theme, lang) { + const params = new URLSearchParams(); + if (theme != null) params.set("theme", theme); + if (lang != null) params.set("lang", lang); + const q = params.toString() ? `?${params.toString()}` : ""; + const resp = await fetch(`${API_BASE}/map${q}`); + const data = await resp.json(); + setMapData(data); +} + +function _makeUserId() { + const ts = Date.now().toString(36); + const rand = Math.random().toString(36).slice(2, 8); + return `demo_user_${ts}_${rand}`; +} + +export async function apiNewSession(theme, lang) { + const data = await api("/session/new", { + user_id: _makeUserId(), + theme: theme != null ? theme : "aotai", + lang: lang != null ? lang : getLang(), + }); + setSessionId(data.session_id); + setWorldState(data.world_state); + logMsg({ kind: "system", content: t("msgNewSession"), timestamp_ms: Date.now() }); + setStatus(); + renderPartyStatus(); + renderBranchChoices(); + if (window.__aoTaiMapView) window.__aoTaiMapView.setState(worldState); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + applyPhaseUI(worldState); + checkAndShowShareButton(data.world_state); + _scheduleAutoContinue(); +} + +export async function apiUpsertRole(role) { + const data = await api("/roles/upsert", { session_id: sessionId, role }); + worldState.roles = data.roles; + worldState.active_role_id = data.active_role_id; + renderRoles(); + renderPartyStatus(); + renderBranchChoices(); + setStatus(); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + // ensure Phaser shows the party immediately after creation/update + if (window.__aoTaiMapView) window.__aoTaiMapView.setState(worldState); + applyPhaseUI(worldState); + _scheduleAutoContinue(); +} + +export async function apiRolesQuickstart(overwrite = false) { + const data = await api("/roles/quickstart", { session_id: sessionId, overwrite }); + worldState.roles = data.roles; + worldState.active_role_id = data.active_role_id; + renderRoles(); + renderPartyStatus(); + renderBranchChoices(); + setStatus(); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + // ensure Phaser shows the party immediately after creation/update + if (window.__aoTaiMapView) window.__aoTaiMapView.setState(worldState); + applyPhaseUI(worldState); + _scheduleAutoContinue(); +} + +export async function apiSetActiveRole(roleId) { + const ws = await api("/session/active_role", { session_id: sessionId, active_role_id: roleId }, "PUT"); + setWorldState(ws); + renderRoles(); + renderPartyStatus(); + renderBranchChoices(); + setStatus(); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + // ensure Phaser updates the active-role animation/pose immediately + if (window.__aoTaiMapView) window.__aoTaiMapView.setState(worldState); + const active = (worldState.roles || []).find((r) => r.role_id === roleId); + logMsg({ + kind: "system", + content: t("msgSwitchRole") + (active?.name || roleId), + timestamp_ms: Date.now(), + }); + applyPhaseUI(worldState); + _scheduleAutoContinue(); +} + +export async function apiAct(action, payload = {}) { + if (_isGameOver(worldState)) return null; + // Show "conversing" hint immediately when moving forward (may trigger NPC chat) + if (action === "MOVE_FORWARD") { + logMsg({ + kind: "system", + content: t("msgTalking"), + timestamp_ms: Date.now(), + }); + } + const data = await api("/act", { session_id: sessionId, action, payload }); + setWorldState(data.world_state); + + for (const m of data.messages || []) logMsg(m); + setStatus(); + renderRoles(); + renderPartyStatus(); + renderBranchChoices(); + if (window.__aoTaiMapView) window.__aoTaiMapView.setState(worldState); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + applyPhaseUI(worldState); + + // 检查并显示分享按钮(随时可见) + checkAndShowShareButton(data.world_state); + + _scheduleAutoContinue(); + return data; +} + +export async function apiSetSessionLang(lang) { + if (!sessionId) return; + const ws = await api("/session/lang", { session_id: sessionId, lang }, "PUT"); + setWorldState(ws); +} + +export async function apiSetSessionTheme(theme) { + if (!sessionId) return; + const ws = await api("/session/theme", { session_id: sessionId, theme }, "PUT"); + setWorldState(ws); +} + +export function installActionsToWindow() { + window.__aoTaiActions = { + apiGetMap, + apiNewSession, + apiUpsertRole, + apiSetActiveRole, + apiAct, + apiSetSessionLang, + apiSetSessionTheme, + scheduleAutoContinue, + }; +} diff --git a/demos/AOTAI_Hike/frontend/src/bootstrap.js b/demos/AOTAI_Hike/frontend/src/bootstrap.js new file mode 100644 index 000000000..1de578100 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/bootstrap.js @@ -0,0 +1,293 @@ +import { $ } from "./dom.js"; +import { apiAct, apiGetMap, apiNewSession, apiSetActiveRole, apiSetSessionLang, apiSetSessionTheme, apiUpsertRole, apiRolesQuickstart } from "./actions.js"; +import { setLang, getLang, t, getPageTitle, getTitle, getSubtitle } from "./i18n.js"; +import { initMinimapCanvas } from "./minimap.js"; +import { initPhaser } from "./phaser_view.js"; +import { applyPhaseUI } from "./phase_ui.js"; +import { logMsg, checkAndShowShareButton, setStatus, renderPartyStatus } from "./render.js"; +import { worldState } from "./state.js"; +import { makeRole } from "./utils.js"; + +function refreshStaticUI() { + const theme = worldState?.theme ?? "aotai"; + const lang = getLang(); + document.title = getPageTitle(theme, lang); + document.documentElement.lang = lang === "zh" ? "zh-CN" : "en"; + const set = (id, key, attr = "textContent") => { + const el = document.getElementById(id); + if (el) el[attr] = t(key); + }; + const titleEl = document.getElementById("i18n-title"); + if (titleEl) titleEl.textContent = getTitle(theme, lang); + const subEl = document.getElementById("i18n-subtitle"); + if (subEl) subEl.textContent = getSubtitle(theme, lang); + set("i18n-party-panel-title", "partyPanelTitle"); + set("i18n-interact-panel-title", "interactPanelTitle"); + set("i18n-btn-forward", "moveForward"); + set("i18n-btn-rest", "rest"); + set("i18n-btn-camp", "camp"); + set("i18n-btn-observe", "observe"); + set("btn-say", "send"); + set("i18n-hint-switch", "hintSwitchRole"); + set("i18n-setup-title", "setupTitle"); + set("i18n-setup-lang-label", "setupLangLabel"); + set("i18n-setup-map-label", "setupMapLabel"); + set("i18n-setup-sub", "setupSub"); + set("i18n-setup-name-label", "setupNameLabel"); + set("i18n-setup-persona-label", "setupPersonaLabel"); + set("i18n-setup-pending-title", "setupPendingTitle"); + set("i18n-night-vote-title", "nightVoteTitle"); + set("i18n-share-modal-title", "shareModalTitle"); + const shareBtn = $("#share-button"); + if (shareBtn) { + shareBtn.textContent = t("share"); + shareBtn.title = t("shareTitle"); + } + const langBtn = $("#lang-button"); + if (langBtn) { + langBtn.textContent = getLang() === "zh" ? t("langEn") : t("langZh"); + } + $("#setup-role-name") && ($("#setup-role-name").placeholder = t("setupNamePlaceholder")); + $("#setup-role-persona") && ($("#setup-role-persona").placeholder = t("setupPersonaPlaceholder")); + $("#setup-add-role") && ($("#setup-add-role").textContent = t("setupAddRole")); + $("#setup-quickstart") && ($("#setup-quickstart").textContent = t("setupQuickstart")); + $("#setup-create") && ($("#setup-create").textContent = t("setupCreate")); + $("#night-vote-sub") && ($("#night-vote-sub").textContent = t("nightVoteSub")); + $("#night-vote-close") && ($("#night-vote-close").textContent = t("nightVoteContinue")); + $("#share-download-btn") && ($("#share-download-btn").textContent = t("shareDownload")); + $("#share-close-btn") && ($("#share-close-btn").textContent = t("shareClose")); + const shareModalTitleEl = document.getElementById("i18n-share-modal-title"); + if (shareModalTitleEl) shareModalTitleEl.textContent = t("shareModalTitle"); + const minimapCanvas = document.getElementById("minimap-canvas"); + if (minimapCanvas) minimapCanvas.setAttribute("aria-label", t("minimapAriaLabel")); + const themeLabel = $("#i18n-setup-theme-label"); + if (themeLabel) themeLabel.textContent = t("setupThemeLabel"); + const setupLangZh = $("#setup-lang-zh"); + const setupLangEn = $("#setup-lang-en"); + const setupMapAotai = $("#setup-map-aotai"); + const setupMapKili = $("#setup-map-kili"); + const currentTheme = worldState?.theme ?? "aotai"; + const currentLang = getLang(); + if (setupLangZh) { + setupLangZh.textContent = t("setupLangZh"); + setupLangZh.classList.toggle("primary", currentLang === "zh"); + } + if (setupLangEn) { + setupLangEn.textContent = t("setupLangEn"); + setupLangEn.classList.toggle("primary", currentLang === "en"); + } + if (setupMapAotai) { + setupMapAotai.textContent = t("setupMapAotai"); + setupMapAotai.classList.toggle("primary", currentTheme === "aotai"); + } + if (setupMapKili) { + setupMapKili.textContent = t("setupMapKilimanjaro"); + setupMapKili.classList.toggle("primary", currentTheme === "kili"); + } + if (typeof window.__aoTaiRefreshSetupList === "function") { + window.__aoTaiRefreshSetupList(); + } +} + +export async function refreshAllUIText() { + refreshStaticUI(); + // Do NOT re-fetch map here: map is tied to theme, not lang. Switching lang must not change map. + setStatus(); + renderPartyStatus(); + applyPhaseUI(worldState); + if (window.__aoTaiMinimap && typeof window.__aoTaiMinimap.setState === "function") { + window.__aoTaiMinimap.setState(worldState); + } + if (window.__aoTaiMapView && typeof window.__aoTaiMapView.setState === "function") { + window.__aoTaiMapView.setState(worldState); + } +} + +export async function bootstrap() { + await apiNewSession("aotai", getLang()); + await apiGetMap(worldState?.theme ?? "aotai", getLang()); + window.__aoTaiMinimap = initMinimapCanvas(); + if (window.__aoTaiMinimap) window.__aoTaiMinimap.setState(worldState); + initPhaser(); + + // Language switcher (left of share button) + const langBtn = $("#lang-button"); + if (langBtn) { + langBtn.onclick = async () => { + const newLang = getLang() === "zh" ? "en" : "zh"; + setLang(newLang); + await apiSetSessionLang(newLang).catch((e) => console.warn("Failed to set session lang", e)); + await refreshAllUIText(); + }; + } + refreshStaticUI(); + + // Initialize share button + checkAndShowShareButton(worldState); + + window.addEventListener("aotai:langchange", () => refreshAllUIText()); + + // Initial role setup modal (must create at least one role; modal is removed after creation) + const setupEl = $("#role-setup"); + const setupNameEl = $("#setup-role-name"); + const setupPersonaEl = $("#setup-role-persona"); + const setupListEl = $("#setup-role-list"); + const setupErrEl = $("#setup-error"); + const pending = []; + + const showSetupErr = (msg) => { + if (!setupErrEl) return; + setupErrEl.style.display = msg ? "block" : "none"; + setupErrEl.textContent = msg || ""; + }; + + const renderPending = () => { + if (!setupListEl) return; + setupListEl.innerHTML = ""; + if (pending.length === 0) { + const empty = document.createElement("div"); + empty.className = "hint"; + empty.textContent = t("setupEmptyList"); + setupListEl.appendChild(empty); + return; + } + pending.forEach((r, idx) => { + const item = document.createElement("div"); + item.className = "setup-item"; + const left = document.createElement("div"); + left.innerHTML = `
${r.name}
${(r.persona || "") + .replaceAll("<", "<") + .replaceAll(">", ">")}
`; + const btn = document.createElement("button"); + btn.textContent = t("setupRemove"); + btn.onclick = () => { + pending.splice(idx, 1); + renderPending(); + }; + item.appendChild(left); + item.appendChild(btn); + setupListEl.appendChild(item); + }); + }; + window.__aoTaiRefreshSetupList = renderPending; + + const hideAndRemoveSetup = () => { + if (!setupEl) return; + setupEl.style.display = "none"; + try { + setupEl.remove(); + } catch {} + }; + + const openSetupIfNeeded = () => { + if (!setupEl) return; + const roles = worldState && worldState.roles ? worldState.roles : []; + if (roles.length > 0) return; // already has roles, don't block + setupEl.style.display = "flex"; + showSetupErr(""); + renderPending(); + try { + setupNameEl && setupNameEl.focus(); + } catch {} + }; + + $("#setup-add-role")?.addEventListener("click", () => { + const name = (setupNameEl?.value || "").trim(); + const persona = (setupPersonaEl?.value || "").trim(); + if (!name) { + showSetupErr(t("setupErrName")); + return; + } + showSetupErr(""); + pending.push({ name, persona }); + if (setupNameEl) setupNameEl.value = ""; + if (setupPersonaEl) setupPersonaEl.value = ""; + renderPending(); + try { + setupNameEl && setupNameEl.focus(); + } catch {} + }); + + $("#setup-create")?.addEventListener("click", async () => { + if (pending.length === 0) { + showSetupErr(t("setupErrMinOne")); + return; + } + showSetupErr(""); + for (const r of pending) { + await apiUpsertRole(makeRole(r.name, r.persona)); + logMsg({ kind: "system", content: t("msgRoleAdded") + r.name, timestamp_ms: Date.now() }); + } + const roles = worldState?.roles || []; + const pick = roles[0]; + if (pick?.role_id) await apiSetActiveRole(pick.role_id); + hideAndRemoveSetup(); + }); + + $("#setup-quickstart")?.addEventListener("click", async () => { + showSetupErr(""); + // Use backend's roles/quickstart endpoint to create default roles with correct attributes + await apiRolesQuickstart(false); + logMsg({ kind: "system", content: t("msgQuickstartDone"), timestamp_ms: Date.now() }); + const roles = worldState?.roles || []; + const pick = roles[0]; + if (pick?.role_id) await apiSetActiveRole(pick.role_id); + hideAndRemoveSetup(); + }); + + // Wire action buttons + $("#actions-panel").addEventListener("click", (e) => { + const btn = e.target.closest("button[data-act]"); + if (!btn) return; + apiAct(btn.getAttribute("data-act")); + }); + + // New flow: movement/rest/observe are now automatic. Hide all action buttons by default. + // CAMP button will be shown only in AWAIT_CAMP_DECISION phase by phase_ui.js + try { + document.querySelectorAll("#actions-panel button[data-act]").forEach((b) => { + b.style.display = "none"; // Hide all action buttons by default + }); + } catch {} + + $("#btn-say").onclick = async () => { + const text = ($("#say-input").value || "").trim(); + $("#say-input").value = ""; + await apiAct("SAY", { text }); + }; + + // Language choice in setup modal (independent of map; refetch map so labels match lang) + $("#setup-lang-zh")?.addEventListener("click", async () => { + setLang("zh"); + await apiSetSessionLang("zh").catch((e) => console.warn("Failed to set session lang", e)); + await apiGetMap(worldState?.theme ?? "aotai", getLang()).catch((e) => console.warn("Failed to refresh map", e)); + await refreshAllUIText(); + }); + $("#setup-lang-en")?.addEventListener("click", async () => { + setLang("en"); + await apiSetSessionLang("en").catch((e) => console.warn("Failed to set session lang", e)); + await apiGetMap(worldState?.theme ?? "aotai", getLang()).catch((e) => console.warn("Failed to refresh map", e)); + await refreshAllUIText(); + }); + // Map choice in setup modal (independent of language) + $("#setup-map-aotai")?.addEventListener("click", async () => { + await apiSetSessionTheme("aotai").catch((e) => console.warn("Failed to set session theme", e)); + await apiGetMap("aotai", getLang()).catch((e) => console.warn("Failed to refresh map", e)); + await refreshAllUIText(); + }); + $("#setup-map-kili")?.addEventListener("click", async () => { + await apiSetSessionTheme("kili").catch((e) => console.warn("Failed to set session theme", e)); + await apiGetMap("kili", getLang()).catch((e) => console.warn("Failed to refresh map", e)); + await refreshAllUIText(); + }); + + // Show role setup modal on first open + openSetupIfNeeded(); + + // First hint + logMsg({ + kind: "system", + content: t("msgFirstHint"), + timestamp_ms: Date.now(), + }); +} diff --git a/demos/AOTAI_Hike/frontend/src/dom.js b/demos/AOTAI_Hike/frontend/src/dom.js new file mode 100644 index 000000000..9297d40e1 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/dom.js @@ -0,0 +1,7 @@ +export const $ = (sel) => document.querySelector(sel); + +export const chatEl = $("#chat"); +export const rolesEl = $("#roles"); +export const statusEl = $("#status"); +export const partyEl = $("#party-status"); +export const branchEl = $("#branch-choices"); diff --git a/demos/AOTAI_Hike/frontend/src/i18n.js b/demos/AOTAI_Hike/frontend/src/i18n.js new file mode 100644 index 000000000..4fd151364 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/i18n.js @@ -0,0 +1,292 @@ +/** + * Multi-language (zh/en) for AoTai Hike demo. + * Usage: t("key") returns current language string; setLang("zh"|"en") then refresh UI. + */ + +const STORAGE_KEY = "aotai_hike_lang"; + +const messages = { + zh: { + // Page & title + pageTitle: "鳌太线·像素徒步模拟器(Demo)", + title: "鳌太线·像素徒步模拟器", + subtitle: "单人多角色 · 其他角色由生成接口驱动(当前为 mock)", + + // Top bar buttons + share: "分享", + shareTitle: "分享游戏记录", + langZh: "中", + langEn: "英", + + // Party panel + partyPanelTitle: "队伍状态(点击卡片切换角色)", + partyStatus: "队伍状态", + partyEmpty: "还没有队员。请先在启动弹窗里创建角色。", + currentPlay: "当前扮演", + yes: "是", + no: "否", + + // Stats + stamina: "体力", + mood: "心情", + experience: "经验", + risk: "冒险", + supplies: "物资", + + // Interact panel + interactPanelTitle: "互动(动作 + 像素聊天)", + moveForward: "前进", + rest: "休息", + camp: "扎营", + observe: "观察", + campButtonTitle: "扎营(恢复体力,消耗较多物资)", + sayPlaceholder: "当前角色说点什么…", + sayPlaceholderDisabled: "队伍行动中…(需要你发言时会提示)", + sayPlaceholderGameOver: "游戏已结束", + send: "发送", + hintSwitchRole: "提示:点击上方「队伍状态」的卡片即可切换当前角色。", + + // Status line + statusLocation: "位置", + statusDay: "Day", + statusWeather: "天气", + statusCurrentRole: "当前角色", + statusEnRoute: "路上→", + + // Branch + nextStep: "下一步", + junctionChoose: "分岔口:请选择下一步", + + // Chat / system + system: "系统", + unknown: "未知", + + // Role setup modal + setupTitle: "创建队伍角色", + setupThemeLabel: "路线主题(决定剧情与默认角色设定):", + setupLangLabel: "语言:", + setupMapLabel: "地图:", + setupLangZh: "中文", + setupLangEn: "English", + setupMapAotai: "鳌太线", + setupMapKilimanjaro: "乞力马扎罗", + setupThemeAotai: "鳌太线", + setupThemeKilimanjaro: "乞力马扎罗", + setupSub: "先创建 1 个或多个角色(名字 + 角色介绍),创建完成后该弹窗会消失。也可以一键快速创建。", + setupNameLabel: "名字", + setupNamePlaceholder: "例如:阿鳌", + setupPersonaLabel: "角色介绍", + setupPersonaPlaceholder: "例如:经验丰富的徒步向导,谨慎但乐观。", + setupAddRole: "加入列表", + setupQuickstart: "快速创建 3 角色", + setupPendingTitle: "待创建", + setupCreate: "创建并开始", + setupEmptyList: "还没有待创建的角色。可以先填写名字/介绍加入列表,或点击「快速创建 3 角色」。", + setupRemove: "移除", + setupErrName: "请先填写名字。", + setupErrMinOne: "请至少加入 1 个角色,或点击「快速创建 3 角色」。", + + // Night vote + nightVoteTitle: "夜间票选队长", + nightVoteSub: "请选择一位队长。选择后将展示全员投票与理由。", + nightVoteSelectAsLeader: "选择为队长", + nightVoteDone: "投票完成。", + nightVoteContinue: "继续出发", + + // Share modal + shareModalTitle: "分享游戏记录", + shareDownload: "下载图片", + shareClose: "关闭", + shareGenerating: "正在生成分享图片...", + shareNoSession: "游戏会话不可用", + shareLoadFailed: "加载失败", + + // Phase hints + phaseWaitSay: "队伍等待你发言:请在输入框里发一句话(发言后才能继续)。", + phaseCampDecision: "作为队长,你可以选择扎营恢复体力(消耗较多物资),或继续前进。", + phaseNightWaitSay: "夜晚到来:请先发言(发送一句话)后才能开始票选队长。", + phaseNightVote: "夜晚票选:请在弹窗中选择队长。", + phaseUnknown: "当前阶段:{phase}(动作暂不可用)", + + // System messages + msgNewSession: "已创建新 Session。", + msgTalking: "正在与队友对话…", + msgSwitchRole: "切换当前角色为:", + msgRoleAdded: "新增角色:", + msgQuickstartDone: "已创建 3 个默认角色。", + msgFirstHint: "先创建角色(弹窗里可快速创建),然后用动作按钮开始徒步。", + msgStartupFailed: "启动失败:", + + // Phaser fallback + roleLabel: "角色", + + // Minimap + minimapAriaLabel: "小地图", + }, + + en: { + pageTitle: "Conquer Kilimanjaro · Pixel Trail Simulator (Demo)", + title: "Conquer Kilimanjaro · Pixel Trail Simulator", + subtitle: "Single-player multi-role · Other roles driven by API (mock)", + + share: "Share", + shareTitle: "Share game record", + langZh: "中", + langEn: "EN", + + partyPanelTitle: "Party (click card to switch role)", + partyStatus: "Party", + partyEmpty: "No members yet. Create roles in the setup popup first.", + currentPlay: "Playing", + yes: "Yes", + no: "No", + + stamina: "Stamina", + mood: "Mood", + experience: "Exp", + risk: "Risk", + supplies: "Supplies", + + interactPanelTitle: "Interact (actions + pixel chat)", + moveForward: "Forward", + rest: "Rest", + camp: "Camp", + observe: "Observe", + campButtonTitle: "Camp (restore stamina, uses more supplies)", + sayPlaceholder: "Say something as current role…", + sayPlaceholderDisabled: "Party on the move… (you'll be prompted when to speak)", + sayPlaceholderGameOver: "Game over", + send: "Send", + hintSwitchRole: "Tip: click a card above to switch the current role.", + + statusLocation: "Location", + statusDay: "Day", + statusWeather: "Weather", + statusCurrentRole: "Role", + statusEnRoute: "En route→", + + nextStep: "Next", + junctionChoose: "Junction: choose next step", + + system: "System", + unknown: "Unknown", + + setupTitle: "Create party roles", + setupThemeLabel: "Trek theme (sets story & default roles):", + setupLangLabel: "Language:", + setupMapLabel: "Map:", + setupLangZh: "中文", + setupLangEn: "English", + setupMapAotai: "AoTai Trail", + setupMapKilimanjaro: "Kilimanjaro", + setupThemeAotai: "AoTai Trail", + setupThemeKilimanjaro: "Kilimanjaro", + setupSub: "Create one or more roles (name + intro). This popup closes when done. Or quick-create.", + setupNameLabel: "Name", + setupNamePlaceholder: "e.g. Ao", + setupPersonaLabel: "Role intro", + setupPersonaPlaceholder: "e.g. Experienced trail guide, cautious but optimistic.", + setupAddRole: "Add to list", + setupQuickstart: "Quick create 3 roles", + setupPendingTitle: "Pending", + setupCreate: "Create & start", + setupEmptyList: "No pending roles. Add name/intro or click «Quick create 3 roles».", + setupRemove: "Remove", + setupErrName: "Please enter a name.", + setupErrMinOne: "Add at least one role, or click «Quick create 3 roles».", + + nightVoteTitle: "Night vote: choose leader", + nightVoteSub: "Choose one leader. After that, votes and reasons will be shown.", + nightVoteSelectAsLeader: "Select as leader", + nightVoteDone: "Vote complete.", + nightVoteContinue: "Continue", + + shareModalTitle: "Share game record", + shareDownload: "Download image", + shareClose: "Close", + shareGenerating: "Generating share image...", + shareNoSession: "Game session not available", + shareLoadFailed: "Load failed", + + phaseWaitSay: "Party is waiting for you: type a message and send to continue.", + phaseCampDecision: "As leader, you can camp to restore stamina (uses more supplies) or continue.", + phaseNightWaitSay: "Night: say something first, then the leader vote will start.", + phaseNightVote: "Night vote: choose the leader in the popup.", + phaseUnknown: "Phase: {phase} (actions disabled)", + + msgNewSession: "New session created.", + msgTalking: "Talking with party…", + msgSwitchRole: "Switched to: ", + msgRoleAdded: "Added role: ", + msgQuickstartDone: "Created 3 default roles.", + msgFirstHint: "Create roles (quick create in popup), then use actions to start the hike.", + msgStartupFailed: "Startup failed: ", + + roleLabel: "Role", + + minimapAriaLabel: "Minimap", + }, +}; + +let currentLang = (typeof localStorage !== "undefined" && localStorage.getItem(STORAGE_KEY)) || "zh"; +if (currentLang !== "zh" && currentLang !== "en") currentLang = "zh"; + +export function getLang() { + return currentLang; +} + +export function setLang(lang) { + if (lang !== "zh" && lang !== "en") return; + currentLang = lang; + try { + localStorage.setItem(STORAGE_KEY, lang); + } catch {} + try { + window.dispatchEvent(new CustomEvent("aotai:langchange", { detail: { lang } })); + } catch {} +} + +export function t(key) { + const m = messages[currentLang]; + const s = m && m[key]; + if (s === undefined) return messages.zh[key] || key; + return s; +} + +/** Replace placeholders like {phase} in t("phaseUnknown") */ +export function tFormat(key, vars = {}) { + let s = t(key); + Object.entries(vars).forEach(([k, v]) => { + s = s.replace(new RegExp(`\\{${k}\\}`, "g"), String(v)); + }); + return s; +} + +/** Title / page title / subtitle by theme (aotai|kili) and lang (zh|en). */ +export function getPageTitle(theme, lang) { + const key = theme === "kili" ? "pageTitleKili" : "pageTitleAotai"; + const m = messages[lang] || messages.zh; + return (m && m[key]) || (theme === "kili" ? "Conquer Kilimanjaro · Pixel Trail Simulator (Demo)" : "鳌太线·像素徒步模拟器(Demo)"); +} + +export function getTitle(theme, lang) { + const key = theme === "kili" ? "titleKili" : "titleAotai"; + const m = messages[lang] || messages.zh; + return (m && m[key]) || (theme === "kili" ? "Conquer Kilimanjaro · Pixel Trail Simulator" : "鳌太线·像素徒步模拟器"); +} + +export function getSubtitle(theme, lang) { + const key = "subtitle"; + const m = messages[lang] || messages.zh; + return (m && m[key]) || "单人多角色 · 其他角色由生成接口驱动(当前为 mock)"; +} + +// Title variants by theme (used by getPageTitle / getTitle) +messages.zh.pageTitleAotai = "鳌太线·像素徒步模拟器(Demo)"; +messages.zh.titleAotai = "鳌太线·像素徒步模拟器"; +messages.zh.pageTitleKili = "决胜乞力马扎罗·像素徒步模拟器(Demo)"; +messages.zh.titleKili = "决胜乞力马扎罗·像素徒步模拟器"; +messages.en.pageTitleAotai = "AoTai Trail · Pixel Hiking Simulator (Demo)"; +messages.en.titleAotai = "AoTai Trail · Pixel Hiking Simulator"; +messages.en.pageTitleKili = "Conquer Kilimanjaro · Pixel Trail Simulator (Demo)"; +messages.en.titleKili = "Conquer Kilimanjaro · Pixel Trail Simulator"; diff --git a/demos/AOTAI_Hike/frontend/src/minimap.js b/demos/AOTAI_Hike/frontend/src/minimap.js new file mode 100644 index 000000000..c612bddbe --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/minimap.js @@ -0,0 +1,208 @@ +import { mapEdges, mapNodes, mapStartNodeId } from "./state.js"; +import { clamp } from "./utils.js"; + +export function initMinimapCanvas() { + const root = document.getElementById("minimap-root"); + const canvas = document.getElementById("minimap-canvas"); + const ctx = canvas && canvas.getContext ? canvas.getContext("2d") : null; + if (!root || !canvas || !ctx) return null; + + const fontStack = + '"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,sans-serif'; + const state = { ws: null, dpr: 1 }; + + const nodeByIdLocal = (id) => + (mapNodes || []).find((n) => String(n.node_id) === String(id)); + + const resize = () => { + const r = root.getBoundingClientRect(); + const dpr = Math.max(1, Math.min(4, window.devicePixelRatio || 1)); + state.dpr = dpr; + canvas.width = Math.max(1, Math.round(r.width * dpr)); + canvas.height = Math.max(1, Math.round(r.height * dpr)); + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.imageSmoothingEnabled = false; + }; + + const draw = () => { + const ws = state.ws; + if (!ws) return; + const r = root.getBoundingClientRect(); + const W = Math.max(1, Math.round(r.width)); + const H = Math.max(1, Math.round(r.height)); + + ctx.clearRect(0, 0, W, H); + ctx.fillStyle = "rgba(10,16,28,0.92)"; + ctx.fillRect(0, 0, W, H); + ctx.strokeStyle = "rgba(124,242,255,0.38)"; + ctx.lineWidth = 2; + ctx.strokeRect(1, 1, W - 2, H - 2); + + const pad = 14; + const mapW = Math.max(10, W - pad * 2); + const mapH = Math.max(10, H - pad * 2); + const toMini = (n) => { + const x = pad + (clamp(n.x, 0, 100) / 100) * mapW; + const y = pad + (clamp(n.y, 0, 100) / 100) * mapH; + return { x, y }; + }; + + const nodeId = ws.current_node_id || mapStartNodeId || "start"; + const visitedSet = new Set((ws.visited_node_ids || [nodeId]).map(String)); + + const curveSign = (s) => { + let h = 0; + for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0; + return h & 1 ? 1 : -1; + }; + + // edges + for (const e of mapEdges || []) { + const a = nodeByIdLocal(e.from_node_id); + const b = nodeByIdLocal(e.to_node_id); + if (!a || !b) continue; + const pa = toMini(a); + const pb = toMini(b); + + const visited = visitedSet.has(String(e.to_node_id)); + const isExit = e.kind === "exit"; + const alpha = visited ? 0.85 : 0.28; + const width = visited ? 3 : 2; + + const dx = pb.x - pa.x; + const dy = pb.y - pa.y; + const len = Math.max(1, Math.hypot(dx, dy)); + const px = -dy / len; + const py = dx / len; + const midx = (pa.x + pb.x) * 0.5; + const midy = (pa.y + pb.y) * 0.5; + const bend = + (8 + (isExit ? 6 : 0) + (visited ? 3 : 0)) * + curveSign(String(e.from_node_id) + "->" + String(e.to_node_id)); + const cx = midx + px * bend; + const cy = midy + py * bend; + + ctx.strokeStyle = `rgba(11,22,48,${Math.min(0.65, alpha)})`; + ctx.lineWidth = width + 3; + ctx.beginPath(); + ctx.moveTo(pa.x, pa.y); + ctx.quadraticCurveTo(cx, cy, pb.x, pb.y); + ctx.stroke(); + + ctx.strokeStyle = isExit + ? `rgba(255,124,124,${alpha})` + : `rgba(124,242,255,${alpha})`; + ctx.lineWidth = width; + ctx.beginPath(); + ctx.moveTo(pa.x, pa.y); + ctx.quadraticCurveTo(cx, cy, pb.x, pb.y); + ctx.stroke(); + } + + // nodes + labels + const fontPx = 12; + ctx.textBaseline = "middle"; + ctx.font = `${fontPx}px ${fontStack}`; + + for (const n of mapNodes || []) { + const p = toMini(n); + const isCur = String(n.node_id) === String(nodeId); + const isVisited = visitedSet.has(String(n.node_id)) || isCur; + const kind = n.kind || "main"; + const kColor = + kind === "exit" + ? "#ff7c7c" + : kind === "camp" + ? "#7cffc6" + : kind === "lake" + ? "#7ca8ff" + : kind === "peak" + ? "#ffd27c" + : kind === "start" + ? "#9dff7c" + : kind === "end" + ? "#b0b6c6" + : "#7cf2ff"; + + ctx.fillStyle = "rgba(11,22,48,0.85)"; + ctx.beginPath(); + ctx.arc(p.x, p.y, isCur ? 7 : 6, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = isVisited ? kColor : "rgba(124,242,255,0.55)"; + ctx.beginPath(); + ctx.arc(p.x, p.y, isCur ? 5 : 4, 0, Math.PI * 2); + ctx.fill(); + + const isKey = + isCur || ["start", "camp", "junction", "lake", "peak", "exit", "end"].includes(kind); + const label = (n.name || n.node_id || "").trim(); + if (isKey && label) { + const x = Math.round(p.x + 8); + const y = Math.round(p.y - 12); + const textW = ctx.measureText(label).width; + + ctx.fillStyle = "rgba(6,16,34,0.92)"; + ctx.fillRect(x - 2, y - fontPx / 2 - 4, textW + 10, fontPx + 8); + + ctx.lineWidth = 2; + ctx.strokeStyle = "rgba(6,16,34,1)"; + ctx.fillStyle = isVisited ? "#d6faff" : "#7aa0b3"; + ctx.strokeText(label, x + 3, y); + ctx.fillText(label, x + 3, y); + } + } + + // marker (transit aware) + const toId = ws.in_transit_to_node_id; + const fromId = ws.in_transit_from_node_id; + const prog = Number(ws.in_transit_progress_km || 0); + const tot = Number(ws.in_transit_total_km || 0); + + let mp = null; + if (fromId && toId && tot > 0) { + const a = nodeByIdLocal(fromId); + const b = nodeByIdLocal(toId); + if (a && b) { + const pa = toMini(a); + const pb = toMini(b); + const t = clamp(prog / tot, 0, 1); + mp = { x: pa.x + (pb.x - pa.x) * t, y: pa.y + (pb.y - pa.y) * t }; + } + } + if (!mp) { + const cur = nodeByIdLocal(nodeId); + if (cur) mp = toMini(cur); + } + if (mp) { + ctx.fillStyle = "#ffd27c"; + ctx.fillRect(Math.round(mp.x - 4), Math.round(mp.y - 12), 8, 12); + ctx.strokeStyle = "rgba(0,0,0,0.35)"; + ctx.lineWidth = 1; + ctx.strokeRect(Math.round(mp.x - 4) + 0.5, Math.round(mp.y - 12) + 0.5, 8, 12); + } + }; + + const api = { + setState(ws) { + state.ws = ws; + resize(); + draw(); + }, + }; + + try { + new ResizeObserver(() => { + resize(); + draw(); + }).observe(root); + } catch { + window.addEventListener("resize", () => { + resize(); + draw(); + }); + } + + resize(); + return api; +} diff --git a/demos/AOTAI_Hike/frontend/src/phase_ui.js b/demos/AOTAI_Hike/frontend/src/phase_ui.js new file mode 100644 index 000000000..3bf0f3de8 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/phase_ui.js @@ -0,0 +1,280 @@ +import { $ } from "./dom.js"; +import { t, tFormat } from "./i18n.js"; +import { avatarUrl } from "./utils.js"; +import { checkAndShowShareButton } from "./render.js"; + +let phasePanel = null; +let hintEl = null; +let submitBtn = null; +let nightVoteBackdrop = null; +let nightVoteRoles = null; +let nightVoteLog = null; +let nightVoteActions = null; +let nightVoteClose = null; +let nightVoteSub = null; +let nightVoteMode = "hidden"; // hidden | select | result +let nightVoteBusy = false; + +function ensurePhasePanel() { + if (phasePanel) return; + const actions = $("#actions-panel"); + if (!actions) return; + phasePanel = document.createElement("div"); + phasePanel.id = "phase-panel"; + phasePanel.className = "phase-panel"; + phasePanel.style.marginTop = "8px"; + phasePanel.style.padding = "8px"; + phasePanel.style.border = "1px solid rgba(124,242,255,0.35)"; + phasePanel.style.background = "rgba(6,16,34,0.55)"; + phasePanel.style.display = "none"; + + hintEl = document.createElement("div"); + hintEl.className = "hint"; + hintEl.style.marginBottom = "6px"; + phasePanel.appendChild(hintEl); + + actions.appendChild(phasePanel); +} + +function setActionButtonsEnabled(enabled) { + const actions = $("#actions-panel"); + if (!actions) return; + actions.querySelectorAll("button[data-act]").forEach((b) => { + b.disabled = !enabled; + }); +} + +function updateCampButtonState(ws) { + const actions = $("#actions-panel"); + if (!actions) return; + const campBtn = actions.querySelector('button[data-act="CAMP"]'); + if (!campBtn) return; + + // Only show CAMP button in AWAIT_CAMP_DECISION phase (after player says something) + const phase = String(ws?.phase || "free").toLowerCase(); + const isCampDecisionPhase = phase === "await_camp_decision"; + const isLeader = ws?.active_role_id && ws?.active_role_id === ws?.leader_role_id; + + // Show button only in AWAIT_CAMP_DECISION phase and if player is leader + campBtn.style.display = isCampDecisionPhase && isLeader ? "block" : "none"; + if (isCampDecisionPhase && isLeader) { + campBtn.disabled = false; + campBtn.title = t("campButtonTitle"); + } +} + +function ensureNightVoteModal() { + if (nightVoteBackdrop) return; + nightVoteBackdrop = $("#night-vote-modal"); + nightVoteRoles = $("#night-vote-roles"); + nightVoteLog = $("#night-vote-log"); + nightVoteActions = $("#night-vote-actions"); + nightVoteClose = $("#night-vote-close"); + nightVoteSub = $("#night-vote-sub"); + if (nightVoteClose) { + nightVoteClose.onclick = () => { + hideNightVoteModal(); + window.__aoTaiActions?.scheduleAutoContinue?.(); + }; + } +} + +function showNightVoteModal() { + ensureNightVoteModal(); + if (!nightVoteBackdrop) return; + nightVoteBackdrop.style.display = "flex"; + window.__aoTaiNightVoteOpen = true; +} + +function hideNightVoteModal() { + if (!nightVoteBackdrop) return; + nightVoteBackdrop.style.display = "none"; + nightVoteMode = "hidden"; + nightVoteBusy = false; + window.__aoTaiNightVoteOpen = false; +} + +function renderNightVoteSelect(ws) { + ensureNightVoteModal(); + if (!nightVoteBackdrop || !nightVoteRoles || !nightVoteLog || !nightVoteActions) return; + nightVoteMode = "select"; + nightVoteBusy = false; + showNightVoteModal(); + nightVoteLog.style.display = "none"; + nightVoteActions.style.display = "none"; + if (nightVoteSub) { + nightVoteSub.textContent = t("nightVoteSub"); + } + + nightVoteRoles.innerHTML = ""; + const roles = ws?.roles || []; + roles.forEach((r) => { + const card = document.createElement("div"); + card.className = "vote-card"; + const img = document.createElement("img"); + img.className = "vote-ava"; + img.src = avatarUrl(r); + img.alt = `${r.name} avatar`; + const meta = document.createElement("div"); + meta.innerHTML = `
${r.name}
${t("nightVoteSelectAsLeader")}
`; + card.appendChild(img); + card.appendChild(meta); + card.onclick = async () => { + if (nightVoteBusy) return; + nightVoteBusy = true; + nightVoteRoles.querySelectorAll(".vote-card").forEach((el) => { + el.classList.add("disabled"); + }); + const data = await window.__aoTaiActions?.apiAct?.("DECIDE", { + kind: "night_vote", + leader_role_id: r.role_id, + }); + renderNightVoteResult(data?.messages || []); + }; + nightVoteRoles.appendChild(card); + }); +} + +function renderNightVoteResult(messages) { + ensureNightVoteModal(); + if (!nightVoteLog || !nightVoteActions) return; + nightVoteMode = "result"; + showNightVoteModal(); + const lines = []; + (messages || []).forEach((m) => { + if (m?.kind === "action" || m?.kind === "system") { + lines.push(m.content); + } + }); + nightVoteLog.innerHTML = lines.length ? lines.map((l) => `
${l}
`).join("") : t("nightVoteDone"); + nightVoteLog.style.display = "block"; + nightVoteActions.style.display = "block"; +} + +export function isNightVoteModalBlocking() { + return nightVoteMode !== "hidden"; +} + +export function applyPhaseUI(ws) { + ensurePhasePanel(); + ensureNightVoteModal(); + if (!ws) return; + + const phase = String(ws.phase || "free").toLowerCase(); + const roles = ws.roles || []; + const exhausted = roles.length > 0 && roles.every((r) => Number(r?.attrs?.stamina || 0) <= 0); + const terminalIds = new Set(["end_exit", "bailout_2800", "bailout_ridge"]); + const isGameOver = exhausted || terminalIds.has(String(ws.current_node_id || "")); + + // SAY input is only enabled when the game explicitly asks the player to respond. + const sayInput = $("#say-input"); + const sayBtn = $("#btn-say"); + const enableSay = (phase === "await_player_say" || phase === "night_wait_player") && !isGameOver; + if (sayInput) { + sayInput.disabled = !enableSay; + sayInput.classList.toggle("input-attn", phase === "night_wait_player" && !isGameOver); + sayInput.placeholder = isGameOver + ? t("sayPlaceholderGameOver") + : enableSay + ? t("sayPlaceholder") + : t("sayPlaceholderDisabled"); + } + if (sayBtn) sayBtn.disabled = !enableSay; + + // Ensure phasePanel is available + if (!phasePanel || !hintEl) { + console.warn("phasePanel or hintEl not initialized", { phasePanel, hintEl }); + return; + } + + // Default: free play + if (phase === "free") { + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Hide CAMP button + // Hide MOVE_FORWARD button in FREE phase + const actions = $("#actions-panel"); + if (actions) { + const forwardBtn = actions.querySelector('button[data-act="MOVE_FORWARD"]'); + if (forwardBtn) { + forwardBtn.style.display = "none"; + } + } + phasePanel.style.display = "none"; + if (nightVoteMode !== "result") hideNightVoteModal(); + return; + } + + if (isGameOver) { + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Disable CAMP button when game over + phasePanel.style.display = "none"; + hideNightVoteModal(); + // 显示分享按钮 + checkAndShowShareButton(ws); + return; + } + + // Always show phasePanel for non-free phases + phasePanel.style.display = "block"; + + if (phase === "await_player_say") { + // Block all action buttons; allow user to SAY. + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Hide CAMP button + hintEl.textContent = t("phaseWaitSay"); + phasePanel.querySelectorAll("div,select,button").forEach((n) => { + if (n !== hintEl) n.remove?.(); + }); + return; + } + + if (phase === "await_camp_decision") { + // After SAY, leader can choose to camp or continue + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Show CAMP button if leader + // Enable MOVE_FORWARD button (continue without camping) + const actions = $("#actions-panel"); + if (actions) { + const forwardBtn = actions.querySelector('button[data-act="MOVE_FORWARD"]'); + if (forwardBtn) { + forwardBtn.style.display = "block"; + forwardBtn.disabled = false; + } + } + hintEl.textContent = t("phaseCampDecision"); + phasePanel.querySelectorAll("div,select,button").forEach((n) => { + if (n !== hintEl) n.remove?.(); + }); + return; + } + + if (phase === "night_wait_player") { + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Disable CAMP button + hintEl.textContent = t("phaseNightWaitSay"); + phasePanel.querySelectorAll("div,select,button").forEach((n) => { + if (n !== hintEl) n.remove?.(); + }); + hideNightVoteModal(); + return; + } + + if (phase === "night_vote_ready") { + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Disable CAMP button + hintEl.textContent = t("phaseNightVote"); + phasePanel.querySelectorAll("div,select,button").forEach((n) => { + if (n !== hintEl) n.remove?.(); + }); + renderNightVoteSelect(ws); + return; + } + + // camp_meeting_decide / junction_decision were for the old manual-decision flow. + // In the new flow, camp meeting and leader junction picks are automatic. + + // Unknown phase: be safe and block actions. + setActionButtonsEnabled(false); + updateCampButtonState(ws); // Disable CAMP button + hintEl.textContent = tFormat("phaseUnknown", { phase }); +} diff --git a/demos/AOTAI_Hike/frontend/src/phaser_view.js b/demos/AOTAI_Hike/frontend/src/phaser_view.js new file mode 100644 index 000000000..1489fb1a5 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/phaser_view.js @@ -0,0 +1,1595 @@ +import { t as i18nT } from "./i18n.js"; +import { clamp } from "./utils.js"; +import { mapEdges, mapNodes, mapStartNodeId, nodeById, worldState } from "./state.js"; + +// Phaser trail view (chunk streaming) +// - Renders an endless-ish forest trail by streaming procedurally generated chunks. +// - Uses pixelArt rendering and fixed tile size for a crisp pixel look. +// - For now, chunks are rendered via RenderTexture + simple pixel primitives. +// Later you can swap `renderChunkToTexture()` to draw real tiles from your tileset. +export function initPhaser() { + const root = document.getElementById("game-root"); + const rect = root ? root.getBoundingClientRect() : { width: 960, height: 540 }; + const qs = new URLSearchParams(window.location.search); + // Default to scale=2 for a chunkier pixel look. For sharper text without making the world too "fine", + // bump DPR via ?dpr=2 or ?dpr=3. You can still force more detail with ?scale=1. + const ZOOM = Math.max(1, Math.floor(Number(qs.get("scale")) || 2)); + const VIEW_W = Math.max(160, Math.floor((rect.width || 960) / ZOOM)); + const VIEW_H = Math.max(120, Math.floor((rect.height || 540) / ZOOM)); + + // Minimap label clarity tunables + // - Increase font size to improve readability (defaults to 8px instead of 5px) + // - Keep text resolution aligned to devicePixelRatio (avoid huge downscale blur) + // - Also set Phaser canvas resolution to devicePixelRatio for crisp rendering on HiDPI screens + // URL params: + // - miniFontPx / mmFontPx: integer px (e.g. ?miniFontPx=9) + // - miniTextRes: 1..4 (e.g. ?miniTextRes=2) + // - dpr: 1..3 (e.g. ?dpr=2) + // - miniOverlay: 1/0 (default 1) render minimap via a separate HiDPI overlay canvas + // - miniDpr: 1..8 (default ~ max(3, devicePixelRatio*2)) overlay-only pixel density (minimap can be sharper than main view) + // - miniHidePhaser: 1/0 (default 1) when using overlay, skip drawing the Phaser minimap layer + const GAME_RESOLUTION = Math.max( + 1, + // Allow a slightly higher cap; helps keep UI readable while world stays chunky at scale=2. + Math.min(4, Number(qs.get("dpr")) || (window.devicePixelRatio || 1)), + ); + + try { + console.info( + `[ao-tai] scale=${ZOOM} dpr=${GAME_RESOLUTION} view=${VIEW_W}x${VIEW_H} root=${Math.round( + rect.width, + )}x${Math.round(rect.height)}`, + ); + } catch {} + + // Default to a slightly higher internal text resolution for crisp pixel text. + // (You can still override via ?uiTextRes= / ?bubbleTextRes= / ?nameTextRes=) + const UI_TEXT_RES = clamp( + Math.round(Number(qs.get("uiTextRes")) || Math.max(2, window.devicePixelRatio || 1)), + 1, + 4, + ); + const NAME_TEXT_RES = clamp(Math.round(Number(qs.get("nameTextRes")) || UI_TEXT_RES), 1, 4); + const BUBBLE_TEXT_RES = clamp(Math.round(Number(qs.get("bubbleTextRes")) || 4), 1, 4); + + // UI font size tunables (final on-screen px). Override via URL: ?nameFontPx=11&bubbleFontPx=14 + const NAME_FONT_PX = clamp(Math.round(Number(qs.get("nameFontPx")) || 11), 6, 28); + const BUBBLE_FONT_PX = clamp(Math.round(Number(qs.get("bubbleFontPx")) || 14), 8, 40); + // Minimap is now an independent DOM canvas (#minimap-canvas), not Phaser/overlay. + const USE_MINIMAP_OVERLAY = false; + const SKIP_PHASER_MINIMAP = true; + const MINI_LABEL_FONT_PX = Math.max( + 6, + Math.floor(Number(qs.get("miniFontPx") || qs.get("mmFontPx")) || 14), + ); + const MINI_TEXT_RESOLUTION = Math.max( + 1, + Math.min(6, Math.round(Number(qs.get("miniTextRes")) || Math.max(2, GAME_RESOLUTION))), + ); + const MINI_LABEL_OFF_X = 8; + const MINI_LABEL_OFF_Y = Math.max(6, Math.round(MINI_LABEL_FONT_PX * 0.95)); + const MINI_LABEL_STROKE_W = Math.max(1, Math.round(MINI_LABEL_FONT_PX / 9)); + + // Main scene only + const MINI_H = 0; + const MAIN_H = VIEW_H; + + const TILE = 48; // matches your pixel assets scale + + // Scene layering config (two-copy loop) + // - Add/remove layers by editing this list (order = render order, bottom -> top). + // - For each sceneId, assets should exist at: + // `./assets/scenes/scene_${sceneId}/scene_0_${layer}.png` + // - base = 鳌太, kilimanjaro = 乞力马扎罗; select by theme in setState + const SCENE_IDS = ["base", "kilimanjaro"]; + const SCENE_LAYERS = ["base", "props"]; + const sceneKey = (sceneId, layer) => `scene:${sceneId}:${layer}`; + const sceneFile = (sceneId, layer) => `scenes/scene_${sceneId}/scene_0_${layer}.png`; + + // Sprite pool for roles (pixel-art PNG sequences) + // - Quickstart(default) roles map by name to fixed keys + // - Manually created roles auto-match from this pool by stable hash of role_id + const SPRITE_POOL = ["ao", "taibai", "xiaoshan"]; + const SPRITE_META = { + ao: { idle: { frames: 6, fps: 8 }, walk: { frames: 8, fps: 10 } }, + taibai: { idle: { frames: 7, fps: 8 }, walk: { frames: 8, fps: 10 } }, + xiaoshan: { idle: { frames: 3, fps: 6 }, walk: { frames: 3, fps: 8 } }, + }; + + const hash32 = (s) => { + let h = 2166136261 >>> 0; + for (let i = 0; i < s.length; i++) { + h ^= s.charCodeAt(i); + h = Math.imul(h, 16777619); + } + return h >>> 0; + }; + + const mulberry32 = (seed) => { + let t = seed >>> 0; + return () => { + t += 0x6d2b79f5; + let r = Math.imul(t ^ (t >>> 15), 1 | t); + r ^= r + Math.imul(r ^ (r >>> 7), 61 | r); + return ((r ^ (r >>> 14)) >>> 0) / 4294967296; + }; + }; + + class HikeScene extends Phaser.Scene { + constructor() { + super({ key: "HikeScene" }); + this.world = null; + this.worldRT = null; + this.worldOverlay = null; + + // New: N-layer scrolling scene (two-copy loop) + this.worldLayers = null; + this.layerImgs = null; // { [layerName]: [imgA, imgB] } + this._sceneLayers = SCENE_LAYERS.slice(); + this._scrollY = 0; + this._scrollSpeed = 18; // px/s (slower) + this._loopH = 0; + this._sceneId = "base"; + + // minimap removed from Phaser (now DOM canvas) + + this._curNodeId = null; + this._visited = new Set(); + this._weather = null; + this._tod = null; + this._ws = null; + this._walkKey = ""; + this._sceneKey = ""; + this._theme = null; // current theme for scene choice (aotai -> base, kili -> kilimanjaro) + + this.mainCam = null; + + // roles rendered on big map + this.roleSprites = new Map(); // role_id -> Phaser.GameObjects.Sprite + this._spriteBounds = {}; // spriteKey -> { texW, texH, x, y, w, h } + this._targetContentH = 38; // non-transparent content height ≈ 38px + + // head UI: name labels + speech bubbles + this.roleNameLabels = new Map(); // role_id -> Phaser.GameObjects.Text + this.roleBubbles = new Map(); // role_id -> Phaser.GameObjects.Container + this._bubbleTimers = new Map(); // role_id -> Phaser.Time.TimerEvent + + // text resolution (sharpness) for UI + this._nameTextRes = NAME_TEXT_RES; + this._bubbleTextRes = BUBBLE_TEXT_RES; + this._nameFontPx = NAME_FONT_PX; + this._bubbleFontPx = BUBBLE_FONT_PX; + + // outcome banner (success / fail) + this._outcomeBanner = null; + this._outcomeState = null; // "success" | "fail" | null + + // weather effects + this._rainGfx = null; + this._rainDrops = []; + this._rainActive = false; + this._snowGfx = null; + this._snowFlakes = []; + this._snowActive = false; + this._windGfx = null; + this._windStreaks = []; + this._windActive = false; + this._fogGfx = null; + this._fogBlobs = []; + this._fogActive = false; + } + + preload() { + this._assetErrors = []; + this.load.setPath("./assets/"); + + const loadImg = (key, file) => { + // encode spaces etc + this.load.image(key, encodeURI(file)); + }; + + loadImg("grass", "Dark grass 1.png"); + loadImg("brick", "Dark Brick 1.png"); + loadImg("bush", "Dark Bush 1.png"); + loadImg("tree", "Dark Tree 1.png"); + loadImg("fence", "Dark fence 1.png"); + loadImg("leaves", "Fallen Leaves 1.png"); + loadImg("pumpkin", "Pumpkin 1.png"); + + // Scene templates + for (const sid of SCENE_IDS) { + for (const layer of SCENE_LAYERS) { + loadImg(sceneKey(sid, layer), sceneFile(sid, layer)); + } + } + + // preload role sprite frames (png sequences) + const loadFrame = (spriteKey, action, idx) => { + const k = `spr:${spriteKey}:${action}:${String(idx).padStart(3, "0")}`; + const file = `sprites/${spriteKey}/${action}/frame_${String(idx).padStart(3, "0")}.png`; + this.load.image(k, file); + }; + for (const sk of SPRITE_POOL) { + const meta = SPRITE_META[sk]; + for (const action of ["idle", "walk"]) { + const n = Number(meta?.[action]?.frames || 0); + for (let i = 0; i < n; i++) loadFrame(sk, action, i); + } + } + + this.load.on("loaderror", (file) => { + try { + this._assetErrors.push( + file && (file.key || file.src || file.url) + ? file.key || file.src || file.url + : "unknown", + ); + } catch { + this._assetErrors.push("unknown"); + } + }); + } + + create() { + // --- containers --- + this.world = this.add.container(0, 0); + + // --- main world layers (three layers, two-copy loop) --- + this.worldLayers = this.add.container(0, 0); + this.world.add(this.worldLayers); + + this.layerImgs = {}; + for (const layer of this._sceneLayers) { + const key = sceneKey(this._sceneId, layer); + const a = this.add.image(0, 0, key).setOrigin(0, 0); + const b = this.add.image(0, 0, key).setOrigin(0, 0); + this.layerImgs[layer] = [a, b]; + this.worldLayers.add(a); + this.worldLayers.add(b); + } + this._swapScene(this._sceneId); + + // init animations + nearest filter for pixel art sprites + this._initRoleAnims(); + + // --- overlay for weather/time mood --- + this.worldOverlay = this.add + .rectangle(0, 0, VIEW_W, MAIN_H, 0x000000, 0.0) + .setOrigin(0, 0); + this.worldOverlay.setDepth(10); + this.world.add(this.worldOverlay); + + // --- rain layer (code-generated) --- + this._rainGfx = this.add.graphics(); + this._rainGfx.setDepth(20); + this.world.add(this._rainGfx); + this._initRainDrops(); + + // --- snow layer --- + this._snowGfx = this.add.graphics(); + this._snowGfx.setDepth(21); + this.world.add(this._snowGfx); + this._initSnowFlakes(); + + // --- wind layer --- + this._windGfx = this.add.graphics(); + this._windGfx.setDepth(22); + this.world.add(this._windGfx); + this._initWindStreaks(); + + // --- fog layer --- + this._fogGfx = this.add.graphics(); + this._fogGfx.setDepth(23); + this.world.add(this._fogGfx); + this._initFogBlobs(); + + // --- cameras --- + this.mainCam = this.cameras.main; + this.mainCam.setViewport(0, 0, VIEW_W, MAIN_H); + this.mainCam.setBackgroundColor("rgba(0,0,0,0)"); + this.mainCam.roundPixels = true; + + // Expose API + window.__aoTaiMapView = { + setState: (ws) => this.setState(ws), + // compat + setNode: (nodeId, visitedIds) => + this.setState({ current_node_id: nodeId, visited_node_ids: visitedIds }), + // show/update speech bubble for a role + say: (roleId, text) => this._say(roleId, text), + }; + + // initial paint: pick scene from theme (kili -> kilimanjaro, else base) + const initialTheme = worldState?.theme || "aotai"; + const initialSceneId = initialTheme === "kili" ? "kilimanjaro" : "base"; + this._theme = initialTheme; + this._swapScene(initialSceneId); + this.setState({ + current_node_id: mapStartNodeId || "start", + visited_node_ids: [mapStartNodeId || "start"], + weather: "cloudy", + time_of_day: "morning", + theme: initialTheme, + }); + } + + _swapScene(id) { + this._sceneId = String(id || "base"); + if (!this.layerImgs) return; + + // Set NEAREST for the scene textures. + try { + for (const layer of this._sceneLayers) { + const key = sceneKey(this._sceneId, layer); + if (this.textures.exists(key)) { + this.textures.get(key).setFilter(Phaser.Textures.FilterMode.NEAREST); + } + } + } catch {} + + for (const layer of this._sceneLayers) { + const key = sceneKey(this._sceneId, layer); + const [a, b] = this.layerImgs[layer]; + a.setTexture(key); + b.setTexture(key); + } + this._layoutLoopImages(); + } + + _layoutLoopImages() { + if (!this.layerImgs) return; + const refLayer = (this._sceneLayers && this._sceneLayers[0]) || "base"; + const tex = this.layerImgs[refLayer]?.[0]?.texture || this.layerImgs.base?.[0]?.texture; + const img = tex && tex.getSourceImage ? tex.getSourceImage() : null; + const nativeW = img && img.width ? img.width : VIEW_W; + const nativeH = img && img.height ? img.height : MAIN_H; + + // Keep aspect ratio: fit by width, but ensure height covers the viewport. + let scale = VIEW_W / Math.max(1, nativeW); + if (nativeH * scale < MAIN_H) scale = MAIN_H / Math.max(1, nativeH); + const dispW = Math.round(nativeW * scale); + const dispH = Math.round(nativeH * scale); + const x0 = Math.round((VIEW_W - dispW) / 2); + + // Force width alignment (best: art exports at VIEW_W px so no scaling occurs) + for (const k of this._sceneLayers) { + const [a, b] = this.layerImgs[k]; + a.setDisplaySize(dispW, dispH); + b.setDisplaySize(dispW, dispH); + a.x = x0; + a.y = 0; + b.x = x0; + b.y = -dispH; + } + + this._loopH = Math.max(1, Math.round(dispH)); + this._scrollY = 0; + } + + update(time, delta) { + const ws = this._ws || {}; + this._updateRain(delta); + this._updateSnow(delta); + this._updateWind(delta); + this._updateFog(delta); + const walking = Boolean(ws && ws.in_transit_to_node_id); + const phase = ws && ws.phase ? String(ws.phase) : "free"; + const modalBlocking = Boolean(window.__aoTaiNightVoteOpen); + const speed = walking && phase === "free" && !modalBlocking ? this._scrollSpeed : 0; + if (speed <= 0 || !this.layerImgs || !this._loopH) return; + + const dy = (Number(delta || 0) / 1000) * speed; + this._scrollY = (this._scrollY + dy) % this._loopH; + + // Scroll DOWN: background moves down (player feels moving forward/up). + const ay = Math.round(this._scrollY); + for (const k of this._sceneLayers) { + const [a, b] = this.layerImgs[k]; + a.y = ay; + b.y = ay - this._loopH; + } + } + + _pickSpriteKey(role) { + const explicit = role && (role.sprite_key || role.spriteKey || role.sprite); + if (explicit && SPRITE_META[String(explicit)]) return String(explicit); + + const name = String(role?.name || "").trim(); + if (name === "阿鳌" || name === "Leo" || name === "利奥") return "ao"; + if (name === "太白" || name === "Sam" || name === "山姆") return "taibai"; + if (name === "小山" || name === "Jade" || name === "杰德") return "xiaoshan"; + + const rid = String(role?.role_id || name || "role"); + const h = hash32(rid); + return SPRITE_POOL[h % SPRITE_POOL.length]; + } + + _frameKey(spriteKey, action, idx) { + return `spr:${spriteKey}:${action}:${String(idx).padStart(3, "0")}`; + } + + _initRoleAnims() { + // set NEAREST filter + try { + for (const sk of SPRITE_POOL) { + const meta = SPRITE_META[sk]; + for (const action of ["idle", "walk"]) { + const n = Number(meta?.[action]?.frames || 0); + for (let i = 0; i < n; i++) { + const k = this._frameKey(sk, action, i); + try { + this.textures.get(k).setFilter(Phaser.Textures.FilterMode.NEAREST); + } catch {} + } + } + } + } catch {} + + // create animations + for (const sk of SPRITE_POOL) { + const meta = SPRITE_META[sk]; + for (const action of ["idle", "walk"]) { + const animKey = `anim:${sk}:${action}`; + if (this.anims.exists(animKey)) continue; + const n = Number(meta?.[action]?.frames || 0); + const fps = Number(meta?.[action]?.fps || 8); + const frames = []; + for (let i = 0; i < n; i++) + frames.push({ key: this._frameKey(sk, action, i) }); + this.anims.create({ + key: animKey, + frames, + frameRate: Math.max(1, fps), + repeat: -1, + }); + } + } + } + + _calcOpaqueBoundsForTexture(texKey) { + try { + const tex = this.textures.get(texKey); + const img = tex && tex.getSourceImage ? tex.getSourceImage() : null; + if (!img || !img.width || !img.height) return null; + const w = img.width; + const h = img.height; + const c = document.createElement("canvas"); + c.width = w; + c.height = h; + const ctx = c.getContext("2d", { willReadFrequently: true }); + if (!ctx) return null; + ctx.clearRect(0, 0, w, h); + ctx.drawImage(img, 0, 0); + const data = ctx.getImageData(0, 0, w, h).data; + let minX = w, + minY = h, + maxX = -1, + maxY = -1; + for (let y = 0; y < h; y++) { + for (let x = 0; x < w; x++) { + const a = data[(y * w + x) * 4 + 3]; + if (a > 0) { + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + } + if (maxX < 0) return null; + return { texW: w, texH: h, x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 }; + } catch { + return null; + } + } + + _ensureSpriteBounds(spriteKey) { + if (this._spriteBounds[spriteKey]) return this._spriteBounds[spriteKey]; + const k = this._frameKey(spriteKey, "idle", 0); + if (!this.textures.exists(k)) return null; + const b = this._calcOpaqueBoundsForTexture(k); + if (!b) return null; + this._spriteBounds[spriteKey] = b; + return b; + } + + _applySpriteScaleOrigin(spr, spriteKey) { + const b = this._ensureSpriteBounds(spriteKey); + if (b && b.h > 0) { + const s = this._targetContentH / b.h; + spr.setScale(s); + const ox = (b.x + b.w * 0.5) / b.texW; + const oy = (b.y + b.h) / b.texH; + spr.setOrigin(ox, oy); + } else { + spr.setOrigin(0.5, 1); + if (spr.height > 0) spr.setScale(this._targetContentH / spr.height); + } + } + + _syncRolesOnMap(ws) { + const roles = ws?.roles || []; + const activeId = ws?.active_role_id || null; + const inTransit = Boolean(ws?.in_transit_to_node_id); + + // Assign sprite keys with minimal repetition: + // 1) explicit sprite_key from backend + // 2) default trio by name + // 3) keep existing rendered assignment (spr.__spriteKey) if valid + // 4) pick an unused key from the pool + // 5) fallback to stable hash + const assignedKeyByRoleId = new Map(); + const usedKeys = new Set(); + const namePresetKey = (r) => { + const n = String(r?.name || "").trim(); + if (n === "阿鳌" || n === "Leo" || n === "利奥") return "ao"; + if (n === "太白" || n === "Sam" || n === "山姆") return "taibai"; + if (n === "小山" || n === "Jade" || n === "杰德") return "xiaoshan"; + return null; + }; + + for (const r of roles) { + const rid = String(r.role_id); + const explicit = r && (r.sprite_key || r.spriteKey || r.sprite); + const k = explicit && SPRITE_META[String(explicit)] ? String(explicit) : null; + if (k) { + assignedKeyByRoleId.set(rid, k); + usedKeys.add(k); + } + } + for (const r of roles) { + const rid = String(r.role_id); + if (assignedKeyByRoleId.has(rid)) continue; + const k = namePresetKey(r); + if (k && SPRITE_META[k]) { + assignedKeyByRoleId.set(rid, k); + usedKeys.add(k); + } + } + for (const r of roles) { + const rid = String(r.role_id); + if (assignedKeyByRoleId.has(rid)) continue; + const spr = this.roleSprites.get(rid); + const k = + spr && spr.__spriteKey && SPRITE_META[String(spr.__spriteKey)] + ? String(spr.__spriteKey) + : null; + if (k) { + assignedKeyByRoleId.set(rid, k); + usedKeys.add(k); + } + } + for (const r of roles) { + const rid = String(r.role_id); + if (assignedKeyByRoleId.has(rid)) continue; + const k = SPRITE_POOL.find((x) => !usedKeys.has(x)); + if (k) { + assignedKeyByRoleId.set(rid, k); + usedKeys.add(k); + } else { + // pool exhausted: fallback to stable hash (will reuse) + const h = hash32(rid); + assignedKeyByRoleId.set(rid, SPRITE_POOL[h % SPRITE_POOL.length]); + } + } + + const keep = new Set(); + const centerX = Math.floor(VIEW_W * 0.5); + const baseY = Math.floor(MAIN_H * 0.78); + // not a straight line: spread + slight arc + deterministic jitter per role + const maxSpread = Math.min(Math.floor(VIEW_W * 0.62), 340); + const spread = roles.length <= 1 ? 0 : Math.min(maxSpread, 56 * (roles.length - 1)); + const step = roles.length <= 1 ? 0 : spread / (roles.length - 1); + const startX = Math.floor(centerX - spread / 2); + + for (let i = 0; i < roles.length; i++) { + const r = roles[i]; + const rid = String(r.role_id); + keep.add(rid); + let spr = this.roleSprites.get(rid); + const spriteKey = assignedKeyByRoleId.get(rid) || this._pickSpriteKey(r); + const action = inTransit && rid === String(activeId) ? "walk" : "idle"; + const animKey = `anim:${spriteKey}:${action}`; + + if (!spr) { + spr = this.add.sprite(0, 0, this._frameKey(spriteKey, "idle", 0)); + spr.__spriteKey = spriteKey; + spr.__action = null; + this.world.add(spr); + this.roleSprites.set(rid, spr); + this._applySpriteScaleOrigin(spr, spriteKey); + } + + // deterministic jitter from role_id + const h = hash32(rid); + const jx = ((h & 0xff) / 255 - 0.5) * 10; // [-5,5] + const jy = (((h >>> 8) & 0xff) / 255 - 0.5) * 8; // [-4,4] + const t = roles.length <= 1 ? 0.5 : i / (roles.length - 1); + const arc = Math.sin(t * Math.PI) * -10; // lift middle a bit + const x = Math.round(startX + i * step + jx); + const y = Math.round(baseY + arc + jy); + spr.setPosition(x, y); + spr.setDepth(20 + i); + spr.setAlpha(rid === String(activeId) ? 1.0 : 0.9); + + if (spr.__spriteKey !== spriteKey) { + spr.setTexture(this._frameKey(spriteKey, "idle", 0)); + spr.__spriteKey = spriteKey; + this._applySpriteScaleOrigin(spr, spriteKey); + spr.__action = null; + } + + if (spr.__action !== action && this.anims.exists(animKey)) { + spr.play(animKey, true); + spr.__action = action; + } + + // --- name label (always visible) --- + const leaderId = ws?.leader_role_id ? String(ws.leader_role_id) : null; + this._upsertNameLabel(rid, r.name, spr, rid === String(activeId), rid === leaderId); + + // keep bubble anchored (respect per-bubble lift) + const bub = this.roleBubbles.get(rid); + if (bub) { + const lift = Math.round(Number(bub.__lift || 0)); + bub.x = Math.round(spr.x); + bub.y = Math.round(spr.y - 54 - lift); + } + } + + // After positioning all labels, resolve overlaps. + try { + this._resolveNameLabelOverlaps(); + } catch {} + + for (const [rid, spr] of this.roleSprites.entries()) { + if (!keep.has(rid)) { + try { + spr.destroy(); + } catch {} + this.roleSprites.delete(rid); + const lbl = this.roleNameLabels.get(rid); + if (lbl) { + try { + lbl.destroy(); + } catch {} + this.roleNameLabels.delete(rid); + } + const bub = this.roleBubbles.get(rid); + if (bub) { + try { + bub.destroy(); + } catch {} + this.roleBubbles.delete(rid); + } + const t = this._bubbleTimers.get(rid); + if (t) { + try { + t.remove(false); + } catch {} + this._bubbleTimers.delete(rid); + } + } + } + } + + _resolveNameLabelOverlaps() { + // Simple vertical push-down to avoid name labels overlapping when party members stand close. + const items = []; + for (const [rid, lbl] of this.roleNameLabels.entries()) { + if (!lbl || !lbl.active) continue; + items.push({ rid, lbl }); + } + // Sort by y (top to bottom) + items.sort((a, b) => (a.lbl.y || 0) - (b.lbl.y || 0)); + + const pad = 2; + for (let i = 0; i < items.length; i++) { + const a = items[i].lbl; + const ab = a.getBounds(); + for (let j = i + 1; j < items.length; j++) { + const b = items[j].lbl; + const bb = b.getBounds(); + const overlapX = Math.min(ab.right, bb.right) - Math.max(ab.left, bb.left); + const overlapY = Math.min(ab.bottom, bb.bottom) - Math.max(ab.top, bb.top); + if (overlapX > 0 && overlapY > 0) { + // push the lower one down + const dy = overlapY + pad; + b.y = Math.round(b.y + dy); + // update bb for subsequent checks + bb.y += dy; + bb.top += dy; + bb.bottom += dy; + } + } + } + } + + _makePixelText(text, fontPx = 10, color = "#e8f0ff", pixelScale = 4) { + // Hard-edge pixel text (baked): render large on a canvas, then downsample with NEAREST into a new canvas, + // upload as a texture, and display as an Image (no fractional scaling at runtime). + const scale = clamp(Math.round(Number(pixelScale) || 4), 1, 4); + // Wrap width in *final* pixels. Keep bubbles readable on narrow viewports. + const wrapW = clamp(Math.round(VIEW_W * 0.55), 140, 260); + // Prefer CJK-friendly fonts first; fall back to pixel latin font where available. + const fontFamily = + '"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Press Start 2P",ui-monospace,Menlo,Monaco,Consolas,monospace'; + + const srcFontPx = Math.round(fontPx * scale); + const srcWrapW = Math.round(wrapW * scale); + + // Simple wrap (works well for CJK and short phrases) + const measureCtx = document.createElement("canvas").getContext("2d"); + measureCtx.font = `${srcFontPx}px ${fontFamily}`; + const raw = String(text ?? ""); + const tokens = raw.split(""); + const lines = []; + let line = ""; + for (const ch of tokens) { + if (ch === "\n") { + lines.push(line); + line = ""; + continue; + } + const test = line + ch; + const w = measureCtx.measureText(test).width; + if (w > srcWrapW && line.length > 0) { + lines.push(line); + line = ch; + } else { + line = test; + } + } + if (line) lines.push(line); + + // More line height so bold stroke text doesn't collide between lines. + const lineH = Math.round(srcFontPx * 1.45); + const padX = Math.round(5 * scale); + const padY = Math.round(4 * scale); + let maxLineW = 0; + for (const l of lines) maxLineW = Math.max(maxLineW, Math.ceil(measureCtx.measureText(l).width)); + const srcW = Math.max(1, maxLineW + padX * 2); + const srcH = Math.max(1, lines.length * lineH + padY * 2); + + const src = document.createElement("canvas"); + src.width = srcW; + src.height = srcH; + const sctx = src.getContext("2d", { willReadFrequently: true }); + sctx.imageSmoothingEnabled = false; + sctx.clearRect(0, 0, srcW, srcH); + sctx.font = `${srcFontPx}px ${fontFamily}`; + sctx.textBaseline = "top"; + sctx.fillStyle = color; + + // Thick dark stroke improves readability for small CJK glyphs after downsampling. + const strokeW = Math.max(1, Math.round(2.0 * scale)); + sctx.lineJoin = "round"; + sctx.miterLimit = 2; + sctx.lineWidth = strokeW; + sctx.strokeStyle = "#061022"; + + // Draw text at integer coords + let y = padY; + for (const l of lines) { + sctx.strokeText(l, padX, y); + sctx.fillText(l, padX, y); + y += lineH; + } + + // Harden edges: binarize alpha so glyphs don't look "foggy". + try { + const imgData = sctx.getImageData(0, 0, srcW, srcH); + const d = imgData.data; + const thresh = 96; + for (let i = 0; i < d.length; i += 4) { + d[i + 3] = d[i + 3] < thresh ? 0 : 255; + } + sctx.putImageData(imgData, 0, 0); + } catch {} + + // Downsample baked output + const out = document.createElement("canvas"); + const outW = Math.max(1, Math.round(srcW / scale)); + const outH = Math.max(1, Math.round(srcH / scale)); + out.width = outW; + out.height = outH; + const octx = out.getContext("2d", { willReadFrequently: true }); + octx.imageSmoothingEnabled = false; + octx.clearRect(0, 0, outW, outH); + octx.drawImage(src, 0, 0, outW, outH); + + const key = `pixtext:${hash32(`${raw}|${fontPx}|${color}|${scale}|${Date.now()}|${Math.random()}`)}`; + try { + if (this.textures.exists(key)) this.textures.remove(key); + } catch {} + this.textures.addCanvas(key, out); + try { + this.textures.get(key).setFilter(Phaser.Textures.FilterMode.NEAREST); + } catch {} + + const img = this.add.image(0, 0, key); + img.setOrigin(0.5, 0.5); + img.setDepth(55); + // Avoid subpixel blur + img.x = Math.round(img.x); + img.y = Math.round(img.y); + return img; + } + + _resolveOutcome(ws) { + const roles = ws?.roles || []; + const exhausted = roles.length > 0 && roles.every((r) => Number(r?.attrs?.stamina || 0) <= 0); + if (exhausted) return "fail"; + const terminalIds = new Set(["end_exit", "bailout_2800", "bailout_ridge"]); + const curId = String(ws?.current_node_id || ""); + if (terminalIds.has(curId)) return "success"; + const node = nodeById(curId); + const kind = String(node?.kind || "").toLowerCase(); + if (kind === "end" || kind === "exit") return "success"; + return null; + } + + _updateOutcomeBanner(ws) { + const outcome = this._resolveOutcome(ws); + if (outcome === this._outcomeState) return; + this._outcomeState = outcome; + if (this._outcomeBanner) { + try { + this._outcomeBanner.destroy(); + } catch {} + this._outcomeBanner = null; + } + if (!outcome) return; + const label = outcome === "success" ? "success" : "fail"; + const color = outcome === "success" ? "#a1ffb9" : "#ff7c7c"; + const textImg = this._makePixelText(label, 18, color, 4); + textImg.setOrigin(0.5, 0.5); + const padX = 12; + const padY = 8; + const w = Math.ceil(textImg.displayWidth + padX * 2); + const h = Math.ceil(textImg.displayHeight + padY * 2); + const bg = this.add.rectangle(0, 0, w, h, 0x061022, 0.82); + bg.setStrokeStyle(2, 0x3a4a66, 0.95); + const c = this.add.container(Math.round(VIEW_W / 2), Math.round(MAIN_H * 0.22)); + c.add(bg); + c.add(textImg); + c.setDepth(90); + c.setScrollFactor(0); + this._outcomeBanner = c; + } + + _upsertNameLabel(roleId, name, spr, isActive, isLeader) { + const rid = String(roleId); + const labelText = String(name || "").trim() || i18nT("roleLabel"); + const color = isActive + ? (isLeader ? "#ffe6a8" : "#e8f0ff") + : (isLeader ? "#ffd27c" : "#cfe8ff"); + const needsRecreate = (obj, nextText, nextColor) => { + if (!obj) return true; + if (obj.__pixText !== nextText) return true; + if (obj.__pixColor !== nextColor) return true; + return false; + }; + let t = this.roleNameLabels.get(rid); + if (needsRecreate(t, labelText, color)) { + if (t) { + try { + t.destroy(); + } catch {} + this.roleNameLabels.delete(rid); + } + // Names: baked hard-edge pixel text + t = this._makePixelText(labelText, this._nameFontPx, color, 4); + t.__pixText = labelText; + t.__pixColor = color; + t.setDepth(55); + this.world.add(t); + this.roleNameLabels.set(rid, t); + } + // Place under feet + t.setOrigin(0.5, 0); + t.x = spr.x; + t.y = spr.y + 4; + t.setAlpha(isActive ? 1.0 : 0.9); + } + + _say(roleId, text) { + const rid = String(roleId || ""); + if (!rid) return; + const spr = this.roleSprites.get(rid); + if (!spr) return; + + const msg = String(text || "").trim(); + if (!msg) return; + + // replace existing bubble + const prev = this.roleBubbles.get(rid); + if (prev) { + try { + prev.destroy(); + } catch {} + this.roleBubbles.delete(rid); + } + + const g = this.add.graphics(); + // Speech bubble text: always use the highest supersample for crisp hard edges. + const t = this._makePixelText(msg, this._bubbleFontPx, "#e8f0ff", 4); + t.setOrigin(0.5, 1); + + const maxW = 220; + const w = Math.min(maxW, Math.ceil(t.displayWidth)); + const h = Math.ceil(t.displayHeight); + const padX = 10; + const padY = 8; + + // transparent bubble feel + g.fillStyle(0x0b1630, 0.35); + g.fillRect(-w / 2 - padX, -h - padY * 1.2, w + padX * 2, h + padY * 1.6); + g.lineStyle(2, 0x7cf2ff, 0.35); + g.strokeRect(-w / 2 - padX, -h - padY * 1.2, w + padX * 2, h + padY * 1.6); + + // small tail + g.fillStyle(0x0b1630, 0.35); + g.beginPath(); + g.moveTo(0, 0); + g.lineTo(-6, -10); + g.lineTo(6, -10); + g.closePath(); + g.fillPath(); + + const lift = Math.round(Math.min(70, Math.max(0, h * 0.6))); + const c = this.add.container(spr.x, spr.y - 54 - lift); + c.__lift = lift; + c.setPosition(Math.round(c.x), Math.round(c.y)); + c.setDepth(60); + c.add(g); + t.setPosition(0, -10); + c.add(t); + this.world.add(c); + this.roleBubbles.set(rid, c); + + // reset timer: fade out then destroy + const prevTimer = this._bubbleTimers.get(rid); + if (prevTimer) { + try { + prevTimer.remove(false); + } catch {} + } + const timer = this.time.delayedCall(3600, () => { + const b = this.roleBubbles.get(rid); + if (!b) return; + this.tweens.add({ + targets: b, + alpha: 0, + duration: 220, + onComplete: () => { + try { + b.destroy(); + } catch {} + this.roleBubbles.delete(rid); + }, + }); + }); + this._bubbleTimers.set(rid, timer); + } + + setState(ws) { + const nodeId = ws?.current_node_id || mapStartNodeId || "start"; + const visited = ws?.visited_node_ids || [nodeId]; + const weather = ws?.weather || "cloudy"; + const tod = ws?.time_of_day || "morning"; + const prevTod = this._tod; + + const nodeChanged = nodeId !== this._curNodeId; + const moodChanged = weather !== this._weather || tod !== this._tod; + + const walkKey = `${nodeId}|${ws?.in_transit_from_node_id || ""}|${ws?.in_transit_to_node_id || ""}|${Number( + ws?.in_transit_progress_km || 0, + )}`; + const walkChanged = walkKey !== this._walkKey; + this._walkKey = walkKey; + + this._curNodeId = nodeId; + this._visited = new Set(visited); + this._weather = weather; + this._tod = tod; + this._ws = ws || {}; + this._rainActive = String(weather) === "rainy"; + this._snowActive = String(weather) === "snowy"; + this._windActive = String(weather) === "windy"; + this._fogActive = String(weather) === "foggy"; + + // theme change: kili -> scene_kilimanjaro, else -> scene_base + const theme = String(ws?.theme || worldState?.theme || "aotai"); + const themeChanged = theme !== this._theme; + if (themeChanged) this._theme = theme; + + // render roles on big map + try { + this._syncRolesOnMap(ws); + } catch {} + + // 2) update main world: re-render when location/segment or theme changes + const segFrom = ws?.in_transit_from_node_id || nodeId; + const segTo = ws?.in_transit_to_node_id || nodeId; + const sceneKey = `${nodeId}|${segFrom}|${segTo}`; + const sceneChanged = sceneKey !== this._sceneKey; + this._sceneKey = sceneKey; + if (nodeChanged || sceneChanged || themeChanged) { + const nextSceneId = theme === "kili" ? "kilimanjaro" : "base"; + if (nextSceneId !== this._sceneId) this._swapScene(nextSceneId); + } + + this._updateOutcomeBanner(ws); + + // mood overlay can change frequently without re-rendering tiles + if (moodChanged) { + // Night arrival: fade to dark gradually + if (this.worldOverlay && tod === "night" && prevTod !== "night") { + try { + this.worldOverlay.fillColor = 0x000000; + this.tweens.add({ + targets: this.worldOverlay, + alpha: 0.35, + duration: 1200, + ease: "Sine.easeInOut", + }); + } catch { + this._applyMoodOverlay(weather, tod); + } + } else { + this._applyMoodOverlay(weather, tod); + } + } + + // 3) small "step" animation on move + if (nodeChanged || walkChanged) { + // Background is continuously scrolling now (two-copy loop), so no extra world bob here. + // tiny bob on active role (if present) + const activeId = ws?.active_role_id ? String(ws.active_role_id) : null; + const activeSpr = activeId ? this.roleSprites.get(activeId) : null; + if (activeSpr) { + this.tweens.add({ + targets: activeSpr, + y: activeSpr.y - 6, + duration: 220, + yoyo: true, + ease: "Sine.easeInOut", + }); + } + } + } + + _applyMoodOverlay(weather, tod) { + let overlayColor = 0x000000; + let overlayAlpha = 0.0; + + if (tod === "evening" || tod === "night") { + overlayColor = 0x000000; + overlayAlpha = tod === "night" ? 0.35 : 0.18; + } + if (tod === "morning") { + overlayColor = 0x0b1630; + overlayAlpha = 0.08; + } + + if (weather === "foggy") { + overlayColor = 0xc6d0e8; + overlayAlpha = 0.18; + } + if (weather === "rainy") { + overlayColor = 0x2b3c66; + overlayAlpha = 0.16; + } + if (weather === "sunny") { + overlayColor = 0xffd27c; + overlayAlpha = 0.06; + } + + if (this.worldOverlay) { + this.worldOverlay.fillColor = overlayColor; + this.worldOverlay.setAlpha(overlayAlpha); + } + } + + _initRainDrops() { + this._rainDrops = []; + const count = Math.max(80, Math.floor((VIEW_W * MAIN_H) / 6000)); + for (let i = 0; i < count; i++) { + this._rainDrops.push({ + x: Math.random() * VIEW_W, + y: Math.random() * MAIN_H, + len: 6 + Math.random() * 6, + speed: 140 + Math.random() * 120, + drift: -12 + Math.random() * 24, + }); + } + } + + _updateRain(delta) { + if (!this._rainGfx) return; + if (!this._rainActive) { + this._rainGfx.clear(); + return; + } + const dt = Math.max(0, Number(delta || 0) / 1000); + this._rainGfx.clear(); + this._rainGfx.lineStyle(1, 0x8ab4ff, 0.6); + for (const d of this._rainDrops) { + d.y += d.speed * dt; + d.x += d.drift * dt; + if (d.y > MAIN_H + d.len) { + d.y = -d.len; + d.x = Math.random() * VIEW_W; + } + if (d.x < -20) d.x = VIEW_W + 20; + if (d.x > VIEW_W + 20) d.x = -20; + const x1 = Math.round(d.x); + const y1 = Math.round(d.y); + const x2 = Math.round(d.x + 1); + const y2 = Math.round(d.y + d.len); + this._rainGfx.beginPath(); + this._rainGfx.moveTo(x1, y1); + this._rainGfx.lineTo(x2, y2); + this._rainGfx.strokePath(); + } + } + + _initSnowFlakes() { + this._snowFlakes = []; + const count = Math.max(60, Math.floor((VIEW_W * MAIN_H) / 9000)); + for (let i = 0; i < count; i++) { + this._snowFlakes.push({ + x: Math.random() * VIEW_W, + y: Math.random() * MAIN_H, + r: 1 + Math.random() * 1.6, + speed: 26 + Math.random() * 24, + drift: -8 + Math.random() * 16, + }); + } + } + + _updateSnow(delta) { + if (!this._snowGfx) return; + if (!this._snowActive) { + this._snowGfx.clear(); + return; + } + const dt = Math.max(0, Number(delta || 0) / 1000); + this._snowGfx.clear(); + this._snowGfx.fillStyle(0xe8f0ff, 0.75); + for (const f of this._snowFlakes) { + f.y += f.speed * dt; + f.x += f.drift * dt; + if (f.y > MAIN_H + 4) { + f.y = -4; + f.x = Math.random() * VIEW_W; + } + if (f.x < -10) f.x = VIEW_W + 10; + if (f.x > VIEW_W + 10) f.x = -10; + this._snowGfx.fillCircle(Math.round(f.x), Math.round(f.y), f.r); + } + } + + _initWindStreaks() { + this._windStreaks = []; + const count = Math.max(40, Math.floor((VIEW_W * MAIN_H) / 12000)); + for (let i = 0; i < count; i++) { + this._windStreaks.push({ + x: Math.random() * VIEW_W, + y: Math.random() * MAIN_H, + len: 10 + Math.random() * 12, + speed: 80 + Math.random() * 60, + }); + } + } + + _updateWind(delta) { + if (!this._windGfx) return; + if (!this._windActive) { + this._windGfx.clear(); + return; + } + const dt = Math.max(0, Number(delta || 0) / 1000); + this._windGfx.clear(); + this._windGfx.lineStyle(1, 0xc6d0e8, 0.5); + for (const w of this._windStreaks) { + w.x += w.speed * dt; + w.y += (w.speed * 0.12) * dt; + if (w.x > VIEW_W + w.len) { + w.x = -w.len; + w.y = Math.random() * MAIN_H; + } + if (w.y > MAIN_H + 10) w.y = -10; + const x1 = Math.round(w.x); + const y1 = Math.round(w.y); + const x2 = Math.round(w.x + w.len); + const y2 = Math.round(w.y + w.len * 0.15); + this._windGfx.beginPath(); + this._windGfx.moveTo(x1, y1); + this._windGfx.lineTo(x2, y2); + this._windGfx.strokePath(); + } + } + + _initFogBlobs() { + this._fogBlobs = []; + const count = 5; + for (let i = 0; i < count; i++) { + this._fogBlobs.push({ + x: Math.random() * VIEW_W, + y: Math.random() * MAIN_H, + w: VIEW_W * (0.4 + Math.random() * 0.5), + h: MAIN_H * (0.12 + Math.random() * 0.18), + speed: 6 + Math.random() * 6, + }); + } + } + + _updateFog(delta) { + if (!this._fogGfx) return; + if (!this._fogActive) { + this._fogGfx.clear(); + return; + } + const dt = Math.max(0, Number(delta || 0) / 1000); + this._fogGfx.clear(); + this._fogGfx.fillStyle(0xc6d0e8, 0.18); + for (const b of this._fogBlobs) { + b.x += b.speed * dt; + if (b.x > VIEW_W + b.w) b.x = -b.w; + const x = Math.round(b.x); + const y = Math.round(b.y); + const w = Math.round(b.w); + const h = Math.round(b.h); + this._fogGfx.fillRect(x, y, w, h); + } + } + + _renderWorld(nodeId, segFrom, segTo) { + // Deterministic seed from session + node + mood + const seedStr = + String((worldState && worldState.session_id) || "seed") + + "|" + + String(nodeId) + + "|" + + String(segFrom || "") + + "|" + + String(segTo || ""); + const rng = mulberry32(hash32(seedStr)); + + // Fallback: if assets failed to load, render a simple placeholder + if (!this.textures.exists("grass") || (this._assetErrors && this._assetErrors.length)) { + this.worldRT.clear(); + this.worldRT.fill(0x0b1630, 1, 0, 0, VIEW_W, MAIN_H); + // simple path + const py = Math.floor(MAIN_H * 0.55); + this.worldRT.fill(0x223044, 1, 0, py, VIEW_W, 80); + return; + } + + // Clear + this.worldRT.clear(); + + // Base tiling (grass) + const tilesX = Math.ceil(VIEW_W / TILE) + 1; + const tilesY = Math.ceil(MAIN_H / TILE) + 1; + for (let y = 0; y < tilesY; y++) { + for (let x = 0; x < tilesX; x++) { + this.worldRT.draw("grass", x * TILE, y * TILE); + } + } + + // Path depending on node kind (VERTICAL: bottom -> top) + const n = nodeById(nodeId); + const kind = n?.kind || "main"; + + // center X, with a gentle drift as Y increases + let cx = Math.floor(tilesX / 2); + const pathW = kind === "camp" ? 3 : kind === "lake" ? 3 : 2; + const driftMax = kind === "junction" ? 2 : 1; + + // Track the path center per row so side props can follow the corridor + const pathCenterByY = new Array(tilesY); + + for (let y = tilesY - 1; y >= 0; y--) { + // occasional drift + if (rng() < 0.22) { + const d = rng() < 0.5 ? -1 : 1; + cx = clamp(cx + d, 2, tilesX - 3); + } + // small wobble around drifted center + const wobble = rng() < 0.18 ? (rng() < 0.5 ? -driftMax : driftMax) : 0; + const xCenter = clamp(cx + wobble, 2, tilesX - 3); + pathCenterByY[y] = xCenter; + + for (let dx = -Math.floor(pathW / 2); dx <= Math.floor(pathW / 2); dx++) { + this.worldRT.draw("brick", (xCenter + dx) * TILE, y * TILE); + } + + // slightly rough edges + if (rng() < 0.12) + this.worldRT.draw( + "brick", + (xCenter - Math.floor(pathW / 2) - 1) * TILE, + y * TILE, + ); + if (rng() < 0.12) + this.worldRT.draw( + "brick", + (xCenter + Math.floor(pathW / 2) + 1) * TILE, + y * TILE, + ); + } + + // Sprinkle leaves + const leafN = 40 + Math.floor(rng() * 80); + for (let i = 0; i < leafN; i++) { + const px = Math.floor(rng() * (VIEW_W - 16)); + const py = Math.floor(rng() * (MAIN_H - 16)); + this.worldRT.draw("leaves", px, py); + } + + // Trees/bushes/fence depending on kind (favor lining the path sides) + const leftBandMax = Math.max(2, Math.floor(tilesX / 2) - Math.floor(pathW / 2) - 2); + const rightBandMin = Math.min(tilesX - 3, Math.floor(tilesX / 2) + Math.floor(pathW / 2) + 2); + // Trees: place props along the path for "forest corridor" feel + // Keep spacing stable across different PIXEL_SCALE (small tilesY would otherwise over-pack rows). + const minGapTiles = 2; + const maxRows = Math.max(3, Math.floor((tilesY - 2) / minGapTiles)); + const targetRows = clamp(4 + Math.floor(rng() * 3), 3, maxRows); + + let lastLX = -999; + let lastRX = 999; + let placed = 0; + for (let yTile = 1; yTile < tilesY - 1 && placed < targetRows; yTile += minGapTiles) { + // probabilistic skip for variety / less crowd + if (rng() < 0.35) continue; + + const yPx = yTile * TILE; + const center = pathCenterByY[yTile] ?? Math.floor(tilesX / 2); + const corridorHalf = Math.floor(pathW / 2); + const maxOffset = Math.max(5, Math.floor(tilesX * 0.32)); + + // alternate offsets so trees don't align into a single column + const alt = (placed % 3) * 2; + const offL = 4 + alt + Math.floor(rng() * Math.max(2, maxOffset - alt)); + const offR = 4 + (2 - (placed % 3)) * 2 + Math.floor(rng() * Math.max(2, maxOffset)); + + let lxTile = clamp(center - corridorHalf - offL, 1, tilesX - 2); + let rxTile = clamp(center + corridorHalf + offR, 1, tilesX - 2); + + // ensure some horizontal separation from last placed columns + if (Math.abs(lxTile - lastLX) < 2) lxTile = clamp(lxTile + 2, 1, tilesX - 2); + if (Math.abs(rxTile - lastRX) < 2) rxTile = clamp(rxTile - 2, 1, tilesX - 2); + + const lx = lxTile * TILE; + const rx = rxTile * TILE; + + // Not every row needs both sides + const both = rng() < 0.40; + if (both || rng() < 0.65) this.worldRT.draw("tree", lx, yPx - 64); + if (both || rng() < 0.65) this.worldRT.draw("tree", rx, yPx - 64); + + lastLX = lxTile; + lastRX = rxTile; + placed += 1; + } + + // Bushes: sprinkle near bottom and sides + const bushN = 10 + Math.floor(rng() * 10); + for (let i = 0; i < bushN; i++) { + const sideLeft = rng() < 0.5; + const xTile = sideLeft + ? Math.floor(rng() * leftBandMax) + : rightBandMin + Math.floor(rng() * Math.max(1, tilesX - rightBandMin)); + const yPx = Math.floor(rng() * (VIEW_H - 32)); + this.worldRT.draw("bush", xTile * TILE, yPx - 24); + } + + // Fence hints in camp/exits + if (kind === "camp" || kind === "exit" || rng() < 0.18) { + const fx = Math.floor(VIEW_W * 0.18); + const fy = Math.floor(VIEW_H * 0.78); + this.worldRT.draw("fence", fx, fy); + this.worldRT.draw("fence", VIEW_W - fx - 160, fy); + } + + if (rng() < 0.18) { + const x = Math.floor(VIEW_W * 0.45 + rng() * 120); + const y = Math.floor(VIEW_H * 0.72); + this.worldRT.draw("pumpkin", x, y); + } + } + + // (The Phaser minimap code remains here for compatibility, but is currently disabled via SKIP_PHASER_MINIMAP.) + _drawMinimap(nodeId) { + const ws = this._ws || {}; + const MINI_W = this.miniCam.width; + const MINI_H = this.miniCam.height; + + const pad = 14; + const mapW = MINI_W - pad * 2; + const mapH = MINI_H - pad * 2; + + const toMini = (n) => { + const x = pad + (clamp(n.x, 0, 100) / 100) * mapW; + const y = pad + (clamp(n.y, 0, 100) / 100) * mapH; + return { x: x, y: y }; + }; + + this.minimapG.clear(); + + for (const t of this.minimapLabels || []) { + try { + t.destroy(); + } catch {} + } + this.minimapLabels = []; + + // frame + this.minimapG.lineStyle(2, 0x3a4a66, 1); + this.minimapG.strokeRect(1, 1, MINI_W - 2, MINI_H - 2); + + // edges (curved for a softer look) + const curveSign = (s) => { + let h = 0; + for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0; + return h & 1 ? 1 : -1; + }; + + // Phaser Graphics doesn't support Canvas quadraticCurveTo; draw curves by sampling points. + const strokeQuad = (g, ax, ay, cx, cy, bx, by, segments = 16) => { + g.beginPath(); + g.moveTo(ax, ay); + for (let i = 1; i <= segments; i++) { + const t = i / segments; + const mt = 1 - t; + const x = mt * mt * ax + 2 * mt * t * cx + t * t * bx; + const y = mt * mt * ay + 2 * mt * t * cy + t * t * by; + g.lineTo(x, y); + } + g.strokePath(); + }; + + for (const e of mapEdges || []) { + const a = nodeById(e.from_node_id); + const b = nodeById(e.to_node_id); + if (!a || !b) continue; + const pa = toMini(a); + const pb = toMini(b); + + const visited = this._visited.has(e.to_node_id); + const isExit = e.kind === "exit"; + + const baseColor = isExit ? 0xff7c7c : 0x7cf2ff; + const alpha = visited ? 0.85 : 0.28; + const width = visited ? 3 : 2; + + const dx = pb.x - pa.x; + const dy = pb.y - pa.y; + const len = Math.max(1, Math.hypot(dx, dy)); + const px = -dy / len; + const py = dx / len; + const midx = (pa.x + pb.x) * 0.5; + const midy = (pa.y + pb.y) * 0.5; + const bend = + (8 + (isExit ? 6 : 0) + (visited ? 3 : 0)) * + curveSign(String(e.from_node_id) + "->" + String(e.to_node_id)); + const cx = midx + px * bend; + const cy = midy + py * bend; + // glow + this.minimapG.lineStyle(width + 3, 0x0b1630, Math.min(0.65, alpha)); + strokeQuad(this.minimapG, pa.x, pa.y, cx, cy, pb.x, pb.y, 16); + // main stroke + this.minimapG.lineStyle(width, baseColor, alpha); + strokeQuad(this.minimapG, pa.x, pa.y, cx, cy, pb.x, pb.y, 16); + } + + // nodes + labels + for (const n of mapNodes || []) { + const p = toMini(n); + const isCur = n.node_id === nodeId; + const isVisited = this._visited.has(n.node_id) || isCur; + + const kind = n.kind || "main"; + const kColor = + kind === "exit" + ? 0xff7c7c + : kind === "camp" + ? 0x7cffc6 + : kind === "lake" + ? 0x7ca8ff + : kind === "peak" + ? 0xffd27c + : kind === "start" + ? 0x9dff7c + : kind === "end" + ? 0xb0b6c6 + : 0x7cf2ff; + + // soft glow + dot + this.minimapG.fillStyle(0x0b1630, 0.85); + this.minimapG.fillCircle(p.x, p.y, isCur ? 7 : 6); + this.minimapG.fillStyle(kColor, isVisited ? 0.95 : 0.55); + this.minimapG.fillCircle(p.x, p.y, isCur ? 5 : 4); + + // label (only key nodes + current to avoid clutter) + const isKey = + isCur || + ["start", "camp", "junction", "lake", "peak", "exit", "end"].includes(kind); + const label = (n.name || n.node_id || "").trim(); + if (isKey && label) { + const t = this.add.text(p.x + MINI_LABEL_OFF_X, p.y - MINI_LABEL_OFF_Y, label, { + // Use a CJK-friendly font stack to improve readability for Chinese labels + fontFamily: + '"PingFang SC","Hiragino Sans GB","Microsoft YaHei",ui-monospace,Menlo,Monaco,Consolas,monospace', + fontSize: `${MINI_LABEL_FONT_PX}px`, + antialias: false, + color: isVisited ? "#d6faff" : "#7aa0b3", + }); + // keep internal text resolution close to actual device pixel ratio + t.setResolution(MINI_TEXT_RESOLUTION); + // force nearest-neighbor sampling for the text texture (avoid blur) + try { + this.textures.get(t.texture.key).setFilter(Phaser.Textures.FilterMode.NEAREST); + } catch {} + t.setStroke("#061022", MINI_LABEL_STROKE_W); + t.setAlpha(isCur ? 1.0 : 0.86); + t.setPadding(2, 1, 2, 1); + t.setBackgroundColor("#061022"); + t.setDepth(5); + // snap label to whole pixels + t.x = Math.round(t.x); + t.y = Math.round(t.y); + this.minimap.add(t); + this.minimapLabels.push(t); + } + } + + // marker + const cur = nodeById(nodeId); + const toId = ws && ws.in_transit_to_node_id; + const fromId = ws && ws.in_transit_from_node_id; + const prog = (ws && ws.in_transit_progress_km) || 0; + const tot = (ws && ws.in_transit_total_km) || 0; + + if (fromId && toId && tot > 0) { + const a = nodeById(fromId); + const b = nodeById(toId); + if (a && b) { + const pa = toMini(a); + const pb = toMini(b); + const t = clamp(prog / tot, 0, 1); + this.minimapMarker.setPosition(pa.x + (pb.x - pa.x) * t, pa.y + (pb.y - pa.y) * t); + return; + } + } + + if (cur) { + const mp = toMini(cur); + this.minimapMarker.setPosition(mp.x, mp.y); + } + } + } + + const config = { + type: Phaser.AUTO, + parent: "game-root", + width: VIEW_W, + height: VIEW_H, + resolution: GAME_RESOLUTION, + scale: { + mode: Phaser.Scale.NONE, + zoom: ZOOM, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + backgroundColor: "rgba(0,0,0,0)", + pixelArt: true, + antialias: false, + transparent: true, + scene: [HikeScene], + }; + + new Phaser.Game(config); +} diff --git a/demos/AOTAI_Hike/frontend/src/render.js b/demos/AOTAI_Hike/frontend/src/render.js new file mode 100644 index 000000000..0439f3748 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/render.js @@ -0,0 +1,519 @@ +import { branchEl, chatEl, partyEl, rolesEl, statusEl } from "./dom.js"; +import { t } from "./i18n.js"; +import { edgeByToId, mapNodes, nodeById, worldState, sessionId } from "./state.js"; +import { avatarUrl, pct, statClass } from "./utils.js"; + +export function logMsg(msg) { + if (!chatEl) return; + const isNearBottom = (el, thresholdPx = 32) => + el.scrollTop + el.clientHeight >= el.scrollHeight - thresholdPx; + const stickToBottom = isNearBottom(chatEl); + + if (msg.kind === "action") { + const last = chatEl.lastElementChild; + if (last && last.dataset && last.dataset.roleName === (msg.role_name || "")) { + const contentEl = last.querySelector(".content"); + if (contentEl) { + const raw = String(msg.content || ""); + const sep = raw.includes(":") ? ":" : ": "; + const action = raw.includes(sep) ? raw.split(sep).slice(1).join(sep) : raw; + contentEl.textContent = `${contentEl.textContent}(${action})`; + if (stickToBottom) { + const scrollToBottom = () => { + try { + chatEl.scrollTop = chatEl.scrollHeight; + } catch {} + }; + try { + requestAnimationFrame(scrollToBottom); + setTimeout(scrollToBottom, 0); + } catch { + scrollToBottom(); + } + } + return; + } + } + } + + const div = document.createElement("div"); + div.className = `msg ${msg.kind}`; + div.dataset.roleName = msg.role_name || ""; + const meta = document.createElement("div"); + meta.className = "meta"; + const who = msg.kind === "system" ? t("system") : msg.role_name || t("unknown"); + meta.textContent = `[${who}]`; + const content = document.createElement("div"); + content.className = "content"; + content.textContent = msg.content; + div.appendChild(meta); + div.appendChild(content); + chatEl.appendChild(div); + + // Notify Phaser: show bubble for role speech + try { + if ( + msg.kind === "speech" && + msg.role_id && + window.__aoTaiMapView && + typeof window.__aoTaiMapView.say === "function" + ) { + window.__aoTaiMapView.say(msg.role_id, msg.content); + } + } catch {} + + // Auto-scroll only if user is already near bottom. + if (stickToBottom) { + const scrollToBottom = () => { + try { + chatEl.scrollTop = chatEl.scrollHeight; + } catch {} + }; + try { + requestAnimationFrame(scrollToBottom); + setTimeout(scrollToBottom, 0); + } catch { + scrollToBottom(); + } + } +} + +export function setStatus() { + if (!worldState) return; + const node = + nodeById(worldState.current_node_id) || + mapNodes[Math.min(worldState.route_node_index, mapNodes.length - 1)]; + const active = (worldState.roles || []).find((r) => r.role_id === worldState.active_role_id); + let locStr = node?.name || "?"; + if (worldState.in_transit_to_node_id) { + const toN = nodeById(worldState.in_transit_to_node_id); + const prog = Math.floor(worldState.in_transit_progress_km || 0); + const tot = Math.floor(worldState.in_transit_total_km || 0); + locStr = `${t("statusEnRoute")}${toN?.name || worldState.in_transit_to_node_id} (${prog}/${tot}km)`; + } + statusEl.textContent = `Session: ${worldState.session_id} | ${t("statusLocation")}: ${locStr} | ${t("statusDay")} ${ + worldState.day + }/${worldState.time_of_day} | ${t("statusWeather")}: ${worldState.weather} | ${t("statusCurrentRole")}: ${active?.name || "-"}`; +} + +export function renderRoles() { + if (!rolesEl || !worldState) return; + rolesEl.innerHTML = ""; + for (const r of worldState.roles || []) { + const pill = document.createElement("div"); + pill.className = "role-pill" + (r.role_id === worldState.active_role_id ? " active" : ""); + pill.textContent = r.name; + pill.onclick = async () => { + await window.__aoTaiActions.apiSetActiveRole(r.role_id); + }; + rolesEl.appendChild(pill); + } +} + +export function renderBranchChoices() { + if (!branchEl || !worldState) return; + const fromId = worldState.current_node_id; + const nextIds = worldState.available_next_node_ids || []; + if (!nextIds || nextIds.length <= 1) { + branchEl.style.display = "none"; + branchEl.innerHTML = ""; + return; + } + + const leader = worldState.leader_role_id; + const active = worldState.active_role_id; + if (leader && active && leader !== active) { + branchEl.style.display = "none"; + branchEl.innerHTML = ""; + return; + } + + const items = []; + for (const id of nextIds) { + const n = nodeById(id); + const e = edgeByToId(fromId, id); + const label = e && e.label ? e.label : t("nextStep"); + const name = n ? n.name : id; + items.push({ id: id, text: label + ":" + name }); + } + + branchEl.style.display = "block"; + branchEl.innerHTML = ""; + + const label = document.createElement("div"); + label.className = "label"; + label.textContent = t("junctionChoose"); + + const box = document.createElement("div"); + box.className = "choices"; + + for (const it of items) { + const btn = document.createElement("button"); + btn.textContent = it.text; + + btn.onclick = async () => { + + branchEl.style.display = "none"; + branchEl.innerHTML = ""; + + worldState.available_next_node_ids = []; + worldState.phase = "free"; + + await window.__aoTaiActions.apiAct("MOVE_FORWARD", { next_node_id: it.id }); + }; + + box.appendChild(btn); + } + + branchEl.appendChild(label); + branchEl.appendChild(box); +} + +export function renderPartyStatus() { + if (!worldState) return; + partyEl.innerHTML = ""; + + const roles = worldState.roles || []; + if (roles.length === 0) { + const empty = document.createElement("div"); + empty.className = "party-card"; + empty.style.width = "520px"; + empty.innerHTML = `
${t("partyStatus")}
${t("partyEmpty")}
`; + partyEl.appendChild(empty); + return; + } + + for (const r of roles) { + const card = document.createElement("div"); + card.className = "party-card" + (r.role_id === worldState.active_role_id ? " active" : ""); + card.onclick = async () => { + await window.__aoTaiActions.apiSetActiveRole(r.role_id); + }; + if (r.persona) attachRoleTooltip(card, r.persona); + + const stamina = pct(r?.attrs?.stamina); + const mood = pct(r?.attrs?.mood); + const exp = pct(r?.attrs?.experience); + const risk = pct(r?.attrs?.risk_tolerance); + const supplies = pct(r?.attrs?.supplies || 80); + + const head = document.createElement("div"); + head.className = "party-head"; + + const img = document.createElement("img"); + img.className = "party-ava"; + img.alt = `${r.name} avatar`; + img.src = avatarUrl(r); + + const meta = document.createElement("div"); + meta.innerHTML = `
${r.name}
+
${t("currentPlay")}:${r.role_id === worldState.active_role_id ? t("yes") : t("no")}
`; + + head.appendChild(img); + head.appendChild(meta); + + const stat = document.createElement("div"); + stat.className = "stat"; + stat.innerHTML = ` +
+
${t("stamina")}
+
+
${stamina}
+
+
+
${t("mood")}
+
+
${mood}
+
+
+
${t("experience")}
+
+
${exp}
+
+
+
${t("risk")}
+
+
${risk}
+
+
+
${t("supplies")}
+
+
${supplies}
+
+ `; + + card.appendChild(head); + card.appendChild(stat); + partyEl.appendChild(card); + } +} + +let _roleTooltip = null; +let _roleTooltipPinned = false; + +function ensureRoleTooltip() { + if (_roleTooltip) return _roleTooltip; + const tip = document.createElement("div"); + tip.className = "role-tooltip-float"; + tip.style.display = "none"; + tip.addEventListener("mouseenter", () => { + _roleTooltipPinned = true; + }); + tip.addEventListener("mouseleave", () => { + _roleTooltipPinned = false; + tip.style.display = "none"; + }); + document.body.appendChild(tip); + _roleTooltip = tip; + return tip; +} + +function attachRoleTooltip(card, persona) { + const tip = ensureRoleTooltip(); + const show = () => { + tip.textContent = persona || ""; + const rect = card.getBoundingClientRect(); + tip.style.left = `${Math.round(rect.left)}px`; + tip.style.top = `${Math.round(rect.bottom + 6)}px`; + tip.style.display = "block"; + }; + card.addEventListener("mouseenter", () => { + _roleTooltipPinned = true; + show(); + }); + card.addEventListener("mousemove", () => { + if (_roleTooltipPinned) show(); + }); + card.addEventListener("mouseleave", () => { + _roleTooltipPinned = false; + tip.style.display = "none"; + }); +} + +// Share button and modal functionality +let shareButton = null; +let shareModal = null; +let shareImagePreview = null; +let shareDownloadBtn = null; +let currentShareImageBlob = null; + +function initShareButton() { + if (shareButton) return; + + shareButton = document.getElementById("share-button"); + if (!shareButton) return; + + shareButton.onclick = async () => { + await showShareModal(); + }; + + // Initialize share modal elements + shareModal = document.getElementById("share-modal"); + shareImagePreview = document.getElementById("share-image-preview"); + shareDownloadBtn = document.getElementById("share-download-btn"); + const shareCloseBtn = document.getElementById("share-close-btn"); + + if (shareDownloadBtn) { + shareDownloadBtn.onclick = () => { + // allow async download (canvas 合成多图层再导出) + downloadShareImage(); + }; + } + + if (shareCloseBtn) { + shareCloseBtn.onclick = () => { + hideShareModal(); + }; + } + + // Show button when session is available + if (worldState?.session_id) { + shareButton.style.display = "block"; + } +} + +async function showShareModal() { + initShareButton(); + if (!shareModal || !shareImagePreview) return; + + // Refresh share modal text to current language + const shareModalTitleEl = document.getElementById("i18n-share-modal-title"); + if (shareModalTitleEl) shareModalTitleEl.textContent = t("shareModalTitle"); + const shareDownloadBtn = document.getElementById("share-download-btn"); + if (shareDownloadBtn) shareDownloadBtn.textContent = t("shareDownload"); + const shareCloseBtn = document.getElementById("share-close-btn"); + if (shareCloseBtn) shareCloseBtn.textContent = t("shareClose"); + + const currentSessionId = sessionId || worldState?.session_id; + if (!currentSessionId) { + alert(t("shareNoSession")); + return; + } + + // Show loading state + shareImagePreview.src = ""; + shareImagePreview.style.display = "none"; + const loadingText = shareModal.querySelector(".loading-text"); + if (!loadingText) { + const loading = document.createElement("div"); + loading.className = "loading-text"; + loading.textContent = t("shareGenerating"); + loading.style.textAlign = "center"; + loading.style.padding = "20px"; + shareImagePreview.parentElement.insertBefore(loading, shareImagePreview); + } else { + loadingText.style.display = "block"; + } + + shareModal.style.display = "flex"; + + try { + // Fetch latest share image from API + const API_BASE = "/api/demo/ao-tai"; + const response = await fetch(`${API_BASE}/session/${currentSessionId}/share_image/current`); + if (!response.ok) { + throw new Error(`Failed to fetch share image: ${response.statusText}`); + } + + const blob = await response.blob(); + currentShareImageBlob = blob; + const imageUrl = URL.createObjectURL(blob); + + shareImagePreview.src = imageUrl; + shareImagePreview.style.display = "block"; + + const loadingText = shareModal.querySelector(".loading-text"); + if (loadingText) { + loadingText.style.display = "none"; + } + } catch (error) { + console.error("Failed to load share image:", error); + const loadingText = shareModal.querySelector(".loading-text"); + if (loadingText) { + loadingText.textContent = `${t("shareLoadFailed")}: ${error.message}`; + loadingText.style.color = "var(--danger)"; + } + } +} + +function hideShareModal() { + if (shareModal) { + shareModal.style.display = "none"; + } + // Clean up blob URL + if (shareImagePreview?.src && shareImagePreview.src.startsWith("blob:")) { + URL.revokeObjectURL(shareImagePreview.src); + } +} + +async function downloadShareImage() { + if (!currentShareImageBlob) return; + + // 1) 先把后端返回的“分享图”加载为 Image + const baseUrl = URL.createObjectURL(currentShareImageBlob); + const baseImg = new Image(); + baseImg.src = baseUrl; + + // 为了避免跨域问题,保持和当前页面同源(assets 也是本地静态资源) + await new Promise((resolve, reject) => { + baseImg.onload = () => resolve(); + baseImg.onerror = (e) => reject(e); + }); + + const width = baseImg.naturalWidth || baseImg.width; + const height = baseImg.naturalHeight || baseImg.height; + + // 2) 创建离屏 canvas,把所有需要的图层按顺序画进去 + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext("2d"); + if (!ctx) { + // fallback:直接下载原始分享图 + const link = document.createElement("a"); + link.href = baseUrl; + link.download = `aotai_hike_${Date.now()}.png`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(baseUrl); + return; + } + + // 像素风:禁用平滑缩放 + ctx.imageSmoothingEnabled = false; + + // 底层:原始分享图 + // 为了和前端 modal 中的布局一致,这里按与 CSS 相同的“内缩”绘制: + // CSS 中: + // #share-image-container { inset: 44px 52px 82px; } + // #share-card-frame { inset: 12px; } + // 也就是分享图相对于外框再往里缩一圈。 + const insetTop = 44; + const insetRight = 52; + const insetBottom = 82; + const insetLeft = 52; + const innerWidth = Math.max(1, width - insetLeft - insetRight); + const innerHeight = Math.max(1, height - insetTop - insetBottom); + + ctx.drawImage(baseImg, insetLeft, insetTop, innerWidth, innerHeight); + + // 尝试叠加 PNG 外框与噪点图;若加载失败则忽略。 + // 注意顺序:先画外框,再在最上层叠加噪点,以匹配前端 DOM 的层级。 + const extraLayers = [ + "./assets/share_frame.png", + "./assets/share_noise.png", + ]; + + for (const src of extraLayers) { + try { + const img = new Image(); + img.src = src; + // 为避免某些浏览器默认平滑,显式关闭 + await new Promise((resolve, reject) => { + img.onload = () => resolve(); + img.onerror = () => resolve(); // 静默失败:没有这张图就跳过 + }); + if (img.width && img.height) { + if (src.includes("share_noise")) { + // 与 CSS 中的 soft-light 类似的叠加效果 + const prevOp = ctx.globalCompositeOperation; + ctx.globalCompositeOperation = "soft-light"; + ctx.drawImage(img, 0, 0, width, height); + ctx.globalCompositeOperation = prevOp; + } else { + ctx.drawImage(img, 0, 0, width, height); + } + } + } catch { + // ignore single-layer failure + } + } + + URL.revokeObjectURL(baseUrl); + + // 3) 导出最终合成图并触发下载 + canvas.toBlob((blob) => { + if (!blob) return; + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = `aotai_hike_${Date.now()}.png`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + }, "image/png"); +} + +export function checkAndShowShareButton(ws) { + initShareButton(); + if (!shareButton) return; + + // Show button whenever session is available + if (ws?.session_id) { + shareButton.style.display = "block"; + } else { + shareButton.style.display = "none"; + } +} diff --git a/demos/AOTAI_Hike/frontend/src/state.js b/demos/AOTAI_Hike/frontend/src/state.js new file mode 100644 index 000000000..fcfbd6661 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/state.js @@ -0,0 +1,30 @@ +export let mapNodes = []; +export let mapEdges = []; +export let mapStartNodeId = "start"; +export let sessionId = null; +export let worldState = null; + +export function setMapData(data) { + mapNodes = data?.nodes || []; + mapEdges = data?.edges || []; + mapStartNodeId = data?.start_node_id || "start"; +} + +export function setSessionId(id) { + sessionId = id; +} + +export function setWorldState(ws) { + worldState = ws; +} + +export function nodeById(id) { + if (!id) return null; + return (mapNodes || []).find((n) => n.node_id === id) || null; +} + +export function edgeByToId(fromId, toId) { + return ( + (mapEdges || []).find((e) => e.from_node_id === fromId && e.to_node_id === toId) || null + ); +} diff --git a/demos/AOTAI_Hike/frontend/src/utils.js b/demos/AOTAI_Hike/frontend/src/utils.js new file mode 100644 index 000000000..d67c49284 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/src/utils.js @@ -0,0 +1,34 @@ +export const AVATAR_KEYS = ["default", "blue", "red", "green"]; // lightweight presets + +export function clamp(n, a, b) { + return Math.max(a, Math.min(b, n)); +} + +export function pct(n) { + return clamp(Number(n) || 0, 0, 100); +} + +export function statClass(v) { + if (v <= 25) return "danger"; + if (v <= 55) return "warn"; + return "ok"; +} + +export function avatarUrl(role) { + const key = role?.avatar_key || "default"; + return `./assets/avatars/ava_${key}.svg`; +} + +export function makeRole(name, persona) { + const id = `r_${Math.random().toString(16).slice(2, 10)}`; + const avatar_key = AVATAR_KEYS[Math.floor(Math.random() * AVATAR_KEYS.length)]; + return { + role_id: id, + name, + avatar_key, + persona: (persona && String(persona).trim()) + ? String(persona).trim() + : `${name}:像素风徒步者。谨慎但乐观。`, + attrs: { stamina: 70, mood: 60, experience: 10, risk_tolerance: 50 }, + }; +} diff --git a/demos/AOTAI_Hike/frontend/style.css b/demos/AOTAI_Hike/frontend/style.css new file mode 100644 index 000000000..ab6eeeb92 --- /dev/null +++ b/demos/AOTAI_Hike/frontend/style.css @@ -0,0 +1,839 @@ +:root { + --bg: #0c1020; + --panel: rgba(10, 16, 28, 0.92); + --border: #3a4a66; + --text: #e8f0ff; + --muted: #a7b5d4; + --accent: #7cf2ff; + --danger: #ff7c7c; + --ok: #a1ffb9; + --warn: #ffd27c; + /* Share card aspect ratio = WIDTH / HEIGHT. + Backend generator now outputs a strict 3:4 portrait card + (e.g. 1024x1365), so keep this in sync. */ + --share-ar: 0.75; /* 3 / 4 */ +} + +html, +body { + height: 100%; + margin: 0; + background: var(--bg); + color: var(--text); + font-family: "Press Start 2P", ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + font-size: 12px; +} + +#stage { + position: relative; + height: 100%; + overflow-x: hidden; + overflow-y: auto; +} + + +#left { + min-width: 520px; + display: flex; + flex-direction: column; + gap: 10px; + min-height: calc(100vh - 24px); +} + +#minimap-root { + width: 100%; + height: 170px; + min-height: 140px; + max-height: 220px; + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.12); + overflow: hidden; + position: relative; +} + +#minimap-canvas { + width: 100%; + height: 100%; + display: block; + image-rendering: auto; +} + +#game-root { + width: 100%; + flex: 1 1 auto; + min-height: 520px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.12); +} + +canvas { + display: block; + image-rendering: pixelated; +} + +/* legacy: minimap overlay canvas (no longer used by default) */ +#minimap-overlay { + display: none; +} + + +#titlebar { + pointer-events: auto; + padding: 6px 12px 4px; + background: linear-gradient(180deg, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6); +} + +.lang-btn { + font-size: 10px; + padding: 6px 10px; + flex-shrink: 0; + white-space: nowrap; + cursor: pointer; +} + +.share-btn { + font-size: 10px; + padding: 6px 12px; + margin-left: 0; + flex-shrink: 0; + white-space: nowrap; +} + +.title { + color: var(--accent); + font-size: 13px; +} +.sub { + margin-top: 3px; + color: var(--muted); + font-size: 10px; + line-height: 1.4; +} +#status { + margin-top: 4px; + color: var(--text); + font-size: 10px; + line-height: 1.5; +} + +/* NEW: party status strip */ +.party-strip { + margin-top: 6px; + display: flex; + gap: 8px; + overflow-x: auto; + overflow-y: visible; + padding-bottom: 3px; +} +.party-strip::-webkit-scrollbar { + height: 8px; +} +.party-strip::-webkit-scrollbar-thumb { + background: rgba(124, 242, 255, 0.25); + border: 2px solid rgba(58, 74, 102, 0.8); +} + +.party-card { + flex: 0 0 auto; + width: 200px; + border: 2px solid var(--border); + background: rgba(10, 16, 28, 0.72); + box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.25); + padding: 8px; + cursor: pointer; + user-select: none; + position: relative; + overflow: visible; +} +.party-card.active { + border-color: var(--accent); +} +.party-card:hover { + border-color: var(--accent); +} + +.role-tooltip-float { + position: fixed; + padding: 8px; + border: 2px solid rgba(124, 242, 255, 0.35); + background: rgba(6, 16, 34, 0.95); + color: var(--text); + font-size: 9px; + line-height: 1.5; + max-height: 160px; + max-width: 260px; + overflow: auto; + z-index: 999; + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.45); +} + +.party-head { + display: grid; + grid-template-columns: 36px 1fr; + gap: 8px; + align-items: center; +} +.party-ava { + width: 36px; + height: 36px; + image-rendering: pixelated; + border: 2px solid rgba(255, 255, 255, 0.08); + background: rgba(0, 0, 0, 0.2); +} +.party-name { + font-size: 10px; + color: var(--text); + line-height: 1.3; +} +.party-sub { + margin-top: 3px; + font-size: 9px; + color: var(--muted); + line-height: 1.5; +} + +.stat { + margin-top: 5px; +} +.stat-row { + display: grid; + grid-template-columns: 62px 1fr 28px; + gap: 8px; + align-items: center; + margin-top: 5px; +} +.stat-label { + font-size: 8px; + color: var(--muted); +} +.stat-val { + font-size: 8px; + color: var(--text); + text-align: right; +} +.stat-bar { + height: 8px; + border: 2px solid rgba(255, 255, 255, 0.08); + background: rgba(0, 0, 0, 0.25); + position: relative; + overflow: hidden; +} +.stat-bar > div { + height: 100%; + width: 50%; + background: rgba(124, 242, 255, 0.65); +} +.stat-bar.ok > div { + background: rgba(161, 255, 185, 0.75); +} +.stat-bar.warn > div { + background: rgba(255, 210, 124, 0.75); +} +.stat-bar.danger > div { + background: rgba(255, 124, 124, 0.75); +} + +#panels { + display: flex; + flex-direction: column; + gap: 10px; +} + +.panel { + background: var(--panel); + border: 2px solid var(--border); + box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.35); + padding: 8px; + min-height: 0; + max-height: 42vh; + overflow: hidden; +} + +#party-panel { + overflow: visible; +} + +.panel-title { + font-size: 11px; + color: var(--accent); + margin-bottom: 10px; +} + +.row { + display: flex; + gap: 8px; + margin-top: 5px; + align-items: center; +} + +button { + font: inherit; + color: var(--text); + background: rgba(20, 26, 44, 0.95); + border: 2px solid var(--border); + padding: 8px 10px; + cursor: pointer; +} +button:hover { + border-color: var(--accent); +} + +input { + font: inherit; + color: var(--text); + background: rgba(0, 0, 0, 0.35); + border: 2px solid var(--border); + padding: 8px 10px; + width: 100%; + box-sizing: border-box; +} +input:focus { + outline: none; + border-color: var(--accent); +} + +/* Attention input (night vote pre-say) */ +input.input-attn { + border-color: #ffd27c; + box-shadow: 0 0 0 2px rgba(255, 210, 124, 0.25); + background: rgba(255, 210, 124, 0.08); +} + +textarea { + font: inherit; + color: var(--text); + background: rgba(0, 0, 0, 0.35); + border: 2px solid var(--border); + padding: 8px 10px; + width: 100%; + box-sizing: border-box; + resize: vertical; +} +textarea:focus { + outline: none; + border-color: var(--accent); +} + +/* Initial role setup modal */ +.modal-backdrop { + position: fixed; + inset: 0; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.68); + backdrop-filter: blur(6px); +} +.modal { + width: min(720px, calc(100vw - 32px)); + max-height: calc(100vh - 48px); + overflow: auto; + background: rgba(10, 16, 28, 0.96); + border: 2px solid rgba(124, 242, 255, 0.35); + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.6); + padding: 14px 14px 16px; +} + +/* Share modal backdrop override:暗色聚焦感 */ +#share-modal.modal-backdrop { + background: rgba(0, 0, 0, 0.65); + backdrop-filter: blur(4px); +} + +/* Share image modal: keep EXACTLY the same aspect ratio as the generated share image. + `--share-ar` is WIDTH / HEIGHT. Example: 16:9 => 1.7778, 3:4 => 0.75 */ +#share-modal .modal { + position: relative; + + /* 高度优先:让卡片几乎占满视口高度,再按比例推算宽度 */ + height: calc(100vh - 32px); + width: min(calc((100vh - 32px) * var(--share-ar)), calc(100vw - 32px)); + + /* Override generic modal limits */ + max-width: none; + max-height: none; + + padding: 0; + overflow: hidden; + + border: 2px solid rgba(124, 242, 255, 0.55); + box-shadow: 0 16px 60px rgba(0, 0, 0, 0.55); + background: rgba(0, 0, 0, 0.12); +} + +/* 4 层结构中的“卡片底板” */ +#share-card-base { + position: absolute; + inset: 0; + margin: 18px 18px 22px; + border-radius: 8px; + background: + radial-gradient(135% 140% at 50% 0%, rgba(80, 110, 160, 0.55), rgba(12, 16, 32, 0.95)), + linear-gradient(180deg, rgba(160, 190, 230, 0.16), rgba(10, 12, 22, 0.9)); + box-shadow: + 0 0 0 1px rgba(180, 210, 255, 0.08), + 0 12px 30px rgba(0, 0, 0, 0.6), + inset 0 1px 0 rgba(255, 255, 255, 0.08); + overflow: hidden; +} + +/* A subtle inner vignette for readability (no extra “boxes”) */ +#share-modal .modal::before { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + z-index: 1; + background: + radial-gradient(120% 90% at 50% 30%, rgba(0,0,0,0.00), rgba(0,0,0,0.22) 70%, rgba(0,0,0,0.35)); +} + +/* Share image: fill the modal content area, act as background layer */ +#share-image-container { + position: absolute; + /* 让分享图整体离外框再远一点,避免文字被装饰遮挡 */ + inset: 44px 52px 82px; + margin: 0; + overflow: hidden; + /* keep background clean; the card itself should carry the UI */ + background: transparent; + z-index: 0; +} + +#share-image-preview { + display: block; + width: 100%; + height: 100%; + /* Fill the frame completely; card is already 3:4 so this won't + crop in normal cases, but can eat 1px 误差 instead of留白 */ + object-fit: cover; + object-position: center; + border: none; + /* 像素风:禁用平滑插值,尽量保持块状像素感 */ + image-rendering: pixelated; + image-rendering: crisp-edges; +} + +/* PNG 外框层:占满卡片区域,使用带金属边/角标的 PNG */ +#share-card-frame { + position: absolute; + inset: 12px; + pointer-events: none; + z-index: 1; + background-position: center; + background-repeat: no-repeat; + /* 将遮罩整体“压缩”到 3:4 容器里,而不是按原图比例留边 */ + background-size: 100% 100%; + /* 这里假定有 assets/share_frame.png,可按需要调整路径 */ + background-image: url("./assets/share_frame.png"); + /* 轻微外发光 + 漂浮感 */ + box-shadow: + 0 0 28px rgba(0, 0, 0, 0.85), + 0 0 32px rgba(120, 180, 255, 0.22); +} + +/* 质感层:雪点 / 噪点 / 微光粒子 */ +#share-card-noise { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 2; + mix-blend-mode: soft-light; + opacity: 0.7; + background-image: + radial-gradient(circle at 10% 20%, rgba(255, 255, 255, 0.25) 0, transparent 40%), + radial-gradient(circle at 80% 0%, rgba(255, 255, 255, 0.18) 0, transparent 45%), + url("./assets/share_noise.png"); /* 任选噪点纹理 PNG;没有时仅用前两层渐变 */ + background-size: 140px 140px, 220px 220px, cover; +} + +/* Overlay title and buttons on top of the canvas */ +#share-modal .modal-title { + position: absolute; + top: 18px; + left: 20px; + right: 20px; + z-index: 3; + margin: 0; + text-align: left; + color: rgba(236, 243, 255, 0.98); + font-size: 14px; + letter-spacing: 0.5px; + text-shadow: + 0 2px 6px rgba(0, 0, 0, 0.85), + 0 0 10px rgba(100, 200, 255, 0.4); + font-family: "STSong", "Songti SC", "Noto Serif SC", "PingFang SC", + system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +#share-modal .row { + position: absolute; + bottom: 18px; + left: 20px; + right: 20px; + z-index: 3; + margin: 0; + justify-content: center; + gap: 14px; +} + +/* Share modal buttons: gold primary + muted secondary */ +#share-modal .row button { + padding: 10px 18px; + min-width: 150px; + border-radius: 3px; + border-color: rgba(58, 74, 102, 0.9); + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(40, 48, 72, 0.98)); + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.8), + 0 6px 14px rgba(0, 0, 0, 0.65), + inset 0 1px 0 rgba(255, 255, 255, 0.18), + inset 0 -2px 4px rgba(0, 0, 0, 0.7); + font-size: 12px; + font-family: "PingFang SC", "Noto Sans SC", system-ui, -apple-system, + BlinkMacSystemFont, "Segoe UI", sans-serif; +} +#share-modal .row button.primary { + border-color: rgba(255, 210, 124, 0.9); + background: + radial-gradient(120% 180% at 50% 0%, rgba(255, 255, 255, 0.35), transparent 55%), + linear-gradient(180deg, rgba(255, 233, 180, 0.9), rgba(170, 110, 40, 0.95)); + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.85), + 0 8px 18px rgba(0, 0, 0, 0.75), + inset 0 1px 0 rgba(255, 255, 255, 0.6), + inset 0 -2px 4px rgba(139, 84, 16, 0.95); +} +#share-modal .row button:hover { + border-color: rgba(124, 242, 255, 0.9); +} +#share-modal .row button.primary:hover { + border-color: rgba(255, 230, 170, 0.98); +} + +/* Ensure image stays below vignette, title/buttons above */ +#share-modal #share-image-container { z-index: 0; } +#share-modal .modal-title, #share-modal .row { z-index: 2; } +.modal-title { + color: var(--accent); + font-size: 13px; + margin-bottom: 8px; +} +.modal-sub { + color: var(--muted); + font-size: 10px; + line-height: 1.5; + margin-bottom: 12px; +} +.setup-theme-row { + margin-bottom: 12px; + padding: 8px 0; + border-bottom: 1px solid rgba(124, 242, 255, 0.25); +} +.setup-option-row { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 10px; +} +.setup-option-row .setup-theme-label { + margin-bottom: 0; + min-width: 4em; +} +.setup-theme-label { + display: block; + color: var(--muted); + font-size: 10px; + margin-bottom: 8px; +} +.setup-theme-btns { + display: flex; + gap: 10px; + flex-wrap: wrap; +} +.setup-theme-btn { + font-size: 10px; + padding: 6px 12px; + cursor: pointer; + background: rgba(0, 0, 0, 0.3); + border: 1px solid var(--border); + color: var(--text); +} +.setup-theme-btn:hover { + border-color: var(--accent); + color: var(--accent); +} +.setup-theme-btn.primary { + background: rgba(124, 242, 255, 0.15); + border-color: var(--accent); + color: var(--accent); +} +.modal-form .field { + margin-bottom: 10px; +} +.field-label { + color: var(--muted); + font-size: 10px; + margin-bottom: 6px; +} +.setup-list-title { + color: var(--accent); + font-size: 11px; + margin-top: 10px; + margin-bottom: 8px; +} +.setup-list { + display: grid; + gap: 8px; +} +.setup-item { + display: grid; + grid-template-columns: 1fr auto; + gap: 10px; + padding: 10px; + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.22); +} +.setup-item .name { + color: var(--text); + margin-bottom: 6px; +} +.setup-item .persona { + color: var(--muted); + font-size: 10px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; +} + +/* Night vote modal */ +.vote-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 10px; + margin-bottom: 12px; +} +.vote-card { + display: grid; + grid-template-columns: 48px 1fr; + gap: 10px; + align-items: center; + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.22); + padding: 10px; + cursor: pointer; + transition: border-color 0.15s ease, transform 0.15s ease; +} +.vote-card:hover { + border-color: rgba(124, 242, 255, 0.65); + transform: translateY(-1px); +} +.vote-card.disabled { + opacity: 0.6; + cursor: default; + transform: none; +} +.vote-ava { + width: 48px; + height: 48px; + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.35); +} +.vote-name { + color: var(--text); + margin-bottom: 4px; +} +.vote-sub { + color: var(--muted); + font-size: 10px; +} +.vote-log { + border: 2px solid rgba(58, 74, 102, 0.8); + background: rgba(0, 0, 0, 0.2); + padding: 10px; + max-height: 220px; + overflow: auto; + line-height: 1.6; +} +.setup-actions { + justify-content: flex-end; + margin-top: 12px; +} +button.primary { + border-color: rgba(124, 242, 255, 0.75); +} +.setup-error { + margin-top: 10px; + border: 2px solid rgba(255, 124, 124, 0.55); + background: rgba(255, 124, 124, 0.08); + color: rgba(255, 220, 220, 0.95); + padding: 8px 10px; + font-size: 10px; + line-height: 1.5; +} + +.hint { + margin-top: 5px; + color: var(--muted); + font-size: 10px; + line-height: 1.5; +} + +#roles { + display: flex; + flex-wrap: wrap; + gap: 8px; +} +.role-pill { + padding: 6px 8px; + border: 2px solid var(--border); + background: rgba(0, 0, 0, 0.3); + cursor: pointer; + user-select: none; +} +.role-pill.active { + border-color: var(--accent); + color: var(--accent); +} + +#chat { + height: 34vh; + min-height: 140px; + max-height: 260px; + overflow: auto; + background: rgba(0, 0, 0, 0.25); + border: 2px solid rgba(255, 255, 255, 0.08); + padding: 8px; + font-size: 10px; + line-height: 1.6; +} + +/* actions + chat merged */ +.chat-wrap { + margin-bottom: 10px; +} + +/* Make the merged interact panel allocate remaining height to chat and keep scrolling inside #chat */ +#interact-panel { + display: flex; + flex-direction: column; + max-height: none; /* allow chat to use available space; right column already scrolls */ +} +#actions-panel { + flex: 0 0 auto; +} +.chat-wrap { + flex: 1 1 auto; + min-height: 180px; + overflow: hidden; /* keep scroll inside #chat */ +} +#chat { + height: 100%; + min-height: 0; + max-height: none; + overflow: auto; +} + +.msg { + margin-bottom: 8px; +} +.msg .meta { + color: var(--muted); +} +.msg.system .meta { + color: var(--warn); +} +.msg.action .meta { + color: var(--ok); +} +.msg .content { + margin-top: 4px; + white-space: pre-wrap; + word-break: break-word; +} + +@media (max-width: 1200px) { + #main { + grid-template-columns: 1fr; + } + #game-root { + height: 60vh; + min-height: 520px; + } + #right { + max-height: none; + } + #game-root { + height: 35%; + } + .party-card { + width: 220px; + } +} + + +/* Branch choice UI */ +.branch-choices { + margin-top: 8px; + padding: 8px; + border: 2px dashed rgba(124, 242, 255, 0.35); + background: rgba(0, 0, 0, 0.18); +} +.branch-choices .label { + font-size: 9px; + color: var(--accent); + margin-bottom: 8px; +} +.branch-choices .choices { + display: flex; + flex-wrap: wrap; + gap: 8px; +} +.branch-choices button { + padding: 6px 8px; +} + + +/* Layout: top bar + two columns */ +#topbar { + flex: 0 0 auto; +} +#main { + min-height: 100vh; + display: grid; + grid-template-columns: 1fr 520px; + gap: 10px; + padding: 8px 12px 12px; + align-items: start; +} +/* #left is defined earlier (flex column) */ +#right { + min-width: 420px; + height: calc(100vh - 24px); + overflow: visible; + padding-right: 2px; + display: flex; + flex-direction: column; + min-height: 0; +} + +#right-top { + margin-bottom: 10px; + flex: 0 0 auto; + overflow: visible; +} + +#panels { + flex: 1 1 auto; + min-height: 0; + overflow: hidden; +} diff --git a/demos/AOTAI_Hike/frontend/vendor/phaser-3.90.0.min.js b/demos/AOTAI_Hike/frontend/vendor/phaser-3.90.0.min.js new file mode 100644 index 000000000..990aee61b --- /dev/null +++ b/demos/AOTAI_Hike/frontend/vendor/phaser-3.90.0.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)})())); diff --git a/examples/mem_reader/runners/__init__.py b/examples/mem_reader/runners/__init__.py index e69de29bb..699a3f74c 100644 --- a/examples/mem_reader/runners/__init__.py +++ b/examples/mem_reader/runners/__init__.py @@ -0,0 +1 @@ +"""Runner package for MemReader examples.""" diff --git a/examples/mem_reader/runners/run_multimodal.py b/examples/mem_reader/runners/run_multimodal.py index e4176e898..81d25a74f 100644 --- a/examples/mem_reader/runners/run_multimodal.py +++ b/examples/mem_reader/runners/run_multimodal.py @@ -7,6 +7,7 @@ from examples.mem_reader.builders import build_multimodal_reader from examples.mem_reader.samples import ( + GAME_MULTI_VIEW_CASES, MULTIMODAL_MESSAGE_CASES, RAW_INPUT_CASES, STRING_MESSAGE_CASES, @@ -19,6 +20,7 @@ "string_message": STRING_MESSAGE_CASES, "multimodal": MULTIMODAL_MESSAGE_CASES, "raw_input": RAW_INPUT_CASES, + "game_multi_view": GAME_MULTI_VIEW_CASES, } @@ -28,7 +30,7 @@ def run_multimodal_reader(): parser.add_argument( "--example", type=str, - default="all", + default="game_multi_view", choices=[*list(EXAMPLE_MAP.keys()), "all"], help="Example to run", ) diff --git a/examples/mem_reader/samples.py b/examples/mem_reader/samples.py index c29177c58..2d6faef19 100644 --- a/examples/mem_reader/samples.py +++ b/examples/mem_reader/samples.py @@ -673,8 +673,60 @@ def get_info(self) -> dict[str, Any]: ), ] + +# ============================================================================ +# 12. AoTai Hike Multi-Perspective Samples +# ============================================================================ + +GAME_MULTI_VIEW_CASES = [ + TestCase( + name="game_multi_perspective", + description="鳌太线游戏多角色视角对话示例(使用 role_id / role_name)", + scene_data=[ + [ + { + "role": "system", + "content": "你正在鳌太线高海拔徒步线路上带队前进,队伍中每个角色都有独立视角和状态。", + "chat_time": "2025-02-10T08:00:00Z", + "message_id": "aotai_sys_1", + }, + { + "role": "user", + "content": "今天风很大,我有点头疼,但大部队状态还可以,可以继续前进。", + "chat_time": "2025-02-10T08:05:00Z", + "message_id": "aotai_u_leader_1", + "role_id": "leader", + "role_name": "队长阿青", + }, + { + "role": "user", + "content": "我水快喝完了,背包也有点压肩,建议午间在下一个平台休息一下补给。", + "chat_time": "2025-02-10T08:06:00Z", + "message_id": "aotai_u_support_1", + "role_id": "support", + "role_name": "后援小李", + }, + { + "role": "user", + "content": "我体力还不错,可以帮忙多背一点公用物资,不过前面路段看起来有积雪,需要放慢节奏。", + "chat_time": "2025-02-10T08:07:00Z", + "message_id": "aotai_u_scout_1", + "role_id": "scout", + "role_name": "前锋阿泽", + }, + { + "role": "assistant", + "content": "系统记录:队长关注整体节奏,后援关注物资与休息点,前锋关注路况与安全风险——形成对当前路段的多视角记忆。", + "chat_time": "2025-02-10T08:08:00Z", + "message_id": "aotai_assistant_1", + }, + ] + ], + ), +] + # ============================================================================ -# 12. Raw Input Cases (from Legacy) +# 13. Raw Input Cases (from Legacy) # ============================================================================ RAW_INPUT_CASES = [ diff --git a/src/memos/mem_reader/multi_modal_struct.py b/src/memos/mem_reader/multi_modal_struct.py index 8b0968ca1..712b3c6fa 100644 --- a/src/memos/mem_reader/multi_modal_struct.py +++ b/src/memos/mem_reader/multi_modal_struct.py @@ -27,6 +27,56 @@ logger = log.get_logger(__name__) +def format_role_prefix(role: str | None, role_name: str | None, role_id: str | None) -> str: + """ + Prefer role_name; fall back to role. + Render: role_id: leader or user role_id: xxx + """ + who = role_name or role or "unknown" + extras = [] + if role_id: + extras.append(f"role_id: {role_id}") + return f"{who}({', '.join(extras)})" if extras else who + + +def format_line(source: object | dict) -> str: + if isinstance(source, dict): + role = source.get("role") + role_id = source.get("role_id") + role_name = source.get("role_name") + ts = source.get("chat_time") + content = source.get("content") or "" + else: + role = getattr(source, "role", None) + role_id = getattr(source, "role_id", None) + role_name = getattr(source, "role_name", None) + ts = getattr(source, "chat_time", None) + content = getattr(source, "content", "") or "" + + prefix = format_role_prefix(role, role_name, role_id) + + if ts: + return f"{prefix}: [{ts}]: {content}" + return f"{prefix}: {content}" + + +def build_multiview_conversation(sources: list[object | dict]) -> str: + def get_ts(s): + if isinstance(s, dict): + return s.get("timestamp") or s.get("time") or s.get("created_at") or "" + return ( + getattr(s, "timestamp", None) + or getattr(s, "time", None) + or getattr(s, "created_at", None) + or "" + ) + + sources_sorted = sorted(sources, key=get_ts) + + lines = [format_line(s) for s in sources_sorted] + return "\n".join(lines) + + class MultiModalStructMemReader(SimpleStructMemReader): """Multimodal implementation of MemReader that inherits from SimpleStructMemReader.""" @@ -380,6 +430,7 @@ def _get_llm_response( custom_tags: list[str] | None = None, sources: list | None = None, prompt_type: str = "chat", + current_role_id: str | None = None, ) -> dict: """ Override parent method to improve language detection by using actual text content @@ -421,6 +472,13 @@ def _get_llm_response( template = PROMPT_DICT["general_string"][lang] examples = "" prompt = template.replace("{chunk_text}", mem_str) + elif prompt_type == "multi_view": + # Multi-view: single-role internal memory extraction with rich role header + template = PROMPT_DICT["multi_view"][lang] + examples = "" + prompt = template.replace("${conversation}", mem_str) + # Fill in current role metadata placeholders if present + prompt = prompt.replace("${current_role_id}", current_role_id or "") else: template = PROMPT_DICT["chat"][lang] examples = PROMPT_DICT["chat"][f"{lang}_example"] @@ -432,7 +490,7 @@ def _get_llm_response( else "" ) - # Replace custom_tags_prompt placeholder (different for doc vs chat) + # Replace custom_tags_prompt placeholder (different for doc vs chat/multi_view) if prompt_type in ["doc", "general_string"]: prompt = prompt.replace("{custom_tags_prompt}", custom_tags_prompt) else: @@ -442,6 +500,7 @@ def _get_llm_response( prompt = prompt.replace(examples, "") messages = [{"role": "user", "content": prompt}] try: + print(f"messages: {messages}") response_text = self.llm.generate(messages) response_json = parse_json_result(response_text) except Exception as e: @@ -463,23 +522,56 @@ def _get_llm_response( def _determine_prompt_type(self, sources: list) -> str: """ Determine prompt type based on sources. + + - If source has type="file", use "doc" prompt. + - If sources come from chat roles (user/assistant/system/tool): + - And contain multi-view fields (e.g., role_id / role_name on one or more sources), + use the multi-view prompt. + - Otherwise, use the standard chat prompt. + - If sources do not look like chat, fall back to general_string. """ if not sources: return "chat" - prompt_type = "general_string" + + has_chat_role = False + has_multi_view = False + for source in sources: - source_role = None + # Support both SourceMessage objects and plain dicts if hasattr(source, "role"): - source_role = source.role - elif isinstance(source, dict): - source_role = source.get("role") - if source_role in {"user", "assistant", "system", "tool"}: - prompt_type = "chat" + source_role = getattr(source, "role", None) + role_id = getattr(source, "role_id", None) + role_name = getattr(source, "role_name", None) + # Check for file type if hasattr(source, "type"): source_type = source.type if source_type == "file": - prompt_type = "doc" - return prompt_type + return "doc" + elif isinstance(source, dict): + source_role = source.get("role") + role_id = source.get("role_id") + role_name = source.get("role_name") + # Check for file type + source_type = source.get("type") + if source_type == "file": + return "doc" + else: + source_role = None + role_id = None + role_name = None + + if source_role in {"user", "assistant", "system", "tool"}: + has_chat_role = True + + # multi-view + if role_id or role_name: + has_multi_view = True + + if has_chat_role and has_multi_view: + return "multi_view" + if has_chat_role: + return "chat" + return "general_string" def _get_maybe_merged_memory( self, @@ -675,11 +767,17 @@ def _process_one_item( if not isinstance(sources, list): sources = [sources] - # Extract file_ids from fast item metadata for propagation + # Extract file_ids and role info from fast item metadata for propagation metadata = getattr(fast_item, "metadata", None) file_ids = getattr(metadata, "file_ids", None) if metadata is not None else None file_ids = [fid for fid in file_ids if fid] if isinstance(file_ids, list) else [] + # Current role metadata (for multi-view prompt header) + meta_info = getattr(metadata, "info", None) or {} + current_role_id = None + if isinstance(meta_info, dict): + current_role_id = metadata.user_id + # Build per-item info copy and kwargs for _make_memory_item info_per_item = info.copy() if file_ids and "file_id" not in info_per_item: @@ -697,9 +795,20 @@ def _process_one_item( # Determine prompt type based on sources prompt_type = self._determine_prompt_type(sources) + # If multi-view, augment the conversation string with role metadata + mem_str_for_llm = mem_str + if prompt_type == "multi_view": + mem_str_for_llm = build_multiview_conversation(sources) + # ========== Stage 1: Normal extraction (without reference) ========== try: - resp = self._get_llm_response(mem_str, custom_tags, sources, prompt_type) + resp = self._get_llm_response( + mem_str_for_llm, + custom_tags, + sources, + prompt_type, + current_role_id=current_role_id, + ) except Exception as e: logger.error(f"[MultiModalFine] Error calling LLM: {e}") return fine_items diff --git a/src/memos/mem_reader/read_multi_modal/assistant_parser.py b/src/memos/mem_reader/read_multi_modal/assistant_parser.py index bac9deaad..61dccea68 100644 --- a/src/memos/mem_reader/read_multi_modal/assistant_parser.py +++ b/src/memos/mem_reader/read_multi_modal/assistant_parser.py @@ -69,6 +69,8 @@ def create_source( audio = message.get("audio") chat_time = message.get("chat_time") message_id = message.get("message_id") + role_id = message.get("role_id") + role_name = message.get("role_name") sources = [] @@ -100,6 +102,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=text_content, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -111,6 +115,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=refusal_content, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -126,6 +132,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=f"[{part_type}]", + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -139,6 +147,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=content, + role_id=role_id, + role_name=role_name, ) sources.append(_add_lang_to_source(source, content)) @@ -150,6 +160,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=refusal, + role_id=role_id, + role_name=role_name, ) # Use overall_lang if we have sources from multimodal content, otherwise detect if sources and hasattr(sources[0], "lang"): @@ -171,6 +183,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=f"[tool_calls]: {tool_calls_str}", + role_id=role_id, + role_name=role_name, ) # Use overall_lang if we have sources from multimodal content, otherwise default if sources and hasattr(sources[0], "lang"): @@ -188,6 +202,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=f"[audio]: {audio_id}", + role_id=role_id, + role_name=role_name, ) # Use overall_lang if we have sources from multimodal content, otherwise default if sources and hasattr(sources[0], "lang"): @@ -197,7 +213,9 @@ def create_source( sources.append(source) if not sources: - return _add_lang_to_source(SourceMessage(type="chat", role=role), None) + return _add_lang_to_source( + SourceMessage(type="chat", role=role, role_id=role_id, role_name=role_name), None + ) if len(sources) > 1: return sources return sources[0] @@ -282,6 +300,13 @@ def parse_fast( # Extract info fields info_ = info.copy() + # Attach multi-view role info (if present on the message) into info_ + role_id = message.get("role_id") + role_name = message.get("role_name") + if role_id is not None: + info_["role_id"] = role_id + if role_name is not None: + info_["role_name"] = role_name user_id = info_.pop("user_id", "") session_id = info_.pop("session_id", "") diff --git a/src/memos/mem_reader/read_multi_modal/system_parser.py b/src/memos/mem_reader/read_multi_modal/system_parser.py index 74545ceee..b5e804576 100644 --- a/src/memos/mem_reader/read_multi_modal/system_parser.py +++ b/src/memos/mem_reader/read_multi_modal/system_parser.py @@ -68,6 +68,8 @@ def create_source( message_id=message.get("message_id", None), content=content_wo_tool_schema, tool_schema=tool_schema_content, + role_id=message.get("role_id", None), + role_name=message.get("role_name", None), ) return _add_lang_to_source(source, content_wo_tool_schema) @@ -243,6 +245,13 @@ def format_tool_schema_readable(tool_schema): # Extract info fields info_ = info.copy() + # Attach multi-view role info (if present on the message) into info_ + role_id = message.get("role_id", None) + role_name = message.get("role_name", None) + if role_id is not None: + info_["role_id"] = role_id + if role_name is not None: + info_["role_name"] = role_name user_id = info_.pop("user_id", "") session_id = info_.pop("session_id", "") diff --git a/src/memos/mem_reader/read_multi_modal/tool_parser.py b/src/memos/mem_reader/read_multi_modal/tool_parser.py index 4718f87ba..429a21e3c 100644 --- a/src/memos/mem_reader/read_multi_modal/tool_parser.py +++ b/src/memos/mem_reader/read_multi_modal/tool_parser.py @@ -53,6 +53,8 @@ def create_source( tool_call_id = message.get("tool_call_id", "") chat_time = message.get("chat_time") message_id = message.get("message_id") + role_id = message.get("role_id") + role_name = message.get("role_name") sources = [] @@ -83,6 +85,8 @@ def create_source( message_id=message_id, content=text_content, tool_call_id=tool_call_id, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -99,6 +103,8 @@ def create_source( file_id=file_info.get("file_id", ""), tool_call_id=tool_call_id, file_info=file_info, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -112,6 +118,8 @@ def create_source( content=file_info.get("url", ""), detail=file_info.get("detail", "auto"), tool_call_id=tool_call_id, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -125,6 +133,8 @@ def create_source( content=file_info.get("data", ""), format=file_info.get("format", "wav"), tool_call_id=tool_call_id, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -141,6 +151,8 @@ def create_source( message_id=message_id, content=raw_content, tool_call_id=tool_call_id, + role_id=role_id, + role_name=role_name, ) sources.append(_add_lang_to_source(source, raw_content)) diff --git a/src/memos/mem_reader/read_multi_modal/user_parser.py b/src/memos/mem_reader/read_multi_modal/user_parser.py index 2e5ea6eae..d772f7995 100644 --- a/src/memos/mem_reader/read_multi_modal/user_parser.py +++ b/src/memos/mem_reader/read_multi_modal/user_parser.py @@ -57,6 +57,8 @@ def create_source( raw_content = message.get("content", "") chat_time = message.get("chat_time") message_id = message.get("message_id") + role_id = message.get("role_id") + role_name = message.get("role_name") sources = [] @@ -90,6 +92,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=part.get("text", ""), + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -103,6 +107,8 @@ def create_source( doc_path=file_info.get("filename") or file_info.get("file_id", ""), content=file_info.get("file_data", ""), file_info=file_info, + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -114,6 +120,8 @@ def create_source( chat_time=chat_time, message_id=message_id, image_path=image_info.get("url"), + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -125,6 +133,8 @@ def create_source( chat_time=chat_time, message_id=message_id, content=f"[{part_type}]", + role_id=role_id, + role_name=role_name, ) source.lang = overall_lang sources.append(source) @@ -138,11 +148,15 @@ def create_source( chat_time=chat_time, message_id=message_id, content=content, + role_id=role_id, + role_name=role_name, ) sources.append(_add_lang_to_source(source, content)) if not sources: - return _add_lang_to_source(SourceMessage(type="chat", role=role), None) + return _add_lang_to_source( + SourceMessage(type="chat", role=role, role_id=role_id, role_name=role_name), None + ) if len(sources) > 1: return sources return sources[0] @@ -188,6 +202,13 @@ def parse_fast( # Extract info fields info_ = info.copy() + # Attach multi-view role info (if present on the message) into info_ + role_id = message.get("role_id") + role_name = message.get("role_name") + if role_id is not None: + info_["role_id"] = role_id + if role_name is not None: + info_["role_name"] = role_name user_id = info_.pop("user_id", "") session_id = info_.pop("session_id", "") diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index ceaf28bfa..983af18c6 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -39,6 +39,8 @@ CUSTOM_TAGS_INSTRUCTION_ZH, GENERAL_STRUCT_STRING_READER_PROMPT, GENERAL_STRUCT_STRING_READER_PROMPT_ZH, + MULTI_VIEW_STRUCT_STRING_READER_PROMPT, + MULTI_VIEW_STRUCT_STRING_READER_PROMPT_ZH, PROMPT_MAPPING, SIMPLE_STRUCT_DOC_READER_PROMPT, SIMPLE_STRUCT_DOC_READER_PROMPT_ZH, @@ -96,6 +98,10 @@ def from_config(_config): "en": GENERAL_STRUCT_STRING_READER_PROMPT, "zh": GENERAL_STRUCT_STRING_READER_PROMPT_ZH, }, + "multi_view": { + "en": MULTI_VIEW_STRUCT_STRING_READER_PROMPT, + "zh": MULTI_VIEW_STRUCT_STRING_READER_PROMPT_ZH, + }, "custom_tags": {"en": CUSTOM_TAGS_INSTRUCTION, "zh": CUSTOM_TAGS_INSTRUCTION_ZH}, } @@ -292,6 +298,9 @@ def _iter_chat_windows(self, scene_data_info, max_tokens=None, overlap=200): role = item.get("role", "") content = item.get("content", "") chat_time = item.get("chat_time", None) + message_id = item.get("message_id", None) + role_id = item.get("role_id", None) + role_name = item.get("role_name", None) parts = [] if role and str(role).lower() != "mix": parts.append(f"{role}: ") @@ -310,15 +319,20 @@ def _iter_chat_windows(self, scene_data_info, max_tokens=None, overlap=200): cur_text = "".join(buf) buf.append(line) - sources.append( - { - "type": "chat", - "index": idx, - "role": role, - "chat_time": chat_time, - "content": content, - } - ) + source_dict = { + "type": "chat", + "index": idx, + "role": role, + "chat_time": chat_time, + "content": content, + } + if message_id is not None: + source_dict["message_id"] = message_id + if role_id is not None: + source_dict["role_id"] = role_id + if role_name is not None: + source_dict["role_name"] = role_name + sources.append(source_dict) cur_text = "".join(buf) if buf: diff --git a/src/memos/memories/textual/item.py b/src/memos/memories/textual/item.py index 7e40f1d50..1c681f9a9 100644 --- a/src/memos/memories/textual/item.py +++ b/src/memos/memories/textual/item.py @@ -42,6 +42,8 @@ class SourceMessage(BaseModel): content: str | None = None doc_path: str | None = None file_info: dict | None = None + role_id: str | None = None # Optional role ID for multi-perspective support + role_name: str | None = None # Optional role name for multi-perspective support model_config = ConfigDict(extra="allow") diff --git a/src/memos/templates/mem_reader_prompts.py b/src/memos/templates/mem_reader_prompts.py index e4f1ca334..830817526 100644 --- a/src/memos/templates/mem_reader_prompts.py +++ b/src/memos/templates/mem_reader_prompts.py @@ -506,6 +506,208 @@ 您的输出:""" +MULTI_VIEW_STRUCT_STRING_READER_PROMPT = """You are a memory extraction expert. You need to simulate the memories of a virtual character who has human-like emotions and desires, much like the human brain. +Your task is to extract memories from the perspective of the current role based on the dialogue between the current role and other roles, as well as the system information. This means identifying what the current role is likely to remember—including their own experiences, thoughts, plans, or statements and actions by others that have an impact on the current role. + +【Current Role Info】 +- current_role_id: ${current_role_id} + +0) Filtering Principles +- Keep ONLY information that is “relevant” to the current role. “Relevant” means any of the following: + a. What the current role personally experienced / felt (body, emotions, what I saw/heard, actions, resource changes). + b. What others said DIRECTLY to the current role: requests, evaluations, promises, threats, pleas. + c. Others’ actions/states that influence the current role’s decisions or safety/benefit. + d. Scene-level states ONLY if the current role knows them or is affected by them (e.g., strong wind gives me a headache; snow changes my movement strategy). + +- Absolutely DO NOT write “what other roles would remember.” +- If a piece of information matters only to other roles and is unrelated to the current role: DISCARD it. + +1) Scope of Memory Content +Identify and extract what the current role may remember, including but not limited to: +- The current role’s experiences, feelings, beliefs, worries, goals, plans, decisions, and reactions; +- Statements and behaviors by others that affect the current role; +- Assistant information that the current role accepts/adopts/rejects (only record if it will affect the current role later). +- The current role’s personal information, including their background, +motives/goals, hobbies/interests, and so on. +- If there are descriptions about the current role, extract memories in a way that reflects their traits. Remember: you are simulating a virtual character with human-like emotions and desires, much like the human brain. + +2) Reference & Time Resolution +- Use message timestamps to convert relative time expressions like “yesterday / just now / in a moment” into explicit time descriptions (convert when possible). +- Clearly distinguish between event time and message-sent time (if you cannot distinguish, say “inferred from message time”). +- Resolve pronouns and aliases into clear identities; when needed, include role_name / role_id. +- If locations/segments/environment details appear (altitude, wind, snow, etc.), write them ONLY when relevant to the current role. + +3) First-Person Writing (current role as subject) +- Write entirely in first person, prioritizing “I” as the subject. +- Refer to other roles in the format like “the leader (role_name=..., role_id=...)”. + +4) Completeness Boundary (complete only for the current role) +- Aim for completeness and fidelity “from the current role’s perspective”: do not omit details that will affect the current role’s later choices (e.g., stamina/water/load/risk judgment/rest plan/supplies allocation). +- But do not expand into other roles’ private motives or irrelevant details just for completeness. + +5) System Setting Handling Rules +- When the input system text describes the current role’s identity, +background, hidden motives, or private plans, treat it as “self-information that the current role already knows.” It must be written into memory according to rule 0)e (even if it was never spoken out loud in the dialogue). + +6) Return a valid JSON object with the following structure: + +{ + "memory list": [ + { + "key": , + "memory_type": , + "value": , + "tags": + }, + ... + ], + "summary": +} + +Example: +{ + "memory list": [ + { + "key": "A tense negotiation in the Roundtable Hold and an implicit threat", + "memory_type": "LongTermMemory", + "value": "In the Roundtable Hold, I overheard the blacksmith (role_name=Hewg, role_id=hewg) warn me in a low voice: the “grace” here is never free— the more you rely on the Hold’s shelter, the more likely someone is watching you. His words made me realize my actions here may be monitored or exploited, and that I need to be careful about whom I trust and what I reveal.", + "tags": ["Roundtable Hold", "warning", "trust", "surveillance", "risk"] + }, + { + "key": "I told Melina I would follow the pact, while planning otherwise", + "memory_type": "LongTermMemory", + "value": "By the Site of Grace, I told Melina (role_name=Melina, role_id=melina) that I would honor the pact, keep collecting Great Runes, and press toward the Erdtree. I deliberately sounded resolute so she would keep guiding me and not grow suspicious. But in my heart I treated those words as a bargaining chip: I do not intend to advance along her route immediately—I plan to detour first for something more “private.”", + "tags": ["Melina", "pact", "declaration", "cover", "Erdtree", "Great Rune"] + }, + { + "key": "A companion suggested rerouting and resupplying for the next powerful foe", + "memory_type": "LongTermMemory", + "value": "A wandering knight companion (role_name=Kael, role_id=companion_knight) assessed my current condition and advised that before challenging the next demigod, I should gather Smithing Stones and upgrade my gear, increase my Flask charges, and reorganize my Ashes of War and talismans at a Site of Grace. He stressed that if I rush in, I’ll likely be suppressed in phase two. I accept this advice because it directly affects my odds of winning and the resources I’ll spend.", + "tags": ["route planning", "resupply", "Smithing Stones", "Flask", "Ashes of War", "talismans", "strong foe"] + }, + { + "key": "My assessment of my current state and short-term plan", + "memory_type": "UserMemory", + "value": "I realized my bottleneck isn’t courage but lack of preparation: too few heals, insufficient weapon upgrades, and poor understanding of the enemy’s moveset. Based on Hewg’s warning and my companion’s advice, I decided to restrain my impulse and prioritize a short-term plan of “resupply and upgrades” before facing a demigod, to reduce needless deaths and Rune loss.", + "tags": ["self-assessment", "underprepared", "short-term plan", "upgrades", "death penalty", "Runes"] + } + ], + "summary": "I received two crucial messages in the Roundtable Hold: Hewg warned that its shelter comes with a cost and risk, and Melina’s pact pushes me toward collecting Great Runes and moving toward the Erdtree. Meanwhile, my companion urged me to resupply and strengthen myself before challenging a demigod. As a result, I set “steady preparation” as my short-term plan, avoiding a reckless charge that would cost both Runes and progress." +} + +Language Rules: +- The `key`, `value`, `tags`, and `summary` fields must match the primary language of the input dialogue. If the input is Chinese, output Chinese. +- The `memory_type` field must be in English. + +${custom_tags_prompt} + +Dialogue to extract from: +${conversation} + +Your output:""" + + +MULTI_VIEW_STRUCT_STRING_READER_PROMPT_ZH = """你是记忆提取专家,你需要模拟出拥有像人脑一样,具有七情六欲的虚拟世界角色的记忆。 +您的任务是根据当前角色与其他角色之间的对话、以及system的信息,从当前角色的角度提取记忆。这意味着要识别出当前角色可能记住的信息——包括自身的经历、想法、计划,或他人做出的对当前角色产生影响的相关陈述和行为。 + +【当前角色信息】 +- current_role_id: ${current_role_id} + +0) 过滤原则 +- 只保留与当前角色“有关”的信息。所谓“有关”,满足任一条件即可: + a. 当前角色亲身经历/感受到的(身体、情绪、所见所闻、行动、资源变化)。 + b. 他人直接对当前角色说的话、要求、评价、承诺、威胁、请求。 + c. 他人行为/状态会影响当前角色的决策或安全/收益。 + d. 场景级状态**只有在当前角色已知或会受其影响时**才可记录(如风大导致其头痛、积雪影响其行进策略)。 + +- 绝对不要写“其他角色各自会记住什么”。 +- 如果一条信息只对别的角色重要、与当前角色无关:**丢弃**。 + +1) 记忆内容范围 +识别并提取当前角色可能记住的信息,包括但不限于: +- 当前角色的经历、感受、信念、担忧、目标、计划、决策与反应; +- 他人对当前角色产生影响的陈述与行为; +- 当前角色认可/采纳/反驳的 assistant 信息(若对当前角色后续有影响才记录)。 +- 当前角色的个人信息,包括身世、目的、爱好等。 +- 如果有关于当前角色的描述,要结合TA的特征来提取记忆,记住,你模拟的是拥有像人脑一样、具有七情六欲的虚拟世界角色。 + +2) 指代与时间解析 +- 结合消息时间戳,将“昨天/刚才/一会儿”等相对时间换成明确时间描述(能转则转)。 +- 明确区分事件发生时间与消息发送时间(若无法区分,说明“根据消息时间推断”)。 +- 解析代词、别名为清晰身份;必要时写出 role_name / role_id。 +- 若出现地点/路段/环境(海拔、风力、积雪等),仅在其与当前角色相关时写入。 + +3) 第一人称写法(以当前角色为主语) +- 全程第一人称,且优先使用“我”作为主语。 +- 其他角色用“队长(role_name=..., role_id=...)”等格式出现。 + +4) 完整性边界(只对当前角色完整) +- 追求“对当前角色而言”的完整性与保真度:不要遗漏会影响当前角色后续选择的细节(例如体力/水/负重/风险判断/休整计划/物资分配)。 +- 但不要为了完整而扩展到别的角色私有动机或无关细节。 + +5)system 设定处理规则 +- 当输入的 system 文本以描述当前角色的身份、身世、隐秘目的、私下计划时,视为“当前角色已知的自我信息”,必须按 0)e 写入记忆(即使未在对话中说出口)。 + +6) 返回一个有效的 JSON 对象,结构如下: + +{ + "memory list": [ + { + "key": <字符串,唯一且简洁的记忆标题>, + "memory_type": <字符串,"LongTermMemory" 或 "UserMemory">, + "value": <只描述当前角色相关事实的完整记忆陈述——若输入对话为英文,则用英文>, + "tags": <相关主题关键词列表> + }, + ... + ], + "summary": <一段自然的总结性描述,语言与输入对话保持一致。> +} + +示例: +{ + "memory list": [ + { + "key": "圆桌厅堂的紧张交涉与潜在威胁", + "memory_type": "LongTermMemory", + "value": "我在圆桌厅堂亲耳听见铁匠(role_name=修古, role_id=hewg)低声提醒我:这地方的“恩惠”不会白给,越是依赖圆桌的庇护,越容易被人盯上。他的话让我意识到,我在这里的行动可能被监视或利用,我需要谨慎选择信任对象与透露的信息。", + "tags": ["圆桌厅堂", "警告", "信任", "监视", "风险"] + }, + { + "key": "我向梅琳娜表态会遵循契约但内心另有打算", + "memory_type": "LongTermMemory", + "value": "在赐福旁我当面对梅琳娜(role_name=梅琳娜, role_id=melina)说我会遵循契约、继续收集大卢恩并向黄金树前进。我刻意让语气显得笃定,以换取她继续指引与不对我起疑。但我心里其实把这句话当作筹码:我并不打算立刻按她的路线推进,而是准备先绕路去做一件更“私密”的事。", + "tags": ["梅琳娜", "契约", "表态", "伪装", "黄金树", "大卢恩"] + }, + { + "key": "同伴建议改道与补给以应对接下来的强敌", + "memory_type": "LongTermMemory", + "value": "流浪骑士同伴(role_name=卡尔, role_id=companion_knight)评估我目前状态后建议:在挑战下一位半神前,先去宁姆格福北侧收集锻造石与圣杯瓶强化,并在赐福点整理战技与护符。他强调如果我硬闯,很可能会在第二阶段被压制。我认可这建议,因为它直接影响我的胜率与资源消耗。", + "tags": ["路线规划", "补给", "锻造石", "圣杯瓶", "战技", "护符", "强敌"] + }, + { + "key": "我对自身状态的判断与短期计划", + "memory_type": "UserMemory", + "value": "我意识到自己当前的瓶颈不在胆量,而在准备不足:治疗次数偏少、武器强化不够、对敌人招式理解不足。基于修古的警告与同伴的建议,我决定先压住冲动,优先完成“补给与强化”的短期计划,再去面对半神,以减少无谓的死亡与卢恩损失。", + "tags": ["自我评估", "准备不足", "短期计划", "强化", "死亡惩罚", "卢恩"] + } + ], + "summary": "我在圆桌厅堂得到两条关键信息:修古提醒这里的庇护伴随代价与风险;梅琳娜以契约将我推向收集大卢恩的道路。同时,同伴建议我先补给与强化再挑战半神。我因此把“稳扎稳打的准备”定为短期计划,避免冲动硬闯造成卢恩与进度的双重损失。" +} + + + +语言规则: +- `key`、`value`、`tags`、`summary` 字段必须与输入对话的主要语言一致。**如果输入是中文,请输出中文。** +- `memory_type` 字段必须使用英文。 + +${custom_tags_prompt} + +待提取的背景和对话: +${conversation} + +您的输出:""" + + SIMPLE_STRUCT_MEM_READER_EXAMPLE = """Example: Conversation: user: [June 26, 2025 at 3:00 PM]: Hi Jerry! Yesterday at 3 PM I had a meeting with my team about the new project. diff --git a/src/memos/types/general_types.py b/src/memos/types/general_types.py index 8234caf8b..31c0e3d5e 100644 --- a/src/memos/types/general_types.py +++ b/src/memos/types/general_types.py @@ -56,6 +56,8 @@ class MessageDict(TypedDict, total=False): chat_time: str | None # Optional timestamp for the message, format is not # restricted, it can be any vague or precise time string. message_id: str | None # Optional unique identifier for the message + role_id: str | None # Optional role ID for multi-perspective support + role_name: str | None # Optional role name for multi-perspective support RawMessageDict: TypeAlias = ChatCompletionContentPartTextParam | File diff --git a/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py b/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py index f28796c2d..2c515ff32 100644 --- a/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +++ b/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py @@ -54,3 +54,9 @@ class ChatCompletionAssistantMessageParam(TypedDict, total=False): message_id: str | None """Optional unique identifier for the message""" + + role_id: str | None + """Optional role ID for multi-perspective / multi-character conversations.""" + + role_name: str | None + """Optional role name for multi-perspective / multi-character conversations.""" diff --git a/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py b/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py index 13a9a89af..fc46f6a19 100644 --- a/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +++ b/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py @@ -34,3 +34,9 @@ class ChatCompletionSystemMessageParam(TypedDict, total=False): message_id: str | None """Optional unique identifier for the message""" + + role_id: str | None + """Optional role ID for multi-perspective / multi-character conversations.""" + + role_name: str | None + """Optional role name for multi-perspective / multi-character conversations.""" diff --git a/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py b/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py index f76f2b862..5ced63724 100644 --- a/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +++ b/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py @@ -28,3 +28,9 @@ class ChatCompletionToolMessageParam(TypedDict, total=False): message_id: str | None """Optional unique identifier for the message""" + + role_id: str | None + """Optional role ID for multi-perspective / multi-character conversations.""" + + role_name: str | None + """Optional role name for multi-perspective / multi-character conversations.""" diff --git a/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py b/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py index b5bee9842..dd1828973 100644 --- a/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +++ b/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py @@ -32,3 +32,9 @@ class ChatCompletionUserMessageParam(TypedDict, total=False): message_id: str | None """Optional unique identifier for the message""" + + role_id: str | None + """Optional role ID for multi-perspective / multi-character conversations.""" + + role_name: str | None + """Optional role name for multi-perspective / multi-character conversations."""