181404010226 3 mesiacov pred
rodič
commit
c3060229ab

+ 0 - 166
EventBus事件使用分析报告.md

@@ -1,166 +0,0 @@
-# EventBus事件使用分析报告
-
-## 概述
-根据`游戏管理.txt`文档要求和EventBus事件定义,本报告分析了当前事件系统的使用情况,并提出改进建议。
-
-## 事件使用情况分析
-
-### 1. 已正确使用的事件
-
-#### 游戏状态事件
-- ✅ `GAME_START` - 在GameBlockSelection、IN_game、GameManager中正确触发和监听
-- ✅ `GAME_PAUSE` - 在GamePause、IN_game中正确使用
-- ✅ `GAME_RESUME` - 在GameBlockSelection、GamePause中正确使用
-- ✅ `GAME_SUCCESS` - 在GamePause、IN_game中触发,在GameManager、UIStateManager中监听
-- ✅ `GAME_DEFEAT` - 在GamePause、IN_game中触发,在GameManager、UIStateManager中监听
-
-#### 重置事件(完整实现)
-- ✅ `GAME_RESTART` - 在GameManager中触发,在StartGame中监听
-- ✅ `RESET_GAME_MANAGER` - 在StartGame、GameManager中触发和监听
-- ✅ `RESET_ENEMY_CONTROLLER` - 在StartGame中触发,在EnemyController中监听
-- ✅ `RESET_BALL_CONTROLLER` - 在IN_game、StartGame中触发,在BallController中监听
-- ✅ `RESET_BLOCK_MANAGER` - 在IN_game、StartGame中触发,在BlockManager中监听
-- ✅ `RESET_BLOCK_SELECTION` - 在IN_game、StartGame中触发,在GameBlockSelection中监听
-- ✅ `RESET_WALL_HEALTH` - 在IN_game、StartGame中触发,在Wall中监听
-- ✅ `RESET_GAME_PAUSE` - 在StartGame中触发,在GamePause中监听
-- ✅ `RESET_ENERGY_SYSTEM` - 在StartGame、IN_game中触发和监听
-
-#### 清理事件
-- ✅ `CLEAR_ALL_ENEMIES` - 在IN_game中触发
-- ✅ `CLEAR_ALL_BULLETS` - 在IN_game中触发
-- ✅ `CLEAR_ALL_GAME_OBJECTS` - 在StartGame、IN_game中触发,在EnemyController中监听
-
-#### 球控制事件
-- ✅ `BALL_START` - 在IN_game、GameManager中触发,在BallController中监听
-- ✅ `BALL_CREATE` - 在BallController中监听
-- ✅ `BALL_FIRE_BULLET` - 在WeaponBullet中触发,在GamePause、EnemyController中监听
-
-#### 敌人控制事件
-- ✅ `ENEMY_START_GAME` - 在IN_game中触发,在EnemyController中监听
-- ✅ `ENEMY_START_WAVE` - 在IN_game中触发,在EnemyController中监听
-- ✅ `ENEMY_SHOW_START_WAVE_PROMPT` - 在IN_game、GameManager中触发,在EnemyController中监听
-- ✅ `ENEMY_UPDATE_COUNT` - 在IN_game中触发,在EnemyController中监听
-- ✅ `ENEMY_CHECK_ACTIVE` - 在IN_game中触发,在EnemyController中监听
-- ✅ `ENEMY_CHECK_GAME_STARTED` - 在IN_game中触发,在EnemyController中监听
-- ✅ `ENEMY_GET_COUNT` - 在IN_game中触发,在EnemyController中监听
-- ✅ `GAME_CHECK_OVER` - 在EnemyController、IN_game中触发,在GamePause中监听
-
-#### 方块选择事件
-- ✅ `BLOCK_SELECTION_OPEN` - 在GameBlockSelection中触发
-- ✅ `BLOCK_SELECTION_CLOSE` - 在GameBlockSelection中触发
-- ✅ `SHOW_BLOCK_SELECTION` - 在StartGame中触发,在GamePause中监听
-
-### 2. 定义但未使用的事件
-
-#### 游戏重置事件
-- ❌ `GAME_RESET_REQUEST` - 仅在StartGame中触发,无监听器
-- ❌ `GAME_RESET_COMPLETE` - 仅在StartGame中触发,无监听器
-
-#### UI事件
-- ❌ `SHOP_UPDATED` - 完全未使用
-- ❌ `SHOW_GAME_BLOCK_SELECTION` - 完全未使用
-- ⚠️ `RESET_UI_STATES` - 在StartGame中触发,但UIStateManager中被注释掉
-
-#### 墙体事件
-- ❌ `WALL_HEALTH_CHANGED` - 完全未使用
-- ❌ `WALL_DESTROYED` - 完全未使用
-- ❌ `WALL_TAKE_DAMAGE` - 完全未使用
-
-#### 敌人事件
-- ❌ `ENEMY_SPAWN_START` - 完全未使用
-- ❌ `ENEMY_SPAWN_STOP` - 完全未使用
-- ❌ `ENEMY_ALL_PAUSE` - 完全未使用
-- ❌ `ENEMY_ALL_RESUME` - 完全未使用
-- ❌ `ENEMY_TAKE_DAMAGE` - 完全未使用
-- ❌ `ENEMY_SPAWN_REQUEST` - 完全未使用
-- ❌ `ENEMY_GET_NEAREST` - 在EnemyController中监听,但无触发
-
-#### 球事件
-- ❌ `BALL_CREATE_ADDITIONAL` - 在BallController中监听,但无触发
-
-#### 方块选择事件
-- ❌ `BLOCK_SELECTION_HIDE` - 完全未使用
-- ❌ `BLOCK_SELECTION_SHOW` - 完全未使用
-
-#### 子弹事件
-- ❌ `BULLET_CREATE_REQUEST` - 完全未使用
-- ❌ `BULLET_HIT_ENEMY` - 完全未使用
-
-## 根据游戏管理文档的改进建议
-
-### ✅ 已完成的改进
-
-#### 1. UI状态管理改进
-根据文档要求,已实现以下UI状态切换:
-
-- ✅ 修复 `RESET_UI_STATES` 事件监听(UIStateManager.ts中取消注释)
-- ✅ 添加 `RETURN_TO_MAIN_MENU` 事件在GameManager.onMainMenuClick中触发
-- ✅ 根据游戏管理文档添加UI状态切换事件:
-  - ✅ `ENTER_BATTLE_PREPARATION` - 进入备战状态(在GameBlockSelection.showBlockSelection中触发)
-  - ✅ `ENTER_PLAYING_STATE` - 进入游玩状态(在IN_game.ts的startGame中触发)
-  - ✅ `ENTER_GAME_END_STATE` - 进入游戏结束状态(在IN_game.ts的onGameSuccess/onGameDefeat中触发)
-- ✅ **修复重新开始游戏UI状态切换问题**:
-  - 在 `GameBlockSelection.ts` 中添加了对 `SHOW_BLOCK_SELECTION` 事件的监听
-  - 修正了 `GamePause.ts` 中对 `SHOW_BLOCK_SELECTION` 事件的处理逻辑
-  - 确保重新开始游戏时正确显示方块选择界面并触发相应的UI状态切换事件
-- ✅ **修复重新开始游戏时GameEnd UI残留问题**:
-  - 在 `GameManager.ts` 的 `onResetGameManagerEvent` 方法中添加了对 `gameEndUI` 的隐藏逻辑
-  - 确保重新开始游戏时游戏结束界面被正确清理
-
-#### 2. 墙体事件系统完善
-已在Wall组件中添加事件触发:
-
-- ✅ 在Wall.ts的takeDamage方法中触发 `WALL_TAKE_DAMAGE` 和 `WALL_HEALTH_CHANGED`
-- ✅ 在墙体被摧毁时触发 `WALL_DESTROYED`
-- ✅ 在setHealth和heal方法中触发 `WALL_HEALTH_CHANGED`
-
-#### 3. 子弹系统事件
-已在子弹相关组件中实现:
-
-- ✅ 在WeaponBullet.createBullets中触发 `BULLET_CREATE_REQUEST` 事件
-- ✅ 在WeaponBullet.onHit中触发 `BULLET_HIT_ENEMY` 事件
-
-### 🔄 待实现的改进
-
-#### 4. 商店系统事件
-建议在商店相关操作中使用:
-```typescript
-// 商店数据更新时
-EventBus.getInstance().emit(GameEvents.SHOP_UPDATED);
-```
-
-#### 5. 敌人控制事件完善
-建议在EnemyController中添加:
-```typescript
-// 开始生成敌人
-EventBus.getInstance().emit(GameEvents.ENEMY_SPAWN_START);
-
-// 停止生成敌人
-EventBus.getInstance().emit(GameEvents.ENEMY_SPAWN_STOP);
-
-// 暂停所有敌人
-EventBus.getInstance().emit(GameEvents.ENEMY_ALL_PAUSE);
-
-// 恢复所有敌人
-EventBus.getInstance().emit(GameEvents.ENEMY_ALL_RESUME);
-```
-
-## 实现优先级
-
-### 高优先级(立即实现)
-1. 修复`RESET_UI_STATES`事件监听
-2. 实现墙体事件系统
-3. 完善UI状态切换事件
-
-### 中优先级(后续实现)
-1. 实现商店更新事件
-2. 完善敌人控制事件
-3. 实现子弹系统事件
-
-### 低优先级(可选实现)
-1. 清理未使用的事件定义
-2. 添加事件文档说明
-
-## 总结
-
-当前EventBus系统已经实现了核心的游戏状态管理和重置功能,但在UI状态管理、墙体事件、商店系统等方面还有改进空间。建议按照优先级逐步完善事件系统,以更好地支持游戏管理文档中描述的功能需求。

+ 0 - 183
MenuUI音频控制系统实现说明.md

@@ -1,183 +0,0 @@
-# MenuUI音频控制系统实现说明
-
-## 功能概述
-
-本次实现了完整的MenuUI音频控制系统,包括滑动条音量控制、开关按钮状态管理,以及完整的音频管理架构。
-
-## 实现的功能
-
-### 1. 滑动条音量控制
-- ✅ **音效滑动条**: Canvas/MenuUI/sound/soundEffect 的 Slider 组件
-- ✅ **音乐滑动条**: Canvas/MenuUI/sound/music 的 Slider 组件
-- ✅ **绿色进度条**: 跟随Handle的Progress变化实时更新
-- ✅ **音量应用**: 滑动时实时应用到音频系统
-
-### 2. 开关按钮功能
-- ✅ **音效开关**: Canvas/MenuUI/sound/soundEffect/checkbox 按钮控制
-- ✅ **音乐开关**: Canvas/MenuUI/sound/music/checkbox 按钮控制
-- ✅ **勾选状态**: 通过 Canvas/MenuUI/sound/soundEffect/checkbox/check 节点显隐控制
-- ✅ **状态记忆**: 取消勾选时记录当前progress,再次勾选时恢复
-- ✅ **滑动条联动**: 开关状态与滑动条位置同步
-
-### 3. 数据持久化
-- ✅ **本地存储**: 音频设置自动保存到localStorage
-- ✅ **设置恢复**: 游戏重启后自动恢复之前的音频设置
-- ✅ **状态同步**: UI状态与保存的设置保持同步
-
-## 创建的文件
-
-### 核心系统文件
-
-1. **SoundController.ts** (`assets/scripts/CombatSystem/MenuSystem/SoundController.ts`)
-   - 音频控制器主要逻辑
-   - 管理滑动条和开关按钮交互
-   - 处理进度条视觉更新
-   - 实现数据持久化
-
-2. **AudioManager.ts** (`assets/scripts/Core/AudioManager.ts`)
-   - 统一音频管理系统
-   - 单例模式,全局访问
-   - 提供音乐和音效播放控制
-   - 包含便捷的静态Audio类
-
-### 文档和示例
-
-3. **AudioSystemGuide.md** (`docs/AudioSystemGuide.md`)
-   - 完整的音频系统设置指南
-   - 详细的集成步骤说明
-   - 代码使用示例
-   - 扩展功能建议
-
-4. **AudioExample.ts** (`assets/scripts/Examples/AudioExample.ts`)
-   - 音频系统使用示例代码
-   - 展示各种场景下的音频调用
-   - 包含武器音效、UI交互音效等示例
-
-### 更新的文件
-
-5. **MenuController.ts** (已更新)
-   - 添加了SoundController组件引用
-   - 集成音频控制功能
-
-## 组件配置说明
-
-### SoundController组件属性
-
-在Canvas/MenuUI节点上添加SoundController组件,需要配置以下属性:
-
-#### 音效控制
-- `soundEffectSlider`: 音效滑动条 (Slider组件)
-- `soundEffectCheckbox`: 音效开关按钮 (Button组件)
-- `soundEffectCheck`: 音效勾选标记节点 (Node)
-- `soundEffectProgressBg`: 音效进度条背景 (Sprite组件)
-
-#### 音乐控制
-- `musicSlider`: 音乐滑动条 (Slider组件)
-- `musicCheckbox`: 音乐开关按钮 (Button组件)
-- `musicCheck`: 音乐勾选标记节点 (Node)
-- `musicProgressBg`: 音乐进度条背景 (Sprite组件)
-
-#### 视觉资源
-- `greenProgressSprite`: 绿色进度条材质 (SpriteFrame)
-
-## 使用方法
-
-### 1. 在场景中设置AudioManager
-
-```typescript
-// 在主场景中创建AudioManager节点
-Canvas/
-├── AudioManager (添加AudioManager组件)
-```
-
-### 2. 配置MenuUI的SoundController
-
-```typescript
-// 在MenuUI节点上添加SoundController组件
-// 并在Inspector中配置所有必要的属性引用
-```
-
-### 3. 在代码中使用音频功能
-
-```typescript
-import { Audio } from '../AudioManager/AudioManager';
-
-// 播放背景音乐
-Audio.playMusic('audio/music/background_music');
-
-// 播放音效
-Audio.playSFX('audio/sfx/button_click');
-
-// 控制音量
-Audio.setMusicVolume(0.7);
-Audio.setSFXVolume(0.8);
-```
-
-## 技术特点
-
-### 1. 模块化设计
-- 音频管理与UI控制分离
-- 单一职责原则
-- 易于扩展和维护
-
-### 2. 用户体验优化
-- 实时音量反馈
-- 视觉进度条跟随
-- 状态记忆功能
-- 平滑的交互体验
-
-### 3. 数据管理
-- 自动保存设置
-- 跨会话状态恢复
-- 异常处理机制
-
-### 4. 性能考虑
-- 单例模式减少资源消耗
-- 事件驱动架构
-- 资源懒加载
-
-## 后续集成步骤
-
-### 1. 添加音频资源
-
-将音频文件放置在 `assets/resources/audio/` 目录下:
-
-```
-assets/resources/audio/
-├── music/
-│   ├── background_music.mp3
-│   └── menu_music.mp3
-└── sfx/
-    ├── button_click.mp3
-    ├── weapon_fire.mp3
-    └── explosion.mp3
-```
-
-### 2. 在游戏逻辑中集成音效
-
-参考 `AudioExample.ts` 中的示例,在相应的游戏逻辑中添加音效调用。
-
-### 3. 测试和调优
-
-- 测试所有音频控制功能
-- 调整音量平衡
-- 优化音频文件大小
-- 验证跨平台兼容性
-
-## 扩展建议
-
-1. **音频淡入淡出**: 添加平滑的音量过渡效果
-2. **音效池管理**: 对频繁播放的音效实现对象池
-3. **3D音效支持**: 为空间音效添加位置信息
-4. **音频压缩**: 根据平台选择合适的音频格式
-5. **动态加载**: 实现音频资源的动态加载和卸载
-
-## 总结
-
-本次实现提供了完整的MenuUI音频控制系统,包括:
-- 直观的滑动条音量控制
-- 智能的开关按钮状态管理
-- 完整的音频管理架构
-- 详细的使用文档和示例
-
-系统设计遵循了良好的软件工程原则,具有良好的可扩展性和可维护性,为后续的音频功能扩展奠定了坚实的基础。

+ 0 - 219
ShopSystem每日奖励实现说明.md

@@ -1,219 +0,0 @@
-# ShopSystem每日奖励系统实现说明
-
-## 功能概述
-
-本系统实现了一个完整的每日奖励机制,包括:
-1. 每天第一次免费领取钞票和钻石
-2. 观看广告获得额外奖励(有每日上限)
-3. 新增Cost按钮,支持免费观看广告(计入总广告次数)
-4. 自动每日刷新机制
-
-## 核心功能实现
-
-### 1. 每日刷新机制
-
-**实现原理:**
-- 使用 `localStorage` 存储每日奖励数据
-- 每次启动时检查 `lastResetDate` 与当前日期
-- 如果日期不同,自动重置所有计数器
-
-**关键代码:**
-```typescript
-private loadDailyRewardData() {
-    const savedData = localStorage.getItem(this.DAILY_REWARD_KEY);
-    const today = this.getCurrentDateString();
-    
-    if (savedData) {
-        const data = JSON.parse(savedData) as DailyRewardData;
-        
-        // 检查是否需要重置(新的一天)
-        if (data.lastResetDate !== today) {
-            this.resetDailyRewardData(today);
-        } else {
-            this.dailyRewardData = data;
-        }
-    } else {
-        this.resetDailyRewardData(today);
-    }
-}
-
-private getCurrentDateString(): string {
-    const now = new Date();
-    const month = (now.getMonth() + 1).toString();
-    const day = now.getDate().toString();
-    const paddedMonth = month.length === 1 ? '0' + month : month;
-    const paddedDay = day.length === 1 ? '0' + day : day;
-    return `${now.getFullYear()}-${paddedMonth}-${paddedDay}`;
-}
-```
-
-### 2. 数据结构
-
-**DailyRewardData接口:**
-```typescript
-interface DailyRewardData {
-    lastResetDate: string;     // 上次重置日期
-    moneyFreeCount: number;    // 金币免费领取次数
-    moneyAdCount: number;      // 金币广告观看次数
-    diamondsFreeCount: number; // 钻石免费领取次数
-    diamondsAdCount: number;   // 钻石广告观看次数
-    costAdCount: number;       // Cost按钮广告观看次数
-    costFreeUsed: boolean;     // Cost按钮免费使用标记
-}
-```
-
-### 3. 配置文件结构
-
-**shop.json配置:**
-```json
-{
-  "dailyRewards": {
-    "money": {
-      "baseAmount": 100,
-      "maxClaimsPerDay": 36,
-      "maxAdsPerDay": 4,
-      "firstClaimFree": true,
-      "adRequiredAfterFirst": true
-    },
-    "diamond": {
-      "baseAmount": 10,
-      "maxClaimsPerDay": 36,
-      "maxAdsPerDay": 2,
-      "firstClaimFree": true,
-      "adRequiredAfterFirst": true
-    },
-    "costButtons": {
-      "maxAdsPerDay": 5
-    }
-  },
-  "ui": {
-    "moneyClaimButton": {
-      "normalText": "领取钞票",
-      "adText": "看广告领取",
-      "disabledText": "今日已达上限"
-    },
-    "diamondClaimButton": {
-      "normalText": "领取钻石",
-      "adText": "看广告领取",
-      "disabledText": "今日已达上限"
-    },
-    "costButtons": {
-      "freeText": "免  费",
-      "normalText": "免费观看",
-      "disabledText": "今日已达上限"
-    }
-  }
-}
-```
-
-## 新增功能
-
-### 1. Cost按钮装饰器
-
-在ShopController中新增了两个按钮属性:
-```typescript
-@property(Button)
-billCostButton: Button = null;
-
-@property(Button)
-diamondCostButton: Button = null;
-```
-
-**免费机制**:
-- 每天第一次点击显示"免费"文本,点击后直接生效
-- 免费使用后按钮文本变为空,并根据广告次数判断是否置灰
-- 后续点击需要观看广告,计入每日广告观看总次数
-- 当达到广告上限后按钮会自动置灰
-
-### 2. Cost按钮事件处理
-
-```typescript
-// 钞票Cost按钮点击事件
-public onBillCostClick() {
-    // 检查每日广告观看次数限制
-    // 显示广告并增加计数
-}
-
-// 钻石Cost按钮点击事件
-public onDiamondCostClick() {
-    // 检查每日广告观看次数限制
-    // 显示广告并增加计数
-}
-```
-
-### 3. UI状态更新
-
-新增 `updateCostButtonsUI()` 方法,根据当前广告观看次数更新按钮状态:
-- 未达上限:显示"免费观看",按钮可点击
-- 达到上限:显示"今日已达上限",按钮置灰
-
-## 使用说明
-
-### 1. 编辑器配置
-
-在Cocos Creator编辑器中:
-1. 将 `shop.json` 文件拖拽到 `ShopController` 的 `shopConfigAsset` 属性
-2. 将对应的按钮节点拖拽到相应的属性:
-   - `billCostButton`: Canvas/ShopUI/ScrollView/view/content/bill/Cost
-   - `diamondCostButton`: Canvas/ShopUI/ScrollView/view/content/diamond/Cost
-
-### 2. 按钮事件绑定
-
-在编辑器中为按钮绑定点击事件:
-- 钞票Cost按钮 → `ShopController.onBillCostClick`
-- 钻石Cost按钮 → `ShopController.onDiamondCostClick`
-
-### 3. 配置参数说明
-
-- `maxAdsPerDay`: 每日最大广告观看次数
-- `firstClaimFree`: 是否首次免费领取
-- `baseAmount`: 基础奖励数量
-- `maxClaimsPerDay`: 每日最大领取次数
-
-#### Cost按钮参数说明
-
-**配置参数**:
-- `maxAdsPerDay`: 每日最大广告观看次数
-
-**UI文本**:
-- `freeText`: 每天第一次免费状态显示文本
-- `normalText`: 正常状态显示文本(广告观看)
-- `disabledText`: 禁用状态显示文本(达到上限后)
-
-## 每日刷新机制详解
-
-### 刷新时机
-- 游戏启动时自动检查
-- 跨越午夜0点时自动重置
-- 可手动调用 `resetDailyRewards()` 方法重置(调试用)
-
-### 刷新内容
-- 所有领取次数归零
-- 广告观看次数归零
-- 更新最后重置日期
-- 重新启用所有按钮
-
-### 数据持久化
-- 使用 `localStorage` 存储
-- 键名:`daily_reward_data`
-- 格式:JSON字符串
-
-## 扩展建议
-
-1. **服务器同步**:可将数据同步到服务器,防止本地数据被篡改
-2. **时区处理**:考虑不同时区用户的刷新时间
-3. **奖励动画**:添加领取奖励时的视觉效果
-4. **统计分析**:记录用户的领取行为数据
-5. **推送通知**:在新的一天提醒用户领取奖励
-
-## 调试功能
-
-```typescript
-// 重置每日奖励数据(调试用)
-public resetDailyRewards()
-
-// 获取当前状态(调试用)
-public getDailyRewardStatus()
-```
-
-这些方法可以在开发过程中用于测试每日刷新功能。

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 221 - 607
assets/Scenes/GameLevel.scene


+ 13 - 253
assets/Scenes/TestScene.scene

@@ -23,7 +23,7 @@
     "_active": true,
     "_components": [],
     "_prefab": {
-      "__id__": 14
+      "__id__": 8
     },
     "_lpos": {
       "__type__": "cc.Vec3",
@@ -54,7 +54,7 @@
     },
     "autoReleaseAssets": false,
     "_globals": {
-      "__id__": 15
+      "__id__": 9
     },
     "_id": "8a125a67-dbc5-4c64-b398-6a616deee4aa"
   },
@@ -69,21 +69,18 @@
     "_children": [
       {
         "__id__": 3
-      },
-      {
-        "__id__": 5
       }
     ],
     "_active": true,
     "_components": [
       {
-        "__id__": 11
+        "__id__": 5
       },
       {
-        "__id__": 12
+        "__id__": 6
       },
       {
-        "__id__": 13
+        "__id__": 7
       }
     ],
     "_prefab": null,
@@ -207,243 +204,6 @@
     "_trackingType": 0,
     "_id": "63WIch3o5BEYRlXzTT0oWc"
   },
-  {
-    "__type__": "cc.Node",
-    "_name": "Test",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "_parent": {
-      "__id__": 2
-    },
-    "_children": [
-      {
-        "__id__": 6
-      }
-    ],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 9
-      },
-      {
-        "__id__": 10
-      }
-    ],
-    "_prefab": null,
-    "_lpos": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_lrot": {
-      "__type__": "cc.Quat",
-      "x": 0,
-      "y": 0,
-      "z": 0,
-      "w": 1
-    },
-    "_lscale": {
-      "__type__": "cc.Vec3",
-      "x": 1,
-      "y": 1,
-      "z": 1
-    },
-    "_mobility": 0,
-    "_layer": 33554432,
-    "_euler": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_id": "c5vHvM5NtOhpvDIpWOcmIv"
-  },
-  {
-    "__type__": "cc.Node",
-    "_name": "TestContainer",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "_parent": {
-      "__id__": 5
-    },
-    "_children": [],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 7
-      },
-      {
-        "__id__": 8
-      }
-    ],
-    "_prefab": null,
-    "_lpos": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 146.298,
-      "z": 0
-    },
-    "_lrot": {
-      "__type__": "cc.Quat",
-      "x": 0,
-      "y": 0,
-      "z": 0,
-      "w": 1
-    },
-    "_lscale": {
-      "__type__": "cc.Vec3",
-      "x": 1,
-      "y": 1,
-      "z": 1
-    },
-    "_mobility": 0,
-    "_layer": 33554432,
-    "_euler": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_id": "dakWNhS4dEx5a8FIq+sWMf"
-  },
-  {
-    "__type__": "cc.UITransform",
-    "_name": "",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "node": {
-      "__id__": 6
-    },
-    "_enabled": true,
-    "__prefab": null,
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 700,
-      "height": 1000
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_id": "02LzZVgepKhY5pYUsCo5TT"
-  },
-  {
-    "__type__": "cc.Layout",
-    "_name": "",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "node": {
-      "__id__": 6
-    },
-    "_enabled": true,
-    "__prefab": null,
-    "_resizeMode": 0,
-    "_layoutType": 3,
-    "_cellSize": {
-      "__type__": "cc.Size",
-      "width": 40,
-      "height": 40
-    },
-    "_startAxis": 0,
-    "_paddingLeft": 0,
-    "_paddingRight": 0,
-    "_paddingTop": 0,
-    "_paddingBottom": 0,
-    "_spacingX": 20,
-    "_spacingY": 0,
-    "_verticalDirection": 1,
-    "_horizontalDirection": 0,
-    "_constraint": 0,
-    "_constraintNum": 2,
-    "_affectedByScale": false,
-    "_isAlign": false,
-    "_id": "20seuYbhVOK5dqGNJalFC9"
-  },
-  {
-    "__type__": "cc.UITransform",
-    "_name": "",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "node": {
-      "__id__": 5
-    },
-    "_enabled": true,
-    "__prefab": null,
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 720,
-      "height": 1334
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_id": "a3XpajTHZMiaZA76SrtJzL"
-  },
-  {
-    "__type__": "de769KSTUJOAIOEGPeHd7cR",
-    "_name": "",
-    "_objFlags": 0,
-    "__editorExtras__": {},
-    "node": {
-      "__id__": 5
-    },
-    "_enabled": true,
-    "__prefab": null,
-    "testContainer": {
-      "__id__": 6
-    },
-    "blockPrefabs": [
-      {
-        "__uuid__": "9bd227fc-cc4f-46ca-bf7c-811318c3e88c",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "46f313aa-d24b-436e-a705-2dc1c6461f6e",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "498808e2-0ee8-40c6-8580-82a5a634d253",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "6fdf19f9-7e73-4b1c-9181-d72de52c0bd5",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "2c3693c7-a923-439d-899e-ca0d5340572a",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "1776637a-37c8-4115-b758-0433a17d8f01",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "c5c50d29-4d75-4053-a182-b8e756372fb8",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "fc4bc660-4efd-48b7-8f4d-04db9f3c23cc",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "9da27476-ca02-4534-bfc5-a2075a400849",
-        "__expectedType__": "cc.Prefab"
-      },
-      {
-        "__uuid__": "100736d9-f230-4018-9613-c3f4d99843cb",
-        "__expectedType__": "cc.Prefab"
-      }
-    ],
-    "weaponsConfigAsset": {
-      "__uuid__": "b0dff099-9502-41f9-8678-6126d42ddd68",
-      "__expectedType__": "cc.JsonAsset"
-    },
-    "_id": "a2wq705cJMCLQc8vFvM3cA"
-  },
   {
     "__type__": "cc.UITransform",
     "_name": "",
@@ -523,28 +283,28 @@
   {
     "__type__": "cc.SceneGlobals",
     "ambient": {
-      "__id__": 16
+      "__id__": 10
     },
     "shadows": {
-      "__id__": 17
+      "__id__": 11
     },
     "_skybox": {
-      "__id__": 18
+      "__id__": 12
     },
     "fog": {
-      "__id__": 19
+      "__id__": 13
     },
     "octree": {
-      "__id__": 20
+      "__id__": 14
     },
     "skin": {
-      "__id__": 21
+      "__id__": 15
     },
     "lightProbeInfo": {
-      "__id__": 22
+      "__id__": 16
     },
     "postSettings": {
-      "__id__": 23
+      "__id__": 17
     },
     "bakedWithStationaryMainLight": false,
     "bakedWithHighpLightmap": false

+ 0 - 1127
assets/resources/data/enemies_backup_20250904_155751.json

@@ -1,1127 +0,0 @@
-[
-  {
-    "id": "normal_zombie",
-    "name": "普通僵尸",
-    "type": "basic",
-    "stats": {
-      "health": 45,
-      "maxHealth": 45,
-      "defense": 0,
-      "speed": 30.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 50.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 0.4,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 50.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/001",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/baseball_bat"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/zombie_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/001",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/baseball_bat"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/dao2.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 1.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "roadblock_zombie",
-    "name": "路障僵尸",
-    "type": "armored",
-    "stats": {
-      "health": 45,
-      "maxHealth": 45,
-      "defense": 1,
-      "speed": 8.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 20.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/002",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/magic_staff"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/roadblock_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/002",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/magic_staff"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/bow.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 2.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "wandering_zombie",
-    "name": "漫步僵尸",
-    "type": "wanderer",
-    "stats": {
-      "health": 35,
-      "maxHealth": 35,
-      "defense": 0,
-      "speed": 12.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 30.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "sway",
-      "swingAmplitude": 20.0,
-      "swingFrequency": 2.0,
-      "speedVariation": 0.2
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee_weapon",
-      "attackDelay": 1.0,
-      "weaponType": "baseball_bat",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/003",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/bow"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/wandering_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/003",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/bow"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/MagicianAttack.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 3.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "mage_zombie",
-    "name": "法师僵尸",
-    "type": "ranged_caster",
-    "stats": {
-      "health": 25,
-      "maxHealth": 25,
-      "defense": 0,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 250.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "magic_projectile",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "magic_bolt",
-      "projectileSpeed": 50.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/004",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/mage_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/004",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/zhanshiAtk.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 4.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "archer_zombie",
-    "name": "弓箭僵尸",
-    "type": "ranged_archer",
-    "stats": {
-      "health": 25,
-      "maxHealth": 25,
-      "defense": 0,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 400.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "arrow_projectile",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "arrow",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/005",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/archer_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/005",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 5.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "stealth_zombie",
-    "name": "隐身僵尸",
-    "type": "stealth",
-    "stats": {
-      "health": 28,
-      "maxHealth": 28,
-      "defense": 0,
-      "speed": 9.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 25.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "stealth_strike",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/006",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/stealth_walk",
-      "blockSound": "",
-      "stealthSound": "audio/stealth_activate",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/006",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 6.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "Null",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "bucket_zombie",
-    "name": "铁桶僵尸",
-    "type": "heavy_armor",
-    "stats": {
-      "health": 60,
-      "maxHealth": 60,
-      "defense": 2,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "heavy_melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/007",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/iron_gate"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/bucket_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "audio/armor_break",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/007",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/iron_gate"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp5",
-      "death_sound": "data/弹球音效/normal zombie die 7.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "Null",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "barrel_zombie",
-    "name": "火药桶僵尸",
-    "type": "explosive",
-    "stats": {
-      "health": 30,
-      "maxHealth": 30,
-      "defense": 0,
-      "speed": 10.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 25.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/008",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/tombstone"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/barrel_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "audio/barrel_fuse",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/008",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/tombstone"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "Null"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "boss1_gatekeeper",
-    "name": "BOSS1",
-    "type": "boss",
-    "stats": {
-      "health": 1500,
-      "maxHealth": 1500,
-      "defense": 2,
-      "speed": 4.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 30.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "gate_slam",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/009",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/cyber_arm"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss1_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/009",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/cyber_arm"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  },
-  {
-    "id": "boss2_gravedigger",
-    "name": "BOSS2",
-    "type": "boss",
-    "stats": {
-      "health": 1500,
-      "maxHealth": 1500,
-      "defense": 3,
-      "speed": 4.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 30.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "tombstone_smash",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/010",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss2_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/010",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  },
-  {
-    "id": "boss3_cyborg",
-    "name": "BOSS3",
-    "type": "boss",
-    "stats": {
-      "health": 1000,
-      "maxHealth": 1000,
-      "defense": 1,
-      "speed": 5.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 80.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "cyber_arm_combo",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/011",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss3_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/011",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  }
-]

+ 0 - 11
assets/resources/data/enemies_backup_20250904_155751.json.meta

@@ -1,11 +0,0 @@
-{
-  "ver": "2.0.1",
-  "importer": "json",
-  "imported": true,
-  "uuid": "4beb8a66-5954-4880-be35-6c9b5fa07582",
-  "files": [
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

+ 0 - 1127
assets/resources/data/enemies_backup_20250904_185518.json

@@ -1,1127 +0,0 @@
-[
-  {
-    "id": "normal_zombie",
-    "name": "普通僵尸",
-    "type": "basic",
-    "stats": {
-      "health": 45,
-      "maxHealth": 45,
-      "defense": 0,
-      "speed": 30.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 50.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 0.4,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 50.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/001",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/baseball_bat"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/zombie_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/001",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/baseball_bat"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/dao2.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 1.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "roadblock_zombie",
-    "name": "路障僵尸",
-    "type": "armored",
-    "stats": {
-      "health": 45,
-      "maxHealth": 45,
-      "defense": 1,
-      "speed": 8.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 20.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/002",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/magic_staff"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/roadblock_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/002",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/magic_staff"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/bow.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 2.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "wandering_zombie",
-    "name": "漫步僵尸",
-    "type": "wanderer",
-    "stats": {
-      "health": 35,
-      "maxHealth": 35,
-      "defense": 0,
-      "speed": 12.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 30.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "sway",
-      "swingAmplitude": 20.0,
-      "swingFrequency": 2.0,
-      "speedVariation": 0.2
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee_weapon",
-      "attackDelay": 1.0,
-      "weaponType": "baseball_bat",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/003",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/bow"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/wandering_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/003",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/bow"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/MagicianAttack.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 3.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "mage_zombie",
-    "name": "法师僵尸",
-    "type": "ranged_caster",
-    "stats": {
-      "health": 25,
-      "maxHealth": 25,
-      "defense": 0,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 250.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "magic_projectile",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "magic_bolt",
-      "projectileSpeed": 50.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/004",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/mage_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/004",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/zhanshiAtk.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 4.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "archer_zombie",
-    "name": "弓箭僵尸",
-    "type": "ranged_archer",
-    "stats": {
-      "health": 25,
-      "maxHealth": 25,
-      "defense": 0,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 400.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "arrow_projectile",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "arrow",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/005",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/archer_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/005",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 5.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "stealth_zombie",
-    "name": "隐身僵尸",
-    "type": "stealth",
-    "stats": {
-      "health": 28,
-      "maxHealth": 28,
-      "defense": 0,
-      "speed": 9.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 25.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "stealth_strike",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/006",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/stealth_walk",
-      "blockSound": "",
-      "stealthSound": "audio/stealth_activate",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/006",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/normal zombie die 6.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "Null",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "bucket_zombie",
-    "name": "铁桶僵尸",
-    "type": "heavy_armor",
-    "stats": {
-      "health": 60,
-      "maxHealth": 60,
-      "defense": 2,
-      "speed": 6.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 15.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "heavy_melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/007",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/iron_gate"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/bucket_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "audio/armor_break",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/007",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/iron_gate"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp5",
-      "death_sound": "data/弹球音效/normal zombie die 7.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "Null",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "barrel_zombie",
-    "name": "火药桶僵尸",
-    "type": "explosive",
-    "stats": {
-      "health": 30,
-      "maxHealth": 30,
-      "defense": 0,
-      "speed": 10.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 25.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 2,
-      "attackRange": 30.0,
-      "attackSpeed": 3.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 2.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/008",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/tombstone"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/barrel_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "audio/barrel_fuse",
-      "volume": 1.0
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/008",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/tombstone"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "Null"
-    },
-    "boss": {
-      "is_boss": false,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.0,
-      "rage_speed_multiplier": 1.0
-    },
-    "special_abilities": []
-  },
-  {
-    "id": "boss1_gatekeeper",
-    "name": "BOSS1",
-    "type": "boss",
-    "stats": {
-      "health": 1500,
-      "maxHealth": 1500,
-      "defense": 2,
-      "speed": 4.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 30.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "gate_slam",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/009",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": "props/cyber_arm"
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss1_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/009",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "props/cyber_arm"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  },
-  {
-    "id": "boss2_gravedigger",
-    "name": "BOSS2",
-    "type": "boss",
-    "stats": {
-      "health": 1500,
-      "maxHealth": 1500,
-      "defense": 3,
-      "speed": 4.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 30.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "tombstone_smash",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/010",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss2_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/010",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  },
-  {
-    "id": "boss3_cyborg",
-    "name": "BOSS3",
-    "type": "boss",
-    "stats": {
-      "health": 1000,
-      "maxHealth": 1000,
-      "defense": 1,
-      "speed": 5.0,
-      "dropEnergy": 1
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 10.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 3,
-      "attackRange": 80.0,
-      "attackSpeed": 4.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 3.0,
-      "attackType": "cyber_arm_combo",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.0
-    },
-    "visualConfig": {
-      "spritePath": "Animation/EnemyAni/011",
-      "scale": 1.0,
-      "animationSpeed": 1.0,
-      "flipX": false,
-      "tint": "#FFFFFF",
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weaponProp": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "audio/boss3_walk",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    },
-    "visual": {
-      "sprite_path": "Animation/EnemyAni/011",
-      "scale": 1.0,
-      "animation_speed": 1.0,
-      "flip_horizontal": false,
-      "animations": {
-        "idle": "idle",
-        "walk": "walk",
-        "attack": "attack",
-        "death": "dead"
-      },
-      "weapon_prop": "nan"
-    },
-    "audio": {
-      "attack_sound": "data/弹球音效/hammer1.mp3",
-      "death_sound": "data/弹球音效/boss die.mp3",
-      "hit_sound": "Null",
-      "walk_sound": "Null",
-      "block_sound": "nan",
-      "stealth_sound": "nan",
-      "armor_break_sound": "nan",
-      "fuse_sound": "nan"
-    },
-    "boss": {
-      "is_boss": true,
-      "phases": 1,
-      "rage_threshold": 0.3,
-      "rage_damage_multiplier": 1.5,
-      "rage_speed_multiplier": 1.3
-    },
-    "special_abilities": [
-      {
-        "type": "charge_attack",
-        "damage": 1,
-        "range": 150,
-        "cooldown": 8
-      },
-      {
-        "type": "area_attack",
-        "damage": 2,
-        "range": 100,
-        "cooldown": 12
-      }
-    ]
-  }
-]

+ 0 - 11
assets/resources/data/enemies_backup_20250904_185518.json.meta

@@ -1,11 +0,0 @@
-{
-  "ver": "2.0.1",
-  "importer": "json",
-  "imported": true,
-  "uuid": "6fdfed7b-9016-476e-be8d-f6a55e0a9b1b",
-  "files": [
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

BIN
assets/resources/data/excel/__pycache__/shop_config_manager.cpython-313.pyc


+ 12 - 0
assets/resources/data/excel/__pycache__/shop_config_manager.cpython-313.pyc.meta

@@ -0,0 +1,12 @@
+{
+  "ver": "1.0.0",
+  "importer": "*",
+  "imported": true,
+  "uuid": "266f89ca-6662-4ecd-afb6-ed9e41361d08",
+  "files": [
+    ".json",
+    ".pyc"
+  ],
+  "subMetas": {},
+  "userData": {}
+}

+ 83 - 20
assets/resources/data/excel/config_manager.py

@@ -76,6 +76,13 @@ except ImportError:
     GAME_SKILL_MANAGER_AVAILABLE = False
     print("警告: game_skill_config_manager.py 未找到,游戏内技能配置功能将不可用")
 
+try:
+    from shop_config_manager import ShopConfigManager
+    SHOP_MANAGER_AVAILABLE = True
+except ImportError:
+    SHOP_MANAGER_AVAILABLE = False
+    print("警告: shop_config_manager.py 未找到,商店配置功能将不可用")
+
 
     def parse_skill_types(self, df):
         """解析技能类型配置"""
@@ -234,6 +241,7 @@ class ConfigManagerGUI:
         self.ball_controller_config_manager_class = BallControllerConfigManager if BALL_CONTROLLER_MANAGER_AVAILABLE else None
         self.skill_config_manager_class = SkillConfigManager if SKILL_CONFIG_MANAGER_AVAILABLE else None
         self.game_skill_config_manager_class = GameSkillConfigManager if GAME_SKILL_MANAGER_AVAILABLE else None
+        self.shop_config_manager_class = ShopConfigManager if SHOP_MANAGER_AVAILABLE else None
         
         # 初始化新的配置管理器模块
         self.init_config_managers()
@@ -411,6 +419,17 @@ class ConfigManagerGUI:
             ttk.Label(level_btn_frame, text="关卡配置管理器不可用", 
                      foreground="red").pack(side=tk.LEFT)
         
+        # 商店配置专用按钮
+        shop_btn_frame = ttk.Frame(right_frame)
+        shop_btn_frame.grid(row=8, column=0, sticky=(tk.W, tk.E), pady=(10, 0))
+        
+        if SHOP_MANAGER_AVAILABLE:
+            ttk.Button(shop_btn_frame, text="导入商店配置", 
+                      command=self.import_shop_config).pack(side=tk.LEFT)
+        else:
+            ttk.Label(shop_btn_frame, text="商店配置管理器不可用", 
+                     foreground="red").pack(side=tk.LEFT)
+        
         # 底部状态栏
         self.status_var = tk.StringVar()
         self.status_var.set("就绪")
@@ -1243,26 +1262,70 @@ class ConfigManagerGUI:
             print(error_details)
             messagebox.showerror("错误", f"启动游戏内技能配置导入失败: {str(e)}\n\n详细错误信息已输出到控制台,请查看。")
     
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
+    def import_shop_config(self):
+        """导入商店配置"""
+        try:
+            if not SHOP_MANAGER_AVAILABLE:
+                messagebox.showerror("错误", "商店配置管理器不可用,请检查shop_config_manager.py文件是否存在")
+                return
+            
+            # 创建商店配置管理器
+            excel_dir = Path(self.excel_dir)
+            shop_excel_file = excel_dir / "商店配置" / "商店配置表.xlsx"
+            shop_json_file = excel_dir.parent / "shop.json"
+            
+            if not shop_excel_file.exists():
+                messagebox.showwarning("警告", f"未找到商店配置文件: {shop_excel_file}")
+                return
+            
+            # 使用ShopConfigManager导入配置
+            shop_manager = ShopConfigManager(
+                excel_file_path=str(shop_excel_file),
+                json_file_path=str(shop_json_file)
+            )
+            
+            # 在后台线程中执行导入
+            def import_thread():
+                try:
+                    success = shop_manager.import_config()
+                    
+                    # 在主线程中更新UI
+                    def update_ui():
+                        if success:
+                            messagebox.showinfo("成功", "商店配置导入成功!")
+                            self.status_var.set("商店配置导入成功")
+                            # 更新预览文本
+                            self.preview_text.delete(1.0, tk.END)
+                            self.preview_text.insert(tk.END, "商店配置导入成功\n\n配置已从Excel文件合并到JSON文件中")
+                        else:
+                            messagebox.showerror("错误", "商店配置导入失败,请查看控制台输出")
+                            self.status_var.set("商店配置导入失败")
+                    
+                    self.root.after(0, update_ui)
+                    
+                except Exception as e:
+                    def show_error():
+                        import traceback
+                        error_details = traceback.format_exc()
+                        print(f"导入商店配置失败,详细错误信息:")
+                        print(error_details)
+                        messagebox.showerror("错误", f"导入商店配置失败: {str(e)}\n\n详细错误信息已输出到控制台,请查看。")
+                        self.status_var.set("商店配置导入失败")
+                    
+                    self.root.after(0, show_error)
+            
+            # 启动导入线程
+            self.status_var.set("正在导入商店配置...")
+            thread = threading.Thread(target=import_thread)
+            thread.daemon = True
+            thread.start()
+            
+        except Exception as e:
+            import traceback
+            error_details = traceback.format_exc()
+            print(f"启动商店配置导入失败,详细错误信息:")
+            print(error_details)
+            messagebox.showerror("错误", f"启动商店配置导入失败: {str(e)}\n\n详细错误信息已输出到控制台,请查看。")
 
     def init_config_managers(self):
         """初始化新的配置管理器模块"""

+ 398 - 0
assets/resources/data/excel/shop_config_manager.py

@@ -0,0 +1,398 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+商店配置管理器
+从config_manager.py中提取的商店相关配置管理功能
+支持从Excel读取商店配置并与现有JSON配置合并
+"""
+
+import json
+import os
+from pathlib import Path
+from datetime import datetime
+
+try:
+    import pandas as pd
+    PANDAS_AVAILABLE = True
+except ImportError:
+    PANDAS_AVAILABLE = False
+    print("警告: pandas未安装,无法处理Excel文件")
+
+class ShopConfigManager:
+    """商店配置管理器"""
+    
+    def __init__(self, excel_file_path=None, json_file_path=None):
+        """初始化商店配置管理器
+        
+        Args:
+            excel_file_path: Excel配置文件路径
+            json_file_path: JSON配置文件路径
+        """
+        self.script_dir = Path(__file__).parent
+        
+        # 设置默认路径
+        if excel_file_path is None:
+            self.excel_file = self.script_dir / "商店配置" / "商店配置表.xlsx"
+        else:
+            self.excel_file = Path(excel_file_path)
+            
+        if json_file_path is None:
+            self.json_file = self.script_dir.parent / "shop.json"
+        else:
+            self.json_file = Path(json_file_path)
+            
+        print(f"Excel文件路径: {self.excel_file}")
+        print(f"JSON文件路径: {self.json_file}")
+        
+        # 商店配置映射
+        self.shop_mapping = {
+            'format_type': 'horizontal',
+            'param_types': {
+                # 每日奖励配置字段
+                '奖励类型': str,
+                '奖励索引': int,
+                '奖励数量': int,
+                '每日最大领取次数': int,
+                # 英文字段支持
+                'rewardType': str,
+                'rewardIndex': int,
+                'rewardAmount': int,
+                'maxClaimsPerDay': int
+            }
+        }
+    
+    def load_existing_json_config(self):
+        """加载现有的JSON配置文件"""
+        try:
+            if self.json_file.exists():
+                with open(self.json_file, 'r', encoding='utf-8') as f:
+                    config = json.load(f)
+                print(f"成功加载现有JSON配置")
+                return config
+            else:
+                print(f"JSON文件不存在,将创建新配置: {self.json_file}")
+                return {'dailyRewards': {'money': {'rewards': [], 'maxClaimsPerDay': 36}, 'diamond': {'rewards': [], 'maxClaimsPerDay': 36}}}
+        except Exception as e:
+            print(f"加载JSON配置失败: {e}")
+            return {'dailyRewards': {'money': {'rewards': [], 'maxClaimsPerDay': 36}, 'diamond': {'rewards': [], 'maxClaimsPerDay': 36}}}
+    
+    def read_excel_config(self):
+        """读取Excel配置文件"""
+        if not PANDAS_AVAILABLE:
+            print("错误: pandas未安装,无法读取Excel文件")
+            return None
+            
+        if not self.excel_file.exists():
+            print(f"Excel文件不存在: {self.excel_file}")
+            return None
+        
+        try:
+            # 读取Excel文件的所有工作表
+            excel_data = pd.read_excel(self.excel_file, sheet_name=None)
+            print(f"成功读取Excel文件,包含工作表: {list(excel_data.keys())}")
+            
+            config = {'dailyRewards': {'money': {'rewards': [], 'maxClaimsPerDay': 36}, 'diamond': {'rewards': [], 'maxClaimsPerDay': 36}}}
+            
+            # 处理金币奖励工作表
+            if 'money_rewards' in excel_data or '金币奖励' in excel_data:
+                sheet_name = 'money_rewards' if 'money_rewards' in excel_data else '金币奖励'
+                money_df = excel_data[sheet_name]
+                money_rewards = self.parse_rewards_sheet(money_df, 'money')
+                if money_rewards:
+                    config['dailyRewards']['money'] = money_rewards
+            
+            # 处理钻石奖励工作表
+            if 'diamond_rewards' in excel_data or '钻石奖励' in excel_data:
+                sheet_name = 'diamond_rewards' if 'diamond_rewards' in excel_data else '钻石奖励'
+                diamond_df = excel_data[sheet_name]
+                diamond_rewards = self.parse_rewards_sheet(diamond_df, 'diamond')
+                if diamond_rewards:
+                    config['dailyRewards']['diamond'] = diamond_rewards
+            
+            # 如果只有一个工作表,尝试解析为通用格式
+            if len(excel_data) == 1:
+                sheet_name = list(excel_data.keys())[0]
+                df = excel_data[sheet_name]
+                parsed_config = self.parse_general_shop_sheet(df)
+                if parsed_config:
+                    config = parsed_config
+            
+            return config
+            
+        except Exception as e:
+            print(f"读取Excel文件失败: {e}")
+            return None
+    
+    def parse_rewards_sheet(self, df, reward_type):
+        """解析奖励工作表"""
+        try:
+            rewards = []
+            max_claims = 10  # 默认值
+            
+            # 读取所有数据行(pandas已经自动处理了标题行)
+            if len(df) > 0:
+                # 从第一行开始读取奖励数据(pandas自动将标题行作为列名)
+                for index in range(0, len(df)):
+                    row = df.iloc[index]
+                    if pd.isna(row.iloc[0]):
+                        continue
+                    
+                    try:
+                        reward_amount = int(row.iloc[0])
+                        rewards.append(reward_amount)
+                    except (ValueError, TypeError):
+                        continue
+                
+                # 检查是否有第三列的maxClaimsPerDay配置
+                if len(df.columns) >= 3 and len(df) > 1:
+                    try:
+                        # 从第一行第三列读取maxClaimsPerDay值(索引0是第一行数据)
+                        max_claims_value = df.iloc[0, 2]
+                        if not pd.isna(max_claims_value):
+                            max_claims = int(max_claims_value)
+                    except (ValueError, TypeError, IndexError):
+                        pass
+            
+            print(f"解析{reward_type}奖励: {len(rewards)}个奖励, maxClaimsPerDay: {max_claims}")
+            
+            return {
+                'rewards': rewards,
+                'maxClaimsPerDay': max_claims
+            }
+            
+        except Exception as e:
+            print(f"解析{reward_type}奖励工作表失败: {e}")
+            return None
+    
+    def parse_general_shop_sheet(self, df):
+        """解析通用商店配置工作表"""
+        try:
+            config = {'dailyRewards': {'money': {'rewards': [], 'maxClaimsPerDay': 36}, 'diamond': {'rewards': [], 'maxClaimsPerDay': 36}}}
+            
+            # 检查列名
+            columns = [str(col).lower() for col in df.columns]
+            
+            for index, row in df.iterrows():
+                if pd.isna(row.iloc[0]):
+                    continue
+                
+                try:
+                    # 根据列名判断奖励类型
+                    reward_type = None
+                    reward_amount = None
+                    max_claims = 36
+                    
+                    # 查找奖励类型列
+                    for i, col in enumerate(columns):
+                        if 'type' in col or '类型' in col:
+                            reward_type = str(row.iloc[i]).lower()
+                            break
+                    
+                    # 查找奖励数量列
+                    for i, col in enumerate(columns):
+                        if 'amount' in col or 'reward' in col or '数量' in col or '奖励' in col:
+                            reward_amount = int(row.iloc[i])
+                            break
+                    
+                    # 查找最大领取次数列
+                    for i, col in enumerate(columns):
+                        if 'max' in col or '最大' in col:
+                            max_claims = int(row.iloc[i])
+                            break
+                    
+                    # 添加到对应的奖励类型
+                    if reward_type and reward_amount is not None:
+                        if 'money' in reward_type or '金币' in reward_type:
+                            config['dailyRewards']['money']['rewards'].append(reward_amount)
+                            config['dailyRewards']['money']['maxClaimsPerDay'] = max_claims
+                        elif 'diamond' in reward_type or '钻石' in reward_type:
+                            config['dailyRewards']['diamond']['rewards'].append(reward_amount)
+                            config['dailyRewards']['diamond']['maxClaimsPerDay'] = max_claims
+                    
+                except Exception as e:
+                    print(f"解析第 {index+1} 行失败: {e}")
+                    continue
+            
+            return config
+            
+        except Exception as e:
+            print(f"解析通用商店配置工作表失败: {e}")
+            return None
+    
+    def merge_configs(self, excel_config, json_config):
+        """合并Excel配置和现有JSON配置"""
+        if not excel_config:
+            return json_config
+        
+        try:
+            # 合并每日奖励配置
+            if 'dailyRewards' in excel_config:
+                if 'dailyRewards' not in json_config:
+                    json_config['dailyRewards'] = {}
+                
+                # 合并金币奖励
+                if 'money' in excel_config['dailyRewards']:
+                    json_config['dailyRewards']['money'] = excel_config['dailyRewards']['money']
+                
+                # 合并钻石奖励
+                if 'diamond' in excel_config['dailyRewards']:
+                    json_config['dailyRewards']['diamond'] = excel_config['dailyRewards']['diamond']
+            
+            print("配置合并完成")
+            return json_config
+            
+        except Exception as e:
+            print(f"合并配置失败: {e}")
+            return json_config
+    
+    def validate_config(self, config):
+        """验证配置数据"""
+        errors = []
+        
+        # 验证每日奖励配置
+        if not config.get("dailyRewards"):
+            errors.append("每日奖励配置为空")
+        else:
+            daily_rewards = config["dailyRewards"]
+            
+            # 验证金币奖励
+            if "money" in daily_rewards:
+                money_config = daily_rewards["money"]
+                if not money_config.get("rewards"):
+                    errors.append("金币奖励列表为空")
+                elif not isinstance(money_config["rewards"], list):
+                    errors.append("金币奖励必须是数组")
+                else:
+                    for i, reward in enumerate(money_config["rewards"]):
+                        if not isinstance(reward, (int, float)) or reward <= 0:
+                            errors.append(f"金币奖励第 {i+1} 项必须是正数")
+                
+                if money_config.get("maxClaimsPerDay", 0) <= 0:
+                    errors.append("金币每日最大领取次数必须大于0")
+            
+            # 验证钻石奖励
+            if "diamond" in daily_rewards:
+                diamond_config = daily_rewards["diamond"]
+                if not diamond_config.get("rewards"):
+                    errors.append("钻石奖励列表为空")
+                elif not isinstance(diamond_config["rewards"], list):
+                    errors.append("钻石奖励必须是数组")
+                else:
+                    for i, reward in enumerate(diamond_config["rewards"]):
+                        if not isinstance(reward, (int, float)) or reward <= 0:
+                            errors.append(f"钻石奖励第 {i+1} 项必须是正数")
+                
+                if diamond_config.get("maxClaimsPerDay", 0) <= 0:
+                    errors.append("钻石每日最大领取次数必须大于0")
+        
+        return errors
+    
+    def backup_json(self):
+        """备份当前JSON文件(已禁用)"""
+        # 不再创建备份文件,直接返回成功
+        return True
+    
+    def save_json_config(self, config):
+        """保存配置到JSON文件"""
+        try:
+            # 确保目录存在
+            self.json_file.parent.mkdir(parents=True, exist_ok=True)
+            
+            with open(self.json_file, 'w', encoding='utf-8') as f:
+                json.dump(config, f, ensure_ascii=False, indent=2)
+            print(f"配置已保存到: {self.json_file}")
+            return True
+        except Exception as e:
+            print(f"保存JSON文件失败: {e}")
+            return False
+    
+    def import_config(self):
+        """导入配置的主要方法"""
+        print("开始导入商店配置...")
+        
+        # 1. 加载现有JSON配置
+        json_config = self.load_existing_json_config()
+        
+        # 2. 读取Excel配置
+        excel_config = self.read_excel_config()
+        if not excel_config:
+            print("无法读取Excel配置,导入失败")
+            return False
+        
+        # 3. 合并配置
+        merged_config = self.merge_configs(excel_config, json_config)
+        
+        # 4. 验证配置
+        errors = self.validate_config(merged_config)
+        if errors:
+            print("配置验证失败:")
+            for error in errors:
+                print(f"  - {error}")
+            return False
+        
+        # 5. 备份现有配置
+        if not self.backup_json():
+            print("备份失败,但继续导入...")
+        
+        # 6. 保存新配置
+        if self.save_json_config(merged_config):
+            print("商店配置导入成功!")
+            return True
+        else:
+            print("保存配置失败")
+            return False
+    
+    def create_excel_template(self):
+        """创建Excel模板文件"""
+        if not PANDAS_AVAILABLE:
+            print("错误: pandas未安装,无法创建Excel模板")
+            return False
+        
+        try:
+            # 确保目录存在
+            template_dir = self.excel_file.parent
+            template_dir.mkdir(parents=True, exist_ok=True)
+            
+            # 创建示例数据
+            money_data = {
+                '奖励数量': [100, 120, 150, 180, 200, 250, 300, 350, 400, 450],
+                '备注': ['第1天', '第2天', '第3天', '第4天', '第5天', '第6天', '第7天', '第8天', '第9天', '第10天']
+            }
+            
+            diamond_data = {
+                '奖励数量': [10, 12, 15, 18, 20, 25, 30, 35, 40, 45],
+                '备注': ['第1天', '第2天', '第3天', '第4天', '第5天', '第6天', '第7天', '第8天', '第9天', '第10天']
+            }
+            
+            # 创建DataFrame
+            money_df = pd.DataFrame(money_data)
+            diamond_df = pd.DataFrame(diamond_data)
+            
+            # 保存到Excel文件
+            with pd.ExcelWriter(self.excel_file, engine='openpyxl') as writer:
+                money_df.to_excel(writer, sheet_name='金币奖励', index=False)
+                diamond_df.to_excel(writer, sheet_name='钻石奖励', index=False)
+            
+            print(f"Excel模板已创建: {self.excel_file}")
+            return True
+            
+        except Exception as e:
+            print(f"创建Excel模板失败: {e}")
+            return False
+
+# 测试代码
+if __name__ == "__main__":
+    manager = ShopConfigManager()
+    
+    # 创建模板
+    print("创建Excel模板...")
+    manager.create_excel_template()
+    
+    # 导入配置
+    print("\n导入配置...")
+    success = manager.import_config()
+    
+    if success:
+        print("\n商店配置管理器测试完成!")
+    else:
+        print("\n商店配置管理器测试失败!")

+ 12 - 0
assets/resources/data/excel/shop_config_manager.py.meta

@@ -0,0 +1,12 @@
+{
+  "ver": "1.0.0",
+  "importer": "*",
+  "imported": true,
+  "uuid": "be70d938-6b36-4d91-8fb0-9cb422b537aa",
+  "files": [
+    ".json",
+    ".py"
+  ],
+  "subMetas": {},
+  "userData": {}
+}

+ 9 - 0
assets/resources/data/excel/商店配置.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.2.0",
+  "importer": "directory",
+  "imported": true,
+  "uuid": "d5093cf2-5fbd-4dbc-912e-147bf57009a7",
+  "files": [],
+  "subMetas": {},
+  "userData": {}
+}

BIN
assets/resources/data/excel/商店配置/商店配置表.xlsx


+ 12 - 0
assets/resources/data/excel/商店配置/商店配置表.xlsx.meta

@@ -0,0 +1,12 @@
+{
+  "ver": "1.0.0",
+  "importer": "*",
+  "imported": true,
+  "uuid": "ef965ff9-c5c4-4e88-9d55-39685ba73f65",
+  "files": [
+    ".json",
+    ".xlsx"
+  ],
+  "subMetas": {},
+  "userData": {}
+}

+ 26 - 13
assets/resources/data/shop.json

@@ -1,21 +1,34 @@
 {
   "dailyRewards": {
     "money": {
-      "baseAmount": 100,
-      "maxClaimsPerDay": 36,
-      "maxAdsPerDay": 4,
-      "firstClaimFree": true,
-      "adRequiredAfterFirst": true
+      "rewards": [
+        50,
+        120,
+        150,
+        180,
+        200,
+        250,
+        300,
+        350,
+        400,
+        450
+      ],
+      "maxClaimsPerDay": 10
     },
     "diamond": {
-      "baseAmount": 10,
-      "maxClaimsPerDay": 36,
-      "maxAdsPerDay": 2,
-      "firstClaimFree": true,
-      "adRequiredAfterFirst": true
-    },
-    "costButtons": {
-      "maxAdsPerDay": 5
+      "rewards": [
+        5,
+        10,
+        15,
+        18,
+        20,
+        25,
+        30,
+        35,
+        40,
+        45
+      ],
+      "maxClaimsPerDay": 10
     }
   }
 }

+ 42 - 2
assets/scripts/Animations/MoneyAni.ts

@@ -30,6 +30,18 @@ export class MoneyAni extends Component {
     })
     public rewardStartNode: Node = null;
     
+    @property({
+        type: Node,
+        tooltip: '钞票动画起始位置节点(Canvas/ShopUI/ScrollView/view/content/bill/Sprite/Sprite)'
+    })
+    public coinStartNode: Node = null;
+    
+    @property({
+        type: Node,
+        tooltip: '钻石动画起始位置节点(Canvas/ShopUI/ScrollView/view/content/diamond/Sprite/Sprite)'
+    })
+    public diamondStartNode: Node = null;
+    
     @property({
         type: Node,
         tooltip: 'Canvas节点,用于添加动画元素'
@@ -135,7 +147,7 @@ export class MoneyAni extends Component {
         
         // 生成钞票数量(最多10个,超过则按比例显示)
         const coinCount = Math.min(amount, 10);
-        const startPos = this.getRewardStartPosition();
+        const startPos = this.getCoinStartPosition();
         
         console.log(`[MoneyAni] 生成${coinCount}个钞票动画`);
         
@@ -179,7 +191,7 @@ export class MoneyAni extends Component {
         
         // 生成钻石数量(最多5个)
         const diamondCount = Math.min(amount, 5);
-        const startPos = this.getRewardStartPosition();
+        const startPos = this.getDiamondStartPosition();
         
         console.log(`[MoneyAni] 生成${diamondCount}个钻石动画`);
         
@@ -304,6 +316,34 @@ export class MoneyAni extends Component {
         return new Vec3(0, -200, 0);
     }
     
+    /**
+     * 获取钞票动画起始位置
+     */
+    private getCoinStartPosition(): Vec3 {
+        if (this.coinStartNode) {
+            const worldPos = new Vec3();
+            this.coinStartNode.getWorldPosition(worldPos);
+            return worldPos;
+        }
+        
+        // 如果没有设置专门的钞票起始节点,使用通用的奖励起始位置
+        return this.getRewardStartPosition();
+    }
+    
+    /**
+     * 获取钻石动画起始位置
+     */
+    private getDiamondStartPosition(): Vec3 {
+        if (this.diamondStartNode) {
+            const worldPos = new Vec3();
+            this.diamondStartNode.getWorldPosition(worldPos);
+            return worldPos;
+        }
+        
+        // 如果没有设置专门的钻石起始节点,使用通用的奖励起始位置
+        return this.getRewardStartPosition();
+    }
+    
     /**
      * 获取散开位置
      */

+ 201 - 257
assets/scripts/FourUI/ShopSystem/ShopController.ts

@@ -1,29 +1,20 @@
-import { _decorator, Component, Node, Label, Button, JsonAsset, Sprite, Color, SpriteFrame } from 'cc';
+import { _decorator, Component, Node, Label, Button, JsonAsset, Sprite, Color, SpriteFrame, director } from 'cc';
 import { SaveDataManager } from '../../LevelSystem/SaveDataManager';
 import EventBus, { GameEvents } from '../../Core/EventBus';
 import { TopBarController } from '../TopBarController';
+import { MoneyAni } from '../../Animations/MoneyAni';
 
 const { ccclass, property } = _decorator;
 
 interface ShopConfig {
     dailyRewards: {
         money: {
-            baseAmount: number;
+            rewards: number[];
             maxClaimsPerDay: number;
-            maxAdsPerDay: number;
-            firstClaimFree: boolean;
-            adRequiredAfterFirst: boolean;
         };
         diamond: {
-            baseAmount: number;
+            rewards: number[];
             maxClaimsPerDay: number;
-            maxAdsPerDay: number;
-            firstClaimFree: boolean;
-            adRequiredAfterFirst: boolean;
-        };
-        // 新增Cost按钮配置
-        costButtons: {
-            maxAdsPerDay: number; // Cost按钮每日最大广告观看次数
         };
     }
 }
@@ -34,11 +25,9 @@ interface DailyRewardData {
     moneyAdCount: number;
     diamondsFreeCount: number;
     diamondsAdCount: number;
-    // Cost按钮相关
-    costAdCount: number;
-    // Cost按钮免费使用状态 - 分别管理
-    billCostFreeUsed: boolean;
-    diamondCostFreeUsed: boolean;
+    // 每日免费机会是否已使用
+    moneyFreeUsed: boolean;
+    diamondFreeUsed: boolean;
 }
 
 @ccclass('ShopController')
@@ -70,20 +59,11 @@ export class ShopController extends Component {
     @property(JsonAsset)
     shopConfigAsset: JsonAsset = null;
     
-    // 新增Cost按钮装饰器
-    @property(Button)
-    billCostButton: Button = null;
-    
-    @property(Button)
-    diamondCostButton: Button = null;
-    
-    // 按钮置灰图片资源
-    @property(SpriteFrame)
-    disabledButtonSprite: SpriteFrame = null;
+    @property(Node)
+    billSpriteNode: Node = null;  // Canvas/ShopUI/ScrollView/view/content/bill/Sprite/Sprite
     
-    // 保存原始按钮图片
-    private originalBillButtonSprite: SpriteFrame = null;
-    private originalDiamondButtonSprite: SpriteFrame = null;
+    @property(Node)
+    diamondSpriteNode: Node = null;  // Canvas/ShopUI/ScrollView/view/content/diamond/Sprite/Sprite
     
     private shopConfig: ShopConfig = null;
     private dailyRewardData: DailyRewardData = null;
@@ -108,29 +88,6 @@ export class ShopController extends Component {
     }
     
     start() {
-        // 检查disabledButtonSprite是否已设置
-        console.log('[ShopController] disabledButtonSprite是否已设置:', !!this.disabledButtonSprite);
-        
-        // 保存原始按钮图片
-        if (this.billCostButton) {
-            const sprite = this.billCostButton.node.getComponent(Sprite);
-            if (sprite) {
-                this.originalBillButtonSprite = sprite.spriteFrame;
-                console.log('[ShopController] 保存钞票按钮原始图片:', !!this.originalBillButtonSprite);
-            } else {
-                console.log('[ShopController] 警告:无法获取钞票按钮的Sprite组件');
-            }
-        }
-        if (this.diamondCostButton) {
-            const sprite = this.diamondCostButton.node.getComponent(Sprite);
-            if (sprite) {
-                this.originalDiamondButtonSprite = sprite.spriteFrame;
-                console.log('[ShopController] 保存钻石按钮原始图片:', !!this.originalDiamondButtonSprite);
-            } else {
-                console.log('[ShopController] 警告:无法获取钻石按钮的Sprite组件');
-            }
-        }
-        
         this.updateUI();
     }
     
@@ -154,20 +111,20 @@ export class ShopController extends Component {
             // 兼容旧数据:如果存在旧的costFreeUsed字段,迁移到新字段
             if (data.hasOwnProperty('costFreeUsed')) {
                 const oldCostFreeUsed = (data as any).costFreeUsed;
-                data.billCostFreeUsed = oldCostFreeUsed || false;
-                data.diamondCostFreeUsed = oldCostFreeUsed || false;
+                data.moneyFreeUsed = oldCostFreeUsed || false;
+                data.diamondFreeUsed = oldCostFreeUsed || false;
                 delete (data as any).costFreeUsed;
                 console.log('[ShopController] 迁移旧的costFreeUsed数据到新字段');
             }
             
             // 确保新字段存在,设置默认值
-            if (data.billCostFreeUsed === undefined) {
-                data.billCostFreeUsed = true;  // 默认为true(可用)
-                console.log('[ShopController] 设置billCostFreeUsed默认值: true');
+            if (data.moneyFreeUsed === undefined) {
+                data.moneyFreeUsed = false;  // 默认为false(未使用)
+                console.log('[ShopController] 设置moneyFreeUsed默认值: false');
             }
-            if (data.diamondCostFreeUsed === undefined) {
-                data.diamondCostFreeUsed = true;  // 默认为true(可用)
-                console.log('[ShopController] 设置diamondCostFreeUsed默认值: true');
+            if (data.diamondFreeUsed === undefined) {
+                data.diamondFreeUsed = false;  // 默认为false(未使用)
+                console.log('[ShopController] 设置diamondFreeUsed默认值: false');
             }
             
             // 检查是否需要重置(新的一天)
@@ -193,9 +150,8 @@ export class ShopController extends Component {
             moneyAdCount: 0,
             diamondsFreeCount: 0,
             diamondsAdCount: 0,
-            costAdCount: 0,
-            billCostFreeUsed: true,
-            diamondCostFreeUsed: true
+            moneyFreeUsed: false,
+            diamondFreeUsed: false
         };
         this.saveDailyRewardData();
     }
@@ -226,10 +182,6 @@ export class ShopController extends Component {
         
         // 更新钻石奖励UI
         this.updateDiamondRewardUI();
-        
-        // 更新Cost按钮UI
-        this.updateBillCostButtonUI();
-        this.updateDiamondCostButtonUI();
     }
     
     private updateMoneyRewardUI() {
@@ -240,18 +192,18 @@ export class ShopController extends Component {
         const adCount = this.dailyRewardData.moneyAdCount;
         const totalCount = freeCount + adCount;
         const maxCount = config.maxClaimsPerDay;
+        const freeUsed = this.dailyRewardData.moneyFreeUsed;
         
-        // 更新次数显示
-        if (this.moneyCountLabel) {
-            this.moneyCountLabel.string = `${totalCount}/${maxCount}`;
-        }
+        // 计算当前次数索引(免费机会未使用时为0,否则为总次数)
+        const currentIndex = freeUsed ? totalCount : 0;
+        const currentReward = config.rewards[currentIndex] || config.rewards[config.rewards.length - 1];
         
         // 更新金额显示
         if (this.moneyAmountLabel) {
-            this.moneyAmountLabel.string = this.formatNumberWithSpaces(config.baseAmount);
+            this.moneyAmountLabel.string = this.formatNumberWithSpaces(currentReward);
         }
         
-        // 更新按钮状态(带广告标识的按钮)
+        // 更新按钮状态和显示
         if (this.moneyButton) {
             const canClaim = totalCount < maxCount;
             this.moneyButton.interactable = canClaim;
@@ -261,10 +213,21 @@ export class ShopController extends Component {
             if (buttonLabel) {
                 if (!canClaim) {
                     buttonLabel.string = "今日已达上限";
+                } else if (!freeUsed) {
+                    buttonLabel.string = "免  费";
                 } else {
                     buttonLabel.string = "观看广告";
                 }
             }
+            
+            // 更新次数显示
+            if (this.moneyCountLabel) {
+                if (!freeUsed) {
+                    this.moneyCountLabel.string = "免  费";
+                } else {
+                    this.moneyCountLabel.string = `${totalCount}/${maxCount}`;
+                }
+            }
         }
     }
     
@@ -276,18 +239,18 @@ export class ShopController extends Component {
         const adCount = this.dailyRewardData.diamondsAdCount;
         const totalCount = freeCount + adCount;
         const maxCount = config.maxClaimsPerDay;
+        const freeUsed = this.dailyRewardData.diamondFreeUsed;
         
-        // 更新次数显示
-        if (this.diamondCountLabel) {
-            this.diamondCountLabel.string = `${totalCount}/${maxCount}`;
-        }
+        // 计算当前次数索引(免费机会未使用时为0,否则为总次数)
+        const currentIndex = freeUsed ? totalCount : 0;
+        const currentReward = config.rewards[currentIndex] || config.rewards[config.rewards.length - 1];
         
         // 更新金额显示
         if (this.diamondAmountLabel) {
-            this.diamondAmountLabel.string = this.formatNumberWithSpaces(config.baseAmount);
+            this.diamondAmountLabel.string = this.formatNumberWithSpaces(currentReward);
         }
         
-        // 更新按钮状态(带广告标识的按钮)
+        // 更新按钮状态和显示
         if (this.diamondButton) {
             const canClaim = totalCount < maxCount;
             this.diamondButton.interactable = canClaim;
@@ -297,14 +260,25 @@ export class ShopController extends Component {
             if (buttonLabel) {
                 if (!canClaim) {
                     buttonLabel.string = "今日已达上限";
+                } else if (!freeUsed) {
+                    buttonLabel.string = "免  费";
                 } else {
                     buttonLabel.string = "观看广告";
                 }
             }
+            
+            // 更新次数显示
+            if (this.diamondCountLabel) {
+                if (!freeUsed) {
+                    this.diamondCountLabel.string = "免  费";
+                } else {
+                    this.diamondCountLabel.string = `${totalCount}/${maxCount}`;
+                }
+            }
         }
     }
     
-    // 钞票奖励按钮点击事件(带广告标识的按钮)
+    // 钞票奖励按钮点击事件
     public onMoneyRewardClick() {
         if (!this.shopConfig || !this.dailyRewardData) return;
         
@@ -313,17 +287,34 @@ export class ShopController extends Component {
         const adCount = this.dailyRewardData.moneyAdCount;
         const totalCount = freeCount + adCount;
         const maxCount = config.maxClaimsPerDay;
+        const freeUsed = this.dailyRewardData.moneyFreeUsed;
         
         if (totalCount >= maxCount) {
             console.log('[ShopController] 钞票奖励已达每日上限');
             return;
         }
         
-        // 看广告增加次数
-        this.showAdForMoneyReward();
+        // 如果免费机会未使用,直接发放奖励
+        if (!freeUsed) {
+            console.log('[ShopController] 使用免费机会获取钞票奖励');
+            this.dailyRewardData.moneyFreeUsed = true;
+            // 免费奖励不计入freeCount,只标记为已使用
+            this.saveDailyRewardData();
+            this.updateUI();
+            
+            // 播放奖励动画并添加货币
+            const amount = config.rewards[0] || config.rewards[config.rewards.length - 1];
+            this.saveDataManager.addMoney(amount, 'daily_free_reward');
+            this.playMoneyRewardAnimation(amount, () => {
+                console.log(`[ShopController] 钞票免费奖励动画播放完成: ${amount}`);
+            });
+        } else {
+            // 看广告增加次数
+            this.showAdForMoneyReward();
+        }
     }
     
-    // 钻石奖励按钮点击事件(带广告标识的按钮)
+    // 钻石奖励按钮点击事件
     public onDiamondRewardClick() {
         if (!this.shopConfig || !this.dailyRewardData) return;
         
@@ -332,67 +323,84 @@ export class ShopController extends Component {
         const adCount = this.dailyRewardData.diamondsAdCount;
         const totalCount = freeCount + adCount;
         const maxCount = config.maxClaimsPerDay;
+        const freeUsed = this.dailyRewardData.diamondFreeUsed;
         
         if (totalCount >= maxCount) {
             console.log('[ShopController] 钻石奖励已达每日上限');
             return;
         }
         
-        // 看广告增加次数
-        this.showAdForDiamondReward();
+        // 如果免费机会未使用,直接发放奖励
+        if (!freeUsed) {
+            console.log('[ShopController] 使用免费机会获取钻石奖励');
+            this.dailyRewardData.diamondFreeUsed = true;
+            // 免费奖励不计入freeCount,只标记为已使用
+            this.saveDailyRewardData();
+            this.updateUI();
+            
+            // 播放奖励动画并添加货币
+            const amount = config.rewards[0] || config.rewards[config.rewards.length - 1];
+            this.saveDataManager.addDiamonds(amount, 'daily_free_reward');
+            this.playDiamondRewardAnimation(amount, () => {
+                console.log(`[ShopController] 钻石免费奖励动画播放完成: ${amount}`);
+            });
+        } else {
+            // 看广告增加次数
+            this.showAdForDiamondReward();
+        }
     }
     
     private claimMoneyReward(isFromAd: boolean) {
-        const amount = this.shopConfig.dailyRewards.money.baseAmount;
-        
-        // 添加钞票
-        const success = this.saveDataManager.addMoney(amount, isFromAd ? 'shop_ad_reward' : 'shop_free_reward');
+        const config = this.shopConfig.dailyRewards.money;
         
-        if (success) {
-            // 更新领取次数
-            if (isFromAd) {
-                this.dailyRewardData.moneyAdCount++;
-            } else {
-                this.dailyRewardData.moneyFreeCount++;
-            }
-            
-            this.saveDailyRewardData();
-            this.updateUI();
-            
-            console.log(`[ShopController] 成功领取钞票奖励: ${amount}, 来源: ${isFromAd ? '广告' : '免费'}`);
-            
-            // 可以在这里添加奖励动画或提示
-            this.showRewardEffect('money', amount);
+        // 更新领取次数(先更新数据)
+        if (isFromAd) {
+            this.dailyRewardData.moneyAdCount++;
         } else {
-            console.error('[ShopController] 领取钞票奖励失败');
+            this.dailyRewardData.moneyFreeCount++;
         }
+        
+        // 计算当前次数索引和对应奖励
+        const totalCount = this.dailyRewardData.moneyFreeCount + this.dailyRewardData.moneyAdCount;
+        const currentIndex = totalCount - 1; // 减1因为已经增加了次数
+        const amount = config.rewards[currentIndex] || config.rewards[config.rewards.length - 1];
+        
+        this.saveDailyRewardData();
+        this.updateUI();
+        
+        console.log(`[ShopController] 开始播放钞票奖励动画: ${amount}, 来源: ${isFromAd ? '广告' : '免费'}`);
+        
+        // 添加货币到账户并播放奖励动画
+        this.saveDataManager.addMoney(amount, isFromAd ? 'daily_ad_reward' : 'daily_free_reward');
+        this.playMoneyRewardAnimation(amount, () => {
+            console.log(`[ShopController] 钞票奖励动画播放完成: ${amount}`);
+        });
     }
     
     private claimDiamondReward(isFromAd: boolean) {
         const config = this.shopConfig.dailyRewards.diamond;
-        const amount = config.baseAmount;
         
-        // 添加钻石
-        const success = this.saveDataManager.addDiamonds(amount, isFromAd ? 'shop_ad_reward' : 'shop_free_reward');
-        
-        if (success) {
-            // 更新领取次数
-            if (isFromAd) {
-                this.dailyRewardData.diamondsAdCount++;
-            } else {
-                this.dailyRewardData.diamondsFreeCount++;
-            }
-            
-            this.saveDailyRewardData();
-            this.updateUI();
-            
-            console.log(`[ShopController] 成功领取钻石奖励: ${amount}, 来源: ${isFromAd ? '广告' : '免费'}`);
-            
-            // 可以在这里添加奖励动画或提示
-            this.showRewardEffect('diamonds', amount);
+        // 更新领取次数(先更新数据)
+        if (isFromAd) {
+            this.dailyRewardData.diamondsAdCount++;
         } else {
-            console.error('[ShopController] 领取钻石奖励失败');
+            this.dailyRewardData.diamondsFreeCount++;
         }
+        
+        // 计算当前次数索引和对应奖励
+        const totalCount = this.dailyRewardData.diamondsFreeCount + this.dailyRewardData.diamondsAdCount;
+        const currentIndex = totalCount - 1; // 减1因为已经增加了次数
+        const amount = config.rewards[currentIndex] || config.rewards[config.rewards.length - 1];
+        
+        this.saveDailyRewardData();
+        this.updateUI();
+        
+        console.log(`[ShopController] 开始播放钻石奖励动画: ${amount}, 来源: ${isFromAd ? '广告' : '免费'}`);
+        
+        // 播放奖励动画,动画完成后会自动添加钻石
+        this.playDiamondRewardAnimation(amount, () => {
+            console.log(`[ShopController] 钻石奖励动画播放完成: ${amount}`);
+        });
     }
     
     private showAdForMoneyReward() {
@@ -413,109 +421,15 @@ export class ShopController extends Component {
         this.claimDiamondReward(true);
     }
     
-    private showRewardEffect(type: 'money' | 'diamonds', amount: number) {
-        // 这里可以添加奖励特效
-        console.log(`[ShopController] 显示奖励特效: ${type} +${amount}`);
-        
-        // 可以触发TopBarController的货币动画
-        const topBarController = this.node.parent?.getComponentInChildren(TopBarController);
-        if (topBarController) {
-            // 如果TopBarController有显示奖励动画的方法,可以在这里调用
-        }
-    }
+    // showRewardEffect方法已被MoneyAni.playReward替代,不再需要
     
-    // 更新钞票Cost按钮UI状态(底部免费按钮)
-    public updateBillCostButtonUI() {
-        if (!this.dailyRewardData) {
-            console.log('[ShopController] dailyRewardData为空,跳过更新');
-            return;
-        }
-        
-        const costFreeUsed = this.dailyRewardData.billCostFreeUsed !== undefined ? this.dailyRewardData.billCostFreeUsed : true;
-        console.log('[ShopController] 更新钞票Cost按钮UI状态,billCostFreeUsed:', costFreeUsed);
-        
-        if (this.billCostButton) {
-            const buttonLabel = this.billCostButton.node.getChildByName('Label')?.getComponent(Label);
-            const buttonSprite = this.billCostButton.node.getComponent(Sprite);
-            
-            console.log('[ShopController] 按钮组件检查 - Label:', !!buttonLabel, 'Sprite:', !!buttonSprite);
-            
-            if (costFreeUsed) {
-            // 每天第一次,显示"免费"
-            this.billCostButton.interactable = true;
-            if (buttonLabel) {
-                buttonLabel.string = "免费";
-            }
-            // 恢复原始图片
-            if (buttonSprite && this.originalBillButtonSprite) {
-                buttonSprite.spriteFrame = this.originalBillButtonSprite;
-                console.log('[ShopController] 恢复按钮原始图片');
-            }
-        } else {
-            // 免费已使用,按钮置灰,并更新对应的数值显示
-            this.billCostButton.interactable = false;
-            if (buttonLabel) {
-                buttonLabel.string = "已使用";
-            }
-            // 设置置灰图片
-            console.log('[ShopController] 尝试设置置灰图片 - buttonSprite:', !!buttonSprite, 'disabledButtonSprite:', !!this.disabledButtonSprite);
-            if (buttonSprite && this.disabledButtonSprite) {
-                buttonSprite.spriteFrame = this.disabledButtonSprite;
-                console.log('[ShopController] 设置按钮为置灰图片成功');
-            } else {
-                console.log('[ShopController] 警告:无法设置置灰图片 - buttonSprite:', !!buttonSprite, 'disabledButtonSprite:', !!this.disabledButtonSprite);
-            }
-            // 更新钞票数值显示
-            this.updateMoneyAmountFromConfig();
-        }
-        }
-    }
-    
-    // 更新钻石Cost按钮UI状态(底部免费按钮)
-    public updateDiamondCostButtonUI() {
-        if (!this.dailyRewardData) {
-            console.log('[ShopController] dailyRewardData为空,跳过更新');
-            return;
-        }
-        
-        const costFreeUsed = this.dailyRewardData.diamondCostFreeUsed !== undefined ? this.dailyRewardData.diamondCostFreeUsed : true;
-        console.log('[ShopController] 更新钻石Cost按钮UI状态,diamondCostFreeUsed:', costFreeUsed);
-        
-        if (this.diamondCostButton) {
-            const buttonLabel = this.diamondCostButton.node.getChildByName('Label')?.getComponent(Label);
-            const buttonSprite = this.diamondCostButton.node.getComponent(Sprite);
-            
-            if (costFreeUsed) {
-                // 每天第一次,显示"免费"
-                this.diamondCostButton.interactable = true;
-                if (buttonLabel) {
-                    buttonLabel.string = "免费";
-                }
-                // 恢复原始图片
-                if (buttonSprite && this.originalDiamondButtonSprite) {
-                    buttonSprite.spriteFrame = this.originalDiamondButtonSprite;
-                }
-            } else {
-                // 免费已使用,按钮置灰,并更新对应的数值显示
-                this.diamondCostButton.interactable = false;
-                if (buttonLabel) {
-                    buttonLabel.string = "已使用";
-                }
-                // 设置置灰图片
-                if (buttonSprite && this.disabledButtonSprite) {
-                    buttonSprite.spriteFrame = this.disabledButtonSprite;
-                }
-                // 更新钻石数值显示
-                this.updateDiamondAmountFromConfig();
-            }
-        }
-    }
+    // Cost按钮相关方法已移除,功能已整合到主按钮中
     
     // 从配置JSON更新钞票数值显示
     private updateMoneyAmountFromConfig() {
         if (this.moneyAmountLabel && this.shopConfig) {
             // 从配置中读取下一次的钞票数值
-            const nextMoneyAmount = this.shopConfig.dailyRewards.money.baseAmount || 100;
+            const nextMoneyAmount = this.shopConfig.dailyRewards.money.rewards[0] || 100;
             this.moneyAmountLabel.string = this.formatNumberWithSpaces(nextMoneyAmount);
             console.log('[ShopController] 从配置更新钞票数值:', nextMoneyAmount);
         }
@@ -525,60 +439,90 @@ export class ShopController extends Component {
     private updateDiamondAmountFromConfig() {
         if (this.diamondAmountLabel && this.shopConfig) {
             // 从配置中读取下一次的钻石数值
-            const nextDiamondAmount = this.shopConfig.dailyRewards.diamond.baseAmount || 10;
+            const nextDiamondAmount = this.shopConfig.dailyRewards.diamond.rewards[0] || 10;
             this.diamondAmountLabel.string = this.formatNumberWithSpaces(nextDiamondAmount);
             console.log('[ShopController] 从配置更新钻石数值:', nextDiamondAmount);
         }
     }
     
-    // 钞票Cost按钮点击事件(底部免费按钮)
-    public onBillCostClick() {
-        console.log('[ShopController] 钞票Cost按钮被点击');
-        if (!this.dailyRewardData) {
-            console.log('[ShopController] dailyRewardData为空,无法处理点击');
+    /**
+     * 播放钞票奖励动画
+     */
+    private playMoneyRewardAnimation(amount: number, onComplete?: () => void) {
+        // 查找场景中的MoneyAni组件
+        const scene = director.getScene();
+        if (!scene) {
+            console.error('[ShopController] 无法获取当前场景');
+            if (onComplete) onComplete();
             return;
         }
         
-        const costFreeUsed = this.dailyRewardData.billCostFreeUsed;
-        console.log('[ShopController] 当前billCostFreeUsed状态:', costFreeUsed);
+        const findMoneyAni = (node: Node): MoneyAni | null => {
+            const moneyAni = node.getComponent(MoneyAni);
+            if (moneyAni) return moneyAni;
+            
+            for (const child of node.children) {
+                const result = findMoneyAni(child);
+                if (result) return result;
+            }
+            return null;
+        };
         
-        if (costFreeUsed) {
-            // 第一次免费点击
-            this.dailyRewardData.billCostFreeUsed = false;
-            // 增加钞票计数
-            this.dailyRewardData.moneyFreeCount++;
-            this.saveDailyRewardData();
-            console.log('[ShopController] 钞票免费按钮使用完毕,更新UI');
-            this.updateBillCostButtonUI(); // 立即更新按钮UI
-            this.updateUI(); // 更新整体UI
+        const moneyAni = findMoneyAni(scene);
+        if (!moneyAni) {
+            console.error('[ShopController] 场景中未找到MoneyAni组件');
+            if (onComplete) onComplete();
             return;
         }
         
-        console.log('[ShopController] 钞票免费按钮今日已使用');
+        // 临时设置钞票起始位置
+        if (this.billSpriteNode) {
+            moneyAni.coinStartNode = this.billSpriteNode;
+        }
+        
+        // 播放钞票动画
+        moneyAni.playRewardAnimation(amount, 0, onComplete);
     }
     
-    // 钻石Cost按钮点击事件(底部免费按钮)
-    public onDiamondCostClick() {
-        if (!this.dailyRewardData) return;
+    /**
+     * 播放钻石奖励动画
+     */
+    private playDiamondRewardAnimation(amount: number, onComplete?: () => void) {
+        // 查找场景中的MoneyAni组件
+        const scene = director.getScene();
+        if (!scene) {
+            console.error('[ShopController] 无法获取当前场景');
+            if (onComplete) onComplete();
+            return;
+        }
         
-        const costFreeUsed = this.dailyRewardData.diamondCostFreeUsed;
+        const findMoneyAni = (node: Node): MoneyAni | null => {
+            const moneyAni = node.getComponent(MoneyAni);
+            if (moneyAni) return moneyAni;
+            
+            for (const child of node.children) {
+                const result = findMoneyAni(child);
+                if (result) return result;
+            }
+            return null;
+        };
         
-        if (costFreeUsed) {
-            // 第一次免费点击
-            this.dailyRewardData.diamondCostFreeUsed = false;
-            // 增加钻石计数
-            this.dailyRewardData.diamondsFreeCount++;
-            this.saveDailyRewardData();
-            this.updateUI();
-            console.log('[ShopController] 钻石免费按钮使用完毕,钻石计数增加');
+        const moneyAni = findMoneyAni(scene);
+        if (!moneyAni) {
+            console.error('[ShopController] 场景中未找到MoneyAni组件');
+            if (onComplete) onComplete();
             return;
         }
         
-        console.log('[ShopController] 钻石免费按钮今日已使用');
+        // 临时设置钻石起始位置
+        if (this.diamondSpriteNode) {
+            moneyAni.diamondStartNode = this.diamondSpriteNode;
+        }
+        
+        // 播放钻石动画
+        moneyAni.playRewardAnimation(0, amount, onComplete);
     }
     
-
-    
     onDestroy() {
         // 移除事件监听
         EventBus.getInstance().off(GameEvents.CURRENCY_CHANGED, this.updateUI, this);

+ 0 - 581
assets/scripts/TestScene/WeaponBlockTestScript.ts

@@ -1,581 +0,0 @@
-import { _decorator, Component, Node, Prefab, instantiate, Vec3, find, JsonAsset, Sprite, Color, SpriteFrame, resources, UITransform } from 'cc';
-import { ConfigManager, WeaponConfig } from '../Core/ConfigManager';
-
-const { ccclass, property } = _decorator;
-
-/**
- * 武器方块测试脚本
- * 用于自动生成所有武器和方块形状的组合,使用自适应缩放和居中逻辑
- */
-@ccclass('WeaponBlockTestScript')
-export class WeaponBlockTestScript extends Component {
-    
-    @property({
-        type: Node,
-        tooltip: '测试容器节点,用于放置生成的测试方块'
-    })
-    public testContainer: Node = null;
-    
-
-    
-    @property([Prefab])
-    public blockPrefabs: Prefab[] = [];
-    
-    @property({
-        type: JsonAsset,
-        tooltip: '武器和方块配置JSON文件'
-    })
-    public weaponsConfigAsset: JsonAsset = null;
-    
-    // 所有武器类型
-    private readonly WEAPON_TYPES = [
-        'pea_shooter',
-        'sharp_carrot', 
-        'saw_grass',
-        'watermelon_bomb',
-        'boomerang_plant',
-        'hot_pepper',
-        'cactus_shotgun',
-        'okra_missile',
-        'mace_club'
-    ];
-    
-    // 所有方块形状
-    private readonly BLOCK_SHAPES = [
-        'I', 'H-I', 'L', 'L2', 'L3', 'L4', 'S', 'S-F', 'D-T', 'T'
-    ];
-    
-    // 稀有度列表
-    private readonly RARITIES = ['common', 'uncommon', 'rare', 'epic'];
-    
-    private configManager: ConfigManager = null;
-    private weaponsConfig: any = null;
-    private blockSizesConfig: any = null;
-    
-    start() {
-        this.initializeComponents();
-        this.loadConfigurations();
-        // 配置加载完成后自动生成武器方块组合
-        this.scheduleOnce(() => {
-            this.generateAllWeaponBlockCombinations();
-        }, 0.1);
-    }
-    
-    private initializeComponents() {
-        // 查找组件引用
-        if (!this.testContainer) {
-            this.testContainer = find('TestContainer');
-        }
-        
-        // 移除 blockManager 初始化
-        
-
-        
-        this.configManager = ConfigManager.getInstance();
-        
-        this.updateStatus('组件初始化完成');
-    }
-    
-    private loadConfigurations() {
-        try {
-            this.updateStatus('加载配置文件中...');
-            
-            // 从装饰器挂载的资源加载武器和方块配置
-            if (this.weaponsConfigAsset) {
-                const configData = this.weaponsConfigAsset.json;
-                console.log('[WeaponBlockTestScript] 原始配置数据:', configData);
-                console.log('[WeaponBlockTestScript] configData类型:', typeof configData);
-                console.log('[WeaponBlockTestScript] configData.weapons存在:', !!configData.weapons);
-                console.log('[WeaponBlockTestScript] configData.weapons类型:', typeof configData.weapons);
-                console.log('[WeaponBlockTestScript] configData.weapons长度:', configData.weapons?.length);
-                
-                // 直接使用configData,因为weapons.json的结构是 {weapons: [...], blockSizes: [...]}
-                this.weaponsConfig = configData;
-                this.blockSizesConfig = configData;
-                
-                console.log('[WeaponBlockTestScript] 设置后的武器配置:', this.weaponsConfig);
-                console.log('[WeaponBlockTestScript] 设置后的方块配置:', this.blockSizesConfig);
-                console.log('[WeaponBlockTestScript] 预制体数量:', this.blockPrefabs?.length || 0);
-                
-                // 验证第一个武器配置
-                if (configData.weapons && configData.weapons.length > 0) {
-                    console.log('[WeaponBlockTestScript] 第一个武器配置:', configData.weapons[0]);
-                    console.log('[WeaponBlockTestScript] 第一个武器ID:', configData.weapons[0].id);
-                }
-            } else {
-                console.warn('[WeaponBlockTestScript] 武器和方块配置资源未挂载');
-            }
-            
-            this.updateStatus('配置文件加载完成');
-        } catch (error) {
-            console.error('[WeaponBlockTestScript] 加载配置失败:', error);
-            this.updateStatus('配置文件加载失败: ' + error.message);
-        }
-    }
-    
-    /**
-     * 生成所有武器方块组合
-     */
-    public async generateAllWeaponBlockCombinations() {
-        console.log('[WeaponBlockTestScript] 开始生成武器方块组合');
-        console.log('[WeaponBlockTestScript] 武器配置状态:', !!this.weaponsConfig);
-        console.log('[WeaponBlockTestScript] 方块配置状态:', !!this.blockSizesConfig);
-        console.log('[WeaponBlockTestScript] 容器节点状态:', !!this.testContainer);
-        
-        if (!this.weaponsConfig || !this.blockSizesConfig) {
-            console.error('[WeaponBlockTestScript] 配置未加载,无法生成测试方块');
-            this.updateStatus('配置未加载,无法生成测试方块');
-            return;
-        }
-        
-        if (!this.testContainer) {
-            console.error('[WeaponBlockTestScript] 测试容器节点未找到');
-            this.updateStatus('测试容器节点未找到');
-            return;
-        }
-        
-        if (!this.blockPrefabs || this.blockPrefabs.length === 0) {
-            console.error('[WeaponBlockTestScript] 没有可用的方块预制体');
-            this.updateStatus('没有可用的方块预制体');
-            return;
-        }
-        
-        this.clearTestContainer();
-        this.updateStatus('开始生成所有武器方块组合...');
-        
-        let totalGenerated = 0;
-        const startX = -500;
-        const startY = 300;
-        const spacingX = 120;
-        const spacingY = 150;
-        const itemsPerRow = 10;
-        
-        for (let weaponIndex = 0; weaponIndex < this.WEAPON_TYPES.length; weaponIndex++) {
-            const weaponType = this.WEAPON_TYPES[weaponIndex];
-            
-            for (let shapeIndex = 0; shapeIndex < this.BLOCK_SHAPES.length; shapeIndex++) {
-                const shapeId = this.BLOCK_SHAPES[shapeIndex];
-                
-                // 计算位置
-                const row = Math.floor(totalGenerated / itemsPerRow);
-                const col = totalGenerated % itemsPerRow;
-                const posX = startX + col * spacingX;
-                const posY = startY - row * spacingY;
-                
-                // 生成测试方块
-                await this.generateTestBlock(weaponType, shapeId, new Vec3(posX, posY, 0));
-                
-                totalGenerated++;
-                
-                // 更新状态
-                this.updateStatus(`生成进度: ${totalGenerated}/${this.WEAPON_TYPES.length * this.BLOCK_SHAPES.length}`);
-                
-                // 每生成10个方块暂停一帧,避免卡顿
-                if (totalGenerated % 10 === 0) {
-                    await this.waitOneFrame();
-                }
-            }
-        }
-        
-        this.updateStatus(`生成完成!共生成 ${totalGenerated} 个测试方块`);
-    }
-    
-    /**
-     * 生成特定武器和形状的测试方块
-     */
-    private async generateTestBlock(weaponType: string, shapeId: string, position: Vec3) {
-        try {
-            // 获取武器配置
-            const weaponConfig = this.getWeaponConfig(weaponType);
-            if (!weaponConfig) {
-                console.warn(`[WeaponBlockTestScript] 未找到武器配置: ${weaponType}`);
-                return;
-            }
-            
-            // 获取形状配置
-            const shapeConfig = this.getShapeConfig(shapeId);
-            if (!shapeConfig) {
-                console.warn(`[WeaponBlockTestScript] 未找到形状配置: ${shapeId}`);
-                return;
-            }
-            
-            // 查找匹配的预制体
-            const prefab = this.findMatchingPrefab(shapeConfig);
-            if (!prefab) {
-                console.warn(`[WeaponBlockTestScript] 未找到匹配的预制体: ${shapeId}`);
-                return;
-            }
-            
-            // 实例化方块
-            const block = instantiate(prefab);
-            block.setParent(this.testContainer);
-            block.setPosition(position);
-            
-            // 设置武器配置
-            this.setupBlockWeapon(block, weaponConfig);
-            
-            // 设置形状信息
-            this.setupBlockShape(block, shapeConfig);
-            
-            // 设置稀有度(固定使用common)
-            const rarity = 'common';
-            this.setupBlockRarity(block, rarity);
-        } catch (error) {
-            console.error(`[WeaponBlockTestScript] 生成测试方块失败 ${weaponType}-${shapeId}:`, error);
-        }
-    }
-    
-    private getWeaponConfig(weaponType: string): WeaponConfig | null {
-        console.log(`[WeaponBlockTestScript] 查找武器配置: ${weaponType}`);
-        console.log('[WeaponBlockTestScript] 当前武器配置结构:', this.weaponsConfig);
-        
-        if (!this.weaponsConfig) {
-            console.warn('[WeaponBlockTestScript] 武器配置为空');
-            return null;
-        }
-        
-        // weapons.json的结构是 {weapons: [...], blockSizes: [...]}
-        // 所以我们需要访问 this.weaponsConfig.weapons
-        let weaponsList = null;
-        if (this.weaponsConfig.weapons && Array.isArray(this.weaponsConfig.weapons)) {
-            weaponsList = this.weaponsConfig.weapons;
-            console.log(`[WeaponBlockTestScript] 使用weapons数组,长度: ${weaponsList.length}`);
-        } else if (Array.isArray(this.weaponsConfig)) {
-            weaponsList = this.weaponsConfig;
-            console.log(`[WeaponBlockTestScript] 直接使用配置数组,长度: ${weaponsList.length}`);
-        } else {
-            console.warn('[WeaponBlockTestScript] 无法识别的武器配置结构');
-            console.log('[WeaponBlockTestScript] weaponsConfig类型:', typeof this.weaponsConfig);
-            console.log('[WeaponBlockTestScript] weaponsConfig.weapons存在:', !!this.weaponsConfig.weapons);
-            return null;
-        }
-        
-        console.log(`[WeaponBlockTestScript] 在${weaponsList.length}个武器中查找: ${weaponType}`);
-        
-        // 打印前几个武器的ID用于调试
-        if (weaponsList.length > 0) {
-            console.log('[WeaponBlockTestScript] 前3个武器ID:', weaponsList.slice(0, 3).map((w: any) => w.id));
-        }
-        
-        const result = weaponsList.find((weapon: any) => weapon.id === weaponType) || null;
-        console.log(`[WeaponBlockTestScript] 武器配置查找结果 ${weaponType}:`, result ? '找到' : '未找到');
-        if (result) {
-            console.log(`[WeaponBlockTestScript] 找到的武器名称: ${result.name}`);
-        }
-        return result;
-    }
-    
-    private getShapeConfig(shapeId: string): any {
-        console.log(`[WeaponBlockTestScript] 查找形状配置: ${shapeId}`);
-        console.log('[WeaponBlockTestScript] 当前方块配置结构:', this.blockSizesConfig);
-        
-        if (!this.blockSizesConfig) {
-            console.warn('[WeaponBlockTestScript] 方块配置为空');
-            return null;
-        }
-        
-        // 尝试不同的配置结构
-        let shapesList = null;
-        if (this.blockSizesConfig.blockSizes) {
-            shapesList = this.blockSizesConfig.blockSizes;
-        } else if (Array.isArray(this.blockSizesConfig)) {
-            shapesList = this.blockSizesConfig;
-        } else {
-            console.warn('[WeaponBlockTestScript] 无法识别的方块配置结构');
-            return null;
-        }
-        
-        const result = shapesList.find((shape: any) => shape.id === shapeId) || null;
-        console.log(`[WeaponBlockTestScript] 形状配置查找结果 ${shapeId}:`, result);
-        return result;
-    }
-    
-    private findMatchingPrefab(shapeConfig: any): Prefab | null {
-        if (!this.blockPrefabs || this.blockPrefabs.length === 0) {
-            console.warn('[WeaponBlockTestScript] 没有可用的方块预制体');
-            return null;
-        }
-        
-        console.log(`[WeaponBlockTestScript] 查找预制体,形状: ${shapeConfig.id}, 网格数: ${shapeConfig.gridCount}`);
-        console.log(`[WeaponBlockTestScript] 可用预制体数量: ${this.blockPrefabs.length}`);
-        
-        // 根据网格数量匹配预制体
-        const targetGridCount = shapeConfig.gridCount || 4;
-        
-        // 如果只有一个预制体,直接使用它
-        if (this.blockPrefabs.length === 1) {
-            console.log('[WeaponBlockTestScript] 只有一个预制体,直接使用');
-            return this.blockPrefabs[0];
-        }
-        
-        // 尝试根据网格数量匹配
-        for (let i = 0; i < this.blockPrefabs.length; i++) {
-            const prefab = this.blockPrefabs[i];
-            if (prefab) {
-                console.log(`[WeaponBlockTestScript] 使用预制体索引: ${i}`);
-                // 这里可以添加更精确的形状匹配逻辑
-                // 暂时根据索引循环使用不同的预制体
-                const shapeIndex = this.BLOCK_SHAPES.indexOf(shapeConfig.id);
-                if (shapeIndex >= 0 && shapeIndex < this.blockPrefabs.length) {
-                    return this.blockPrefabs[shapeIndex];
-                }
-                return prefab;
-            }
-        }
-        
-        return this.blockPrefabs[0] || null;
-    }
-    
-    private setupBlockWeapon(block: Node, weaponConfig: WeaponConfig) {
-        // 存储武器配置到方块节点
-        block['weaponConfig'] = weaponConfig;
-        block['weaponId'] = weaponConfig.id;
-        
-        // 直接调用武器外观设置方法
-        this.setupBlockWeaponVisual(block, weaponConfig);
-    }
-    
-    private setupBlockShape(block: Node, shapeConfig: any) {
-        // 存储形状配置到方块节点
-        block['shapeConfig'] = shapeConfig;
-        block['shapeId'] = shapeConfig.id;
-        block['shapeName'] = shapeConfig.name;
-    }
-    
-    private setupBlockRarity(block: Node, rarity: string) {
-        // 存储稀有度到方块节点
-        block['rarity'] = rarity;
-        
-        // 直接调用稀有度颜色应用方法
-        this.applyBlockRarityColor(block, rarity);
-    }
-    
-    // 设置方块的武器外观
-    private setupBlockWeaponVisual(block: Node, weaponConfig: WeaponConfig) {
-        // 确保方块节点上也有 weaponConfig 属性
-        block['weaponConfig'] = weaponConfig;
-        
-        // 设置方块的稀有度颜色
-        this.applyBlockRarityColor(block, weaponConfig.rarity || 'common');
-        
-        // 加载武器图标
-        this.loadWeaponIcon(block, weaponConfig);
-    }
-    
-    // 应用方块稀有度颜色
-    private applyBlockRarityColor(block: Node, rarity: string) {
-        // Add null safety check for block
-        if (!block || !block.isValid) {
-            return;
-        }
-        
-        // 新的预制体结构:Sprite组件在Node子节点上
-        const nodeChild = block.getChildByName('Node');
-        if (!nodeChild) {
-            console.warn('[WeaponBlockTestScript] 方块节点没有找到Node子节点');
-            return;
-        }
-        
-        const sprite = nodeChild.getComponent(Sprite);
-        if (!sprite || !sprite.isValid) {
-            console.warn('[WeaponBlockTestScript] Node子节点没有Sprite组件');
-            return;
-        }
-        
-        // 根据稀有度设置颜色
-        let color: Color;
-        switch (rarity) {
-            case 'common':
-                color = new Color(255, 255, 255); // 白色
-                break;
-            case 'uncommon':
-                color = new Color(0, 255, 0); // 绿色
-                break;
-            case 'rare':
-                color = new Color(0, 100, 255); // 蓝色
-                break;
-            case 'epic':
-                color = new Color(160, 32, 240); // 紫色
-                break;
-
-            default:
-                color = new Color(255, 255, 255); // 默认白色
-        }
-        
-        sprite.color = color;
-        console.log(`[WeaponBlockTestScript] 设置方块稀有度颜色: ${rarity}`, color);
-    }
-    
-    // 加载武器图标
-
-    private loadWeaponIcon(block: Node, weaponConfig: WeaponConfig) {
-        // 根据预制体结构:WeaponBlock -> B1 -> Weapon
-        const b1Node = block.getChildByName('B1');
-        if (!b1Node) {
-            console.warn('[WeaponBlockTestScript] 找不到B1节点');
-            return;
-        }
-        
-        const weaponNode = b1Node.getChildByName('Weapon');
-        if (!weaponNode) {
-            console.warn('[WeaponBlockTestScript] 找不到Weapon节点');
-            return;
-        }
-        
-        const weaponSprite = weaponNode.getComponent(Sprite);
-        if (!weaponSprite) {
-            console.warn('[WeaponBlockTestScript] Weapon节点上没有Sprite组件');
-            return;
-        }
-        
-        // 获取武器配置中的图片路径
-        const spritePath = weaponConfig.visualConfig?.weaponSprites;
-        if (!spritePath) {
-            console.warn(`[WeaponBlockTestScript] 武器 ${weaponConfig.name} 没有配置图片信息`);
-            return;
-        }
-        
-        // 正确的SpriteFrame子资源路径
-        const spriteFramePath = `${spritePath}/spriteFrame`;
-        
-        // 加载SpriteFrame子资源
-        resources.load(spriteFramePath, SpriteFrame, (err, spriteFrame) => {
-            if (err) {
-                console.warn(`[WeaponBlockTestScript] 加载武器图片失败: ${spriteFramePath}`, err);
-                return;
-            }
-            
-            // Add comprehensive null safety checks before setting spriteFrame
-            if (weaponSprite && weaponSprite.isValid && 
-                weaponNode && weaponNode.isValid && 
-                block && block.isValid && 
-                spriteFrame && spriteFrame.isValid) {
-                weaponSprite.spriteFrame = spriteFrame;
-                
-                console.log(`[WeaponBlockTestScript] 成功加载武器图标: ${weaponConfig.name}`);
-            }
-        });
-    }
-    
-    /**
-     * 生成特定武器类型的所有形状组合
-     */
-    public async generateWeaponShapeCombinations(weaponType: string) {
-        if (this.WEAPON_TYPES.indexOf(weaponType) === -1) {
-            this.updateStatus(`无效的武器类型: ${weaponType}`);
-            return;
-        }
-        
-        this.clearTestContainer();
-        this.updateStatus(`生成武器 ${weaponType} 的所有形状组合...`);
-        
-        const startX = -400;
-        const startY = 200;
-        const spacingX = 100;
-        const spacingY = 120;
-        const itemsPerRow = 5;
-        
-        for (let i = 0; i < this.BLOCK_SHAPES.length; i++) {
-            const shapeId = this.BLOCK_SHAPES[i];
-            
-            const row = Math.floor(i / itemsPerRow);
-            const col = i % itemsPerRow;
-            const posX = startX + col * spacingX;
-            const posY = startY - row * spacingY;
-            
-            await this.generateTestBlock(weaponType, shapeId, new Vec3(posX, posY, 0));
-            
-            this.updateStatus(`生成进度: ${i + 1}/${this.BLOCK_SHAPES.length}`);
-            
-            if ((i + 1) % 5 === 0) {
-                await this.waitOneFrame();
-            }
-        }
-        
-        this.updateStatus(`${weaponType} 的所有形状组合生成完成!`);
-    }
-    
-    /**
-     * 生成特定形状的所有武器组合
-     */
-    public async generateShapeWeaponCombinations(shapeId: string) {
-        if (this.BLOCK_SHAPES.indexOf(shapeId) === -1) {
-            this.updateStatus(`无效的形状ID: ${shapeId}`);
-            return;
-        }
-        
-        this.clearTestContainer();
-        this.updateStatus(`生成形状 ${shapeId} 的所有武器组合...`);
-        
-        const startX = -400;
-        const startY = 200;
-        const spacingX = 100;
-        const spacingY = 120;
-        const itemsPerRow = 3;
-        
-        for (let i = 0; i < this.WEAPON_TYPES.length; i++) {
-            const weaponType = this.WEAPON_TYPES[i];
-            
-            const row = Math.floor(i / itemsPerRow);
-            const col = i % itemsPerRow;
-            const posX = startX + col * spacingX;
-            const posY = startY - row * spacingY;
-            
-            await this.generateTestBlock(weaponType, shapeId, new Vec3(posX, posY, 0));
-            
-            this.updateStatus(`生成进度: ${i + 1}/${this.WEAPON_TYPES.length}`);
-            
-            if ((i + 1) % 3 === 0) {
-                await this.waitOneFrame();
-            }
-        }
-        
-        this.updateStatus(`形状 ${shapeId} 的所有武器组合生成完成!`);
-    }
-    
-    /**
-     * 清空测试容器
-     */
-    public clearTestContainer() {
-        if (this.testContainer) {
-            this.testContainer.removeAllChildren();
-        }
-    }
-    
-    /**
-     * 更新状态显示
-     */
-    private updateStatus(message: string) {
-        console.log(`[WeaponBlockTestScript] ${message}`);
-    }
-    
-    /**
-     * 等待一帧
-     */
-    private waitOneFrame(): Promise<void> {
-        return new Promise(resolve => {
-            this.scheduleOnce(() => {
-                resolve();
-            }, 0);
-        });
-    }
-    
-    /**
-     * 导出当前测试结果为JSON(用于调试)
-     */
-    public exportTestResults(): string {
-        const results = {
-            timestamp: new Date().toISOString(),
-            weaponTypes: this.WEAPON_TYPES,
-            blockShapes: this.BLOCK_SHAPES,
-            rarities: this.RARITIES,
-            totalCombinations: this.WEAPON_TYPES.length * this.BLOCK_SHAPES.length,
-            generatedBlocks: this.testContainer ? this.testContainer.children.length : 0
-        };
-        
-        const jsonString = JSON.stringify(results, null, 2);
-        console.log('[WeaponBlockTestScript] 测试结果:', jsonString);
-        
-        return jsonString;
-    }
-}

+ 0 - 9
assets/scripts/TestScene/WeaponBlockTestScript.ts.meta

@@ -1,9 +0,0 @@
-{
-  "ver": "4.0.24",
-  "importer": "typescript",
-  "imported": true,
-  "uuid": "de769292-4d42-4e00-8384-18f78777b711",
-  "files": [],
-  "subMetas": {},
-  "userData": {}
-}

+ 0 - 1465
dependency-graph.svg

@@ -1,1465 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 13.1.0 (20250701.0955)
- -->
-<!-- Title: G Pages: 1 -->
-<svg width="4179pt" height="3169pt"
- viewBox="0.00 0.00 4179.00 3169.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(21.6 3147.44)">
-<title>G</title>
-<polygon fill="#111111" stroke="none" points="-21.6,21.6 -21.6,-3147.44 4157.1,-3147.44 4157.1,21.6 -21.6,21.6"/>
-<!-- scripts/Animations/BallAni.ts -->
-<g id="node1" class="node">
-<title>scripts/Animations/BallAni.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3573.96,-2090.29C3573.96,-2090.29 3403.54,-2090.29 3403.54,-2090.29 3399.58,-2090.29 3395.62,-2086.33 3395.62,-2082.37 3395.62,-2082.37 3395.62,-2074.46 3395.62,-2074.46 3395.62,-2070.5 3399.58,-2066.54 3403.54,-2066.54 3403.54,-2066.54 3573.96,-2066.54 3573.96,-2066.54 3577.92,-2066.54 3581.88,-2070.5 3581.88,-2074.46 3581.88,-2074.46 3581.88,-2082.37 3581.88,-2082.37 3581.88,-2086.33 3577.92,-2090.29 3573.96,-2090.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3488.75" y="-2072.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Animations/BallAni.ts</text>
-</g>
-<!-- scripts/Core/EventBus.ts -->
-<g id="node2" class="node">
-<title>scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#cfffac" d="M3877.58,-1197.29C3877.58,-1197.29 3729.67,-1197.29 3729.67,-1197.29 3725.71,-1197.29 3721.75,-1193.33 3721.75,-1189.37 3721.75,-1189.37 3721.75,-1181.46 3721.75,-1181.46 3721.75,-1177.5 3725.71,-1173.54 3729.67,-1173.54 3729.67,-1173.54 3877.58,-1173.54 3877.58,-1173.54 3881.54,-1173.54 3885.5,-1177.5 3885.5,-1181.46 3885.5,-1181.46 3885.5,-1189.37 3885.5,-1189.37 3885.5,-1193.33 3881.54,-1197.29 3877.58,-1197.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3803.62" y="-1179.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Core/EventBus.ts</text>
-</g>
-<!-- scripts/Animations/BallAni.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge1" class="edge">
-<title>scripts/Animations/BallAni.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M3530.05,-2066.17C3570.78,-2051.6 3632.22,-2023.18 3664.75,-1976.42 3755,-1846.68 3793.54,-1326.2 3801.17,-1208.95"/>
-<polygon fill="#757575" stroke="#757575" points="3804.66,-1209.22 3801.8,-1199.02 3797.68,-1208.78 3804.66,-1209.22"/>
-</g>
-<!-- scripts/Animations/DamageNumberAni.ts -->
-<g id="node3" class="node">
-<title>scripts/Animations/DamageNumberAni.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2771.71,-1543.29C2771.71,-1543.29 2523.29,-1543.29 2523.29,-1543.29 2519.33,-1543.29 2515.38,-1539.33 2515.38,-1535.37 2515.38,-1535.37 2515.38,-1527.46 2515.38,-1527.46 2515.38,-1523.5 2519.33,-1519.54 2523.29,-1519.54 2523.29,-1519.54 2771.71,-1519.54 2771.71,-1519.54 2775.67,-1519.54 2779.62,-1523.5 2779.62,-1527.46 2779.62,-1527.46 2779.62,-1535.37 2779.62,-1535.37 2779.62,-1539.33 2775.67,-1543.29 2771.71,-1543.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-1525.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/Animations/DamageNumberAni.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts -->
-<g id="node4" class="node">
-<title>scripts/CombatSystem/EnemyController.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2028.33,-1701.29C2028.33,-1701.29 1773.17,-1701.29 1773.17,-1701.29 1769.21,-1701.29 1765.25,-1697.33 1765.25,-1693.37 1765.25,-1693.37 1765.25,-1685.46 1765.25,-1685.46 1765.25,-1681.5 1769.21,-1677.54 1773.17,-1677.54 1773.17,-1677.54 2028.33,-1677.54 2028.33,-1677.54 2032.29,-1677.54 2036.25,-1681.5 2036.25,-1685.46 2036.25,-1685.46 2036.25,-1693.37 2036.25,-1693.37 2036.25,-1697.33 2032.29,-1701.29 2028.33,-1701.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1900.75" y="-1683.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/EnemyController.ts</text>
-</g>
-<!-- scripts/Animations/DamageNumberAni.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
-<g id="edge2" class="edge">
-<title>scripts/Animations/DamageNumberAni.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
-<path fill="none" stroke="#757575" d="M2515.17,-1541.97C2358.73,-1555.01 2113.26,-1577.09 2072.25,-1590.42 2016.2,-1608.63 1958.41,-1647.13 1926.59,-1670.39"/>
-<polygon fill="#757575" stroke="#757575" points="1924.73,-1667.4 1918.79,-1676.17 1928.9,-1673.03 1924.73,-1667.4"/>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge65" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1906.58,-1677.13C1924.67,-1630.87 1989.84,-1462.61 2036.25,-1321.42 2054.04,-1267.3 2028.2,-1234.53 2072.25,-1198.42 2323.86,-992.1 3388.61,-1125.63 3710.24,-1171.6"/>
-<polygon fill="#757575" stroke="#757575" points="3709.47,-1175.02 3719.87,-1172.98 3710.47,-1168.09 3709.47,-1175.02"/>
-</g>
-<!-- scripts/LevelSystem/SaveDataManager.ts -->
-<g id="node10" class="node">
-<title>scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2773.21,-1197.29C2773.21,-1197.29 2521.79,-1197.29 2521.79,-1197.29 2517.83,-1197.29 2513.88,-1193.33 2513.88,-1189.37 2513.88,-1189.37 2513.88,-1181.46 2513.88,-1181.46 2513.88,-1177.5 2517.83,-1173.54 2521.79,-1173.54 2521.79,-1173.54 2773.21,-1173.54 2773.21,-1173.54 2777.17,-1173.54 2781.12,-1177.5 2781.12,-1181.46 2781.12,-1181.46 2781.12,-1189.37 2781.12,-1189.37 2781.12,-1193.33 2777.17,-1197.29 2773.21,-1197.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-1179.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/SaveDataManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge67" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M1918.53,-1677.05C1947.55,-1654.68 2006.86,-1604.47 2036.25,-1547.42 2074.41,-1473.34 2011.66,-1420.62 2072.25,-1363.42 2186.81,-1255.24 2293.78,-1404.85 2423.5,-1315.42 2451.01,-1296.45 2433.96,-1270.96 2459.5,-1249.42 2488.14,-1225.26 2526.37,-1210.07 2560.79,-1200.59"/>
-<polygon fill="#757575" stroke="#757575" points="2561.56,-1204 2570.35,-1198.09 2559.79,-1197.23 2561.56,-1204"/>
-</g>
-<!-- scripts/Core/ConfigManager.ts -->
-<g id="node18" class="node">
-<title>scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3579.96,-2590.29C3579.96,-2590.29 3397.54,-2590.29 3397.54,-2590.29 3393.58,-2590.29 3389.62,-2586.33 3389.62,-2582.37 3389.62,-2582.37 3389.62,-2574.46 3389.62,-2574.46 3389.62,-2570.5 3393.58,-2566.54 3397.54,-2566.54 3397.54,-2566.54 3579.96,-2566.54 3579.96,-2566.54 3583.92,-2566.54 3587.88,-2570.5 3587.88,-2574.46 3587.88,-2574.46 3587.88,-2582.37 3587.88,-2582.37 3587.88,-2586.33 3583.92,-2590.29 3579.96,-2590.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3488.75" y="-2572.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Core/ConfigManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge64" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1919.7,-1701.75C1949.76,-1721.72 2012.84,-1760.79 2072.25,-1779.42 2147.29,-1802.94 2369.47,-1765.28 2423.5,-1822.42 2506.75,-1910.44 2374.76,-2279.83 2459.5,-2366.42 2518.17,-2426.36 2761.35,-2360.21 2835.5,-2399.42 2857.84,-2411.22 2849.2,-2431.54 2871.5,-2443.42 3031.18,-2528.44 3102.03,-2434.52 3276.75,-2481.42 3344.49,-2499.59 3417.59,-2537.86 3457.5,-2560.51"/>
-<polygon fill="#757575" stroke="#757575" points="3455.64,-2563.49 3466.06,-2565.43 3459.13,-2557.42 3455.64,-2563.49"/>
-</g>
-<!-- scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="node25" class="node">
-<title>scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M3205.83,-1427.29C3205.83,-1427.29 2942.42,-1427.29 2942.42,-1427.29 2938.46,-1427.29 2934.5,-1423.33 2934.5,-1419.37 2934.5,-1419.37 2934.5,-1411.46 2934.5,-1411.46 2934.5,-1407.5 2938.46,-1403.54 2942.42,-1403.54 2942.42,-1403.54 3205.83,-1403.54 3205.83,-1403.54 3209.79,-1403.54 3213.75,-1407.5 3213.75,-1411.46 3213.75,-1411.46 3213.75,-1419.37 3213.75,-1419.37 3213.75,-1423.33 3209.79,-1427.29 3205.83,-1427.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-1409.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/LevelSystem/LevelConfigManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="edge66" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2036.56,-1686.81C2277.6,-1681.41 2764.04,-1666.88 2835.5,-1636.42 2938.59,-1592.47 3024.93,-1483.4 3058.32,-1436.93"/>
-<polygon fill="#757575" stroke="#757575" points="3061.01,-1439.19 3063.93,-1429 3055.3,-1435.15 3061.01,-1439.19"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BurnEffect.ts -->
-<g id="node30" class="node">
-<title>scripts/CombatSystem/BulletEffects/BurnEffect.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3222.33,-1741.29C3222.33,-1741.29 2925.92,-1741.29 2925.92,-1741.29 2921.96,-1741.29 2918,-1737.33 2918,-1733.37 2918,-1733.37 2918,-1725.46 2918,-1725.46 2918,-1721.5 2921.96,-1717.54 2925.92,-1717.54 2925.92,-1717.54 3222.33,-1717.54 3222.33,-1717.54 3226.29,-1717.54 3230.25,-1721.5 3230.25,-1725.46 3230.25,-1725.46 3230.25,-1733.37 3230.25,-1733.37 3230.25,-1737.33 3226.29,-1741.29 3222.33,-1741.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-1723.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BulletEffects/BurnEffect.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BurnEffect.ts -->
-<g id="edge59" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BurnEffect.ts</title>
-<path fill="none" stroke="#757575" d="M2036.69,-1694.02C2251.99,-1701.38 2672.71,-1715.74 2906.47,-1723.72"/>
-<polygon fill="#757575" stroke="#757575" points="2906.18,-1727.22 2916.29,-1724.06 2906.42,-1720.22 2906.18,-1727.22"/>
-</g>
-<!-- scripts/CombatSystem/EnemyComponent.ts -->
-<g id="node36" class="node">
-<title>scripts/CombatSystem/EnemyComponent.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2781.46,-1859.29C2781.46,-1859.29 2513.54,-1859.29 2513.54,-1859.29 2509.58,-1859.29 2505.62,-1855.33 2505.62,-1851.37 2505.62,-1851.37 2505.62,-1843.46 2505.62,-1843.46 2505.62,-1839.5 2509.58,-1835.54 2513.54,-1835.54 2513.54,-1835.54 2781.46,-1835.54 2781.46,-1835.54 2785.42,-1835.54 2789.38,-1839.5 2789.38,-1843.46 2789.38,-1843.46 2789.38,-1851.37 2789.38,-1851.37 2789.38,-1855.33 2785.42,-1859.29 2781.46,-1859.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-1841.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/EnemyComponent.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyComponent.ts -->
-<g id="edge60" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyComponent.ts</title>
-<path fill="none" stroke="#757575" d="M1936.26,-1701.73C1970.4,-1713.48 2024.34,-1730.91 2072.25,-1741.42 2226.15,-1775.17 2280.36,-1723.56 2423.5,-1789.42 2442.95,-1798.36 2440.06,-1812.44 2459.5,-1821.42 2470.66,-1826.57 2482.57,-1830.77 2494.76,-1834.19"/>
-<polygon fill="#757575" stroke="#757575" points="2493.52,-1837.48 2504.08,-1836.61 2495.28,-1830.7 2493.52,-1837.48"/>
-</g>
-<!-- scripts/CombatSystem/EnemyInstance.ts -->
-<g id="node37" class="node">
-<title>scripts/CombatSystem/EnemyInstance.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2372.08,-1623.29C2372.08,-1623.29 2123.67,-1623.29 2123.67,-1623.29 2119.71,-1623.29 2115.75,-1619.33 2115.75,-1615.37 2115.75,-1615.37 2115.75,-1607.46 2115.75,-1607.46 2115.75,-1603.5 2119.71,-1599.54 2123.67,-1599.54 2123.67,-1599.54 2372.08,-1599.54 2372.08,-1599.54 2376.04,-1599.54 2380,-1603.5 2380,-1607.46 2380,-1607.46 2380,-1615.37 2380,-1615.37 2380,-1619.33 2376.04,-1623.29 2372.08,-1623.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-1605.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/EnemyInstance.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyInstance.ts -->
-<g id="edge61" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyInstance.ts</title>
-<path fill="none" stroke="#757575" d="M1936.61,-1677.12C1970.79,-1665.46 2024.55,-1648.18 2072.25,-1637.42 2092.53,-1632.84 2114.31,-1628.86 2135.39,-1625.49"/>
-<polygon fill="#757575" stroke="#757575" points="2135.83,-1628.97 2145.17,-1623.97 2134.75,-1622.05 2135.83,-1628.97"/>
-</g>
-<!-- scripts/CombatSystem/Wall.ts -->
-<g id="node38" class="node">
-<title>scripts/CombatSystem/Wall.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2338.33,-1855.29C2338.33,-1855.29 2157.42,-1855.29 2157.42,-1855.29 2153.46,-1855.29 2149.5,-1851.33 2149.5,-1847.37 2149.5,-1847.37 2149.5,-1839.46 2149.5,-1839.46 2149.5,-1835.5 2153.46,-1831.54 2157.42,-1831.54 2157.42,-1831.54 2338.33,-1831.54 2338.33,-1831.54 2342.29,-1831.54 2346.25,-1835.5 2346.25,-1839.46 2346.25,-1839.46 2346.25,-1847.37 2346.25,-1847.37 2346.25,-1851.33 2342.29,-1855.29 2338.33,-1855.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-1837.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/Wall.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/Wall.ts -->
-<g id="edge62" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/Wall.ts</title>
-<path fill="none" stroke="#757575" d="M1917.72,-1701.74C1958.41,-1733.1 2063.46,-1813.74 2072.25,-1817.42 2092.81,-1826.01 2115.78,-1831.82 2138.14,-1835.73"/>
-<polygon fill="#757575" stroke="#757575" points="2137.47,-1839.17 2147.9,-1837.32 2138.59,-1832.26 2137.47,-1839.17"/>
-</g>
-<!-- scripts/Core/BaseSingleton.ts -->
-<g id="node39" class="node">
-<title>scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#cfffac" d="M4127.58,-1973.29C4127.58,-1973.29 3950.42,-1973.29 3950.42,-1973.29 3946.46,-1973.29 3942.5,-1969.33 3942.5,-1965.37 3942.5,-1965.37 3942.5,-1957.46 3942.5,-1957.46 3942.5,-1953.5 3946.46,-1949.54 3950.42,-1949.54 3950.42,-1949.54 4127.58,-1949.54 4127.58,-1949.54 4131.54,-1949.54 4135.5,-1953.5 4135.5,-1957.46 4135.5,-1957.46 4135.5,-1965.37 4135.5,-1965.37 4135.5,-1969.33 4131.54,-1973.29 4127.58,-1973.29"/>
-<text xml:space="preserve" text-anchor="middle" x="4039" y="-1955.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Core/BaseSingleton.ts</text>
-</g>
-<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge63" class="edge">
-<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M1982.28,-1701.77C2010.67,-1705.85 2042.83,-1710.18 2072.25,-1713.42 2227.92,-1730.56 2267.8,-1724.61 2423.5,-1741.42 3006.29,-1804.3 3703.39,-1909.52 3947.93,-1947.34"/>
-<polygon fill="#757575" stroke="#757575" points="3947.32,-1950.79 3957.74,-1948.86 3948.39,-1943.87 3947.32,-1950.79"/>
-</g>
-<!-- scripts/Animations/GameStartMove.ts -->
-<g id="node5" class="node">
-<title>scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1648.96,-381.29C1648.96,-381.29 1420.04,-381.29 1420.04,-381.29 1416.08,-381.29 1412.12,-377.33 1412.12,-373.37 1412.12,-373.37 1412.12,-365.46 1412.12,-365.46 1412.12,-361.5 1416.08,-357.54 1420.04,-357.54 1420.04,-357.54 1648.96,-357.54 1648.96,-357.54 1652.92,-357.54 1656.88,-361.5 1656.88,-365.46 1656.88,-365.46 1656.88,-373.37 1656.88,-373.37 1656.88,-377.33 1652.92,-381.29 1648.96,-381.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1534.5" y="-363.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Animations/GameStartMove.ts</text>
-</g>
-<!-- scripts/Animations/GameStartMove.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge3" class="edge">
-<title>scripts/Animations/GameStartMove.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1597.59,-357.06C1746.5,-330.37 2133.11,-278.5 2423.5,-393.42 2443.41,-401.29 2440.01,-416.55 2459.5,-425.42 2612.85,-495.16 2679.94,-408.74 2835.5,-473.42 2854.22,-481.2 2852.53,-494.26 2871.5,-501.42 2954.12,-532.58 3597.72,-491.93 3664.75,-549.42 3667.79,-552.02 3773.38,-1047.87 3797.67,-1162.12"/>
-<polygon fill="#757575" stroke="#757575" points="3794.18,-1162.52 3799.68,-1171.57 3801.03,-1161.06 3794.18,-1162.52"/>
-</g>
-<!-- scripts/Animations/HPBarAnimation.ts -->
-<g id="node6" class="node">
-<title>scripts/Animations/HPBarAnimation.ts</title>
-<path fill="none" stroke="#cfffac" d="M2761.96,-1627.29C2761.96,-1627.29 2533.04,-1627.29 2533.04,-1627.29 2529.08,-1627.29 2525.12,-1623.33 2525.12,-1619.37 2525.12,-1619.37 2525.12,-1611.46 2525.12,-1611.46 2525.12,-1607.5 2529.08,-1603.54 2533.04,-1603.54 2533.04,-1603.54 2761.96,-1603.54 2761.96,-1603.54 2765.92,-1603.54 2769.88,-1607.5 2769.88,-1611.46 2769.88,-1611.46 2769.88,-1619.37 2769.88,-1619.37 2769.88,-1623.33 2765.92,-1627.29 2761.96,-1627.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-1609.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Animations/HPBarAnimation.ts</text>
-</g>
-<!-- scripts/Animations/MoneyAni.ts -->
-<g id="node7" class="node">
-<title>scripts/Animations/MoneyAni.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1995.33,-573.29C1995.33,-573.29 1806.17,-573.29 1806.17,-573.29 1802.21,-573.29 1798.25,-569.33 1798.25,-565.37 1798.25,-565.37 1798.25,-557.46 1798.25,-557.46 1798.25,-553.5 1802.21,-549.54 1806.17,-549.54 1806.17,-549.54 1995.33,-549.54 1995.33,-549.54 1999.29,-549.54 2003.25,-553.5 2003.25,-557.46 2003.25,-557.46 2003.25,-565.37 2003.25,-565.37 2003.25,-569.33 1999.29,-573.29 1995.33,-573.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1900.75" y="-555.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Animations/MoneyAni.ts</text>
-</g>
-<!-- scripts/Animations/MoneyAni.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge5" class="edge">
-<title>scripts/Animations/MoneyAni.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1999.75,-549.09C2012.4,-545.6 2024.89,-541.14 2036.25,-535.42 2055.64,-525.65 2053.95,-514.09 2072.25,-502.42 2229.38,-402.15 2276.71,-377.9 2459.5,-341.42 2590.84,-315.2 3564.03,-269.14 3664.75,-357.42 3789.65,-466.88 3801.44,-1037.82 3802.52,-1161.69"/>
-<polygon fill="#757575" stroke="#757575" points="3799.02,-1161.63 3802.59,-1171.61 3806.02,-1161.58 3799.02,-1161.63"/>
-</g>
-<!-- scripts/AudioManager/AudioManager.ts -->
-<g id="node8" class="node">
-<title>scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M3192.71,-866.29C3192.71,-866.29 2955.54,-866.29 2955.54,-866.29 2951.58,-866.29 2947.62,-862.33 2947.62,-858.37 2947.62,-858.37 2947.62,-850.46 2947.62,-850.46 2947.62,-846.5 2951.58,-842.54 2955.54,-842.54 2955.54,-842.54 3192.71,-842.54 3192.71,-842.54 3196.67,-842.54 3200.62,-846.5 3200.62,-850.46 3200.62,-850.46 3200.62,-858.37 3200.62,-858.37 3200.62,-862.33 3196.67,-866.29 3192.71,-866.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-848.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/AudioManager/AudioManager.ts</text>
-</g>
-<!-- scripts/Animations/MoneyAni.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge4" class="edge">
-<title>scripts/Animations/MoneyAni.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2003.57,-559.72C2230.12,-556.6 2761.76,-553.09 2835.5,-587.42 2950.23,-640.83 3032.98,-778.6 3061.88,-832.41"/>
-<polygon fill="#757575" stroke="#757575" points="3058.62,-833.73 3066.37,-840.95 3064.81,-830.47 3058.62,-833.73"/>
-</g>
-<!-- scripts/FourUI/TopBarController.ts -->
-<g id="node9" class="node">
-<title>scripts/FourUI/TopBarController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2349.21,-535.29C2349.21,-535.29 2146.54,-535.29 2146.54,-535.29 2142.58,-535.29 2138.62,-531.33 2138.62,-527.37 2138.62,-527.37 2138.62,-519.46 2138.62,-519.46 2138.62,-515.5 2142.58,-511.54 2146.54,-511.54 2146.54,-511.54 2349.21,-511.54 2349.21,-511.54 2353.17,-511.54 2357.12,-515.5 2357.12,-519.46 2357.12,-519.46 2357.12,-527.37 2357.12,-527.37 2357.12,-531.33 2353.17,-535.29 2349.21,-535.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-517.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/TopBarController.ts</text>
-</g>
-<!-- scripts/Animations/MoneyAni.ts&#45;&gt;scripts/FourUI/TopBarController.ts -->
-<g id="edge6" class="edge">
-<title>scripts/Animations/MoneyAni.ts&#45;&gt;scripts/FourUI/TopBarController.ts</title>
-<path fill="none" stroke="#757575" d="M2003.43,-550.22C2042.24,-545.95 2086.83,-541.04 2127.15,-536.6"/>
-<polygon fill="#757575" stroke="#757575" points="2127.35,-540.1 2136.9,-535.52 2126.58,-533.14 2127.35,-540.1"/>
-</g>
-<!-- scripts/Animations/MoneyAni.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge7" class="edge">
-<title>scripts/Animations/MoneyAni.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M1905.76,-573.69C1920.25,-615.83 1974.28,-755.32 2072.25,-814.42 2206.7,-895.52 2301.65,-753.38 2423.5,-852.42 2463.75,-885.13 2434.33,-918.07 2459.5,-963.42 2506.12,-1047.38 2586.97,-1129.37 2625.24,-1165.79"/>
-<polygon fill="#757575" stroke="#757575" points="2622.38,-1167.9 2632.06,-1172.21 2627.18,-1162.8 2622.38,-1167.9"/>
-</g>
-<!-- scripts/FourUI/TopBarController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge130" class="edge">
-<title>scripts/FourUI/TopBarController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2325.05,-511.07C2359.15,-501.99 2397.45,-486.32 2423.5,-459.42 2458.99,-422.76 2418.15,-380.3 2459.5,-350.42 2481.74,-334.34 3632.76,-360.21 3664.75,-388.42 3784.54,-494.04 3800.31,-1041.17 3802.33,-1161.85"/>
-<polygon fill="#757575" stroke="#757575" points="3798.83,-1161.84 3802.48,-1171.79 3805.83,-1161.73 3798.83,-1161.84"/>
-</g>
-<!-- scripts/FourUI/TopBarController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge129" class="edge">
-<title>scripts/FourUI/TopBarController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2357.54,-517.55C2503.82,-511.46 2755.05,-507.88 2835.5,-549.42 2898.5,-581.94 3019.32,-768.46 3059.65,-832.69"/>
-<polygon fill="#757575" stroke="#757575" points="3056.54,-834.32 3064.81,-840.95 3062.48,-830.61 3056.54,-834.32"/>
-</g>
-<!-- scripts/FourUI/TopBarController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge131" class="edge">
-<title>scripts/FourUI/TopBarController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2260.33,-535.79C2291.66,-570.33 2379.34,-671.86 2423.5,-772.42 2453.51,-840.74 2428.38,-868.59 2459.5,-936.42 2503.09,-1031.44 2587.53,-1124.98 2626.23,-1165.06"/>
-<polygon fill="#757575" stroke="#757575" points="2623.64,-1167.42 2633.13,-1172.13 2628.65,-1162.53 2623.64,-1167.42"/>
-</g>
-<!-- scripts/LevelSystem/SaveDataManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge170" class="edge">
-<title>scripts/LevelSystem/SaveDataManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2781.46,-1185.42C3018.08,-1185.42 3506.5,-1185.42 3710.23,-1185.42"/>
-<polygon fill="#757575" stroke="#757575" points="3709.96,-1188.92 3719.96,-1185.42 3709.96,-1181.92 3709.96,-1188.92"/>
-</g>
-<!-- scripts/LevelSystem/SaveDataManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="edge171" class="edge">
-<title>scripts/LevelSystem/SaveDataManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2671.33,-1197.78C2742.04,-1236.08 2957.65,-1352.87 3040.36,-1397.67"/>
-<polygon fill="#757575" stroke="#757575" points="3038.65,-1400.72 3049.11,-1402.41 3041.98,-1394.57 3038.65,-1400.72"/>
-</g>
-<!-- scripts/Animations/PopUPAni.ts -->
-<g id="node11" class="node">
-<title>scripts/Animations/PopUPAni.ts</title>
-<path fill="none" stroke="#cfffac" d="M2742.46,-767.29C2742.46,-767.29 2552.54,-767.29 2552.54,-767.29 2548.58,-767.29 2544.62,-763.33 2544.62,-759.37 2544.62,-759.37 2544.62,-751.46 2544.62,-751.46 2544.62,-747.5 2548.58,-743.54 2552.54,-743.54 2552.54,-743.54 2742.46,-743.54 2742.46,-743.54 2746.42,-743.54 2750.38,-747.5 2750.38,-751.46 2750.38,-751.46 2750.38,-759.37 2750.38,-759.37 2750.38,-763.33 2746.42,-767.29 2742.46,-767.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-749.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Animations/PopUPAni.ts</text>
-</g>
-<!-- scripts/Animations/ToastAni.ts -->
-<g id="node12" class="node">
-<title>scripts/Animations/ToastAni.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3578.83,-421.29C3578.83,-421.29 3398.67,-421.29 3398.67,-421.29 3394.71,-421.29 3390.75,-417.33 3390.75,-413.37 3390.75,-413.37 3390.75,-405.46 3390.75,-405.46 3390.75,-401.5 3394.71,-397.54 3398.67,-397.54 3398.67,-397.54 3578.83,-397.54 3578.83,-397.54 3582.79,-397.54 3586.75,-401.5 3586.75,-405.46 3586.75,-405.46 3586.75,-413.37 3586.75,-413.37 3586.75,-417.33 3582.79,-421.29 3578.83,-421.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3488.75" y="-403.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Animations/ToastAni.ts</text>
-</g>
-<!-- scripts/Animations/ToastAni.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge8" class="edge">
-<title>scripts/Animations/ToastAni.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M3586.8,-403.42C3615.19,-406.61 3644.1,-415.46 3664.75,-435.42 3772.58,-539.6 3797.53,-1046.57 3801.85,-1162"/>
-<polygon fill="#757575" stroke="#757575" points="3798.34,-1161.9 3802.2,-1171.77 3805.34,-1161.65 3798.34,-1161.9"/>
-</g>
-<!-- scripts/AudioManager/AudioConfig.ts -->
-<g id="node13" class="node">
-<title>scripts/AudioManager/AudioConfig.ts</title>
-<path fill="none" stroke="#cfffac" d="M307.71,-2283.29C307.71,-2283.29 84.79,-2283.29 84.79,-2283.29 80.83,-2283.29 76.87,-2279.33 76.87,-2275.37 76.87,-2275.37 76.87,-2267.46 76.87,-2267.46 76.87,-2263.5 80.83,-2259.54 84.79,-2259.54 84.79,-2259.54 307.71,-2259.54 307.71,-2259.54 311.67,-2259.54 315.62,-2263.5 315.62,-2267.46 315.62,-2267.46 315.62,-2275.37 315.62,-2275.37 315.62,-2279.33 311.67,-2283.29 307.71,-2283.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-2265.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/AudioManager/AudioConfig.ts</text>
-</g>
-<!-- scripts/AudioManager/EnemyAudios.ts -->
-<g id="node14" class="node">
-<title>scripts/AudioManager/EnemyAudios.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2764.21,-1585.29C2764.21,-1585.29 2530.79,-1585.29 2530.79,-1585.29 2526.83,-1585.29 2522.88,-1581.33 2522.88,-1577.37 2522.88,-1577.37 2522.88,-1569.46 2522.88,-1569.46 2522.88,-1565.5 2526.83,-1561.54 2530.79,-1561.54 2530.79,-1561.54 2764.21,-1561.54 2764.21,-1561.54 2768.17,-1561.54 2772.12,-1565.5 2772.12,-1569.46 2772.12,-1569.46 2772.12,-1577.37 2772.12,-1577.37 2772.12,-1581.33 2768.17,-1585.29 2764.21,-1585.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-1567.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/AudioManager/EnemyAudios.ts</text>
-</g>
-<!-- scripts/AudioManager/EnemyAudios.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge9" class="edge">
-<title>scripts/AudioManager/EnemyAudios.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2772.26,-1580.76C2795.5,-1576.61 2817.96,-1568.09 2835.5,-1552.42 2889.2,-1504.42 2850.86,-1463.42 2871.5,-1394.42 2932.76,-1189.65 3032.14,-950.7 3063.39,-877.12"/>
-<polygon fill="#757575" stroke="#757575" points="3066.52,-878.73 3067.22,-868.16 3060.08,-875.98 3066.52,-878.73"/>
-</g>
-<!-- scripts/CombatSystem/BallController.ts -->
-<g id="node15" class="node">
-<title>scripts/CombatSystem/BallController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2018.21,-2336.29C2018.21,-2336.29 1783.29,-2336.29 1783.29,-2336.29 1779.33,-2336.29 1775.38,-2332.33 1775.38,-2328.37 1775.38,-2328.37 1775.38,-2320.46 1775.38,-2320.46 1775.38,-2316.5 1779.33,-2312.54 1783.29,-2312.54 1783.29,-2312.54 2018.21,-2312.54 2018.21,-2312.54 2022.17,-2312.54 2026.12,-2316.5 2026.12,-2320.46 2026.12,-2320.46 2026.12,-2328.37 2026.12,-2328.37 2026.12,-2332.33 2022.17,-2336.29 2018.21,-2336.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1900.75" y="-2318.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BallController.ts</text>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Animations/BallAni.ts -->
-<g id="edge10" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Animations/BallAni.ts</title>
-<path fill="none" stroke="#757575" d="M1943.79,-2312.07C1978.08,-2302.43 2027.93,-2289.36 2072.25,-2281.42 2149.53,-2267.56 2359.51,-2288.91 2423.5,-2243.42 2453.96,-2221.76 2428.81,-2188.75 2459.5,-2167.42 2534.23,-2115.48 3137.88,-2089.93 3383.93,-2081.59"/>
-<polygon fill="#757575" stroke="#757575" points="3383.98,-2085.09 3393.86,-2081.25 3383.75,-2078.09 3383.98,-2085.09"/>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge14" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1923.41,-2312.12C1955.15,-2294.57 2016.57,-2262.38 2072.25,-2243.42 2223.44,-2191.92 2294,-2260.92 2423.5,-2167.42 2449.02,-2148.99 2433.31,-2123.88 2459.5,-2106.42 2684.5,-1956.4 3469.5,-2125.52 3664.75,-1938.42 3773.42,-1834.27 3797.73,-1324.92 3801.88,-1208.95"/>
-<polygon fill="#757575" stroke="#757575" points="3805.38,-1209.23 3802.22,-1199.12 3798.38,-1208.99 3805.38,-1209.23"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/WeaponInfo.ts -->
-<g id="node16" class="node">
-<title>scripts/CombatSystem/BlockSelection/WeaponInfo.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2807.33,-3023.29C2807.33,-3023.29 2487.67,-3023.29 2487.67,-3023.29 2483.71,-3023.29 2479.75,-3019.33 2479.75,-3015.37 2479.75,-3015.37 2479.75,-3007.46 2479.75,-3007.46 2479.75,-3003.5 2483.71,-2999.54 2487.67,-2999.54 2487.67,-2999.54 2807.33,-2999.54 2807.33,-2999.54 2811.29,-2999.54 2815.25,-3003.5 2815.25,-3007.46 2815.25,-3007.46 2815.25,-3015.37 2815.25,-3015.37 2815.25,-3019.33 2811.29,-3023.29 2807.33,-3023.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-3005.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BlockSelection/WeaponInfo.ts</text>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts -->
-<g id="edge11" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts</title>
-<path fill="none" stroke="#757575" d="M1912.27,-2336.51C1937.55,-2366.21 2002.12,-2445.95 2036.25,-2523.42 2063.89,-2586.16 2023.88,-2624.83 2072.25,-2673.42 2185.64,-2787.32 2314.81,-2641.01 2423.5,-2759.42 2493.76,-2835.96 2384.47,-2918.53 2459.5,-2990.42 2462.79,-2993.57 2466.28,-2996.44 2469.93,-2999.05"/>
-<polygon fill="#757575" stroke="#757575" points="2467.73,-3001.8 2478.05,-3004.2 2471.48,-2995.89 2467.73,-3001.8"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts -->
-<g id="node17" class="node">
-<title>scripts/CombatSystem/WeaponBullet.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2367.21,-2589.29C2367.21,-2589.29 2128.54,-2589.29 2128.54,-2589.29 2124.58,-2589.29 2120.62,-2585.33 2120.62,-2581.37 2120.62,-2581.37 2120.62,-2573.46 2120.62,-2573.46 2120.62,-2569.5 2124.58,-2565.54 2128.54,-2565.54 2128.54,-2565.54 2367.21,-2565.54 2367.21,-2565.54 2371.17,-2565.54 2375.12,-2569.5 2375.12,-2573.46 2375.12,-2573.46 2375.12,-2581.37 2375.12,-2581.37 2375.12,-2585.33 2371.17,-2589.29 2367.21,-2589.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-2571.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/WeaponBullet.ts</text>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts -->
-<g id="edge12" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts</title>
-<path fill="none" stroke="#757575" d="M1918.4,-2336.62C1974.09,-2377.45 2154.2,-2509.48 2221.34,-2558.7"/>
-<polygon fill="#757575" stroke="#757575" points="2219.04,-2561.35 2229.18,-2564.44 2223.18,-2555.71 2219.04,-2561.35"/>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge13" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1903.1,-2336.5C1909.86,-2390.96 1944.85,-2615.98 2072.25,-2730.42 2193.47,-2839.3 2314.78,-2714.06 2423.5,-2835.42 2482.89,-2901.71 2391.14,-2975.42 2459.5,-3032.42 2498.04,-3064.55 3258.28,-3029.48 3276.75,-3017.42 3428.34,-2918.45 3473.95,-2678 3484.82,-2601.91"/>
-<polygon fill="#757575" stroke="#757575" points="3488.25,-2602.66 3486.13,-2592.28 3481.32,-2601.72 3488.25,-2602.66"/>
-</g>
-<!-- scripts/Core/PhysicsManager.ts -->
-<g id="node19" class="node">
-<title>scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3898.58,-2244.29C3898.58,-2244.29 3708.67,-2244.29 3708.67,-2244.29 3704.71,-2244.29 3700.75,-2240.33 3700.75,-2236.37 3700.75,-2236.37 3700.75,-2228.46 3700.75,-2228.46 3700.75,-2224.5 3704.71,-2220.54 3708.67,-2220.54 3708.67,-2220.54 3898.58,-2220.54 3898.58,-2220.54 3902.54,-2220.54 3906.5,-2224.5 3906.5,-2228.46 3906.5,-2228.46 3906.5,-2236.37 3906.5,-2236.37 3906.5,-2240.33 3902.54,-2244.29 3898.58,-2244.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3803.62" y="-2226.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Core/PhysicsManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
-<g id="edge15" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#757575" d="M2026.45,-2324.76C2132.18,-2324.62 2287.82,-2323.42 2423.5,-2318.42 2894.06,-2301.05 3453.8,-2259.76 3689.33,-2241.44"/>
-<polygon fill="#757575" stroke="#757575" points="3689.43,-2244.94 3699.13,-2240.67 3688.88,-2237.96 3689.43,-2244.94"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/PersistentSkillManager.ts -->
-<g id="node20" class="node">
-<title>scripts/FourUI/SkillSystem/PersistentSkillManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3231.33,-2204.29C3231.33,-2204.29 2916.92,-2204.29 2916.92,-2204.29 2912.96,-2204.29 2909,-2200.33 2909,-2196.37 2909,-2196.37 2909,-2188.46 2909,-2188.46 2909,-2184.5 2912.96,-2180.54 2916.92,-2180.54 2916.92,-2180.54 3231.33,-2180.54 3231.33,-2180.54 3235.29,-2180.54 3239.25,-2184.5 3239.25,-2188.46 3239.25,-2188.46 3239.25,-2196.37 3239.25,-2196.37 3239.25,-2200.33 3235.29,-2204.29 3231.33,-2204.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-2186.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/SkillSystem/PersistentSkillManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts -->
-<g id="edge16" class="edge">
-<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2026.44,-2327.94C2159.96,-2329.34 2361.08,-2323.88 2423.5,-2281.42 2453.41,-2261.07 2429.03,-2227.92 2459.5,-2208.42 2533.95,-2160.76 2769.59,-2168.15 2926.25,-2179.26"/>
-<polygon fill="#757575" stroke="#757575" points="2925.65,-2182.72 2935.88,-2179.95 2926.16,-2175.74 2925.65,-2182.72"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/WeaponInfo.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge33" class="edge">
-<title>scripts/CombatSystem/BlockSelection/WeaponInfo.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2815.47,-3021.72C2975.4,-3028.38 3203,-3028.49 3276.75,-2981.42 3418.05,-2891.23 3470.09,-2673.55 3483.75,-2601.79"/>
-<polygon fill="#757575" stroke="#757575" points="3487.19,-2602.46 3485.54,-2592 3480.3,-2601.21 3487.19,-2602.46"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge106" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2254.78,-2565.2C2275.81,-2523.22 2351.51,-2384.22 2459.5,-2324.42 2619.83,-2235.62 3116.29,-2301.99 3276.75,-2213.42 3298.57,-2201.37 3291.33,-2183.15 3312.75,-2170.42 3449.93,-2088.85 3554.72,-2215.01 3664.75,-2099.42 3791.63,-1966.11 3801.83,-1337.99 3802.58,-1208.71"/>
-<polygon fill="#757575" stroke="#757575" points="3806.08,-1209.02 3802.62,-1199.01 3799.08,-1208.99 3806.08,-1209.02"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge108" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2254.82,-2565.17C2280.61,-2511.41 2383.21,-2290.39 2423.5,-2096.42 2476.57,-1840.93 2384.45,-1760.32 2459.5,-1510.42 2497.15,-1385.04 2591.04,-1256.1 2629.58,-1206.55"/>
-<polygon fill="#757575" stroke="#757575" points="2632.15,-1208.94 2635.58,-1198.92 2626.65,-1204.61 2632.15,-1208.94"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts -->
-<g id="edge98" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts</title>
-<path fill="none" stroke="#757575" d="M2273.26,-2589.67C2312.31,-2610.71 2388.1,-2657.7 2423.5,-2721.42 2482.08,-2826.86 2373.31,-2906.03 2459.5,-2990.42 2462.82,-2993.66 2466.35,-2996.62 2470.05,-2999.3"/>
-<polygon fill="#757575" stroke="#757575" points="2468.01,-3002.15 2478.32,-3004.59 2471.78,-2996.25 2468.01,-3002.15"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge105" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2293.32,-2589.7C2329.94,-2600.97 2382.34,-2619.8 2423.5,-2645.42 2441.93,-2656.88 2439.27,-2670.55 2459.5,-2678.42 2821.57,-2819.26 3307.08,-2650.17 3447.92,-2594.79"/>
-<polygon fill="#757575" stroke="#757575" points="3448.81,-2598.21 3456.81,-2591.26 3446.23,-2591.7 3448.81,-2598.21"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts -->
-<g id="edge107" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2256.16,-2565.2C2286.18,-2515.23 2401.48,-2327.44 2459.5,-2291.42 2530.95,-2247.05 2742.91,-2220 2897.77,-2205.64"/>
-<polygon fill="#757575" stroke="#757575" points="2897.67,-2209.16 2907.31,-2204.76 2897.03,-2202.19 2897.67,-2209.16"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="node23" class="node">
-<title>scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M3232.46,-2879.29C3232.46,-2879.29 2915.79,-2879.29 2915.79,-2879.29 2911.83,-2879.29 2907.88,-2875.33 2907.88,-2871.37 2907.88,-2871.37 2907.88,-2863.46 2907.88,-2863.46 2907.88,-2859.5 2911.83,-2855.54 2915.79,-2855.54 2915.79,-2855.54 3232.46,-2855.54 3232.46,-2855.54 3236.42,-2855.54 3240.38,-2859.5 3240.38,-2863.46 3240.38,-2863.46 3240.38,-2871.37 3240.38,-2871.37 3240.38,-2875.33 3236.42,-2879.29 3232.46,-2879.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-2861.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/SkillSelection/SkillManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge104" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2317.53,-2589.71C2353.34,-2599.35 2395.41,-2616.23 2423.5,-2645.42 2457.42,-2680.65 2421.54,-2718.57 2459.5,-2749.42 2524.88,-2802.53 2753.06,-2780.13 2835.5,-2797.42 2903.11,-2811.59 2979.42,-2835.54 3026.9,-2851.41"/>
-<polygon fill="#757575" stroke="#757575" points="3025.72,-2854.7 3036.31,-2854.58 3027.95,-2848.07 3025.72,-2854.7"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletCount.ts -->
-<g id="node27" class="node">
-<title>scripts/CombatSystem/BulletEffects/BulletCount.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2799.08,-2981.29C2799.08,-2981.29 2495.92,-2981.29 2495.92,-2981.29 2491.96,-2981.29 2488,-2977.33 2488,-2973.37 2488,-2973.37 2488,-2965.46 2488,-2965.46 2488,-2961.5 2491.96,-2957.54 2495.92,-2957.54 2495.92,-2957.54 2799.08,-2957.54 2799.08,-2957.54 2803.04,-2957.54 2807,-2961.5 2807,-2965.46 2807,-2965.46 2807,-2973.37 2807,-2973.37 2807,-2977.33 2803.04,-2981.29 2799.08,-2981.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-2963.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/BulletEffects/BulletCount.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletCount.ts -->
-<g id="edge99" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletCount.ts</title>
-<path fill="none" stroke="#757575" d="M2284.25,-2589.62C2325,-2610.47 2390.55,-2654.76 2423.5,-2712.42 2474.19,-2801.1 2385.65,-2868.84 2459.5,-2939.42 2465.05,-2944.72 2471.17,-2949.23 2477.69,-2953.05"/>
-<polygon fill="#757575" stroke="#757575" points="2475.68,-2955.96 2486.17,-2957.47 2478.92,-2949.75 2475.68,-2955.96"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts -->
-<g id="node28" class="node">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</title>
-<path fill="none" stroke="#ff6c60" d="M2806.58,-2357.29C2806.58,-2357.29 2488.42,-2357.29 2488.42,-2357.29 2484.46,-2357.29 2480.5,-2353.33 2480.5,-2349.37 2480.5,-2349.37 2480.5,-2341.46 2480.5,-2341.46 2480.5,-2337.5 2484.46,-2333.54 2488.42,-2333.54 2488.42,-2333.54 2806.58,-2333.54 2806.58,-2333.54 2810.54,-2333.54 2814.5,-2337.5 2814.5,-2341.46 2814.5,-2341.46 2814.5,-2349.37 2814.5,-2349.37 2814.5,-2353.33 2810.54,-2357.29 2806.58,-2357.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-2339.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletHitEffect.ts -->
-<g id="edge100" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</title>
-<path fill="none" stroke="#757575" d="M2264.95,-2565.16C2323.27,-2526.44 2524.6,-2408.54 2608.9,-2363.2"/>
-<polygon fill="#757575" stroke="#757575" points="2610.54,-2366.29 2617.72,-2358.5 2607.25,-2360.11 2610.54,-2366.29"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
-<g id="node29" class="node">
-<title>scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M3237.33,-2611.29C3237.33,-2611.29 2910.92,-2611.29 2910.92,-2611.29 2906.96,-2611.29 2903,-2607.33 2903,-2603.37 2903,-2603.37 2903,-2595.46 2903,-2595.46 2903,-2591.5 2906.96,-2587.54 2910.92,-2587.54 2910.92,-2587.54 3237.33,-2587.54 3237.33,-2587.54 3241.29,-2587.54 3245.25,-2591.5 3245.25,-2595.46 3245.25,-2595.46 3245.25,-2603.37 3245.25,-2603.37 3245.25,-2607.33 3241.29,-2611.29 3237.33,-2611.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-2593.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
-<g id="edge102" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
-<path fill="none" stroke="#757575" d="M2352.37,-2589.77C2386.44,-2593.29 2424.54,-2596.65 2459.5,-2598.42 2604.59,-2605.75 2769.22,-2605.55 2891.41,-2603.77"/>
-<polygon fill="#757575" stroke="#757575" points="2891.27,-2607.27 2901.22,-2603.62 2891.16,-2600.27 2891.27,-2607.27"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletLifecycle.ts -->
-<g id="node33" class="node">
-<title>scripts/CombatSystem/BulletEffects/BulletLifecycle.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2807.33,-2669.29C2807.33,-2669.29 2487.67,-2669.29 2487.67,-2669.29 2483.71,-2669.29 2479.75,-2665.33 2479.75,-2661.37 2479.75,-2661.37 2479.75,-2653.46 2479.75,-2653.46 2479.75,-2649.5 2483.71,-2645.54 2487.67,-2645.54 2487.67,-2645.54 2807.33,-2645.54 2807.33,-2645.54 2811.29,-2645.54 2815.25,-2649.5 2815.25,-2653.46 2815.25,-2653.46 2815.25,-2661.37 2815.25,-2661.37 2815.25,-2665.33 2811.29,-2669.29 2807.33,-2669.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-2651.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BulletEffects/BulletLifecycle.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletLifecycle.ts -->
-<g id="edge101" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletLifecycle.ts</title>
-<path fill="none" stroke="#757575" d="M2290.91,-2589.69C2333.2,-2601.68 2400.43,-2619.77 2459.5,-2631.42 2482.54,-2635.96 2507.34,-2639.99 2531.09,-2643.45"/>
-<polygon fill="#757575" stroke="#757575" points="2530.4,-2646.89 2540.8,-2644.83 2531.39,-2639.96 2530.4,-2646.89"/>
-</g>
-<!-- scripts/CombatSystem/BulletTrailController.ts -->
-<g id="node34" class="node">
-<title>scripts/CombatSystem/BulletTrailController.ts</title>
-<path fill="none" stroke="#cfffac" d="M2783.71,-2589.29C2783.71,-2589.29 2511.29,-2589.29 2511.29,-2589.29 2507.33,-2589.29 2503.38,-2585.33 2503.38,-2581.37 2503.38,-2581.37 2503.38,-2573.46 2503.38,-2573.46 2503.38,-2569.5 2507.33,-2565.54 2511.29,-2565.54 2511.29,-2565.54 2783.71,-2565.54 2783.71,-2565.54 2787.67,-2565.54 2791.62,-2569.5 2791.62,-2573.46 2791.62,-2573.46 2791.62,-2581.37 2791.62,-2581.37 2791.62,-2585.33 2787.67,-2589.29 2783.71,-2589.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-2571.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/BulletTrailController.ts</text>
-</g>
-<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletTrailController.ts -->
-<g id="edge103" class="edge">
-<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletTrailController.ts</title>
-<path fill="none" stroke="#757575" d="M2375.51,-2577.42C2412.44,-2577.42 2453.22,-2577.42 2491.69,-2577.42"/>
-<polygon fill="#757575" stroke="#757575" points="2491.49,-2580.92 2501.49,-2577.42 2491.49,-2573.92 2491.49,-2580.92"/>
-</g>
-<!-- scripts/Core/ConfigManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge109" class="edge">
-<title>scripts/Core/ConfigManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M3512.28,-2566.2C3580.37,-2528.3 3786.63,-2406.03 3906.5,-2253.42 3975.17,-2165.98 4016.8,-2036.97 4031.73,-1984.69"/>
-<polygon fill="#757575" stroke="#757575" points="4035.08,-1985.69 4034.4,-1975.11 4028.34,-1983.81 4035.08,-1985.69"/>
-</g>
-<!-- scripts/Core/PhysicsManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge110" class="edge">
-<title>scripts/Core/PhysicsManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M3815.26,-2220.07C3852.02,-2177.38 3973.99,-2035.75 4020.12,-1982.18"/>
-<polygon fill="#757575" stroke="#757575" points="4022.71,-1984.53 4026.58,-1974.67 4017.4,-1979.97 4022.71,-1984.53"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillConfigManager.ts -->
-<g id="node55" class="node">
-<title>scripts/FourUI/SkillSystem/SkillConfigManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M3635.46,-1703.29C3635.46,-1703.29 3342.04,-1703.29 3342.04,-1703.29 3338.08,-1703.29 3334.12,-1699.33 3334.12,-1695.37 3334.12,-1695.37 3334.12,-1687.46 3334.12,-1687.46 3334.12,-1683.5 3338.08,-1679.54 3342.04,-1679.54 3342.04,-1679.54 3635.46,-1679.54 3635.46,-1679.54 3639.42,-1679.54 3643.38,-1683.5 3643.38,-1687.46 3643.38,-1687.46 3643.38,-1695.37 3643.38,-1695.37 3643.38,-1699.33 3639.42,-1703.29 3635.46,-1703.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3488.75" y="-1685.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/FourUI/SkillSystem/SkillConfigManager.ts</text>
-</g>
-<!-- scripts/FourUI/SkillSystem/PersistentSkillManager.ts&#45;&gt;scripts/FourUI/SkillSystem/SkillConfigManager.ts -->
-<g id="edge123" class="edge">
-<title>scripts/FourUI/SkillSystem/PersistentSkillManager.ts&#45;&gt;scripts/FourUI/SkillSystem/SkillConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M3084.92,-2180.53C3138.97,-2114.89 3400.98,-1796.77 3470.69,-1712.13"/>
-<polygon fill="#757575" stroke="#757575" points="3473.25,-1714.53 3476.9,-1704.58 3467.84,-1710.08 3473.25,-1714.53"/>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts -->
-<g id="node21" class="node">
-<title>scripts/CombatSystem/BlockManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2021.21,-2049.29C2021.21,-2049.29 1780.29,-2049.29 1780.29,-2049.29 1776.33,-2049.29 1772.38,-2045.33 1772.38,-2041.37 1772.38,-2041.37 1772.38,-2033.46 1772.38,-2033.46 1772.38,-2029.5 1776.33,-2025.54 1780.29,-2025.54 1780.29,-2025.54 2021.21,-2025.54 2021.21,-2025.54 2025.17,-2025.54 2029.12,-2029.5 2029.12,-2033.46 2029.12,-2033.46 2029.12,-2041.37 2029.12,-2041.37 2029.12,-2045.33 2025.17,-2049.29 2021.21,-2049.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1900.75" y="-2031.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BlockManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge20" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1976.32,-2025.04C2194.92,-1988.63 2819.81,-1883.46 2835.5,-1868.42 2888.12,-1817.98 2820.72,-1760.7 2871.5,-1708.42 3125.04,-1447.36 3388.12,-1741.87 3664.75,-1505.42 3759.2,-1424.69 3790.84,-1267.51 3799.66,-1208.52"/>
-<polygon fill="#757575" stroke="#757575" points="3803.08,-1209.38 3801,-1198.99 3796.15,-1208.4 3803.08,-1209.38"/>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge23" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M1908.31,-2025.07C1930.5,-1982.67 2003.24,-1838.52 2036.25,-1710.42 2053.78,-1642.4 2022.78,-1446.27 2072.25,-1396.42 2183.03,-1284.78 2301.17,-1452.27 2423.5,-1353.42 2461.54,-1322.67 2424.85,-1283.94 2459.5,-1249.42 2483.85,-1225.15 2517.78,-1210.08 2550.06,-1200.72"/>
-<polygon fill="#757575" stroke="#757575" points="2550.74,-1204.16 2559.46,-1198.15 2548.9,-1197.4 2550.74,-1204.16"/>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge19" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2009.71,-2025.05C2144.86,-2012.18 2365.71,-2000.61 2423.5,-2054.42 2479.92,-2106.94 2407.37,-2342.63 2459.5,-2399.42 2521.64,-2467.11 3186.34,-2509.98 3276.75,-2526.42 3330.59,-2536.2 3391.15,-2551.59 3433.54,-2563.09"/>
-<polygon fill="#757575" stroke="#757575" points="3432.42,-2566.41 3442.99,-2565.67 3434.26,-2559.66 3432.42,-2566.41"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/BlockTag.ts -->
-<g id="node22" class="node">
-<title>scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
-<path fill="none" stroke="#cfffac" d="M2398.71,-2087.29C2398.71,-2087.29 2097.04,-2087.29 2097.04,-2087.29 2093.08,-2087.29 2089.12,-2083.33 2089.12,-2079.37 2089.12,-2079.37 2089.12,-2071.46 2089.12,-2071.46 2089.12,-2067.5 2093.08,-2063.54 2097.04,-2063.54 2097.04,-2063.54 2398.71,-2063.54 2398.71,-2063.54 2402.67,-2063.54 2406.62,-2067.5 2406.62,-2071.46 2406.62,-2071.46 2406.62,-2079.37 2406.62,-2079.37 2406.62,-2083.33 2402.67,-2087.29 2398.71,-2087.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-2069.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/BlockSelection/BlockTag.ts</text>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts -->
-<g id="edge17" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
-<path fill="none" stroke="#757575" d="M2013.8,-2049.75C2048.85,-2053.61 2087.72,-2057.89 2123.5,-2061.83"/>
-<polygon fill="#757575" stroke="#757575" points="2122.67,-2065.26 2133,-2062.88 2123.44,-2058.3 2122.67,-2065.26"/>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge18" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M1909.99,-2049.76C1934.06,-2086.52 2004.6,-2199.18 2036.25,-2303.42 2055.44,-2366.61 2028.34,-2549.09 2072.25,-2598.42 2179.05,-2718.38 2304.62,-2575.41 2423.5,-2683.42 2459.7,-2716.31 2421.54,-2756.57 2459.5,-2787.42 2524.88,-2840.53 2751.98,-2824.46 2835.5,-2835.42 2880.02,-2841.25 2929.21,-2847.85 2971.22,-2853.54"/>
-<polygon fill="#757575" stroke="#757575" points="2970.71,-2857 2981.09,-2854.87 2971.65,-2850.06 2970.71,-2857"/>
-</g>
-<!-- scripts/Core/LevelSessionManager.ts -->
-<g id="node24" class="node">
-<title>scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M2359.71,-1273.29C2359.71,-1273.29 2136.04,-1273.29 2136.04,-1273.29 2132.08,-1273.29 2128.12,-1269.33 2128.12,-1265.37 2128.12,-1265.37 2128.12,-1257.46 2128.12,-1257.46 2128.12,-1253.5 2132.08,-1249.54 2136.04,-1249.54 2136.04,-1249.54 2359.71,-1249.54 2359.71,-1249.54 2363.67,-1249.54 2367.62,-1253.5 2367.62,-1257.46 2367.62,-1257.46 2367.62,-1265.37 2367.62,-1265.37 2367.62,-1269.33 2363.67,-1273.29 2359.71,-1273.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-1255.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Core/LevelSessionManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge21" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M1908.36,-2025.08C1930.71,-1982.72 2003.93,-1838.69 2036.25,-1710.42 2055.19,-1635.24 2030.24,-1428.57 2072.25,-1363.42 2100.14,-1320.17 2153.33,-1293.01 2193.71,-1277.69"/>
-<polygon fill="#757575" stroke="#757575" points="2194.85,-1281 2203.04,-1274.29 2192.45,-1274.42 2194.85,-1281"/>
-</g>
-<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="edge22" class="edge">
-<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1932.38,-2025.1C1960.29,-2013.36 2002.24,-1994.39 2036.25,-1973.42 2053.5,-1962.78 2053.94,-1954.12 2072.25,-1945.42 2216.94,-1876.62 2284.43,-1943.95 2423.5,-1864.42 2443.69,-1852.87 2440.37,-1839.65 2459.5,-1826.42 2608.58,-1723.3 2686.64,-1771.85 2835.5,-1668.42 2934.16,-1599.86 3023.27,-1484.64 3057.87,-1437.01"/>
-<polygon fill="#757575" stroke="#757575" points="3060.71,-1439.06 3063.7,-1428.9 3055.03,-1434.97 3060.71,-1439.06"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts -->
-<g id="node26" class="node">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1721.33,-2125.29C1721.33,-2125.29 1347.67,-2125.29 1347.67,-2125.29 1343.71,-2125.29 1339.75,-2121.33 1339.75,-2117.37 1339.75,-2117.37 1339.75,-2109.46 1339.75,-2109.46 1339.75,-2105.5 1343.71,-2101.54 1347.67,-2101.54 1347.67,-2101.54 1721.33,-2101.54 1721.33,-2101.54 1725.29,-2101.54 1729.25,-2105.5 1729.25,-2109.46 1729.25,-2109.46 1729.25,-2117.37 1729.25,-2117.37 1729.25,-2121.33 1725.29,-2125.29 1721.33,-2125.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1534.5" y="-2107.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</text>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge31" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1544.22,-2101.27C1573.85,-2059.51 1672.04,-1917.25 1729.25,-1787.42 1751.53,-1736.85 1727.81,-1709.05 1765.25,-1668.42 1864.63,-1560.56 1929.63,-1581.61 2072.25,-1547.42 2595.03,-1422.06 2749.47,-1541.27 3276.75,-1436.42 3453.92,-1401.18 3508.82,-1406.6 3664.75,-1315.42 3715.01,-1286.02 3761.68,-1235.13 3785.7,-1206.52"/>
-<polygon fill="#757575" stroke="#757575" points="3788.32,-1208.84 3791.98,-1198.9 3782.92,-1204.39 3788.32,-1208.84"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge24" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M1545.8,-2101.12C1579.54,-2059.98 1687.04,-1922.18 1729.25,-1787.42 1763.07,-1679.42 1702.2,-1373.4 1765.25,-1279.42 1850.07,-1152.98 1930.86,-1183.9 2072.25,-1127.42 2239.57,-1060.56 2283.22,-1044.71 2459.5,-1007.42 2624.11,-972.59 2673.49,-1008.82 2835.5,-963.42 2913.59,-941.53 2998.43,-897.1 3042.56,-872.25"/>
-<polygon fill="#757575" stroke="#757575" points="3044.08,-875.41 3051.04,-867.42 3040.62,-869.32 3044.08,-875.41"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BallController.ts -->
-<g id="edge25" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BallController.ts</title>
-<path fill="none" stroke="#757575" d="M1556.66,-2125.67C1618.02,-2161.22 1796.26,-2264.47 1868.65,-2306.4"/>
-<polygon fill="#757575" stroke="#757575" points="1866.82,-2309.38 1877.22,-2311.37 1870.33,-2303.33 1866.82,-2309.38"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts -->
-<g id="edge28" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/WeaponInfo.ts</title>
-<path fill="none" stroke="#757575" d="M1541.43,-2125.58C1565.15,-2173.49 1657.07,-2352.47 1765.25,-2475.42 1882.42,-2608.58 1915.9,-2646.66 2072.25,-2730.42 2215.88,-2807.36 2311.93,-2716.67 2423.5,-2835.42 2471.93,-2886.96 2406.67,-2943.4 2459.5,-2990.42 2462.74,-2993.3 2466.15,-2995.94 2469.7,-2998.36"/>
-<polygon fill="#757575" stroke="#757575" points="2467.74,-3001.27 2478.11,-3003.46 2471.37,-2995.28 2467.74,-3001.27"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge30" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1538.45,-2125.51C1553.31,-2184.5 1624.95,-2445.61 1765.25,-2606.42 2006.52,-2882.94 2107.43,-2949.88 2459.5,-3053.42 2512.12,-3068.89 3275.17,-3044.46 3276.75,-3043.42 3436.14,-2938.14 3476.7,-2680.66 3485.54,-2601.77"/>
-<polygon fill="#757575" stroke="#757575" points="3488.99,-2602.51 3486.55,-2592.2 3482.02,-2601.78 3488.99,-2602.51"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts -->
-<g id="edge26" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts</title>
-<path fill="none" stroke="#757575" d="M1649.46,-2101.06C1675.79,-2097.39 1703.6,-2092.86 1729.25,-2087.42 1771.72,-2078.39 1819.04,-2064.17 1853.03,-2053.2"/>
-<polygon fill="#757575" stroke="#757575" points="1853.71,-2056.66 1862.13,-2050.23 1851.54,-2050.01 1853.71,-2056.66"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts -->
-<g id="edge27" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
-<path fill="none" stroke="#757575" d="M1729.42,-2103.06C1838.28,-2097.24 1972.83,-2090.05 2077.44,-2084.47"/>
-<polygon fill="#757575" stroke="#757575" points="2077.44,-2087.97 2087.24,-2083.94 2077.07,-2080.98 2077.44,-2087.97"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge29" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M1545.06,-2125.7C1574.48,-2162.88 1667.59,-2275.87 1765.25,-2345.42 1874.07,-2422.9 1954.3,-2369.92 2036.25,-2475.42 2086.3,-2539.84 2014.62,-2597.67 2072.25,-2655.42 2184.75,-2768.15 2302.79,-2622.51 2423.5,-2726.42 2458.98,-2756.96 2422.09,-2797.26 2459.5,-2825.42 2493.82,-2851.24 2727.36,-2861.2 2896.16,-2865.03"/>
-<polygon fill="#757575" stroke="#757575" points="2895.85,-2868.52 2905.92,-2865.24 2896,-2861.52 2895.85,-2868.52"/>
-</g>
-<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge32" class="edge">
-<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M1545.13,-2101.26C1577.22,-2060.01 1681.28,-1920.59 1729.25,-1787.42 1764.32,-1690.07 1711.91,-1646.08 1765.25,-1557.42 1842.82,-1428.46 1927,-1457.91 2036.25,-1354.42 2054.34,-1337.27 2051.35,-1325 2072.25,-1311.42 2097.45,-1295.03 2128.1,-1283.92 2156.64,-1276.42"/>
-<polygon fill="#757575" stroke="#757575" points="2157.14,-1279.91 2165.99,-1274.09 2155.44,-1273.11 2157.14,-1279.91"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts -->
-<g id="edge35" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts</title>
-<path fill="none" stroke="#757575" d="M2617.4,-2981.75C2576.36,-2991.99 2501.78,-2997.82 2459.5,-2957.42 2385.65,-2886.84 2474.19,-2819.1 2423.5,-2730.42 2387.52,-2667.47 2312.69,-2620.45 2273.71,-2595.74"/>
-<polygon fill="#757575" stroke="#757575" points="2275.75,-2592.89 2265.44,-2590.46 2271.99,-2598.79 2275.75,-2592.89"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge36" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2807.21,-2981.33C2967.08,-2990.32 3200.66,-2994.33 3276.75,-2948.42 3409.96,-2868.03 3466.73,-2669.84 3482.73,-2601.8"/>
-<polygon fill="#757575" stroke="#757575" points="3486.12,-2602.66 3484.92,-2592.14 3479.3,-2601.12 3486.12,-2602.66"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge34" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletCount.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2807.2,-2960.25C2817.03,-2957.05 2826.55,-2953.15 2835.5,-2948.42 2857.23,-2936.91 2850.25,-2918.77 2871.5,-2906.42 2889.4,-2896.01 2909.55,-2888.32 2930.01,-2882.65"/>
-<polygon fill="#757575" stroke="#757575" points="2930.8,-2886.06 2939.6,-2880.16 2929.04,-2879.28 2930.8,-2886.06"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge44" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2814.94,-2340.17C3072.81,-2328.35 3551.11,-2290.41 3664.75,-2170.42 3801.34,-2026.19 3803.78,-1345.58 3802.87,-1209.23"/>
-<polygon fill="#757575" stroke="#757575" points="3806.37,-1209.26 3802.79,-1199.28 3799.37,-1209.31 3806.37,-1209.26"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge37" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2654.82,-2333.32C2682.21,-2280.22 2791.3,-2061.78 2835.5,-1868.42 2882.58,-1662.45 2826.1,-1600.75 2871.5,-1394.42 2917.43,-1185.68 3027.06,-949.38 3062.13,-876.79"/>
-<polygon fill="#757575" stroke="#757575" points="3065.21,-878.46 3066.44,-867.94 3058.92,-875.4 3065.21,-878.46"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts -->
-<g id="edge42" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts</title>
-<path fill="none" stroke="#757575" d="M2630.35,-2357.72C2571.91,-2396.51 2370.54,-2514.42 2286.35,-2559.7"/>
-<polygon fill="#757575" stroke="#757575" points="2284.72,-2556.6 2277.54,-2564.39 2288.01,-2562.78 2284.72,-2556.6"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge43" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2799.62,-2357.65C2812.07,-2361.27 2824.2,-2365.79 2835.5,-2371.42 2855.76,-2381.5 2851.08,-2397.66 2871.5,-2407.42 3034.94,-2485.47 3105.14,-2392.5 3276.75,-2450.42 3351.22,-2475.55 3427.32,-2530.39 3464.46,-2559.46"/>
-<polygon fill="#757575" stroke="#757575" points="3461.84,-2561.85 3471.86,-2565.32 3466.19,-2556.36 3461.84,-2561.85"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts -->
-<g id="edge45" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2682.53,-2333.15C2758.7,-2305.71 2942.91,-2239.33 3028.29,-2208.57"/>
-<polygon fill="#757575" stroke="#757575" points="3029.29,-2211.93 3037.51,-2205.25 3026.91,-2205.35 3029.29,-2211.93"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
-<g id="edge38" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
-<path fill="none" stroke="#757575" d="M2668.98,-2357.67C2737.93,-2398.91 2961.84,-2532.85 3043.21,-2581.52"/>
-<polygon fill="#757575" stroke="#757575" points="3041.17,-2584.38 3051.55,-2586.51 3044.77,-2578.37 3041.17,-2584.38"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BurnEffect.ts -->
-<g id="edge39" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BurnEffect.ts</title>
-<path fill="none" stroke="#757575" d="M2656.98,-2333.11C2709.48,-2256.96 2990.06,-1849.91 3058.21,-1751.06"/>
-<polygon fill="#757575" stroke="#757575" points="3060.97,-1753.22 3063.76,-1743 3055.21,-1749.24 3060.97,-1753.22"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnArea.ts -->
-<g id="node31" class="node">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnArea.ts</title>
-<path fill="none" stroke="#ff6c60" d="M3656.83,-2360.29C3656.83,-2360.29 3320.67,-2360.29 3320.67,-2360.29 3316.71,-2360.29 3312.75,-2356.33 3312.75,-2352.37 3312.75,-2352.37 3312.75,-2344.46 3312.75,-2344.46 3312.75,-2340.5 3316.71,-2336.54 3320.67,-2336.54 3320.67,-2336.54 3656.83,-2336.54 3656.83,-2336.54 3660.79,-2336.54 3664.75,-2340.5 3664.75,-2344.46 3664.75,-2344.46 3664.75,-2352.37 3664.75,-2352.37 3664.75,-2356.33 3660.79,-2360.29 3656.83,-2360.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3488.75" y="-2342.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/BulletEffects/GroundBurnArea.ts</text>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnArea.ts -->
-<g id="edge40" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnArea.ts</title>
-<path fill="none" stroke="#757575" d="M2814.81,-2346.01C2955,-2346.51 3155.46,-2347.23 3301.1,-2347.75"/>
-<polygon fill="#757575" stroke="#757575" points="3300.84,-2351.25 3310.86,-2347.78 3300.87,-2344.25 3300.84,-2351.25"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts -->
-<g id="node32" class="node">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts</title>
-<path fill="none" stroke="#ff6c60" d="M3268.83,-2398.29C3268.83,-2398.29 2879.42,-2398.29 2879.42,-2398.29 2875.46,-2398.29 2871.5,-2394.33 2871.5,-2390.37 2871.5,-2390.37 2871.5,-2382.46 2871.5,-2382.46 2871.5,-2378.5 2875.46,-2374.54 2879.42,-2374.54 2879.42,-2374.54 3268.83,-2374.54 3268.83,-2374.54 3272.79,-2374.54 3276.75,-2378.5 3276.75,-2382.46 3276.75,-2382.46 3276.75,-2390.37 3276.75,-2390.37 3276.75,-2394.33 3272.79,-2398.29 3268.83,-2398.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-2380.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts -->
-<g id="edge41" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts</title>
-<path fill="none" stroke="#757575" d="M2776.48,-2357.77C2826.08,-2362.56 2883.02,-2368.06 2933.67,-2372.95"/>
-<polygon fill="#757575" stroke="#757575" points="2933.25,-2376.43 2943.54,-2373.9 2933.92,-2369.46 2933.25,-2376.43"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletTrajectory.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge48" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletTrajectory.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M3245.64,-2590.74C3290.35,-2588.46 3337.38,-2586.07 3377.97,-2584"/>
-<polygon fill="#757575" stroke="#757575" points="3377.92,-2587.51 3387.73,-2583.51 3377.57,-2580.52 3377.92,-2587.51"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BurnEffect.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge49" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BurnEffect.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M3189.61,-1741.76C3340.18,-1755.42 3593.97,-1768.71 3664.75,-1712.42 3746.48,-1647.41 3789.81,-1302.35 3800.16,-1208.82"/>
-<polygon fill="#757575" stroke="#757575" points="3803.62,-1209.39 3801.22,-1199.07 3796.66,-1208.64 3803.62,-1209.39"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge51" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M3647.75,-2336.07C3653.89,-2332.22 3659.61,-2327.7 3664.75,-2322.42 3705.26,-2280.8 3786.69,-1367.84 3800.59,-1208.9"/>
-<polygon fill="#757575" stroke="#757575" points="3804.05,-1209.46 3801.43,-1199.19 3797.08,-1208.85 3804.05,-1209.46"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
-<g id="edge52" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#757575" d="M3617.11,-2336.1C3633.42,-2332.61 3649.67,-2328.14 3664.75,-2322.42 3709.02,-2305.61 3753.73,-2272.86 3779.77,-2251.85"/>
-<polygon fill="#757575" stroke="#757575" points="3781.81,-2254.7 3787.32,-2245.65 3777.37,-2249.29 3781.81,-2254.7"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts -->
-<g id="edge50" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnArea.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts</title>
-<path fill="none" stroke="#757575" d="M3412.18,-2360.74C3376.88,-2364.87 3332.91,-2369.38 3288.5,-2373.51"/>
-<polygon fill="#757575" stroke="#757575" points="3288.35,-2370.01 3278.71,-2374.41 3288.99,-2376.98 3288.35,-2370.01"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts -->
-<g id="edge54" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts</title>
-<path fill="none" stroke="#757575" d="M3045.13,-2398.75C3001.23,-2417.66 2913.19,-2453.88 2835.5,-2475.42 2656.06,-2525.15 2607.17,-2520.81 2423.5,-2551.42 2398.85,-2555.52 2372.2,-2559.65 2347.31,-2563.37"/>
-<polygon fill="#757575" stroke="#757575" points="2346.89,-2559.89 2337.51,-2564.82 2347.92,-2566.82 2346.89,-2559.89"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge55" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M3234.66,-2398.78C3249.17,-2402.34 3263.41,-2406.81 3276.75,-2412.42 3358.37,-2446.67 3435.01,-2521.45 3469.14,-2557.78"/>
-<polygon fill="#757575" stroke="#757575" points="3466.49,-2560.07 3475.85,-2565.03 3471.63,-2555.32 3466.49,-2560.07"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
-<g id="edge56" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#757575" d="M3277.16,-2396.23C3419.83,-2400.24 3597.17,-2398.43 3664.75,-2369.42 3721.27,-2345.15 3767.2,-2285.99 3788.97,-2253.92"/>
-<polygon fill="#757575" stroke="#757575" points="3791.74,-2256.08 3794.34,-2245.8 3785.9,-2252.22 3791.74,-2256.08"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnArea.ts -->
-<g id="edge53" class="edge">
-<title>scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnArea.ts</title>
-<path fill="none" stroke="#757575" d="M3150.81,-2374.08C3193.16,-2369.13 3248,-2363.62 3301.08,-2358.88"/>
-<polygon fill="#757575" stroke="#757575" points="3301.22,-2362.39 3310.87,-2358.02 3300.6,-2355.41 3301.22,-2362.39"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge47" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2815.75,-2653.82C2942.66,-2649.58 3121.24,-2640.38 3276.75,-2620.42 3326.97,-2613.97 3383.18,-2602.57 3424.94,-2593.27"/>
-<polygon fill="#757575" stroke="#757575" points="3425.59,-2596.72 3434.57,-2591.11 3424.05,-2589.89 3425.59,-2596.72"/>
-</g>
-<!-- scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
-<g id="edge46" class="edge">
-<title>scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
-<path fill="none" stroke="#757575" d="M2739.07,-2645.04C2807.28,-2635.73 2900.8,-2622.95 2971.54,-2613.29"/>
-<polygon fill="#757575" stroke="#757575" points="2971.76,-2616.79 2981.19,-2611.97 2970.81,-2609.86 2971.76,-2616.79"/>
-</g>
-<!-- scripts/CombatSystem/CoinDrop.ts -->
-<g id="node35" class="node">
-<title>scripts/CombatSystem/CoinDrop.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2006.58,-1312.29C2006.58,-1312.29 1794.92,-1312.29 1794.92,-1312.29 1790.96,-1312.29 1787,-1308.33 1787,-1304.37 1787,-1304.37 1787,-1296.46 1787,-1296.46 1787,-1292.5 1790.96,-1288.54 1794.92,-1288.54 1794.92,-1288.54 2006.58,-1288.54 2006.58,-1288.54 2010.54,-1288.54 2014.5,-1292.5 2014.5,-1296.46 2014.5,-1296.46 2014.5,-1304.37 2014.5,-1304.37 2014.5,-1308.33 2010.54,-1312.29 2006.58,-1312.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1900.75" y="-1294.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/CoinDrop.ts</text>
-</g>
-<!-- scripts/CombatSystem/CoinDrop.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge57" class="edge">
-<title>scripts/CombatSystem/CoinDrop.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M2010.95,-1288.08C2047.71,-1283.92 2088.92,-1279.26 2126.49,-1275.02"/>
-<polygon fill="#757575" stroke="#757575" points="2126.45,-1278.55 2135.99,-1273.95 2125.66,-1271.59 2126.45,-1278.55"/>
-</g>
-<!-- scripts/CombatSystem/EnemyComponent.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge58" class="edge">
-<title>scripts/CombatSystem/EnemyComponent.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2708.37,-1859.7C2835.42,-1889.1 3132.17,-1976.12 3276.75,-2171.42 3329.97,-2243.3 3274.78,-2288.43 3312.75,-2369.42 3350.42,-2449.74 3426.76,-2524.5 3464.94,-2558.77"/>
-<polygon fill="#757575" stroke="#757575" points="3462.41,-2561.2 3472.21,-2565.21 3467.05,-2555.96 3462.41,-2561.2"/>
-</g>
-<!-- scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/Animations/DamageNumberAni.ts -->
-<g id="edge68" class="edge">
-<title>scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/Animations/DamageNumberAni.ts</title>
-<path fill="none" stroke="#757575" d="M2380.16,-1600.59C2395.18,-1596.82 2409.94,-1591.88 2423.5,-1585.42 2443.09,-1576.07 2439.74,-1561.4 2459.5,-1552.42 2473.38,-1546.1 2488.41,-1541.39 2503.72,-1537.91"/>
-<polygon fill="#757575" stroke="#757575" points="2504.34,-1541.36 2513.42,-1535.9 2502.92,-1534.51 2504.34,-1541.36"/>
-</g>
-<!-- scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/Animations/HPBarAnimation.ts -->
-<g id="edge69" class="edge">
-<title>scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/Animations/HPBarAnimation.ts</title>
-<path fill="none" stroke="#757575" d="M2380.45,-1612.74C2423.21,-1613.17 2470.68,-1613.65 2513.54,-1614.08"/>
-<polygon fill="#757575" stroke="#757575" points="2513.37,-1617.58 2523.4,-1614.18 2513.44,-1610.58 2513.37,-1617.58"/>
-</g>
-<!-- scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/AudioManager/EnemyAudios.ts -->
-<g id="edge70" class="edge">
-<title>scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/AudioManager/EnemyAudios.ts</title>
-<path fill="none" stroke="#757575" d="M2378.25,-1599.05C2420.8,-1594.98 2468.22,-1590.45 2511.2,-1586.35"/>
-<polygon fill="#757575" stroke="#757575" points="2511.48,-1589.83 2521.11,-1585.4 2510.82,-1582.87 2511.48,-1589.83"/>
-</g>
-<!-- scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/CombatSystem/EnemyComponent.ts -->
-<g id="edge71" class="edge">
-<title>scripts/CombatSystem/EnemyInstance.ts&#45;&gt;scripts/CombatSystem/EnemyComponent.ts</title>
-<path fill="none" stroke="#757575" d="M2269.69,-1623.77C2335.45,-1662.8 2538.93,-1783.57 2616.26,-1829.47"/>
-<polygon fill="#757575" stroke="#757575" points="2614.2,-1832.31 2624.59,-1834.41 2617.77,-1826.3 2614.2,-1832.31"/>
-</g>
-<!-- scripts/CombatSystem/Wall.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge96" class="edge">
-<title>scripts/CombatSystem/Wall.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2346.64,-1835.22C2382.17,-1832.32 2422.64,-1829.11 2459.5,-1826.42 2593.35,-1816.63 3561.92,-1833.65 3664.75,-1747.42 3750.21,-1675.75 3791.14,-1305.65 3800.5,-1208.69"/>
-<polygon fill="#757575" stroke="#757575" points="3803.97,-1209.12 3801.43,-1198.84 3797.01,-1208.47 3803.97,-1209.12"/>
-</g>
-<!-- scripts/CombatSystem/Wall.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge97" class="edge">
-<title>scripts/CombatSystem/Wall.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2261.92,-1831.43C2294.1,-1801.19 2377.92,-1718.04 2423.5,-1632.42 2450.06,-1582.51 2437.25,-1562.39 2459.5,-1510.42 2511.16,-1389.77 2597.43,-1257.58 2631.76,-1206.85"/>
-<polygon fill="#757575" stroke="#757575" points="2634.5,-1209.05 2637.23,-1198.81 2628.71,-1205.11 2634.5,-1209.05"/>
-</g>
-<!-- scripts/CombatSystem/Wall.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge95" class="edge">
-<title>scripts/CombatSystem/Wall.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2264.22,-1855.69C2299.95,-1885.33 2388.36,-1965.02 2423.5,-2054.42 2448.9,-2119.05 2413.66,-2626.24 2459.5,-2678.42 2571.75,-2806.17 2674.27,-2695.31 2835.5,-2749.42 2914.13,-2775.8 2999.71,-2823.45 3043.56,-2849.39"/>
-<polygon fill="#757575" stroke="#757575" points="3041.6,-2852.3 3051.98,-2854.42 3045.18,-2846.29 3041.6,-2852.3"/>
-</g>
-<!-- scripts/CombatSystem/GameEnd.ts -->
-<g id="node40" class="node">
-<title>scripts/CombatSystem/GameEnd.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M304.71,-1020.29C304.71,-1020.29 87.79,-1020.29 87.79,-1020.29 83.83,-1020.29 79.88,-1016.33 79.88,-1012.37 79.88,-1012.37 79.88,-1004.46 79.88,-1004.46 79.88,-1000.5 83.83,-996.54 87.79,-996.54 87.79,-996.54 304.71,-996.54 304.71,-996.54 308.67,-996.54 312.62,-1000.5 312.62,-1004.46 312.62,-1004.46 312.62,-1012.37 312.62,-1012.37 312.62,-1016.33 308.67,-1020.29 304.71,-1020.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-1002.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/GameEnd.ts</text>
-</g>
-<!-- scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge73" class="edge">
-<title>scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M205.03,-996.4C245.78,-934.39 441.8,-647.71 674.75,-501.42 1007.31,-292.56 1140.8,-293.42 1533.5,-293.42 1533.5,-293.42 1533.5,-293.42 1901.75,-293.42 2133.95,-293.42 2229.2,-193.28 2423.5,-320.42 2453.44,-340 2429.92,-372.29 2459.5,-392.42 2528.85,-439.59 2752,-417.42 2835.5,-425.42 2858.55,-427.62 3647.75,-495.69 3664.75,-511.42 3697.27,-541.48 3692.13,-663.98 3700.75,-707.42 3735.56,-882.89 3782.13,-1093.56 3797.48,-1162.42"/>
-<polygon fill="#757575" stroke="#757575" points="3793.98,-1162.78 3799.57,-1171.78 3800.81,-1161.25 3793.98,-1162.78"/>
-</g>
-<!-- scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge72" class="edge">
-<title>scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M213.94,-996.32C273.14,-954.16 479.99,-813.08 674.75,-755.42 1197.85,-600.53 1354.2,-677.42 1899.75,-677.42 1899.75,-677.42 1899.75,-677.42 2248.88,-677.42 2510.06,-677.42 2585.91,-635.45 2835.5,-712.42 2921.6,-738.96 3009.03,-802.78 3049.67,-835.04"/>
-<polygon fill="#757575" stroke="#757575" points="3047.35,-837.67 3057.33,-841.21 3051.74,-832.22 3047.35,-837.67"/>
-</g>
-<!-- scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge75" class="edge">
-<title>scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M312.85,-1013.83C442.78,-1019.45 660.04,-1027.42 847.12,-1027.42 847.12,-1027.42 847.12,-1027.42 1901.75,-1027.42 2136.28,-1027.42 2195.99,-1049.44 2423.5,-1106.42 2489.25,-1122.88 2562.89,-1150.94 2606.93,-1168.81"/>
-<polygon fill="#757575" stroke="#757575" points="2605.49,-1172 2616.07,-1172.55 2608.14,-1165.52 2605.49,-1172"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts -->
-<g id="node41" class="node">
-<title>scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#ff6c60" d="M630.83,-1430.29C630.83,-1430.29 436.42,-1430.29 436.42,-1430.29 432.46,-1430.29 428.5,-1426.33 428.5,-1422.37 428.5,-1422.37 428.5,-1414.46 428.5,-1414.46 428.5,-1410.5 432.46,-1406.54 436.42,-1406.54 436.42,-1406.54 630.83,-1406.54 630.83,-1406.54 634.79,-1406.54 638.75,-1410.5 638.75,-1414.46 638.75,-1414.46 638.75,-1422.37 638.75,-1422.37 638.75,-1426.33 634.79,-1430.29 630.83,-1430.29"/>
-<text xml:space="preserve" text-anchor="middle" x="533.62" y="-1412.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/LevelSystem/IN_game.ts</text>
-</g>
-<!-- scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/LevelSystem/IN_game.ts -->
-<g id="edge74" class="edge">
-<title>scripts/CombatSystem/GameEnd.ts&#45;&gt;scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#757575" d="M207.29,-1020.69C254.54,-1078.45 455.03,-1323.56 515.37,-1397.33"/>
-<polygon fill="#757575" stroke="#757575" points="512.63,-1399.5 521.67,-1405.02 518.05,-1395.06 512.63,-1399.5"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge162" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M537.56,-1430.56C548.56,-1473.84 591.04,-1622.71 674.75,-1712.42 850.55,-1900.81 921.95,-1997.42 1179.62,-1997.42 1179.62,-1997.42 1179.62,-1997.42 1901.75,-1997.42 2000.37,-1997.42 3591.38,-1856.31 3664.75,-1790.42 3754.1,-1710.16 3792.4,-1310.78 3800.79,-1209.03"/>
-<polygon fill="#757575" stroke="#757575" points="3804.27,-1209.42 3801.59,-1199.17 3797.3,-1208.85 3804.27,-1209.42"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
-<g id="edge157" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#757575" d="M536.01,-1406.11C545.31,-1325.32 600.39,-870.55 674.75,-755.42 778.39,-594.94 901.27,-649.87 1021.5,-501.42 1046.04,-471.12 1025.96,-444.33 1057.5,-421.42 1084.82,-401.56 1269.28,-385.96 1400.36,-377.21"/>
-<polygon fill="#757575" stroke="#757575" points="1400.42,-380.71 1410.17,-376.56 1399.96,-373.73 1400.42,-380.71"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge165" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M537.95,-1406.23C549.39,-1366.82 591.11,-1242.05 674.75,-1185.42 862.99,-1057.96 952.3,-1103.42 1179.62,-1103.42 1179.62,-1103.42 1179.62,-1103.42 1901.75,-1103.42 2146.25,-1103.42 2433.21,-1147.62 2568.46,-1171.12"/>
-<polygon fill="#757575" stroke="#757575" points="2567.56,-1174.51 2578.02,-1172.79 2568.77,-1167.62 2567.56,-1174.51"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge160" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M535.66,-1430.55C542.86,-1512.16 587.64,-1981.18 674.75,-2089.42 1216.3,-2762.27 1612.23,-2690.66 2459.5,-2858.42 2613.45,-2888.9 2793.4,-2887.28 2918.46,-2880.41"/>
-<polygon fill="#757575" stroke="#757575" points="2918.33,-2883.92 2928.12,-2879.86 2917.93,-2876.94 2918.33,-2883.92"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge163" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M545.28,-1406.34C567.08,-1382.42 619.42,-1328.95 674.75,-1301.42 880.97,-1198.81 949.29,-1184.42 1179.62,-1184.42 1179.62,-1184.42 1179.62,-1184.42 1535.5,-1184.42 1593.63,-1184.42 1947.05,-1225.58 2132.88,-1247.71"/>
-<polygon fill="#757575" stroke="#757575" points="2132.21,-1251.16 2142.55,-1248.86 2133.03,-1244.21 2132.21,-1251.16"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts -->
-<g id="edge158" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</title>
-<path fill="none" stroke="#757575" d="M535.63,-1430.42C542.32,-1507.26 582.99,-1929.54 674.75,-2011.42 688.22,-2023.43 1166.26,-2074.97 1403.14,-2099.86"/>
-<polygon fill="#757575" stroke="#757575" points="1402.76,-2103.34 1413.07,-2100.91 1403.49,-2096.38 1402.76,-2103.34"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts -->
-<g id="edge159" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts</title>
-<path fill="none" stroke="#757575" d="M535.51,-1430.6C541.54,-1510.51 579.4,-1959.26 674.75,-2048.42 788.63,-2154.89 871.15,-2060.17 1021.5,-2101.42 1151.97,-2137.21 1210.68,-2117.22 1303.75,-2215.42 1337.69,-2251.22 1300.46,-2290.58 1339.75,-2320.42 1590.19,-2510.64 2585.73,-2434.4 2943.91,-2399.88"/>
-<polygon fill="#757575" stroke="#757575" points="2944.23,-2403.36 2953.84,-2398.91 2943.55,-2396.4 2944.23,-2403.36"/>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/Wall.ts -->
-<g id="edge161" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/CombatSystem/Wall.ts</title>
-<path fill="none" stroke="#757575" d="M543.68,-1430.71C596.29,-1500.55 870.97,-1844.42 1179.62,-1844.42 1179.62,-1844.42 1179.62,-1844.42 1535.5,-1844.42 1748.94,-1844.42 1998.4,-1843.96 2137.97,-1843.66"/>
-<polygon fill="#757575" stroke="#757575" points="2137.56,-1847.16 2147.55,-1843.64 2137.55,-1840.16 2137.56,-1847.16"/>
-</g>
-<!-- scripts/LevelSystem/BackgroundManager.ts -->
-<g id="node59" class="node">
-<title>scripts/LevelSystem/BackgroundManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2379.96,-1429.29C2379.96,-1429.29 2115.79,-1429.29 2115.79,-1429.29 2111.83,-1429.29 2107.88,-1425.33 2107.88,-1421.37 2107.88,-1421.37 2107.88,-1413.46 2107.88,-1413.46 2107.88,-1409.5 2111.83,-1405.54 2115.79,-1405.54 2115.79,-1405.54 2379.96,-1405.54 2379.96,-1405.54 2383.92,-1405.54 2387.88,-1409.5 2387.88,-1413.46 2387.88,-1413.46 2387.88,-1421.37 2387.88,-1421.37 2387.88,-1425.33 2383.92,-1429.29 2379.96,-1429.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-1411.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/BackgroundManager.ts</text>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/BackgroundManager.ts -->
-<g id="edge164" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/BackgroundManager.ts</title>
-<path fill="none" stroke="#757575" d="M546.3,-1406.19C568.68,-1383.76 620.24,-1336.73 674.75,-1319.42 807.98,-1277.1 1509.19,-1345.1 1729.25,-1363.42 1866.95,-1374.87 2024.85,-1391.91 2129.68,-1403.78"/>
-<polygon fill="#757575" stroke="#757575" points="2129.09,-1407.23 2139.42,-1404.88 2129.88,-1400.28 2129.09,-1407.23"/>
-</g>
-<!-- scripts/LevelSystem/StartGame.ts -->
-<g id="node62" class="node">
-<title>scripts/LevelSystem/StartGame.ts</title>
-<path fill="none" stroke="#ff6c60" d="M950.96,-1352.29C950.96,-1352.29 745.29,-1352.29 745.29,-1352.29 741.33,-1352.29 737.38,-1348.33 737.38,-1344.37 737.38,-1344.37 737.38,-1336.46 737.38,-1336.46 737.38,-1332.5 741.33,-1328.54 745.29,-1328.54 745.29,-1328.54 950.96,-1328.54 950.96,-1328.54 954.92,-1328.54 958.88,-1332.5 958.88,-1336.46 958.88,-1336.46 958.88,-1344.37 958.88,-1344.37 958.88,-1348.33 954.92,-1352.29 950.96,-1352.29"/>
-<text xml:space="preserve" text-anchor="middle" x="848.12" y="-1334.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/LevelSystem/StartGame.ts</text>
-</g>
-<!-- scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/StartGame.ts -->
-<g id="edge166" class="edge">
-<title>scripts/LevelSystem/IN_game.ts&#45;&gt;scripts/LevelSystem/StartGame.ts</title>
-<path fill="none" stroke="#757575" d="M584.14,-1406.06C639.03,-1392.36 727.59,-1370.25 786.56,-1355.53"/>
-<polygon fill="#757575" stroke="#757575" points="787.26,-1358.97 796.11,-1353.15 785.56,-1352.17 787.26,-1358.97"/>
-</g>
-<!-- scripts/CombatSystem/GamePause.ts -->
-<g id="node42" class="node">
-<title>scripts/CombatSystem/GamePause.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M311.83,-1797.29C311.83,-1797.29 80.67,-1797.29 80.67,-1797.29 76.71,-1797.29 72.75,-1793.33 72.75,-1789.37 72.75,-1789.37 72.75,-1781.46 72.75,-1781.46 72.75,-1777.5 76.71,-1773.54 80.67,-1773.54 80.67,-1773.54 311.83,-1773.54 311.83,-1773.54 315.79,-1773.54 319.75,-1777.5 319.75,-1781.46 319.75,-1781.46 319.75,-1789.37 319.75,-1789.37 319.75,-1793.33 315.79,-1797.29 311.83,-1797.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-1779.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/GamePause.ts</text>
-</g>
-<!-- scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge76" class="edge">
-<title>scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M208.26,-1797.66C266.97,-1861.51 551.5,-2153.42 847.12,-2153.42 847.12,-2153.42 847.12,-2153.42 1901.75,-2153.42 2018.38,-2153.42 2325.95,-2160.36 2423.5,-2096.42 2450.47,-2078.74 2433,-2051.8 2459.5,-2033.42 2682.47,-1878.76 3468.4,-2024.71 3664.75,-1837.42 3758.57,-1747.92 3793.8,-1315.33 3801.11,-1209.04"/>
-<polygon fill="#757575" stroke="#757575" points="3804.59,-1209.46 3801.76,-1199.25 3797.6,-1209 3804.59,-1209.46"/>
-</g>
-<!-- scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/LevelSystem/IN_game.ts -->
-<g id="edge77" class="edge">
-<title>scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#757575" d="M208.41,-1773.2C257.25,-1719.76 452.48,-1506.12 513.98,-1438.82"/>
-<polygon fill="#757575" stroke="#757575" points="516.24,-1441.53 520.4,-1431.79 511.07,-1436.81 516.24,-1441.53"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuAni.ts -->
-<g id="node43" class="node">
-<title>scripts/CombatSystem/MenuSystem/MenuAni.ts</title>
-<path fill="none" stroke="#cfffac" d="M342.58,-2325.29C342.58,-2325.29 49.92,-2325.29 49.92,-2325.29 45.96,-2325.29 42,-2321.33 42,-2317.37 42,-2317.37 42,-2309.46 42,-2309.46 42,-2305.5 45.96,-2301.54 49.92,-2301.54 49.92,-2301.54 342.58,-2301.54 342.58,-2301.54 346.54,-2301.54 350.5,-2305.5 350.5,-2309.46 350.5,-2309.46 350.5,-2317.37 350.5,-2317.37 350.5,-2321.33 346.54,-2325.29 342.58,-2325.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-2307.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/MenuSystem/MenuAni.ts</text>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts -->
-<g id="node44" class="node">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1013.58,-788.29C1013.58,-788.29 682.67,-788.29 682.67,-788.29 678.71,-788.29 674.75,-784.33 674.75,-780.37 674.75,-780.37 674.75,-772.46 674.75,-772.46 674.75,-768.5 678.71,-764.54 682.67,-764.54 682.67,-764.54 1013.58,-764.54 1013.58,-764.54 1017.54,-764.54 1021.5,-768.5 1021.5,-772.46 1021.5,-772.46 1021.5,-780.37 1021.5,-780.37 1021.5,-784.33 1017.54,-788.29 1013.58,-788.29"/>
-<text xml:space="preserve" text-anchor="middle" x="848.12" y="-770.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/MenuSystem/MenuController.ts</text>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge82" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M852.4,-764.17C866.77,-712.85 929.4,-513.25 1057.5,-417.42 1160.9,-340.05 1212.46,-370.17 1339.75,-348.42 2189.85,-203.12 2414.34,-225.75 3276.75,-232.42 3362.98,-233.08 3599.97,-181.5 3664.75,-238.42 3700.87,-270.15 3784.42,-1018.98 3800.07,-1161.95"/>
-<polygon fill="#757575" stroke="#757575" points="3796.57,-1162.14 3801.14,-1171.7 3803.53,-1161.38 3796.57,-1162.14"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
-<g id="edge78" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#757575" d="M859.31,-764.13C887.36,-729.95 967.26,-630.28 1021.5,-539.42 1040.45,-507.67 1028.02,-486.74 1057.5,-464.42 1146.07,-397.35 1201.38,-464.6 1303.75,-421.42 1321.93,-413.74 1321.42,-402.73 1339.75,-395.42 1358.86,-387.8 1379.78,-382.33 1400.58,-378.42"/>
-<polygon fill="#757575" stroke="#757575" points="1401.03,-381.89 1410.28,-376.72 1399.83,-375 1401.03,-381.89"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge80" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M1021.87,-770.43C1316.67,-760.55 1935.85,-741.24 2459.5,-734.42 2626.6,-732.24 2672.94,-695.7 2835.5,-734.42 2918.12,-754.09 3004.57,-807.36 3046.78,-835.85"/>
-<polygon fill="#757575" stroke="#757575" points="3044.57,-838.58 3054.8,-841.34 3048.53,-832.8 3044.57,-838.58"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Animations/PopUPAni.ts -->
-<g id="edge79" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/Animations/PopUPAni.ts</title>
-<path fill="none" stroke="#757575" d="M1021.98,-776.03C1199.45,-775.5 1483.64,-774.26 1729.25,-771.42 2018.77,-768.07 2359.64,-761.41 2532.94,-757.83"/>
-<polygon fill="#757575" stroke="#757575" points="2532.93,-761.33 2542.85,-757.62 2532.78,-754.33 2532.93,-761.33"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/SoundController.ts -->
-<g id="node45" class="node">
-<title>scripts/CombatSystem/MenuSystem/SoundController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2415.58,-885.29C2415.58,-885.29 2080.17,-885.29 2080.17,-885.29 2076.21,-885.29 2072.25,-881.33 2072.25,-877.37 2072.25,-877.37 2072.25,-869.46 2072.25,-869.46 2072.25,-865.5 2076.21,-861.54 2080.17,-861.54 2080.17,-861.54 2415.58,-861.54 2415.58,-861.54 2419.54,-861.54 2423.5,-865.5 2423.5,-869.46 2423.5,-869.46 2423.5,-877.37 2423.5,-877.37 2423.5,-881.33 2419.54,-885.29 2415.58,-885.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-867.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/MenuSystem/SoundController.ts</text>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/CombatSystem/MenuSystem/SoundController.ts -->
-<g id="edge81" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/CombatSystem/MenuSystem/SoundController.ts</title>
-<path fill="none" stroke="#757575" d="M915.52,-788.72C956.34,-795.84 1009.78,-804.37 1057.5,-809.42 1411.06,-846.82 1826.2,-862.85 2060.72,-869.35"/>
-<polygon fill="#757575" stroke="#757575" points="2060.49,-872.84 2070.58,-869.62 2060.68,-865.84 2060.49,-872.84"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts -->
-<g id="node46" class="node">
-<title>scripts/LevelSystem/GameManager.ts</title>
-<path fill="none" stroke="#ff6c60" d="M1295.83,-1430.29C1295.83,-1430.29 1065.42,-1430.29 1065.42,-1430.29 1061.46,-1430.29 1057.5,-1426.33 1057.5,-1422.37 1057.5,-1422.37 1057.5,-1414.46 1057.5,-1414.46 1057.5,-1410.5 1061.46,-1406.54 1065.42,-1406.54 1065.42,-1406.54 1295.83,-1406.54 1295.83,-1406.54 1299.79,-1406.54 1303.75,-1410.5 1303.75,-1414.46 1303.75,-1414.46 1303.75,-1422.37 1303.75,-1422.37 1303.75,-1426.33 1299.79,-1430.29 1295.83,-1430.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1180.62" y="-1412.99" font-family="Arial" font-size="14.00" fill="#ff6c60">scripts/LevelSystem/GameManager.ts</text>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
-<g id="edge83" class="edge">
-<title>scripts/CombatSystem/MenuSystem/MenuController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
-<path fill="none" stroke="#757575" d="M855.43,-788.67C895.56,-866.61 1115.24,-1293.35 1168.16,-1396.14"/>
-<polygon fill="#757575" stroke="#757575" points="1165,-1397.66 1172.69,-1404.95 1171.23,-1394.46 1165,-1397.66"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/SoundController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge84" class="edge">
-<title>scripts/CombatSystem/MenuSystem/SoundController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2352.1,-861.06C2386.24,-857.52 2424.45,-854.16 2459.5,-852.42 2623.04,-844.28 2811.4,-846.64 2935.82,-849.82"/>
-<polygon fill="#757575" stroke="#757575" points="2935.69,-853.31 2945.77,-850.08 2935.87,-846.32 2935.69,-853.31"/>
-</g>
-<!-- scripts/CombatSystem/MenuSystem/SoundController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge85" class="edge">
-<title>scripts/CombatSystem/MenuSystem/SoundController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2273.99,-885.78C2308.94,-903.49 2373.59,-938.1 2423.5,-975.42 2506.26,-1037.29 2591.86,-1126.22 2628.31,-1165.49"/>
-<polygon fill="#757575" stroke="#757575" points="2625.33,-1167.42 2634.69,-1172.4 2630.48,-1162.67 2625.33,-1167.42"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge149" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1198.75,-1406.18C1266.65,-1358.31 1524.98,-1182.34 1765.25,-1100.42 2401.31,-883.55 2605.3,-1032.91 3276.75,-1060.42 3449.35,-1067.48 3502.36,-1024.49 3664.75,-1083.42 3712.82,-1100.86 3758.45,-1140.81 3783.27,-1165.21"/>
-<polygon fill="#757575" stroke="#757575" points="3780.56,-1167.44 3790.09,-1172.06 3785.52,-1162.5 3780.56,-1167.44"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
-<g id="edge145" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#757575" d="M1182.84,-1406.08C1190.14,-1334.98 1231.58,-971.01 1339.75,-696.42 1388.5,-572.66 1480.59,-441.07 1517.56,-390.7"/>
-<polygon fill="#757575" stroke="#757575" points="1520.15,-393.07 1523.28,-382.95 1514.52,-388.91 1520.15,-393.07"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge155" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M1304.18,-1415.99C1415.31,-1413.03 1583.52,-1406.68 1729.25,-1393.42 1866.4,-1380.93 1912.89,-1412.64 2036.25,-1351.42 2056.52,-1341.36 2051.77,-1325.04 2072.25,-1315.42 2214.14,-1248.69 2281.14,-1348.14 2423.5,-1282.42 2443.76,-1273.06 2440.43,-1259 2459.5,-1247.42 2495.4,-1225.62 2539.89,-1210.46 2576.46,-1200.6"/>
-<polygon fill="#757575" stroke="#757575" points="2577.28,-1204 2586.07,-1198.09 2575.51,-1197.23 2577.28,-1204"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
-<g id="edge148" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1183.05,-1430.66C1193.07,-1515.14 1255.01,-2011.93 1339.75,-2134.42 1508.79,-2378.73 1602.66,-2499.42 1899.75,-2499.42 1899.75,-2499.42 1899.75,-2499.42 2248.88,-2499.42 2666.78,-2499.42 3162.37,-2544.74 3378.21,-2566.73"/>
-<polygon fill="#757575" stroke="#757575" points="3377.71,-2570.19 3388.02,-2567.73 3378.42,-2563.23 3377.71,-2570.19"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
-<g id="edge151" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#757575" d="M1183.76,-1430.75C1193.29,-1482.63 1236.03,-1686.4 1339.75,-1813.42 1482.94,-1988.76 1550.61,-2021.44 1765.25,-2093.42 2084.14,-2200.34 2941.54,-2143.93 3276.75,-2171.42 3424.79,-2183.55 3595.49,-2204.68 3701.25,-2218.6"/>
-<polygon fill="#757575" stroke="#757575" points="3700.67,-2222.06 3711.05,-2219.9 3701.59,-2215.12 3700.67,-2222.06"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge150" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M1294.68,-1406.05C1525.04,-1380.78 2027.9,-1325.29 2036.25,-1321.42 2056.21,-1312.14 2052.46,-1297.03 2072.25,-1287.42 2086.25,-1280.61 2101.57,-1275.49 2117.13,-1271.64"/>
-<polygon fill="#757575" stroke="#757575" points="2117.48,-1275.15 2126.45,-1269.51 2115.92,-1268.32 2117.48,-1275.15"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="edge153" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M1206.6,-1430.71C1237.14,-1445 1290.81,-1467.72 1339.75,-1476.42 1510.19,-1506.69 1556.14,-1477.04 1729.25,-1476.42 2037.81,-1475.3 2115.27,-1485.79 2423.5,-1471.42 2607.27,-1462.85 2819.51,-1442.59 2950.02,-1428.94"/>
-<polygon fill="#757575" stroke="#757575" points="2950.14,-1432.44 2959.72,-1427.92 2949.4,-1425.48 2950.14,-1432.44"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts -->
-<g id="edge146" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</title>
-<path fill="none" stroke="#757575" d="M1183.09,-1430.7C1192.79,-1510.34 1250.29,-1953.13 1339.75,-2049.42 1362.18,-2073.56 1393.9,-2088.61 1425.19,-2097.98"/>
-<polygon fill="#757575" stroke="#757575" points="1424.19,-2101.34 1434.76,-2100.66 1426.07,-2094.6 1424.19,-2101.34"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/Wall.ts -->
-<g id="edge147" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/Wall.ts</title>
-<path fill="none" stroke="#757575" d="M1182.5,-1430.77C1187.01,-1484.34 1212.7,-1697.89 1339.75,-1787.42 1339.75,-1787.42 1897.24,-1821.83 2138.14,-1836.7"/>
-<polygon fill="#757575" stroke="#757575" points="2137.66,-1840.18 2147.86,-1837.3 2138.09,-1833.19 2137.66,-1840.18"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/IN_game.ts -->
-<g id="edge152" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#757575" d="M1057.26,-1418.42C940.2,-1418.42 764.98,-1418.42 650.23,-1418.42"/>
-<polygon fill="#757575" stroke="#757575" points="650.49,-1414.92 640.49,-1418.42 650.49,-1421.92 650.49,-1414.92"/>
-</g>
-<!-- scripts/LevelSystem/LevelManager.ts -->
-<g id="node61" class="node">
-<title>scripts/LevelSystem/LevelManager.ts</title>
-<path fill="none" stroke="#cfffac" d="M1646.71,-1467.29C1646.71,-1467.29 1422.29,-1467.29 1422.29,-1467.29 1418.33,-1467.29 1414.38,-1463.33 1414.38,-1459.37 1414.38,-1459.37 1414.38,-1451.46 1414.38,-1451.46 1414.38,-1447.5 1418.33,-1443.54 1422.29,-1443.54 1422.29,-1443.54 1646.71,-1443.54 1646.71,-1443.54 1650.67,-1443.54 1654.62,-1447.5 1654.62,-1451.46 1654.62,-1451.46 1654.62,-1459.37 1654.62,-1459.37 1654.62,-1463.33 1650.67,-1467.29 1646.71,-1467.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1534.5" y="-1449.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/LevelSystem/LevelManager.ts</text>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelManager.ts -->
-<g id="edge154" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelManager.ts</title>
-<path fill="none" stroke="#757575" d="M1299.28,-1430.79C1333.18,-1434.35 1370.32,-1438.26 1404.84,-1441.89"/>
-<polygon fill="#757575" stroke="#757575" points="1404.14,-1445.33 1414.45,-1442.9 1404.87,-1438.37 1404.14,-1445.33"/>
-</g>
-<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/StartGame.ts -->
-<g id="edge156" class="edge">
-<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/StartGame.ts</title>
-<path fill="none" stroke="#757575" d="M1071.97,-1406.11C1067.02,-1404.36 1062.18,-1402.46 1057.5,-1400.42 1039.65,-1392.61 1039.6,-1382.61 1021.5,-1375.42 995.05,-1364.9 964.77,-1358.6 937.05,-1354.4"/>
-<polygon fill="#757575" stroke="#757575" points="937.64,-1350.95 927.25,-1352.99 936.65,-1357.88 937.64,-1350.95"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts -->
-<g id="node47" class="node">
-<title>scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</title>
-<path fill="none" stroke="#cfffac" d="M3252.33,-2939.29C3252.33,-2939.29 2895.92,-2939.29 2895.92,-2939.29 2891.96,-2939.29 2888,-2935.33 2888,-2931.37 2888,-2931.37 2888,-2923.46 2888,-2923.46 2888,-2919.5 2891.96,-2915.54 2895.92,-2915.54 2895.92,-2915.54 3252.33,-2915.54 3252.33,-2915.54 3256.29,-2915.54 3260.25,-2919.5 3260.25,-2923.46 3260.25,-2923.46 3260.25,-2931.37 3260.25,-2931.37 3260.25,-2935.33 3256.29,-2939.29 3252.33,-2939.29"/>
-<text xml:space="preserve" text-anchor="middle" x="3074.12" y="-2921.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</text>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillButtonController.ts -->
-<g id="node48" class="node">
-<title>scripts/CombatSystem/SkillSelection/SkillButtonController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2827.58,-2939.29C2827.58,-2939.29 2467.42,-2939.29 2467.42,-2939.29 2463.46,-2939.29 2459.5,-2935.33 2459.5,-2931.37 2459.5,-2931.37 2459.5,-2923.46 2459.5,-2923.46 2459.5,-2919.5 2463.46,-2915.54 2467.42,-2915.54 2467.42,-2915.54 2827.58,-2915.54 2827.58,-2915.54 2831.54,-2915.54 2835.5,-2919.5 2835.5,-2923.46 2835.5,-2923.46 2835.5,-2931.37 2835.5,-2931.37 2835.5,-2935.33 2831.54,-2939.29 2827.58,-2939.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-2921.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/SkillSelection/SkillButtonController.ts</text>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge86" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2662.37,-2915.15C2699.11,-2881.66 2798.59,-2784.06 2835.5,-2678.42 2882.57,-2543.68 2844.17,-1534.5 2871.5,-1394.42 2912.43,-1184.64 3025.4,-949.04 3061.72,-876.71"/>
-<polygon fill="#757575" stroke="#757575" points="3064.79,-878.38 3066.18,-867.88 3058.55,-875.23 3064.79,-878.38"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge88" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2737.92,-2915.06C2768.83,-2910.76 2803.69,-2905.9 2835.5,-2901.42 2881.71,-2894.9 2932.97,-2887.57 2976.01,-2881.4"/>
-<polygon fill="#757575" stroke="#757575" points="2976.45,-2884.87 2985.85,-2879.99 2975.45,-2877.94 2976.45,-2884.87"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts -->
-<g id="edge87" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillButtonController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</title>
-<path fill="none" stroke="#757575" d="M2835.98,-2927.42C2849.35,-2927.42 2862.85,-2927.42 2876.26,-2927.42"/>
-<polygon fill="#757575" stroke="#757575" points="2875.99,-2930.92 2885.99,-2927.42 2875.99,-2923.92 2875.99,-2930.92"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts -->
-<g id="node49" class="node">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M384.58,-2241.29C384.58,-2241.29 7.92,-2241.29 7.92,-2241.29 3.96,-2241.29 0,-2237.33 0,-2233.37 0,-2233.37 0,-2225.46 0,-2225.46 0,-2221.5 3.96,-2217.54 7.92,-2217.54 7.92,-2217.54 384.58,-2217.54 384.58,-2217.54 388.54,-2217.54 392.5,-2221.5 392.5,-2225.46 392.5,-2225.46 392.5,-2233.37 392.5,-2233.37 392.5,-2237.33 388.54,-2241.29 384.58,-2241.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-2223.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/SkillSelection/SkillSelectionController.ts</text>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
-<g id="edge89" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
-<path fill="none" stroke="#757575" d="M219.3,-2217.06C332.93,-2154.03 865.46,-1866.62 1339.75,-1745.42 1477.4,-1710.24 1639.35,-1696.96 1753.58,-1692.04"/>
-<polygon fill="#757575" stroke="#757575" points="1753.48,-1695.55 1763.32,-1691.64 1753.19,-1688.56 1753.48,-1695.55"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts -->
-<g id="edge91" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M269.2,-2217.06C310.73,-2214.3 360.85,-2219.14 392.5,-2250.42 440.42,-2297.77 404.72,-2488.39 428.5,-2551.42 535.45,-2834.88 544.16,-3089.42 847.12,-3089.42 847.12,-3089.42 847.12,-3089.42 2248.88,-3089.42 2510.83,-3089.42 2634.25,-3200.1 2835.5,-3032.42 2880.24,-2995.13 2828.56,-2945.76 2871.5,-2906.42 2881.46,-2897.29 2892.89,-2890.01 2905.13,-2884.23"/>
-<polygon fill="#757575" stroke="#757575" points="2906.41,-2887.49 2914.21,-2880.32 2903.64,-2881.06 2906.41,-2887.49"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/Wall.ts -->
-<g id="edge92" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/Wall.ts</title>
-<path fill="none" stroke="#757575" d="M249.87,-2217.1C470.63,-2165.86 1344.35,-1967.21 2072.25,-1860.42 2093.42,-1857.31 2116.13,-1854.63 2137.93,-1852.37"/>
-<polygon fill="#757575" stroke="#757575" points="2138.13,-1855.87 2147.72,-1851.38 2137.42,-1848.9 2138.13,-1855.87"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/IN_game.ts -->
-<g id="edge94" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#757575" d="M204.33,-2217.06C232.52,-2167.33 337.95,-1976.22 392.5,-1806.42 418.52,-1725.42 400.56,-1698.77 428.5,-1618.42 452.37,-1549.76 496.39,-1475.49 518.77,-1439.86"/>
-<polygon fill="#757575" stroke="#757575" points="521.51,-1442.08 523.92,-1431.76 515.6,-1438.32 521.51,-1442.08"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
-<g id="edge93" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
-<path fill="none" stroke="#757575" d="M211.9,-2217.32C322.03,-2126.41 1019.56,-1550.56 1156.36,-1437.62"/>
-<polygon fill="#757575" stroke="#757575" points="1158.24,-1440.61 1163.72,-1431.54 1153.78,-1435.21 1158.24,-1440.61"/>
-</g>
-<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonController.ts -->
-<g id="edge90" class="edge">
-<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonController.ts</title>
-<path fill="none" stroke="#757575" d="M375.64,-2241.69C381.46,-2244.26 387.1,-2247.16 392.5,-2250.42 702.5,-2437.48 485.06,-2926.42 847.12,-2926.42 847.12,-2926.42 847.12,-2926.42 1901.75,-2926.42 2086.86,-2926.42 2297.85,-2926.73 2447.88,-2927"/>
-<polygon fill="#757575" stroke="#757575" points="2447.51,-2930.5 2457.52,-2927.02 2447.52,-2923.5 2447.51,-2930.5"/>
-</g>
-<!-- scripts/CombatSystem/WeaponBlockExample.ts -->
-<g id="node50" class="node">
-<title>scripts/CombatSystem/WeaponBlockExample.ts</title>
-<path fill="none" stroke="#cfffac" d="M341.83,-2367.29C341.83,-2367.29 50.67,-2367.29 50.67,-2367.29 46.71,-2367.29 42.75,-2363.33 42.75,-2359.37 42.75,-2359.37 42.75,-2351.46 42.75,-2351.46 42.75,-2347.5 46.71,-2343.54 50.67,-2343.54 50.67,-2343.54 341.83,-2343.54 341.83,-2343.54 345.79,-2343.54 349.75,-2347.5 349.75,-2351.46 349.75,-2351.46 349.75,-2359.37 349.75,-2359.37 349.75,-2363.33 345.79,-2367.29 341.83,-2367.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-2349.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/WeaponBlockExample.ts</text>
-</g>
-<!-- scripts/Debug/WeaponsConfigTest.ts -->
-<g id="node51" class="node">
-<title>scripts/Debug/WeaponsConfigTest.ts</title>
-<path fill="none" stroke="#cfffac" d="M306.96,-2409.29C306.96,-2409.29 85.54,-2409.29 85.54,-2409.29 81.58,-2409.29 77.62,-2405.33 77.62,-2401.37 77.62,-2401.37 77.62,-2393.46 77.62,-2393.46 77.62,-2389.5 81.58,-2385.54 85.54,-2385.54 85.54,-2385.54 306.96,-2385.54 306.96,-2385.54 310.92,-2385.54 314.88,-2389.5 314.88,-2393.46 314.88,-2393.46 314.88,-2401.37 314.88,-2401.37 314.88,-2405.33 310.92,-2409.29 306.96,-2409.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-2391.99" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Debug/WeaponsConfigTest.ts</text>
-</g>
-<!-- scripts/Examples/AudioExample.ts -->
-<g id="node52" class="node">
-<title>scripts/Examples/AudioExample.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2751.83,-885.29C2751.83,-885.29 2543.17,-885.29 2543.17,-885.29 2539.21,-885.29 2535.25,-881.33 2535.25,-877.37 2535.25,-877.37 2535.25,-869.46 2535.25,-869.46 2535.25,-865.5 2539.21,-861.54 2543.17,-861.54 2543.17,-861.54 2751.83,-861.54 2751.83,-861.54 2755.79,-861.54 2759.75,-865.5 2759.75,-869.46 2759.75,-869.46 2759.75,-877.37 2759.75,-877.37 2759.75,-881.33 2755.79,-885.29 2751.83,-885.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-867.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/Examples/AudioExample.ts</text>
-</g>
-<!-- scripts/Examples/AudioExample.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge111" class="edge">
-<title>scripts/Examples/AudioExample.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2760.07,-868.42C2813.97,-866.01 2879.15,-863.09 2936.06,-860.55"/>
-<polygon fill="#757575" stroke="#757575" points="2935.98,-864.06 2945.81,-860.11 2935.66,-857.06 2935.98,-864.06"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts -->
-<g id="node53" class="node">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M339.21,-604.29C339.21,-604.29 53.29,-604.29 53.29,-604.29 49.33,-604.29 45.38,-600.33 45.38,-596.37 45.38,-596.37 45.38,-588.46 45.38,-588.46 45.38,-584.5 49.33,-580.54 53.29,-580.54 53.29,-580.54 339.21,-580.54 339.21,-580.54 343.17,-580.54 347.12,-584.5 347.12,-588.46 347.12,-588.46 347.12,-596.37 347.12,-596.37 347.12,-600.33 343.17,-604.29 339.21,-604.29"/>
-<text xml:space="preserve" text-anchor="middle" x="196.25" y="-586.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/MainSystem/MainUIControlller.ts</text>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge115" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M205.56,-580.35C256.02,-508.63 529.89,-141.42 847.12,-141.42 847.12,-141.42 847.12,-141.42 2248.88,-141.42 2878.84,-141.42 3198.98,216.74 3664.75,-207.42 3701.51,-240.89 3784.87,-1016.84 3800.18,-1162.1"/>
-<polygon fill="#757575" stroke="#757575" points="3796.66,-1162.08 3801.19,-1171.66 3803.62,-1161.34 3796.66,-1162.08"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
-<g id="edge112" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#757575" d="M209.96,-580.15C242.84,-549.29 334.7,-468.54 428.5,-435.42 772.2,-314.04 1213.15,-336.29 1418.6,-355.96"/>
-<polygon fill="#757575" stroke="#757575" points="1418.2,-359.44 1428.49,-356.93 1418.88,-352.48 1418.2,-359.44"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/MoneyAni.ts -->
-<g id="edge113" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/MoneyAni.ts</title>
-<path fill="none" stroke="#757575" d="M347.53,-581.9C479.19,-573.61 675.74,-563.42 847.12,-563.42 847.12,-563.42 847.12,-563.42 1181.62,-563.42 1395.42,-563.42 1645.01,-562.52 1786.52,-561.93"/>
-<polygon fill="#757575" stroke="#757575" points="1786.28,-565.43 1796.26,-561.88 1786.25,-558.43 1786.28,-565.43"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge114" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M347.52,-599.35C644.19,-612.42 1326.12,-639.42 1899.75,-639.42 1899.75,-639.42 1899.75,-639.42 2248.88,-639.42 2379.34,-639.42 2713.37,-616.53 2835.5,-662.42 2932.66,-698.92 3020.14,-791.81 3055.96,-833.55"/>
-<polygon fill="#757575" stroke="#757575" points="3053.07,-835.56 3062.2,-840.94 3058.42,-831.04 3053.07,-835.56"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/FourUI/TopBarController.ts -->
-<g id="edge116" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/FourUI/TopBarController.ts</title>
-<path fill="none" stroke="#757575" d="M279.19,-580.06C323.32,-573.94 378.77,-567.08 428.5,-563.42 1067.31,-516.38 1835.48,-518.77 2126.9,-521.79"/>
-<polygon fill="#757575" stroke="#757575" points="2126.77,-525.29 2136.81,-521.89 2126.84,-518.29 2126.77,-525.29"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge119" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M219.79,-604.76C286.82,-640.89 491.66,-747 674.75,-797.42 1430.65,-1005.57 1692.85,-745.05 2423.5,-1029.42 2506.66,-1061.78 2588.49,-1131.29 2625.69,-1165.53"/>
-<polygon fill="#757575" stroke="#757575" points="2622.94,-1167.76 2632.65,-1172.02 2627.72,-1162.64 2622.94,-1167.76"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/IN_game.ts -->
-<g id="edge118" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/IN_game.ts</title>
-<path fill="none" stroke="#757575" d="M204.16,-604.73C230.9,-652.68 329.17,-831.9 392.5,-987.42 454.39,-1139.39 508.44,-1329.8 526.35,-1395.15"/>
-<polygon fill="#757575" stroke="#757575" points="522.95,-1396 528.95,-1404.73 529.7,-1394.16 522.95,-1396"/>
-</g>
-<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
-<g id="edge117" class="edge">
-<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
-<path fill="none" stroke="#757575" d="M202.94,-604.52C245.61,-694.81 518.34,-1262.53 674.75,-1361.42 705.56,-1380.89 907.02,-1398.98 1045.94,-1409.35"/>
-<polygon fill="#757575" stroke="#757575" points="1045.35,-1412.82 1055.58,-1410.06 1045.87,-1405.84 1045.35,-1412.82"/>
-</g>
-<!-- scripts/FourUI/NavBarController.ts -->
-<g id="node54" class="node">
-<title>scripts/FourUI/NavBarController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1283.08,-497.29C1283.08,-497.29 1078.17,-497.29 1078.17,-497.29 1074.21,-497.29 1070.25,-493.33 1070.25,-489.37 1070.25,-489.37 1070.25,-481.46 1070.25,-481.46 1070.25,-477.5 1074.21,-473.54 1078.17,-473.54 1078.17,-473.54 1283.08,-473.54 1283.08,-473.54 1287.04,-473.54 1291,-477.5 1291,-481.46 1291,-481.46 1291,-489.37 1291,-489.37 1291,-493.33 1287.04,-497.29 1283.08,-497.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1180.62" y="-479.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/NavBarController.ts</text>
-</g>
-<!-- scripts/FourUI/NavBarController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge122" class="edge">
-<title>scripts/FourUI/NavBarController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1291.42,-481.8C1611.39,-472.08 2539.07,-449.99 2835.5,-509.42 2847.65,-511.85 3655.98,-830.65 3664.75,-839.42 3759.09,-933.72 3790.92,-1100.71 3799.72,-1162.01"/>
-<polygon fill="#757575" stroke="#757575" points="3796.21,-1162.18 3801.02,-1171.62 3803.15,-1161.24 3796.21,-1162.18"/>
-</g>
-<!-- scripts/FourUI/NavBarController.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
-<g id="edge120" class="edge">
-<title>scripts/FourUI/NavBarController.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
-<path fill="none" stroke="#757575" d="M1278.36,-473.08C1287.42,-469.54 1296.07,-465.07 1303.75,-459.42 1330.04,-440.08 1312.74,-413.73 1339.75,-395.42 1357.83,-383.15 1379.07,-375.41 1400.74,-370.7"/>
-<polygon fill="#757575" stroke="#757575" points="1401.11,-374.19 1410.26,-368.85 1399.77,-367.32 1401.11,-374.19"/>
-</g>
-<!-- scripts/FourUI/NavBarController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge121" class="edge">
-<title>scripts/FourUI/NavBarController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M1226.17,-497.72C1338.33,-527.57 1641.8,-601.42 1899.75,-601.42 1899.75,-601.42 1899.75,-601.42 2248.88,-601.42 2379.35,-601.42 2715.53,-574.14 2835.5,-625.42 2940.78,-670.41 3026.49,-784.7 3059.03,-832.68"/>
-<polygon fill="#757575" stroke="#757575" points="3056.03,-834.48 3064.49,-840.86 3061.85,-830.6 3056.03,-834.48"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts -->
-<g id="node56" class="node">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2394.96,-1231.29C2394.96,-1231.29 2100.79,-1231.29 2100.79,-1231.29 2096.83,-1231.29 2092.88,-1227.33 2092.88,-1223.37 2092.88,-1223.37 2092.88,-1215.46 2092.88,-1215.46 2092.88,-1211.5 2096.83,-1207.54 2100.79,-1207.54 2100.79,-1207.54 2394.96,-1207.54 2394.96,-1207.54 2398.92,-1207.54 2402.88,-1211.5 2402.88,-1215.46 2402.88,-1215.46 2402.88,-1223.37 2402.88,-1223.37 2402.88,-1227.33 2398.92,-1231.29 2394.96,-1231.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-1213.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/SkillSystem/SkillNodeGenerator.ts</text>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge125" class="edge">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2403.29,-1221.63C2663.68,-1224.37 3206.57,-1225.86 3664.75,-1199.42 3679.39,-1198.57 3694.88,-1197.33 3709.98,-1195.94"/>
-<polygon fill="#757575" stroke="#757575" points="3710.3,-1199.43 3719.92,-1194.99 3709.64,-1192.46 3710.3,-1199.43"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge124" class="edge">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2293.31,-1207.1C2393.14,-1178.64 2641.62,-1103.33 2835.5,-1007.42 2917.3,-966.94 3005.69,-904.51 3047.9,-873.4"/>
-<polygon fill="#757575" stroke="#757575" points="3049.73,-876.39 3055.68,-867.62 3045.56,-870.77 3049.73,-876.39"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge128" class="edge">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2393.55,-1207.04C2428.92,-1204.02 2466.76,-1200.78 2502.11,-1197.76"/>
-<polygon fill="#757575" stroke="#757575" points="2502.32,-1201.26 2511.98,-1196.92 2501.72,-1194.28 2502.32,-1201.26"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts -->
-<g id="edge126" class="edge">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/FourUI/SkillSystem/PersistentSkillManager.ts</title>
-<path fill="none" stroke="#757575" d="M2403.24,-1227.35C2410.45,-1230.94 2417.26,-1235.26 2423.5,-1240.42 2464.12,-1274.01 2423.89,-1314.56 2459.5,-1353.42 2581.85,-1486.92 2724.17,-1367.58 2835.5,-1510.42 2901.81,-1595.49 2840.82,-1647.01 2871.5,-1750.42 2921.73,-1919.72 3024.68,-2107.76 3060.5,-2170.63"/>
-<polygon fill="#757575" stroke="#757575" points="3057.26,-2172.01 3065.27,-2178.94 3063.33,-2168.53 3057.26,-2172.01"/>
-</g>
-<!-- scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/FourUI/SkillSystem/SkillConfigManager.ts -->
-<g id="edge127" class="edge">
-<title>scripts/FourUI/SkillSystem/SkillNodeGenerator.ts&#45;&gt;scripts/FourUI/SkillSystem/SkillConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2359.86,-1231.77C2381.02,-1234.4 2402.97,-1237.33 2423.5,-1240.42 2804.57,-1297.67 2951.46,-1187.82 3276.75,-1394.42 3386.14,-1463.89 3455.59,-1612.4 3478.96,-1668.93"/>
-<polygon fill="#757575" stroke="#757575" points="3475.57,-1669.89 3482.56,-1677.85 3482.06,-1667.26 3475.57,-1669.89"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeAni.ts -->
-<g id="node57" class="node">
-<title>scripts/FourUI/UpgradeSystem/UpgradeAni.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2784.83,-927.29C2784.83,-927.29 2510.17,-927.29 2510.17,-927.29 2506.21,-927.29 2502.25,-923.33 2502.25,-919.37 2502.25,-919.37 2502.25,-911.46 2502.25,-911.46 2502.25,-907.5 2506.21,-903.54 2510.17,-903.54 2510.17,-903.54 2784.83,-903.54 2784.83,-903.54 2788.79,-903.54 2792.75,-907.5 2792.75,-911.46 2792.75,-911.46 2792.75,-919.37 2792.75,-919.37 2792.75,-923.33 2788.79,-927.29 2784.83,-927.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-909.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/UpgradeSystem/UpgradeAni.ts</text>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeAni.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge132" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeAni.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2767.33,-903.06C2789.99,-900.43 2813.5,-897.5 2835.5,-894.42 2888.7,-886.96 2948.32,-876.92 2994.53,-868.76"/>
-<polygon fill="#757575" stroke="#757575" points="2994.95,-872.24 3004.19,-867.05 2993.73,-865.35 2994.95,-872.24"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts -->
-<g id="node58" class="node">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2404.33,-805.29C2404.33,-805.29 2091.42,-805.29 2091.42,-805.29 2087.46,-805.29 2083.5,-801.33 2083.5,-797.37 2083.5,-797.37 2083.5,-789.46 2083.5,-789.46 2083.5,-785.5 2087.46,-781.54 2091.42,-781.54 2091.42,-781.54 2404.33,-781.54 2404.33,-781.54 2408.29,-781.54 2412.25,-785.5 2412.25,-789.46 2412.25,-789.46 2412.25,-797.37 2412.25,-797.37 2412.25,-801.33 2408.29,-805.29 2404.33,-805.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2247.88" y="-787.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/UpgradeSystem/UpgradeController.ts</text>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge135" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2412.73,-791.81C2660.38,-790.74 3117.95,-794.41 3276.75,-833.42 3462.09,-878.94 3514.35,-899.92 3664.75,-1017.42 3719.72,-1060.36 3767.2,-1128.89 3789.34,-1163.66"/>
-<polygon fill="#757575" stroke="#757575" points="3786.3,-1165.4 3794.57,-1172.02 3792.23,-1161.69 3786.3,-1165.4"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge134" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2403.02,-805.66C2410.33,-809.47 2417.22,-814.02 2423.5,-819.42 2464.76,-854.88 2415.74,-904.09 2459.5,-936.42 2526.71,-986.06 2753.1,-950.23 2835.5,-936.42 2909.22,-924.05 2990.66,-891.53 3036.49,-871.36"/>
-<polygon fill="#757575" stroke="#757575" points="3037.71,-874.64 3045.42,-867.37 3034.86,-868.25 3037.71,-874.64"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge137" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2404.23,-805.63C2411.14,-809.48 2417.62,-814.03 2423.5,-819.42 2474.06,-865.72 2428.17,-908.43 2459.5,-969.42 2502.29,-1052.71 2583.67,-1130.63 2623.45,-1165.79"/>
-<polygon fill="#757575" stroke="#757575" points="2620.98,-1168.28 2630.81,-1172.22 2625.58,-1163.01 2620.98,-1168.28"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/Animations/PopUPAni.ts -->
-<g id="edge133" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/Animations/PopUPAni.ts</title>
-<path fill="none" stroke="#757575" d="M2378.25,-781.05C2428.09,-776.29 2484.6,-770.89 2532.85,-766.28"/>
-<polygon fill="#757575" stroke="#757575" points="2533.16,-769.76 2542.78,-765.33 2532.49,-762.79 2533.16,-769.76"/>
-</g>
-<!-- scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/FourUI/UpgradeSystem/UpgradeAni.ts -->
-<g id="edge136" class="edge">
-<title>scripts/FourUI/UpgradeSystem/UpgradeController.ts&#45;&gt;scripts/FourUI/UpgradeSystem/UpgradeAni.ts</title>
-<path fill="none" stroke="#757575" d="M2399.57,-805.67C2408.04,-809.42 2416.1,-813.96 2423.5,-819.42 2453.26,-841.36 2429.35,-873.01 2459.5,-894.42 2469.19,-901.3 2479.9,-906.65 2491.15,-910.76"/>
-<polygon fill="#757575" stroke="#757575" points="2490.05,-914.08 2500.64,-913.87 2492.22,-907.43 2490.05,-914.08"/>
-</g>
-<!-- scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge138" class="edge">
-<title>scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2388.02,-1409.58C2400.89,-1404.72 2413.01,-1398.17 2423.5,-1389.42 2460.42,-1358.62 2421.04,-1316.26 2459.5,-1287.42 2513.15,-1247.18 3598.46,-1230.57 3664.75,-1220.42 3693.88,-1215.95 3725.82,-1208.04 3751.61,-1200.87"/>
-<polygon fill="#757575" stroke="#757575" points="3752.5,-1204.26 3761.17,-1198.16 3750.59,-1197.52 3752.5,-1204.26"/>
-</g>
-<!-- scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge140" class="edge">
-<title>scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M2388.36,-1412.4C2401.24,-1407.47 2413.27,-1400.67 2423.5,-1391.42 2471.79,-1347.75 2415.37,-1297.29 2459.5,-1249.42 2481.76,-1225.26 2513.51,-1210.23 2544.55,-1200.86"/>
-<polygon fill="#757575" stroke="#757575" points="2545.35,-1204.27 2554.03,-1198.19 2543.45,-1197.54 2545.35,-1204.27"/>
-</g>
-<!-- scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
-<g id="edge139" class="edge">
-<title>scripts/LevelSystem/BackgroundManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
-<path fill="none" stroke="#757575" d="M2388.14,-1405.34C2411.93,-1403.7 2436.41,-1402.29 2459.5,-1401.42 2626.49,-1395.08 2668.46,-1396.5 2835.5,-1401.42 2863.67,-1402.24 2893.7,-1403.63 2922.59,-1405.21"/>
-<polygon fill="#757575" stroke="#757575" points="2922.34,-1408.7 2932.52,-1405.76 2922.73,-1401.71 2922.34,-1408.7"/>
-</g>
-<!-- scripts/LevelSystem/CombatStateManager.ts -->
-<g id="node60" class="node">
-<title>scripts/LevelSystem/CombatStateManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1670.33,-729.29C1670.33,-729.29 1398.67,-729.29 1398.67,-729.29 1394.71,-729.29 1390.75,-725.33 1390.75,-721.37 1390.75,-721.37 1390.75,-713.46 1390.75,-713.46 1390.75,-709.5 1394.71,-705.54 1398.67,-705.54 1398.67,-705.54 1670.33,-705.54 1670.33,-705.54 1674.29,-705.54 1678.25,-709.5 1678.25,-713.46 1678.25,-713.46 1678.25,-721.37 1678.25,-721.37 1678.25,-725.33 1674.29,-729.29 1670.33,-729.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1534.5" y="-711.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/CombatStateManager.ts</text>
-</g>
-<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge143" class="edge">
-<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1547.8,-705.21C1580.42,-673.5 1672.93,-587.71 1765.25,-540.42 1877.13,-483.1 1946.68,-547.62 2036.25,-459.42 2074.11,-422.14 2030.9,-378.78 2072.25,-345.42 2210.02,-234.28 3530.57,-187.98 3664.75,-303.42 3799.21,-419.09 3803.45,-1033 3802.84,-1161.73"/>
-<polygon fill="#757575" stroke="#757575" points="3799.34,-1161.7 3802.77,-1171.72 3806.34,-1161.74 3799.34,-1161.7"/>
-</g>
-<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
-<g id="edge141" class="edge">
-<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
-<path fill="none" stroke="#757575" d="M1540.11,-729.7C1578.16,-831.24 1840.41,-1531.06 1891.23,-1666.68"/>
-<polygon fill="#757575" stroke="#757575" points="1887.81,-1667.52 1894.59,-1675.65 1894.36,-1665.06 1887.81,-1667.52"/>
-</g>
-<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
-<g id="edge144" class="edge">
-<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
-<path fill="none" stroke="#757575" d="M1539.44,-729.54C1561.56,-798.09 1671.38,-1144.2 1729.25,-1434.42 1741.34,-1495.07 1729.42,-1659.99 1765.25,-1710.42 1853.67,-1834.85 1926.1,-1820.36 2072.25,-1864.42 2754.87,-2070.18 3043.24,-1708.09 3664.75,-2057.42 3728.58,-2093.29 3773.4,-2171.81 3792.43,-2210.28"/>
-<polygon fill="#757575" stroke="#757575" points="3789.16,-2211.56 3796.64,-2219.06 3795.47,-2208.53 3789.16,-2211.56"/>
-</g>
-<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge142" class="edge">
-<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M1544.19,-705.08C1589.75,-641.66 1809.01,-351.95 2072.25,-264.42 2744.36,-40.92 3003.01,49.15 3664.75,-203.42 3799.36,-254.79 3842.1,-290.52 3906.5,-419.42 3977.45,-561.42 4029.47,-1755.36 4037.05,-1938.01"/>
-<polygon fill="#757575" stroke="#757575" points="4033.54,-1938.03 4037.45,-1947.88 4040.54,-1937.74 4033.54,-1938.03"/>
-</g>
-<!-- scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge172" class="edge">
-<title>scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M959.3,-1350.38C1217.64,-1373.56 1856.86,-1429.8 2072.25,-1438.42 2228.24,-1444.65 2267.87,-1450.69 2423.5,-1438.42 2562.71,-1427.44 3530.23,-1278.88 3664.75,-1241.42 3700.56,-1231.44 3739.68,-1214.99 3767.07,-1202.49"/>
-<polygon fill="#757575" stroke="#757575" points="3768.34,-1205.76 3775.95,-1198.38 3765.4,-1199.4 3768.34,-1205.76"/>
-</g>
-<!-- scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
-<g id="edge175" class="edge">
-<title>scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
-<path fill="none" stroke="#757575" d="M897.84,-1328.1C1033.87,-1294.42 1429.79,-1201.28 1765.25,-1170.42 1885.19,-1159.38 1915.81,-1168.94 2036.25,-1170.42 2195.66,-1172.37 2378.44,-1177.21 2502.08,-1180.87"/>
-<polygon fill="#757575" stroke="#757575" points="2501.87,-1184.36 2511.97,-1181.16 2502.08,-1177.36 2501.87,-1184.36"/>
-</g>
-<!-- scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
-<g id="edge173" class="edge">
-<title>scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
-<path fill="none" stroke="#757575" d="M959.06,-1332.06C1130.97,-1319.22 1473.94,-1294.55 1765.25,-1279.42 1884.21,-1273.23 2019.81,-1268.36 2116.75,-1265.25"/>
-<polygon fill="#757575" stroke="#757575" points="2116.68,-1268.76 2126.56,-1264.94 2116.46,-1261.76 2116.68,-1268.76"/>
-</g>
-<!-- scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
-<g id="edge174" class="edge">
-<title>scripts/LevelSystem/StartGame.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
-<path fill="none" stroke="#757575" d="M959.16,-1340.52C980.32,-1344.18 1001.95,-1349.65 1021.5,-1357.42 1039.6,-1364.61 1039.65,-1374.61 1057.5,-1382.42 1080.22,-1392.35 1106.97,-1398.8 1129.64,-1403.69"/>
-<polygon fill="#757575" stroke="#757575" points="1128.75,-1407.08 1139.26,-1405.73 1130.2,-1400.23 1128.75,-1407.08"/>
-</g>
-<!-- scripts/LevelSystem/LevelStateManager.ts -->
-<g id="node63" class="node">
-<title>scripts/LevelSystem/LevelStateManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M1662.46,-1778.29C1662.46,-1778.29 1406.54,-1778.29 1406.54,-1778.29 1402.58,-1778.29 1398.62,-1774.33 1398.62,-1770.37 1398.62,-1770.37 1398.62,-1762.46 1398.62,-1762.46 1398.62,-1758.5 1402.58,-1754.54 1406.54,-1754.54 1406.54,-1754.54 1662.46,-1754.54 1662.46,-1754.54 1666.42,-1754.54 1670.38,-1758.5 1670.38,-1762.46 1670.38,-1762.46 1670.38,-1770.37 1670.38,-1770.37 1670.38,-1774.33 1666.42,-1778.29 1662.46,-1778.29"/>
-<text xml:space="preserve" text-anchor="middle" x="1534.5" y="-1760.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/LevelStateManager.ts</text>
-</g>
-<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge169" class="edge">
-<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M1546.43,-1754.2C1579.81,-1716.19 1681.06,-1595.39 1729.25,-1476.42 1762.67,-1393.92 1714.74,-1352.7 1765.25,-1279.42 1855.78,-1148.05 1919.16,-1138.31 2072.25,-1093.42 2329.1,-1018.09 3009.36,-1074.15 3276.75,-1086.42 3449.64,-1094.34 3497.75,-1073.98 3664.75,-1119.42 3704.26,-1130.16 3746.23,-1151.93 3773.34,-1167.53"/>
-<polygon fill="#757575" stroke="#757575" points="3771.26,-1170.37 3781.66,-1172.4 3774.8,-1164.33 3771.26,-1170.37"/>
-</g>
-<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
-<g id="edge167" class="edge">
-<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
-<path fill="none" stroke="#757575" d="M1650.25,-1754.05C1676.35,-1750.4 1703.87,-1745.88 1729.25,-1740.42 1772.18,-1731.17 1819.99,-1716.48 1854.03,-1705.23"/>
-<polygon fill="#757575" stroke="#757575" points="1854.76,-1708.67 1863.14,-1702.19 1852.55,-1702.03 1854.76,-1708.67"/>
-</g>
-<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge168" class="edge">
-<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M1544.63,-1778.55C1585.41,-1832.63 1749.52,-2049.54 1765.25,-2058.42 1884.99,-2125.97 1935.02,-2087.95 2072.25,-2096.42 2228.07,-2106.02 2267.52,-2102.93 2423.5,-2096.42 2992.9,-2072.65 3672.32,-2001.94 3930.93,-1973.48"/>
-<polygon fill="#757575" stroke="#757575" points="3931.12,-1976.98 3940.68,-1972.4 3930.36,-1970.02 3931.12,-1976.98"/>
-</g>
-<!-- scripts/LevelSystem/UIStateManager.ts -->
-<g id="node64" class="node">
-<title>scripts/LevelSystem/UIStateManager.ts</title>
-<path fill="none" stroke="#c6c5fe" d="M2766.08,-383.29C2766.08,-383.29 2528.92,-383.29 2528.92,-383.29 2524.96,-383.29 2521,-379.33 2521,-375.37 2521,-375.37 2521,-367.46 2521,-367.46 2521,-363.5 2524.96,-359.54 2528.92,-359.54 2528.92,-359.54 2766.08,-359.54 2766.08,-359.54 2770.04,-359.54 2774,-363.5 2774,-367.46 2774,-367.46 2774,-375.37 2774,-375.37 2774,-379.33 2770.04,-383.29 2766.08,-383.29"/>
-<text xml:space="preserve" text-anchor="middle" x="2647.5" y="-365.99" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/UIStateManager.ts</text>
-</g>
-<!-- scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
-<g id="edge178" class="edge">
-<title>scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
-<path fill="none" stroke="#757575" d="M2774.28,-382.08C3042.65,-405.09 3648.45,-458.54 3664.75,-473.42 3769.74,-569.24 3796.79,-1049.94 3801.7,-1162.02"/>
-<polygon fill="#757575" stroke="#757575" points="3798.2,-1161.94 3802.11,-1171.79 3805.19,-1161.65 3798.2,-1161.94"/>
-</g>
-<!-- scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/AudioManager/AudioManager.ts -->
-<g id="edge176" class="edge">
-<title>scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/AudioManager/AudioManager.ts</title>
-<path fill="none" stroke="#757575" d="M2669,-383.65C2705.32,-405.96 2782.17,-456.08 2835.5,-511.42 2938.93,-618.73 3029.59,-775.09 3061.2,-832.35"/>
-<polygon fill="#757575" stroke="#757575" points="3057.97,-833.73 3065.84,-840.82 3064.11,-830.37 3057.97,-833.73"/>
-</g>
-<!-- scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
-<g id="edge177" class="edge">
-<title>scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
-<path fill="none" stroke="#757575" d="M2682.79,-359.17C2822.03,-311.83 3352.6,-154.66 3664.75,-388.42 3929.95,-587.01 4023.45,-1757.09 4036.39,-1937.94"/>
-<polygon fill="#757575" stroke="#757575" points="4032.88,-1937.99 4037.08,-1947.72 4039.87,-1937.5 4032.88,-1937.99"/>
-</g>
-</g>
-</svg>

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov