Browse Source

bug解决二

181404010226 5 months ago
parent
commit
598e92e85e

File diff suppressed because it is too large
+ 155 - 572
assets/Scenes/GameLevel.scene


+ 478 - 0
assets/assets/Prefabs/Toast.prefab

@@ -0,0 +1,478 @@
+[
+  {
+    "__type__": "cc.Prefab",
+    "_name": "Toast",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_native": "",
+    "data": {
+      "__id__": 1
+    },
+    "optimizationPolicy": 0,
+    "persistent": false
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Toast",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": null,
+    "_children": [
+      {
+        "__id__": 2
+      },
+      {
+        "__id__": 10
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 18
+      }
+    ],
+    "_prefab": {
+      "__id__": 20
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": -310,
+      "y": 617,
+      "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": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "bg",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 3
+      },
+      {
+        "__id__": 5
+      },
+      {
+        "__id__": 7
+      }
+    ],
+    "_prefab": {
+      "__id__": 9
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 310,
+      "y": -564.818,
+      "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": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 4
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 720,
+      "height": 129
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "d9vb2cDEhDe7uLwcofFqhG"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 6
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_spriteFrame": {
+      "__uuid__": "72524b1c-42dd-4b55-a85b-caf16d212d0c@f9941",
+      "__expectedType__": "cc.SpriteFrame"
+    },
+    "_type": 0,
+    "_fillType": 0,
+    "_sizeMode": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_useGrayscale": false,
+    "_atlas": null,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "eaSdq8JURFbrYeDlBRtq86"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 8
+    },
+    "_alignFlags": 9,
+    "_target": null,
+    "_left": 0,
+    "_right": 0,
+    "_top": 550.318,
+    "_bottom": 0,
+    "_horizontalCenter": 0,
+    "_verticalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 0,
+    "_originalHeight": 0,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "2bRiERCQBD8ZNNycbbMaaP"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "ceWpIWJRVFypnqfwgXhc+X",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "label",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 11
+      },
+      {
+        "__id__": 13
+      },
+      {
+        "__id__": 15
+      }
+    ],
+    "_prefab": {
+      "__id__": 17
+    },
+    "_lpos": {
+      "__type__": "cc.Vec3",
+      "x": 323.635,
+      "y": -555.572,
+      "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": 1073741824,
+    "_euler": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 10
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 12
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 264.6278280709945,
+      "height": 54.4
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "729MbBaOBItLy50H9u7Ree"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 10
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 14
+    },
+    "_customMaterial": null,
+    "_srcBlendFactor": 2,
+    "_dstBlendFactor": 4,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_string": "金币不足!",
+    "_horizontalAlign": 1,
+    "_verticalAlign": 1,
+    "_actualFontSize": 50,
+    "_fontSize": 50,
+    "_fontFamily": "Arial",
+    "_lineHeight": 40,
+    "_overflow": 0,
+    "_enableWrapText": true,
+    "_font": null,
+    "_isSystemFontUsed": true,
+    "_spacingX": 0,
+    "_isItalic": true,
+    "_isBold": false,
+    "_isUnderline": false,
+    "_underlineHeight": 2,
+    "_cacheMode": 0,
+    "_enableOutline": true,
+    "_outlineColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_outlineWidth": 2,
+    "_enableShadow": false,
+    "_shadowColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_shadowOffset": {
+      "__type__": "cc.Vec2",
+      "x": 2,
+      "y": 2
+    },
+    "_shadowBlur": 2,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "6egMeJy8pLgqVcPJtn5JzQ"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 10
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 16
+    },
+    "_alignFlags": 18,
+    "_target": null,
+    "_left": 0,
+    "_right": 0,
+    "_top": 0,
+    "_bottom": 0,
+    "_horizontalCenter": 323.635,
+    "_verticalCenter": -555.572,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 0,
+    "_originalHeight": 0,
+    "_alignMode": 2,
+    "_lockFlags": 0,
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "7f0N/IhqJG2IwneTE/3PIF"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "5dIalXnjxD16yd+0b5ZKPn",
+    "instance": null,
+    "targetOverrides": null,
+    "nestedPrefabInstanceRoots": null
+  },
+  {
+    "__type__": "cc.UITransform",
+    "_name": "",
+    "_objFlags": 0,
+    "__editorExtras__": {},
+    "node": {
+      "__id__": 1
+    },
+    "_enabled": true,
+    "__prefab": {
+      "__id__": 19
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 100,
+      "height": 100
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_id": ""
+  },
+  {
+    "__type__": "cc.CompPrefabInfo",
+    "fileId": "c20Xh+GTtI347zkf8qQxrM"
+  },
+  {
+    "__type__": "cc.PrefabInfo",
+    "root": {
+      "__id__": 1
+    },
+    "asset": {
+      "__id__": 0
+    },
+    "fileId": "c9H59Pt9hMU7hpGfgYkt8d",
+    "targetOverrides": null
+  }
+]

+ 13 - 0
assets/assets/Prefabs/Toast.prefab.meta

@@ -0,0 +1,13 @@
+{
+  "ver": "1.1.50",
+  "importer": "prefab",
+  "imported": true,
+  "uuid": "48da814f-5847-4b90-8045-7c58cec88258",
+  "files": [
+    ".json"
+  ],
+  "subMetas": {},
+  "userData": {
+    "syncNodeName": "Toast"
+  }
+}

+ 83 - 7
assets/scripts/CombatSystem/BlockManager.ts

@@ -1157,6 +1157,65 @@ export class BlockManager extends Component {
         const weaponConfig = this.getBlockWeaponConfig(block);
         return weaponConfig ? weaponConfig.id : null;
     }
+
+    // 获取方块的形状
+    public getBlockShape(block: Node): string | null {
+        const weaponConfig = this.getBlockWeaponConfig(block);
+        if (!weaponConfig) return null;
+        
+        // 从方块结构推断形状
+        return this.inferBlockShapeFromStructure(block);
+    }
+
+    // 从方块结构推断形状
+    private inferBlockShapeFromStructure(block: Node): string {
+        const parts = this.getBlockParts(block);
+        if (parts.length === 0) return '1x1';
+        
+        // 计算方块的边界
+        let minX = 0, maxX = 0, minY = 0, maxY = 0;
+        for (const part of parts) {
+            minX = Math.min(minX, part.x);
+            maxX = Math.max(maxX, part.x);
+            minY = Math.min(minY, part.y);
+            maxY = Math.max(maxY, part.y);
+        }
+        
+        const width = maxX - minX + 1;
+        const height = maxY - minY + 1;
+        
+        return `${width}x${height}`;
+    }
+
+    // 检查两个方块是否可以合成(相同形状相同种类)
+    private canMergeBlocks(block1: Node, block2: Node): boolean {
+        // 检查稀有度
+        const rarity1 = this.getBlockRarity(block1);
+        const rarity2 = this.getBlockRarity(block2);
+        if (rarity1 !== rarity2) {
+            console.log(`[BlockManager] 稀有度不匹配: ${rarity1} vs ${rarity2}`);
+            return false;
+        }
+        
+        // 检查武器ID(种类)
+        const weaponId1 = this.getBlockWeaponId(block1);
+        const weaponId2 = this.getBlockWeaponId(block2);
+        if (weaponId1 !== weaponId2) {
+            console.log(`[BlockManager] 武器种类不匹配: ${weaponId1} vs ${weaponId2}`);
+            return false;
+        }
+        
+        // 检查形状
+        const shape1 = this.getBlockShape(block1);
+        const shape2 = this.getBlockShape(block2);
+        if (shape1 !== shape2) {
+            console.log(`[BlockManager] 形状不匹配: ${shape1} vs ${shape2}`);
+            return false;
+        }
+        
+        console.log(`[BlockManager] 方块可以合成: 稀有度=${rarity1}, 种类=${weaponId1}, 形状=${shape1}`);
+        return true;
+    }
     
     // 刷新方块 - 重新生成三个新的武器方块
     public refreshBlocks() {
@@ -1169,6 +1228,20 @@ export class BlockManager extends Component {
         this.generateRandomBlocksInKuang();
     }
 
+    // 检查是否有已放置的方块
+    public hasPlacedBlocks(): boolean {
+        if (!this.placedBlocksContainer || !this.placedBlocksContainer.isValid) {
+            console.log('[BlockManager] PlacedBlocks容器无效');
+            return false;
+        }
+        
+        const blockCount = this.placedBlocksContainer.children.length;
+        console.log(`[BlockManager] 已放置方块数量: ${blockCount}`);
+        
+        // 检查容器中是否有子节点(方块)
+        return blockCount > 0;
+    }
+
     /* =================== 合成逻辑 =================== */
 
     private readonly rarityOrder: string[] = ['common','uncommon','rare','epic','legendary'];
@@ -1178,15 +1251,15 @@ export class BlockManager extends Component {
         const rarity = this.getBlockRarity(block);
         if (!rarity) return;
 
-        // 在 placedBlocksContainer 中寻找与之重叠且同稀有度的其他方块
+        // 在 placedBlocksContainer 中寻找与之重叠且可以合成的其他方块
         if (!this.placedBlocksContainer) return;
 
-        const weaponId = this.getBlockWeaponId(block);
         const blockBB = this.getWorldAABB(block);
         for (const other of this.placedBlocksContainer.children) {
             if (other === block) continue;
-            if (this.getBlockRarity(other) !== rarity) continue;
-            if (this.getBlockWeaponId(other) !== weaponId) continue;
+            
+            // 使用新的合成检查方法
+            if (!this.canMergeBlocks(block, other)) continue;
 
             const otherBB = this.getWorldAABB(other);
             if (this.rectIntersects(blockBB, otherBB)) {
@@ -1198,6 +1271,8 @@ export class BlockManager extends Component {
     }
 
     private performMerge(target: Node, source: Node, rarity: string) {
+        console.log(`[BlockManager] 开始合成方块: 目标=${target.name}, 源=${source.name}, 稀有度=${rarity}`);
+        
         // 隐藏价格标签并处理 db 关联
         this.hidePriceLabel(source);
         const srcDb = source['dbNode'];
@@ -1209,6 +1284,7 @@ export class BlockManager extends Component {
         // 升级稀有度
         const nextRarity = this.getNextRarity(rarity);
         if (nextRarity) {
+            console.log(`[BlockManager] 合成成功,稀有度升级: ${rarity} -> ${nextRarity}`);
             this.setBlockRarityColor(target, nextRarity);
             // 如果有武器配置,也升级
             const cfg = this.blockWeaponConfigs.get(target);
@@ -1285,12 +1361,12 @@ export class BlockManager extends Component {
         const rarity = this.getBlockRarity(draggedBlock);
         if (!rarity) return false;
 
-        const weaponId = this.getBlockWeaponId(draggedBlock);
         const dragBB = this.getWorldAABB(draggedBlock);
         for (const target of this.placedBlocksContainer.children) {
             if (target === draggedBlock) continue;
-            if (this.getBlockRarity(target) !== rarity) continue;
-            if (this.getBlockWeaponId(target) !== weaponId) continue;
+            
+            // 使用新的合成检查方法
+            if (!this.canMergeBlocks(draggedBlock, target)) continue;
 
             const targetBB = this.getWorldAABB(target);
             if (this.rectIntersects(dragBB, targetBB)) {

+ 94 - 11
assets/scripts/CombatSystem/BlockSelection/GameBlockSelection.ts

@@ -1,10 +1,11 @@
-import { _decorator, Component, Node, Button, Label, find, UITransform, Sprite, Color, tween, Tween } from 'cc';
+import { _decorator, Component, Node, Button, Label, find, UITransform, Sprite, Color, tween, Tween, Prefab, instantiate } from 'cc';
 import { LevelSessionManager } from '../../Core/LevelSessionManager';
 import { BallController } from '../BallController';
 import { BlockManager } from '../BlockManager';
 import { GameStartMove } from '../../Animations/GameStartMove';
 import { GamePause } from '../GamePause';
 import { BlockTag } from './BlockTag';
+import EventBus, { GameEvents } from '../../Core/EventBus';
 const { ccclass, property } = _decorator;
 
 @ccclass('GameBlockSelection')
@@ -35,10 +36,10 @@ export class GameBlockSelection extends Component {
     public coinLabelNode: Node = null;
 
     @property({
-        type: Node,
-        tooltip: '拖拽Canvas/InsufficientCoinsUI节点到这里'
+        type: Prefab,
+        tooltip: '拖拽Toast预制体到这里'
     })
-    public insufficientCoinsUI: Node = null;
+    public toastPrefab: Prefab = null;
 
     @property({
         type: Node,
@@ -262,6 +263,15 @@ export class GameBlockSelection extends Component {
 
     // 确认按钮点击(从GameManager迁移的onConfirmButtonClicked)
     public onConfirmButtonClicked() {
+        // 检查是否有上阵方块
+        const hasBlocks = this.hasPlacedBlocks();
+        console.log(`[GameBlockSelection] 检查上阵方块: ${hasBlocks ? '有' : '无'}`);
+        
+        if (!hasBlocks) {
+            this.showNoPlacedBlocksToast();
+            return;
+        }
+        
         // 使用统一的隐藏方法,包含动画
         this.hideBlockSelection();
         
@@ -304,18 +314,33 @@ export class GameBlockSelection extends Component {
 
     // 显示金币不足UI
     private showInsufficientCoinsUI() {
-        if (!this.insufficientCoinsUI) {
-            console.error('金币不足UI节点未绑定,请在Inspector中拖拽Canvas/InsufficientCoinsUI节点');
+        if (!this.toastPrefab) {
+            console.error('Toast预制体未绑定,请在Inspector中拖拽Toast预制体');
             return;
         }
 
-        // 显示金币不足UI
-        this.insufficientCoinsUI.active = true;
+        // 实例化Toast预制体
+        const toastNode = instantiate(this.toastPrefab);
+        
+        // 设置Toast的文本为"金币不足!"
+        const labelNode = toastNode.getChildByName('label');
+        if (labelNode) {
+            const label = labelNode.getComponent(Label);
+            if (label) {
+                label.string = '金币不足!';
+            }
+        }
+        
+        // 将Toast添加到Canvas下
+        const canvas = find('Canvas');
+        if (canvas) {
+            canvas.addChild(toastNode);
+        }
 
-        // 3秒后自动隐藏
+        // 3秒后自动销毁Toast
         this.scheduleOnce(() => {
-            if (this.insufficientCoinsUI && this.insufficientCoinsUI.isValid) {
-                this.insufficientCoinsUI.active = false;
+            if (toastNode && toastNode.isValid) {
+                toastNode.destroy();
             }
         }, 3.0);
 
@@ -356,6 +381,9 @@ export class GameBlockSelection extends Component {
         // 播放BlockSelectionUI出现动画
         this.playShowAnimation();
 
+        // 派发事件
+        EventBus.getInstance().emit(GameEvents.BLOCK_SELECTION_OPEN);
+
         console.log(`[GameBlockSelection] ${isNextWave ? '显示下一波方块选择UI' : '显示游戏开始方块选择UI'}`);
     }
 
@@ -370,6 +398,8 @@ export class GameBlockSelection extends Component {
             //     this.gridContainer.active = false;
             // }
 
+            // 派发事件
+            EventBus.getInstance().emit(GameEvents.BLOCK_SELECTION_CLOSE);
             console.log('隐藏方块选择UI');
         });
     }
@@ -438,4 +468,57 @@ export class GameBlockSelection extends Component {
     public setConfirmCallback(callback: () => void) {
         this.onConfirmCallback = callback;
     }
+
+    // 检查是否有上阵方块
+    private hasPlacedBlocks(): boolean {
+        // 优先使用BlockManager的方法检查
+        if (this.blockManager) {
+            return this.blockManager.hasPlacedBlocks();
+        }
+        
+        // 备用方案:直接检查PlacedBlocks容器
+        const placedBlocksContainer = find('Canvas/GameLevelUI/PlacedBlocks');
+        if (!placedBlocksContainer) {
+            console.warn('找不到PlacedBlocks容器');
+            return false;
+        }
+        
+        // 检查容器中是否有子节点(方块)
+        return placedBlocksContainer.children.length > 0;
+    }
+
+    // 显示没有上阵方块的Toast提示
+    private showNoPlacedBlocksToast() {
+        if (!this.toastPrefab) {
+            console.error('Toast预制体未绑定,请在Inspector中拖拽Toast预制体');
+            return;
+        }
+
+        // 实例化Toast预制体
+        const toastNode = instantiate(this.toastPrefab);
+        
+        // 设置Toast的文本为"请至少上阵一个植物!"
+        const labelNode = toastNode.getChildByName('label');
+        if (labelNode) {
+            const label = labelNode.getComponent(Label);
+            if (label) {
+                label.string = '请至少上阵一个植物!';
+            }
+        }
+        
+        // 将Toast添加到Canvas下
+        const canvas = find('Canvas');
+        if (canvas) {
+            canvas.addChild(toastNode);
+        }
+
+        // 3秒后自动销毁Toast
+        this.scheduleOnce(() => {
+            if (toastNode && toastNode.isValid) {
+                toastNode.destroy();
+            }
+        }, 3.0);
+
+        console.log('请至少上阵一个植物!');
+    }
 }

+ 53 - 12
assets/scripts/CombatSystem/EnemyController.ts

@@ -47,6 +47,13 @@ export class EnemyController extends BaseSingleton {
     @property({ type: Prefab, tooltip: '金币预制体 CoinDrop' })
     public coinPrefab: Prefab = null;
 
+    // Toast预制体,用于显示波次提示
+    @property({
+        type: Prefab,
+        tooltip: 'Toast预制体,用于显示波次提示'
+    })
+    public toastPrefab: Prefab = null;
+
     // === 生成 & 属性参数(保留需要可在内部自行设定,Inspector 不再显示) ===
     private spawnInterval: number = 3;
 
@@ -95,11 +102,12 @@ export class EnemyController extends BaseSingleton {
     })
     public waveNumberLabelNode: Node = null;
 
-    @property({
-        type: Node,
-        tooltip: '每波开始提示UI节点 (StartWaveUI)'
-    })
-    public startWaveUI: Node = null;
+    // 移除startWaveUI的查找,改为使用Toast预制体
+    // @property({
+    //     type: Node,
+    //     tooltip: '每波开始提示UI节点 (StartWaveUI)'
+    // })
+    // public startWaveUI: Node = null;
 
     private totalWaves: number = 1;
     private currentWave: number = 1;
@@ -153,9 +161,10 @@ export class EnemyController extends BaseSingleton {
         if (!this.waveNumberLabelNode) {
             this.waveNumberLabelNode = find('Canvas/GameLevelUI/WaveInfo/WaveNumber');
         }
-        if (!this.startWaveUI) {
-            this.startWaveUI = find('Canvas/GameLevelUI/StartWaveUI') || find('Canvas/GameLevelUI/NextWaveUI');
-        }
+        // 移除startWaveUI的查找,改为使用Toast预制体
+        // if (!this.startWaveUI) {
+        //     this.startWaveUI = find('Canvas/GameLevelUI/StartWaveUI') || find('Canvas/GameLevelUI/NextWaveUI');
+        // }
         // 初始化敌人数量显示
         this.updateEnemyCountLabel();
 
@@ -778,7 +787,8 @@ export class EnemyController extends BaseSingleton {
         this.currentWaveEnemiesKilled = 0;
         this.updateWaveLabel();
         this.updateEnemyCountLabel();
-        if (this.startWaveUI) this.startWaveUI.active = false;
+        // 移除startWaveUI的隐藏,因为现在使用Toast预制体
+        // if (this.startWaveUI) this.startWaveUI.active = false;
     }
 
     private updateWaveLabel() {
@@ -798,13 +808,40 @@ export class EnemyController extends BaseSingleton {
             return;
         }
         
-        if (!this.startWaveUI) return;
-        this.startWaveUI.active = true;
+        if (!this.toastPrefab) {
+            console.warn('Toast预制体未绑定,无法显示波次提示');
+            // 如果没有Toast预制体,直接开始游戏
+            this.startGame();
+            return;
+        }
+
+        // 实例化Toast预制体
+        const toastNode = instantiate(this.toastPrefab);
+        
+        // 设置Toast的文本为"第x波敌人来袭!"
+        const labelNode = toastNode.getChildByName('label');
+        if (labelNode) {
+            const label = labelNode.getComponent(Label);
+            if (label) {
+                label.string = `第${this.currentWave}波敌人来袭!`;
+            }
+        }
+        
+        // 将Toast添加到Canvas下
+        const canvas = find('Canvas');
+        if (canvas) {
+            canvas.addChild(toastNode);
+        }
+
         // 暂停生成(确保未重复)
         this.pauseSpawning();
+        
         if (duration > 0) {
             this.scheduleOnce(() => {
-                if (this.startWaveUI) this.startWaveUI.active = false;
+                // 销毁Toast
+                if (toastNode && toastNode.isValid) {
+                    toastNode.destroy();
+                }
                 
                 // 再次检查游戏是否已经结束,如果结束则不开始生成敌人
                 const gamePauseCheck = GamePause.getInstance();
@@ -817,6 +854,10 @@ export class EnemyController extends BaseSingleton {
                 this.startGame();
             }, duration);
         } else {
+            // 立即销毁Toast并开始游戏
+            if (toastNode && toastNode.isValid) {
+                toastNode.destroy();
+            }
             this.startGame();
         }
     }

+ 3 - 1
assets/scripts/Core/EventBus.ts

@@ -9,7 +9,9 @@ export enum GameEvents {
     GAME_RESUME = 'GAME_RESUME',
     GAME_SUCCESS = 'GAME_SUCCESS',
     GAME_DEFEAT = 'GAME_DEFEAT',
-    SHOP_UPDATED = 'SHOP_UPDATED'
+    SHOP_UPDATED = 'SHOP_UPDATED',
+    BLOCK_SELECTION_OPEN = 'BLOCK_SELECTION_OPEN',
+    BLOCK_SELECTION_CLOSE = 'BLOCK_SELECTION_CLOSE'
 }
 
 export default class EventBus extends EventTarget {

+ 33 - 6
assets/scripts/LevelSystem/GameManager.ts

@@ -23,7 +23,8 @@ enum GameState {
     PLAYING = 'playing',
     SUCCESS = 'success',
     DEFEAT = 'defeat',
-    PAUSED = 'paused'
+    PAUSED = 'paused',
+    BLOCK_SELECTION = 'block_selection'
 }
 
 /**
@@ -147,6 +148,8 @@ export class GameManager extends Component {
     // GameBlockSelection组件
     private blockSelectionComponent: GameBlockSelection = null;
 
+    private pendingSkillSelection: boolean = false;
+
     start() {
         // 初始化物理系统
         this.initPhysicsSystem();
@@ -254,16 +257,15 @@ export class GameManager extends Component {
         // 当前波击杀 +1
         this.currentWaveEnemyCount++;
 
-        // 增加能量点
-        this.incrementEnergy();
-        
         const remaining = this.currentWaveTotalEnemies - this.currentWaveEnemyCount;
         console.log(`[GameManager] 敌人被消灭,当前波剩余敌人: ${remaining}/${this.currentWaveTotalEnemies}, 总击杀: ${this.enemiesKilled}`);
         
+        // 先检查是否波次结束,如果结束则先设置状态
         if (remaining <= 0) {
             // 当前波结束
             if (this.currentWave < (this.levelWaves?.length || 1)) {
-                // 还有下一波,显示提示
+                // 还有下一波,先设置状态为方块选择,防止能量满时直接弹出技能选择
+                this.currentState = GameState.BLOCK_SELECTION;
                 console.log(`[GameManager] 当前波结束,准备显示下一波(${this.currentWave + 1}/${this.levelWaves?.length || 1})选择UI`);
                 this.showNextWavePrompt();
             } else {
@@ -272,6 +274,9 @@ export class GameManager extends Component {
                 this.triggerGameSuccess();
             }
         }
+
+        // 增加能量点(在状态设置之后)
+        this.incrementEnergy();
     }
 
     // === 暂停游戏 ===
@@ -1199,6 +1204,8 @@ export class GameManager extends Component {
         if (this.blockSelectionComponent) {
             this.blockSelectionComponent.showBlockSelection(true);
             this.preparingNextWave = true;
+            // 状态已在onEnemyKilledEvent中设置,这里不需要重复设置
+            // this.currentState = GameState.BLOCK_SELECTION;
             
             // 使用GamePause来暂停游戏
             const gamePause = GamePause.getInstance();
@@ -1234,7 +1241,16 @@ export class GameManager extends Component {
 
     /** 能量满时触发 */
     private onEnergyFull() {
+        console.log(`[GameManager] onEnergyFull 被调用,当前状态: ${this.currentState}, pendingSkillSelection: ${this.pendingSkillSelection}`);
+        
+        if (this.currentState === GameState.BLOCK_SELECTION) {
+            this.pendingSkillSelection = true;
+            console.log('[GameManager] 当前处于方块选择状态,暂存技能选择请求');
+            return;
+        }
+        
         if (this.selectSkillUI && !this.selectSkillUI.active) {
+            console.log('[GameManager] 直接弹出技能选择UI');
             // 暂停游戏后再弹出 UI
             this.pauseGame();
             this.selectSkillUI.active = true;
@@ -1319,10 +1335,21 @@ export class GameManager extends Component {
     // 处理确认操作(替代原来的onConfirmButtonClicked)
     private handleConfirmAction() {
         if (this.preparingNextWave) {
-            // 进入下一波
             this.preparingNextWave = false;
+            this.currentState = GameState.PLAYING;
+            
             this.enemyController.showStartWavePromptUI();  // 弹 startWaveUI 后自动 startGame()
             this.nextWave();                               // 更新 wave 计数 & total
+            
+            // 方块选择结束后,如果有待弹出技能选择,则弹出
+            if (this.pendingSkillSelection) {
+                this.pendingSkillSelection = false;
+                console.log('[GameManager] 检测到待弹出技能选择,现在弹出技能选择UI');
+                if (this.selectSkillUI && !this.selectSkillUI.active) {
+                    this.pauseGame();
+                    this.selectSkillUI.active = true;
+                }
+            }
             return;
         }
 

+ 607 - 0
dependency-graph.svg

@@ -0,0 +1,607 @@
+<?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="3129pt" height="1064pt"
+ viewBox="0.00 0.00 3129.00 1064.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 1042.4)">
+<title>G</title>
+<polygon fill="#111111" stroke="none" points="-21.6,21.6 -21.6,-1042.4 3107.1,-1042.4 3107.1,21.6 -21.6,21.6"/>
+<!-- scripts/Animations/GameStartMove.ts -->
+<g id="node1" class="node">
+<title>scripts/Animations/GameStartMove.ts</title>
+<path fill="none" stroke="#cfffac" d="M1505.08,-792.8C1505.08,-792.8 1276.17,-792.8 1276.17,-792.8 1272.21,-792.8 1268.25,-788.84 1268.25,-784.88 1268.25,-784.88 1268.25,-776.96 1268.25,-776.96 1268.25,-773 1272.21,-769.05 1276.17,-769.05 1276.17,-769.05 1505.08,-769.05 1505.08,-769.05 1509.04,-769.05 1513,-773 1513,-776.96 1513,-776.96 1513,-784.88 1513,-784.88 1513,-788.84 1509.04,-792.8 1505.08,-792.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1390.62" y="-775.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Animations/GameStartMove.ts</text>
+</g>
+<!-- scripts/CombatSystem/BallController.ts -->
+<g id="node2" class="node">
+<title>scripts/CombatSystem/BallController.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1508.08,-400.8C1508.08,-400.8 1273.17,-400.8 1273.17,-400.8 1269.21,-400.8 1265.25,-396.84 1265.25,-392.88 1265.25,-392.88 1265.25,-384.96 1265.25,-384.96 1265.25,-381 1269.21,-377.05 1273.17,-377.05 1273.17,-377.05 1508.08,-377.05 1508.08,-377.05 1512.04,-377.05 1516,-381 1516,-384.96 1516,-384.96 1516,-392.88 1516,-392.88 1516,-396.84 1512.04,-400.8 1508.08,-400.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1390.62" y="-383.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BallController.ts</text>
+</g>
+<!-- scripts/CombatSystem/EnemyController.ts -->
+<g id="node3" class="node">
+<title>scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2203.83,-614.8C2203.83,-614.8 1948.67,-614.8 1948.67,-614.8 1944.71,-614.8 1940.75,-610.84 1940.75,-606.88 1940.75,-606.88 1940.75,-598.96 1940.75,-598.96 1940.75,-595 1944.71,-591.05 1948.67,-591.05 1948.67,-591.05 2203.83,-591.05 2203.83,-591.05 2207.79,-591.05 2211.75,-595 2211.75,-598.96 2211.75,-598.96 2211.75,-606.88 2211.75,-606.88 2211.75,-610.84 2207.79,-614.8 2203.83,-614.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2076.25" y="-597.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/EnemyController.ts</text>
+</g>
+<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
+<g id="edge1" class="edge">
+<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#757575" d="M1460.08,-401.26C1479.26,-405.16 1500.04,-409.8 1519,-414.92 1619.96,-442.17 1916.37,-546.5 2030.11,-586.85"/>
+<polygon fill="#757575" stroke="#757575" points="2028.83,-590.11 2039.42,-590.16 2031.17,-583.51 2028.83,-590.11"/>
+</g>
+<!-- scripts/CombatSystem/GamePause.ts -->
+<g id="node4" class="node">
+<title>scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2566.71,-424.8C2566.71,-424.8 2335.54,-424.8 2335.54,-424.8 2331.58,-424.8 2327.62,-420.84 2327.62,-416.88 2327.62,-416.88 2327.62,-408.96 2327.62,-408.96 2327.62,-405 2331.58,-401.05 2335.54,-401.05 2335.54,-401.05 2566.71,-401.05 2566.71,-401.05 2570.67,-401.05 2574.62,-405 2574.62,-408.96 2574.62,-408.96 2574.62,-416.88 2574.62,-416.88 2574.62,-420.84 2570.67,-424.8 2566.71,-424.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-407.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/GamePause.ts</text>
+</g>
+<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/GamePause.ts -->
+<g id="edge2" class="edge">
+<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M1516.42,-391.75C1716.99,-396.3 2109.42,-405.2 2315.85,-409.88"/>
+<polygon fill="#757575" stroke="#757575" points="2315.77,-413.38 2325.85,-410.1 2315.93,-406.38 2315.77,-413.38"/>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts -->
+<g id="node5" class="node">
+<title>scripts/CombatSystem/WeaponBullet.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1833.08,-748.8C1833.08,-748.8 1594.42,-748.8 1594.42,-748.8 1590.46,-748.8 1586.5,-744.84 1586.5,-740.88 1586.5,-740.88 1586.5,-732.96 1586.5,-732.96 1586.5,-729 1590.46,-725.05 1594.42,-725.05 1594.42,-725.05 1833.08,-725.05 1833.08,-725.05 1837.04,-725.05 1841,-729 1841,-732.96 1841,-732.96 1841,-740.88 1841,-740.88 1841,-744.84 1837.04,-748.8 1833.08,-748.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1713.75" y="-731.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/WeaponBullet.ts</text>
+</g>
+<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts -->
+<g id="edge3" class="edge">
+<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/CombatSystem/WeaponBullet.ts</title>
+<path fill="none" stroke="#757575" d="M1407.74,-401.14C1435.07,-422.76 1490.33,-470.55 1519,-523.92 1552.27,-585.84 1508.59,-625.14 1555,-677.92 1573.5,-698.96 1600.24,-712.51 1626.47,-721.24"/>
+<polygon fill="#757575" stroke="#757575" points="1625.23,-724.52 1635.81,-724.13 1627.3,-717.83 1625.23,-724.52"/>
+</g>
+<!-- scripts/Core/EventBus.ts -->
+<g id="node6" class="node">
+<title>scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#cfffac" d="M2831.33,-404.8C2831.33,-404.8 2683.42,-404.8 2683.42,-404.8 2679.46,-404.8 2675.5,-400.84 2675.5,-396.88 2675.5,-396.88 2675.5,-388.96 2675.5,-388.96 2675.5,-385 2679.46,-381.05 2683.42,-381.05 2683.42,-381.05 2831.33,-381.05 2831.33,-381.05 2835.29,-381.05 2839.25,-385 2839.25,-388.96 2839.25,-388.96 2839.25,-396.88 2839.25,-396.88 2839.25,-400.84 2835.29,-404.8 2831.33,-404.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2757.38" y="-387.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/Core/EventBus.ts</text>
+</g>
+<!-- scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge4" class="edge">
+<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M1516.42,-388.78C1613.49,-388.71 1751.55,-388.68 1872.5,-388.92 2205.72,-389.59 2289.03,-390.01 2622.25,-391.92 2635.75,-392 2650.02,-392.09 2664.02,-392.19"/>
+<polygon fill="#757575" stroke="#757575" points="2663.63,-395.69 2673.65,-392.26 2663.68,-388.69 2663.63,-395.69"/>
+</g>
+<!-- scripts/Core/PhysicsManager.ts -->
+<g id="node7" class="node">
+<title>scripts/Core/PhysicsManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2171.21,-78.8C2171.21,-78.8 1981.29,-78.8 1981.29,-78.8 1977.33,-78.8 1973.38,-74.84 1973.38,-70.88 1973.38,-70.88 1973.38,-62.96 1973.38,-62.96 1973.38,-59 1977.33,-55.05 1981.29,-55.05 1981.29,-55.05 2171.21,-55.05 2171.21,-55.05 2175.17,-55.05 2179.12,-59 2179.12,-62.96 2179.12,-62.96 2179.12,-70.88 2179.12,-70.88 2179.12,-74.84 2175.17,-78.8 2171.21,-78.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2076.25" y="-61.5" 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="edge5" class="edge">
+<title>scripts/CombatSystem/BallController.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
+<path fill="none" stroke="#757575" d="M1403.76,-376.62C1427.99,-351.6 1483.1,-292.27 1519,-234.92 1539.47,-202.22 1524.03,-178.93 1555,-155.92 1669.31,-71 1737.37,-157.83 1872.5,-112.92 1889.87,-107.15 1891.19,-98.87 1908.5,-92.92 1925.37,-87.13 1943.64,-82.62 1961.7,-79.11"/>
+<polygon fill="#757575" stroke="#757575" points="1962.2,-82.58 1971.41,-77.33 1960.94,-75.69 1962.2,-82.58"/>
+</g>
+<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/GamePause.ts -->
+<g id="edge23" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M2212.11,-595.21C2223.64,-590.72 2234.51,-584.75 2244,-576.92 2280.43,-546.85 2246.84,-510.56 2280,-476.92 2303.68,-452.9 2337.25,-437.78 2368.32,-428.32"/>
+<polygon fill="#757575" stroke="#757575" points="2369.08,-431.74 2377.73,-425.62 2367.15,-425.01 2369.08,-431.74"/>
+</g>
+<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge26" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M2212.21,-593.25C2223.52,-589.12 2234.32,-583.78 2244,-576.92 2271.59,-557.38 2252.13,-529.05 2280,-509.92 2406.41,-423.18 2476.47,-514.36 2622.25,-466.92 2643.39,-460.04 2694.13,-430.58 2726.79,-410.97"/>
+<polygon fill="#757575" stroke="#757575" points="2728.24,-414.18 2735,-406.02 2724.62,-408.19 2728.24,-414.18"/>
+</g>
+<!-- scripts/Core/ConfigManager.ts -->
+<g id="node10" class="node">
+<title>scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2848.58,-761.8C2848.58,-761.8 2666.17,-761.8 2666.17,-761.8 2662.21,-761.8 2658.25,-757.84 2658.25,-753.88 2658.25,-753.88 2658.25,-745.96 2658.25,-745.96 2658.25,-742 2662.21,-738.05 2666.17,-738.05 2666.17,-738.05 2848.58,-738.05 2848.58,-738.05 2852.54,-738.05 2856.5,-742 2856.5,-745.96 2856.5,-745.96 2856.5,-753.88 2856.5,-753.88 2856.5,-757.84 2852.54,-761.8 2848.58,-761.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2757.38" y="-744.5" 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="edge25" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M2212.05,-609.95C2223.27,-613.46 2234.09,-618.03 2244,-623.92 2267.54,-637.91 2256.36,-660.11 2280,-673.92 2346.08,-712.52 2547.15,-697.22 2622.25,-711.92 2651.22,-717.59 2683.02,-726.48 2708.39,-734.24"/>
+<polygon fill="#757575" stroke="#757575" points="2707.16,-737.52 2717.75,-737.15 2709.24,-730.84 2707.16,-737.52"/>
+</g>
+<!-- scripts/LevelSystem/SaveDataManager.ts -->
+<g id="node12" class="node">
+<title>scripts/LevelSystem/SaveDataManager.ts</title>
+<path fill="none" stroke="#cfffac" d="M2576.83,-914.8C2576.83,-914.8 2325.42,-914.8 2325.42,-914.8 2321.46,-914.8 2317.5,-910.84 2317.5,-906.88 2317.5,-906.88 2317.5,-898.96 2317.5,-898.96 2317.5,-895 2321.46,-891.05 2325.42,-891.05 2325.42,-891.05 2576.83,-891.05 2576.83,-891.05 2580.79,-891.05 2584.75,-895 2584.75,-898.96 2584.75,-898.96 2584.75,-906.88 2584.75,-906.88 2584.75,-910.84 2580.79,-914.8 2576.83,-914.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-897.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/LevelSystem/SaveDataManager.ts</text>
+</g>
+<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
+<g id="edge27" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
+<path fill="none" stroke="#757575" d="M2212.17,-605.45C2223.76,-609.81 2234.62,-615.81 2244,-623.92 2289.35,-663.13 2248.11,-703.15 2280,-753.92 2316.23,-811.6 2381.49,-859.54 2419.79,-884.44"/>
+<polygon fill="#757575" stroke="#757575" points="2417.79,-887.31 2428.1,-889.74 2421.55,-881.41 2417.79,-887.31"/>
+</g>
+<!-- scripts/CombatSystem/EnemyComponent.ts -->
+<g id="node19" class="node">
+<title>scripts/CombatSystem/EnemyComponent.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2585.08,-664.8C2585.08,-664.8 2317.17,-664.8 2317.17,-664.8 2313.21,-664.8 2309.25,-660.84 2309.25,-656.88 2309.25,-656.88 2309.25,-648.96 2309.25,-648.96 2309.25,-645 2313.21,-641.05 2317.17,-641.05 2317.17,-641.05 2585.08,-641.05 2585.08,-641.05 2589.04,-641.05 2593,-645 2593,-648.96 2593,-648.96 2593,-656.88 2593,-656.88 2593,-660.84 2589.04,-664.8 2585.08,-664.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-647.5" 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="edge21" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyComponent.ts</title>
+<path fill="none" stroke="#757575" d="M2177.36,-615.29C2199.32,-618.07 2222.45,-621.05 2244,-623.92 2279.72,-628.68 2318.88,-634.13 2353.39,-639.02"/>
+<polygon fill="#757575" stroke="#757575" points="2352.53,-642.43 2362.92,-640.37 2353.51,-635.5 2352.53,-642.43"/>
+</g>
+<!-- scripts/CombatSystem/EnemyInstance.ts -->
+<g id="node20" class="node">
+<title>scripts/CombatSystem/EnemyInstance.ts</title>
+<path fill="none" stroke="#cfffac" d="M2575.33,-542.8C2575.33,-542.8 2326.92,-542.8 2326.92,-542.8 2322.96,-542.8 2319,-538.84 2319,-534.88 2319,-534.88 2319,-526.96 2319,-526.96 2319,-523 2322.96,-519.05 2326.92,-519.05 2326.92,-519.05 2575.33,-519.05 2575.33,-519.05 2579.29,-519.05 2583.25,-523 2583.25,-526.96 2583.25,-526.96 2583.25,-534.88 2583.25,-534.88 2583.25,-538.84 2579.29,-542.8 2575.33,-542.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-525.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/EnemyInstance.ts</text>
+</g>
+<!-- scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyInstance.ts -->
+<g id="edge22" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/CombatSystem/EnemyInstance.ts</title>
+<path fill="none" stroke="#757575" d="M2198.77,-590.59C2214.28,-587.1 2229.72,-582.64 2244,-576.92 2262.08,-569.68 2261.8,-558.87 2280,-551.92 2288.79,-548.56 2298.01,-545.71 2307.41,-543.3"/>
+<polygon fill="#757575" stroke="#757575" points="2308.12,-546.73 2317.04,-541.01 2306.5,-539.92 2308.12,-546.73"/>
+</g>
+<!-- scripts/Core/BaseSingleton.ts -->
+<g id="node21" class="node">
+<title>scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#cfffac" d="M3077.58,-389.8C3077.58,-389.8 2900.42,-389.8 2900.42,-389.8 2896.46,-389.8 2892.5,-385.84 2892.5,-381.88 2892.5,-381.88 2892.5,-373.96 2892.5,-373.96 2892.5,-370 2896.46,-366.05 2900.42,-366.05 2900.42,-366.05 3077.58,-366.05 3077.58,-366.05 3081.54,-366.05 3085.5,-370 3085.5,-373.96 3085.5,-373.96 3085.5,-381.88 3085.5,-381.88 3085.5,-385.84 3081.54,-389.8 3077.58,-389.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2989" y="-372.5" 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="edge24" class="edge">
+<title>scripts/CombatSystem/EnemyController.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M2212.25,-612.72C2323.26,-617.91 2484.19,-618.83 2622.25,-593.92 2730.95,-574.31 2763.26,-570.13 2856.5,-510.92 2905.26,-479.95 2949.75,-427.8 2972.36,-398.86"/>
+<polygon fill="#757575" stroke="#757575" points="2974.93,-401.26 2978.24,-391.2 2969.38,-397 2974.93,-401.26"/>
+</g>
+<!-- scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge28" class="edge">
+<title>scripts/CombatSystem/GamePause.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M2575,-404.84C2604.71,-402.89 2635.98,-400.84 2664.02,-398.99"/>
+<polygon fill="#757575" stroke="#757575" points="2664.15,-402.49 2673.9,-398.34 2663.69,-395.51 2664.15,-402.49"/>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
+<g id="edge36" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#757575" d="M1841.23,-728.29C1852.49,-724 1863.15,-718.34 1872.5,-710.92 1905.28,-684.91 1875.23,-649.31 1908.5,-623.92 1915.12,-618.87 1922.33,-614.68 1929.93,-611.23"/>
+<polygon fill="#757575" stroke="#757575" points="1931.13,-614.52 1939.1,-607.54 1928.51,-608.03 1931.13,-614.52"/>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/GamePause.ts -->
+<g id="edge37" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M1783.95,-724.57C1814.46,-716.01 1848.71,-701.69 1872.5,-677.92 1904.74,-645.71 1874.38,-612.12 1908.5,-581.92 2023.37,-480.26 2111.24,-577.76 2244,-500.92 2264.14,-489.27 2260.16,-475.06 2280,-462.92 2306.43,-446.75 2338.37,-435.57 2367.41,-427.95"/>
+<polygon fill="#757575" stroke="#757575" points="2368.06,-431.39 2376.91,-425.57 2366.36,-424.6 2368.06,-431.39"/>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
+<g id="edge38" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M1780.39,-749.22C1817.78,-755.61 1865.59,-762.73 1908.5,-765.92 2172.86,-785.6 2484.78,-769.68 2646.58,-758.5"/>
+<polygon fill="#757575" stroke="#757575" points="2646.73,-762 2656.46,-757.81 2646.24,-755.02 2646.73,-762"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletCount.ts -->
+<g id="node14" class="node">
+<title>scripts/CombatSystem/BulletEffects/BulletCount.ts</title>
+<path fill="none" stroke="#cfffac" d="M2227.83,-656.8C2227.83,-656.8 1924.67,-656.8 1924.67,-656.8 1920.71,-656.8 1916.75,-652.84 1916.75,-648.88 1916.75,-648.88 1916.75,-640.96 1916.75,-640.96 1916.75,-637 1920.71,-633.05 1924.67,-633.05 1924.67,-633.05 2227.83,-633.05 2227.83,-633.05 2231.79,-633.05 2235.75,-637 2235.75,-640.96 2235.75,-640.96 2235.75,-648.88 2235.75,-648.88 2235.75,-652.84 2231.79,-656.8 2227.83,-656.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2076.25" y="-639.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/BulletEffects/BulletCount.ts</text>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletCount.ts -->
+<g id="edge32" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletCount.ts</title>
+<path fill="none" stroke="#757575" d="M1841.28,-724.74C1852.22,-721.13 1862.8,-716.6 1872.5,-710.92 1894.6,-697.98 1886.16,-678.44 1908.5,-665.92 1911.06,-664.49 1913.68,-663.13 1916.34,-661.85"/>
+<polygon fill="#757575" stroke="#757575" points="1917.68,-665.09 1925.46,-657.89 1914.89,-658.67 1917.68,-665.09"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts -->
+<g id="node15" class="node">
+<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2235.33,-698.8C2235.33,-698.8 1917.17,-698.8 1917.17,-698.8 1913.21,-698.8 1909.25,-694.84 1909.25,-690.88 1909.25,-690.88 1909.25,-682.96 1909.25,-682.96 1909.25,-679 1913.21,-675.05 1917.17,-675.05 1917.17,-675.05 2235.33,-675.05 2235.33,-675.05 2239.29,-675.05 2243.25,-679 2243.25,-682.96 2243.25,-682.96 2243.25,-690.88 2243.25,-690.88 2243.25,-694.84 2239.29,-698.8 2235.33,-698.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2076.25" y="-681.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</text>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletHitEffect.ts -->
+<g id="edge33" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletHitEffect.ts</title>
+<path fill="none" stroke="#757575" d="M1794.34,-724.58C1829.33,-719.27 1870.93,-713.1 1908.5,-707.92 1926.09,-705.5 1944.75,-703.04 1962.96,-700.7"/>
+<polygon fill="#757575" stroke="#757575" points="1963.26,-704.19 1972.73,-699.45 1962.37,-697.25 1963.26,-704.19"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
+<g id="node16" class="node">
+<title>scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
+<path fill="none" stroke="#cfffac" d="M2614.33,-744.8C2614.33,-744.8 2287.92,-744.8 2287.92,-744.8 2283.96,-744.8 2280,-740.84 2280,-736.88 2280,-736.88 2280,-728.96 2280,-728.96 2280,-725 2283.96,-721.05 2287.92,-721.05 2287.92,-721.05 2614.33,-721.05 2614.33,-721.05 2618.29,-721.05 2622.25,-725 2622.25,-728.96 2622.25,-728.96 2622.25,-736.88 2622.25,-736.88 2622.25,-740.84 2618.29,-744.8 2614.33,-744.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-727.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</text>
+</g>
+<!-- scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
+<g id="edge35" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
+<path fill="none" stroke="#757575" d="M1841.32,-746.64C1863.69,-748.01 1886.77,-749.19 1908.5,-749.92 2057.53,-754.91 2095.02,-756.05 2244,-749.92 2264.93,-749.06 2287.02,-747.71 2308.66,-746.13"/>
+<polygon fill="#757575" stroke="#757575" points="2308.71,-749.64 2318.42,-745.41 2308.18,-742.66 2308.71,-749.64"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletLifecycle.ts -->
+<g id="node17" class="node">
+<title>scripts/CombatSystem/BulletEffects/BulletLifecycle.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2236.08,-740.8C2236.08,-740.8 1916.42,-740.8 1916.42,-740.8 1912.46,-740.8 1908.5,-736.84 1908.5,-732.88 1908.5,-732.88 1908.5,-724.96 1908.5,-724.96 1908.5,-721 1912.46,-717.05 1916.42,-717.05 1916.42,-717.05 2236.08,-717.05 2236.08,-717.05 2240.04,-717.05 2244,-721 2244,-724.96 2244,-724.96 2244,-732.88 2244,-732.88 2244,-736.84 2240.04,-740.8 2236.08,-740.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2076.25" y="-723.5" 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="edge34" class="edge">
+<title>scripts/CombatSystem/WeaponBullet.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletLifecycle.ts</title>
+<path fill="none" stroke="#757575" d="M1841.34,-734.11C1859.32,-733.71 1878.08,-733.3 1896.82,-732.88"/>
+<polygon fill="#757575" stroke="#757575" points="1896.72,-736.38 1906.64,-732.66 1896.56,-729.39 1896.72,-736.38"/>
+</g>
+<!-- scripts/Core/PhysicsManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
+<g id="edge40" class="edge">
+<title>scripts/Core/PhysicsManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M2118.08,-54.65C2241.69,-20.14 2617.96,65.39 2856.5,-92.92 2948.73,-154.13 2977.39,-297.65 2985.29,-354.31"/>
+<polygon fill="#757575" stroke="#757575" points="2981.8,-354.63 2986.55,-364.1 2988.75,-353.74 2981.8,-354.63"/>
+</g>
+<!-- scripts/CombatSystem/BlockManager.ts -->
+<g id="node8" class="node">
+<title>scripts/CombatSystem/BlockManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1511.08,-712.8C1511.08,-712.8 1270.17,-712.8 1270.17,-712.8 1266.21,-712.8 1262.25,-708.84 1262.25,-704.88 1262.25,-704.88 1262.25,-696.96 1262.25,-696.96 1262.25,-693 1266.21,-689.05 1270.17,-689.05 1270.17,-689.05 1511.08,-689.05 1511.08,-689.05 1515.04,-689.05 1519,-693 1519,-696.96 1519,-696.96 1519,-704.88 1519,-704.88 1519,-708.84 1515.04,-712.8 1511.08,-712.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1390.62" y="-695.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BlockManager.ts</text>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/BlockTag.ts -->
+<g id="node9" class="node">
+<title>scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
+<path fill="none" stroke="#cfffac" d="M1864.58,-668.8C1864.58,-668.8 1562.92,-668.8 1562.92,-668.8 1558.96,-668.8 1555,-664.84 1555,-660.88 1555,-660.88 1555,-652.96 1555,-652.96 1555,-649 1558.96,-645.05 1562.92,-645.05 1562.92,-645.05 1864.58,-645.05 1864.58,-645.05 1868.54,-645.05 1872.5,-649 1872.5,-652.96 1872.5,-652.96 1872.5,-660.88 1872.5,-660.88 1872.5,-664.84 1868.54,-668.8 1864.58,-668.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1713.75" y="-651.5" 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="edge6" class="edge">
+<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
+<path fill="none" stroke="#757575" d="M1481.93,-688.55C1522.2,-683.03 1569.82,-676.5 1611.32,-670.82"/>
+<polygon fill="#757575" stroke="#757575" points="1611.63,-674.31 1621.07,-669.48 1610.68,-667.37 1611.63,-674.31"/>
+</g>
+<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
+<g id="edge7" class="edge">
+<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M1419.62,-713.2C1451.66,-726.66 1506.04,-747.69 1555,-757.92 2019.43,-854.95 2151.27,-839.22 2622.25,-781.92 2649.76,-778.57 2679.82,-771.71 2704.49,-765.19"/>
+<polygon fill="#757575" stroke="#757575" points="2705.22,-768.62 2713.96,-762.63 2703.4,-761.87 2705.22,-768.62"/>
+</g>
+<!-- scripts/Core/LevelSessionManager.ts -->
+<g id="node11" class="node">
+<title>scripts/Core/LevelSessionManager.ts</title>
+<path fill="none" stroke="#cfffac" d="M1825.58,-580.8C1825.58,-580.8 1601.92,-580.8 1601.92,-580.8 1597.96,-580.8 1594,-576.84 1594,-572.88 1594,-572.88 1594,-564.96 1594,-564.96 1594,-561 1597.96,-557.05 1601.92,-557.05 1601.92,-557.05 1825.58,-557.05 1825.58,-557.05 1829.54,-557.05 1833.5,-561 1833.5,-564.96 1833.5,-564.96 1833.5,-572.88 1833.5,-572.88 1833.5,-576.84 1829.54,-580.8 1825.58,-580.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1713.75" y="-563.5" 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="edge8" class="edge">
+<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
+<path fill="none" stroke="#757575" d="M1421.55,-688.62C1479.51,-664.79 1607.14,-612.33 1672.48,-585.48"/>
+<polygon fill="#757575" stroke="#757575" points="1673.47,-588.85 1681.39,-581.81 1670.81,-582.38 1673.47,-588.85"/>
+</g>
+<!-- scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
+<g id="edge9" class="edge">
+<title>scripts/CombatSystem/BlockManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
+<path fill="none" stroke="#757575" d="M1439.8,-713.29C1466.3,-722.31 1497.98,-737.04 1519,-759.92 1550.67,-794.4 1517.32,-831.13 1555,-858.92 1613.79,-902.29 2068.04,-905.71 2305.9,-904.45"/>
+<polygon fill="#757575" stroke="#757575" points="2305.92,-907.95 2315.9,-904.39 2305.88,-900.95 2305.92,-907.95"/>
+</g>
+<!-- scripts/Core/ConfigManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
+<g id="edge39" class="edge">
+<title>scripts/Core/ConfigManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M2769.51,-737.59C2788.64,-716.08 2828.37,-669.89 2856.5,-626.92 2908.6,-547.34 2957.46,-444.9 2977.92,-400.31"/>
+<polygon fill="#757575" stroke="#757575" points="2981.01,-401.96 2981.97,-391.41 2974.64,-399.06 2981.01,-401.96"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts -->
+<g id="node13" class="node">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1218.33,-601.8C1218.33,-601.8 844.67,-601.8 844.67,-601.8 840.71,-601.8 836.75,-597.84 836.75,-593.88 836.75,-593.88 836.75,-585.96 836.75,-585.96 836.75,-582 840.71,-578.05 844.67,-578.05 844.67,-578.05 1218.33,-578.05 1218.33,-578.05 1222.29,-578.05 1226.25,-582 1226.25,-585.96 1226.25,-585.96 1226.25,-593.88 1226.25,-593.88 1226.25,-597.84 1222.29,-601.8 1218.33,-601.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1031.5" y="-584.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</text>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
+<g id="edge10" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
+<path fill="none" stroke="#757575" d="M1052.45,-602.18C1091.92,-626.25 1182.99,-680.9 1262.25,-721.92 1291.51,-737.07 1325.39,-752.67 1350.85,-764.02"/>
+<polygon fill="#757575" stroke="#757575" points="1349.26,-767.15 1359.82,-768 1352.1,-760.75 1349.26,-767.15"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BallController.ts -->
+<g id="edge11" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BallController.ts</title>
+<path fill="none" stroke="#757575" d="M1051.89,-577.71C1091.11,-553.16 1182.85,-496.47 1262.25,-452.92 1292.76,-436.19 1328.19,-418.52 1353.92,-406"/>
+<polygon fill="#757575" stroke="#757575" points="1355.13,-409.31 1362.61,-401.8 1352.08,-403.01 1355.13,-409.31"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/GamePause.ts -->
+<g id="edge14" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M1054.13,-577.6C1093.86,-555.65 1181.81,-510.28 1262.25,-490.92 1362.35,-466.83 2026.39,-432.98 2315.75,-419.16"/>
+<polygon fill="#757575" stroke="#757575" points="2315.81,-422.66 2325.63,-418.69 2315.48,-415.67 2315.81,-422.66"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge15" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M1066.6,-577.63C1111,-562.22 1191.32,-536.31 1262.25,-523.92 1560.62,-471.81 2324.33,-488.55 2622.25,-433.92 2653.16,-428.25 2686.99,-417.88 2712.95,-408.98"/>
+<polygon fill="#757575" stroke="#757575" points="2713.84,-412.38 2722.13,-405.78 2711.53,-405.77 2713.84,-412.38"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts -->
+<g id="edge12" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts</title>
+<path fill="none" stroke="#757575" d="M1072.08,-602.22C1137.38,-622.52 1267.56,-662.98 1339.3,-685.28"/>
+<polygon fill="#757575" stroke="#757575" points="1337.83,-688.49 1348.42,-688.11 1339.91,-681.8 1337.83,-688.49"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts -->
+<g id="edge13" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
+<path fill="none" stroke="#757575" d="M1158.06,-602.29C1276.63,-613.97 1454,-631.44 1576.08,-643.46"/>
+<polygon fill="#757575" stroke="#757575" points="1575.55,-646.92 1585.84,-644.42 1576.23,-639.96 1575.55,-646.92"/>
+</g>
+<!-- scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
+<g id="edge16" class="edge">
+<title>scripts/CombatSystem/BlockSelection/GameBlockSelection.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
+<path fill="none" stroke="#757575" d="M1226.52,-583.93C1340.43,-580.41 1481.34,-576.06 1582.09,-572.95"/>
+<polygon fill="#757575" stroke="#757575" points="1582.16,-576.45 1592.04,-572.65 1581.94,-569.46 1582.16,-576.45"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
+<g id="edge17" class="edge">
+<title>scripts/CombatSystem/BulletEffects/BulletHitEffect.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
+<path fill="none" stroke="#757575" d="M2177.17,-699.25C2227.02,-705.4 2287.46,-712.85 2338.78,-719.18"/>
+<polygon fill="#757575" stroke="#757575" points="2338.07,-722.62 2348.42,-720.37 2338.93,-715.68 2338.07,-722.62"/>
+</g>
+<!-- scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts -->
+<g id="edge18" class="edge">
+<title>scripts/CombatSystem/BulletEffects/BulletLifecycle.ts&#45;&gt;scripts/CombatSystem/BulletEffects/BulletTrajectory.ts</title>
+<path fill="none" stroke="#757575" d="M2244.33,-730.71C2252.3,-730.8 2260.31,-730.88 2268.31,-730.97"/>
+<polygon fill="#757575" stroke="#757575" points="2268.07,-734.47 2278.1,-731.08 2268.14,-727.47 2268.07,-734.47"/>
+</g>
+<!-- scripts/CombatSystem/CoinDrop.ts -->
+<g id="node18" class="node">
+<title>scripts/CombatSystem/CoinDrop.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1496.46,-556.8C1496.46,-556.8 1284.79,-556.8 1284.79,-556.8 1280.83,-556.8 1276.88,-552.84 1276.88,-548.88 1276.88,-548.88 1276.88,-540.96 1276.88,-540.96 1276.88,-537 1280.83,-533.05 1284.79,-533.05 1284.79,-533.05 1496.46,-533.05 1496.46,-533.05 1500.42,-533.05 1504.38,-537 1504.38,-540.96 1504.38,-540.96 1504.38,-548.88 1504.38,-548.88 1504.38,-552.84 1500.42,-556.8 1496.46,-556.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1390.62" y="-539.5" 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="edge19" class="edge">
+<title>scripts/CombatSystem/CoinDrop.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
+<path fill="none" stroke="#757575" d="M1504.84,-553.38C1529.93,-555.26 1556.71,-557.26 1582.42,-559.18"/>
+<polygon fill="#757575" stroke="#757575" points="1582.01,-562.66 1592.25,-559.91 1582.54,-555.68 1582.01,-562.66"/>
+</g>
+<!-- scripts/CombatSystem/EnemyComponent.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
+<g id="edge20" class="edge">
+<title>scripts/CombatSystem/EnemyComponent.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M2567.75,-665.24C2586.23,-668.73 2604.95,-673.2 2622.25,-678.92 2661.12,-691.77 2702.21,-715.18 2728.51,-731.59"/>
+<polygon fill="#757575" stroke="#757575" points="2726.57,-734.5 2736.89,-736.91 2730.32,-728.59 2726.57,-734.5"/>
+</g>
+<!-- scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts -->
+<g id="node22" class="node">
+<title>scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</title>
+<path fill="none" stroke="#cfffac" d="M792.83,-444.8C792.83,-444.8 436.42,-444.8 436.42,-444.8 432.46,-444.8 428.5,-440.84 428.5,-436.88 428.5,-436.88 428.5,-428.96 428.5,-428.96 428.5,-425 432.46,-421.05 436.42,-421.05 436.42,-421.05 792.83,-421.05 792.83,-421.05 796.79,-421.05 800.75,-425 800.75,-428.96 800.75,-428.96 800.75,-436.88 800.75,-436.88 800.75,-440.84 796.79,-444.8 792.83,-444.8"/>
+<text xml:space="preserve" text-anchor="middle" x="614.62" y="-427.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</text>
+</g>
+<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts -->
+<g id="node23" class="node">
+<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M384.58,-444.8C384.58,-444.8 7.92,-444.8 7.92,-444.8 3.96,-444.8 0,-440.84 0,-436.88 0,-436.88 0,-428.96 0,-428.96 0,-425 3.96,-421.05 7.92,-421.05 7.92,-421.05 384.58,-421.05 384.58,-421.05 388.54,-421.05 392.5,-425 392.5,-428.96 392.5,-428.96 392.5,-436.88 392.5,-436.88 392.5,-440.84 388.54,-444.8 384.58,-444.8"/>
+<text xml:space="preserve" text-anchor="middle" x="196.25" y="-427.5" 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/GamePause.ts -->
+<g id="edge29" class="edge">
+<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M235.62,-420.55C334.12,-389.53 604.46,-308.97 836.75,-281.92 1185.67,-241.29 2142.22,-318.26 2244,-338.92 2305.27,-351.36 2372.87,-378.35 2413.39,-396.06"/>
+<polygon fill="#757575" stroke="#757575" points="2411.88,-399.22 2422.44,-400.07 2414.71,-392.82 2411.88,-399.22"/>
+</g>
+<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts -->
+<g id="edge30" class="edge">
+<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/CombatSystem/SkillSelection/SkillButtonAnimator.ts</title>
+<path fill="none" stroke="#757575" d="M392.94,-432.92C400.9,-432.92 408.89,-432.92 416.86,-432.92"/>
+<polygon fill="#757575" stroke="#757575" points="416.59,-436.42 426.59,-432.92 416.59,-429.42 416.59,-436.42"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts -->
+<g id="node24" class="node">
+<title>scripts/LevelSystem/GameManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M729.83,-677.8C729.83,-677.8 499.42,-677.8 499.42,-677.8 495.46,-677.8 491.5,-673.84 491.5,-669.88 491.5,-669.88 491.5,-661.96 491.5,-661.96 491.5,-658 495.46,-654.05 499.42,-654.05 499.42,-654.05 729.83,-654.05 729.83,-654.05 733.79,-654.05 737.75,-658 737.75,-661.96 737.75,-661.96 737.75,-669.88 737.75,-669.88 737.75,-673.84 733.79,-677.8 729.83,-677.8"/>
+<text xml:space="preserve" text-anchor="middle" x="614.62" y="-660.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/GameManager.ts</text>
+</g>
+<!-- scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
+<g id="edge31" class="edge">
+<title>scripts/CombatSystem/SkillSelection/SkillSelectionController.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
+<path fill="none" stroke="#757575" d="M219.34,-445.28C288.51,-483.99 501.09,-602.95 581.95,-648.2"/>
+<polygon fill="#757575" stroke="#757575" points="579.83,-651.02 590.27,-652.85 583.25,-644.91 579.83,-651.02"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
+<g id="edge48" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
+<path fill="none" stroke="#757575" d="M646.16,-678.22C688.28,-694.6 766.93,-723.13 836.75,-736.92 978.42,-764.91 1143.85,-775.21 1256.58,-778.93"/>
+<polygon fill="#757575" stroke="#757575" points="1256.38,-782.43 1266.49,-779.25 1256.6,-775.43 1256.38,-782.43"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BallController.ts -->
+<g id="edge49" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BallController.ts</title>
+<path fill="none" stroke="#757575" d="M626.39,-653.57C670.23,-603.3 833.13,-416.66 836.75,-414.92 993.19,-339.78 1204.08,-357.72 1314.72,-374.81"/>
+<polygon fill="#757575" stroke="#757575" points="1314.16,-378.26 1324.59,-376.38 1315.26,-371.35 1314.16,-378.26"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
+<g id="edge53" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#757575" d="M686.61,-678.25C729.88,-685.33 786.36,-693.81 836.75,-698.92 1025.17,-718.03 1072.93,-716.81 1262.25,-721.92 1376.32,-725 1405.28,-731.33 1519,-721.92 1535.17,-720.58 1538.94,-718.22 1555,-715.92 1625.34,-705.85 1811.96,-715.12 1872.5,-677.92 1897.08,-662.82 1883.97,-639.1 1908.5,-623.92 1915.25,-619.75 1922.44,-616.22 1929.91,-613.26"/>
+<polygon fill="#757575" stroke="#757575" points="1930.97,-616.6 1939.21,-609.94 1928.62,-610 1930.97,-616.6"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/GamePause.ts -->
+<g id="edge54" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/GamePause.ts</title>
+<path fill="none" stroke="#757575" d="M629.39,-653.62C662.98,-622.97 750.06,-539.47 800.75,-453.92 824.4,-414 799.21,-383.2 836.75,-355.92 1035.68,-211.38 1143.73,-334.92 1389.62,-334.92 1389.62,-334.92 1389.62,-334.92 1714.75,-334.92 1953.89,-334.92 2234.34,-376.21 2369.38,-398.71"/>
+<polygon fill="#757575" stroke="#757575" points="2368.49,-402.11 2378.93,-400.31 2369.65,-395.21 2368.49,-402.11"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge56" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M630.72,-653.62C666.48,-623.59 756.64,-542.49 800.75,-453.92 835.57,-384.01 777.17,-332.42 836.75,-281.92 1024.37,-122.92 1143.69,-258.92 1389.62,-258.92 1389.62,-258.92 1389.62,-258.92 2077.25,-258.92 2318.92,-258.92 2599.97,-341.6 2709.41,-377.07"/>
+<polygon fill="#757575" stroke="#757575" points="2708.03,-380.31 2718.63,-380.08 2710.21,-373.65 2708.03,-380.31"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
+<g id="edge58" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
+<path fill="none" stroke="#757575" d="M630.93,-653.72C667.14,-623.91 758.23,-543.27 800.75,-453.92 841.26,-368.81 770.47,-311.94 836.75,-244.92 1161.67,83.66 1801.79,-10.93 2008.91,-52.29"/>
+<polygon fill="#757575" stroke="#757575" points="2008.2,-55.72 2018.7,-54.28 2009.6,-48.86 2008.2,-55.72"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts -->
+<g id="edge50" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockManager.ts</title>
+<path fill="none" stroke="#757575" d="M737.84,-671.45C877.24,-677.75 1104.68,-688.04 1250.69,-694.64"/>
+<polygon fill="#757575" stroke="#757575" points="1250.28,-698.12 1260.43,-695.08 1250.59,-691.13 1250.28,-698.12"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts -->
+<g id="edge51" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/BlockTag.ts</title>
+<path fill="none" stroke="#757575" d="M738.02,-664.92C934.4,-663.31 1320.34,-660.14 1543.15,-658.31"/>
+<polygon fill="#757575" stroke="#757575" points="1543.14,-661.81 1553.11,-658.23 1543.08,-654.81 1543.14,-661.81"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/ConfigManager.ts -->
+<g id="edge55" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/ConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M622.48,-678.25C646.07,-719.35 728.37,-852.35 836.75,-910.92 1055.53,-1029.15 1140.95,-996.92 1389.62,-996.92 1389.62,-996.92 1389.62,-996.92 2077.25,-996.92 2321.64,-996.92 2410.61,-1046.12 2622.25,-923.92 2684.48,-887.99 2727.76,-810.7 2746.28,-772.39"/>
+<polygon fill="#757575" stroke="#757575" points="2749.31,-774.18 2750.39,-763.64 2742.97,-771.2 2749.31,-774.18"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts -->
+<g id="edge57" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/Core/LevelSessionManager.ts</title>
+<path fill="none" stroke="#757575" d="M637.4,-653.64C676.14,-632.43 760.17,-589.24 836.75,-568.92 1130.47,-490.98 1217.1,-489.32 1519,-523.92 1567.87,-529.52 1622.34,-542.82 1661.05,-553.52"/>
+<polygon fill="#757575" stroke="#757575" points="1660,-556.86 1670.57,-556.19 1661.89,-550.12 1660,-556.86"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
+<g id="edge61" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
+<path fill="none" stroke="#757575" d="M624.5,-678.05C651.57,-713.95 737.32,-819.93 836.75,-863.92 1062.66,-963.86 1142.6,-920.92 1389.62,-920.92 1389.62,-920.92 1389.62,-920.92 1714.75,-920.92 1920.12,-920.92 2157.65,-913.82 2305.9,-908.54"/>
+<polygon fill="#757575" stroke="#757575" points="2305.92,-912.04 2315.79,-908.18 2305.67,-905.04 2305.92,-912.04"/>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts -->
+<g id="edge52" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/CombatSystem/BlockSelection/GameBlockSelection.ts</title>
+<path fill="none" stroke="#757575" d="M682.74,-653.63C756.3,-640.15 874.16,-618.56 951.96,-604.31"/>
+<polygon fill="#757575" stroke="#757575" points="952.44,-607.78 961.65,-602.53 951.18,-600.89 952.44,-607.78"/>
+</g>
+<!-- scripts/LevelSystem/LevelConfigManager.ts -->
+<g id="node29" class="node">
+<title>scripts/LevelSystem/LevelConfigManager.ts</title>
+<path fill="none" stroke="#cfffac" d="M1163.21,-854.8C1163.21,-854.8 899.79,-854.8 899.79,-854.8 895.83,-854.8 891.88,-850.84 891.88,-846.88 891.88,-846.88 891.88,-838.96 891.88,-838.96 891.88,-835 895.83,-831.05 899.79,-831.05 899.79,-831.05 1163.21,-831.05 1163.21,-831.05 1167.17,-831.05 1171.12,-835 1171.12,-838.96 1171.12,-838.96 1171.12,-846.88 1171.12,-846.88 1171.12,-850.84 1167.17,-854.8 1163.21,-854.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1031.5" y="-837.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/LevelSystem/LevelConfigManager.ts</text>
+</g>
+<!-- scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts -->
+<g id="edge59" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelConfigManager.ts</title>
+<path fill="none" stroke="#757575" d="M627.73,-677.98C659.05,-708.32 746.65,-787.89 836.75,-821.92 850.63,-827.16 865.44,-831.23 880.46,-834.36"/>
+<polygon fill="#757575" stroke="#757575" points="879.45,-837.73 889.93,-836.19 880.78,-830.86 879.45,-837.73"/>
+</g>
+<!-- scripts/LevelSystem/LevelManager.ts -->
+<g id="node30" class="node">
+<title>scripts/LevelSystem/LevelManager.ts</title>
+<path fill="none" stroke="#cfffac" d="M1143.71,-812.8C1143.71,-812.8 919.29,-812.8 919.29,-812.8 915.33,-812.8 911.38,-808.84 911.38,-804.88 911.38,-804.88 911.38,-796.96 911.38,-796.96 911.38,-793 915.33,-789.05 919.29,-789.05 919.29,-789.05 1143.71,-789.05 1143.71,-789.05 1147.67,-789.05 1151.62,-793 1151.62,-796.96 1151.62,-796.96 1151.62,-804.88 1151.62,-804.88 1151.62,-808.84 1147.67,-812.8 1143.71,-812.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1031.5" y="-795.5" 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="edge60" class="edge">
+<title>scripts/LevelSystem/GameManager.ts&#45;&gt;scripts/LevelSystem/LevelManager.ts</title>
+<path fill="none" stroke="#757575" d="M635.14,-678.28C672.62,-701.38 757.93,-750.91 836.75,-774.92 856.86,-781.05 878.59,-785.73 899.97,-789.31"/>
+<polygon fill="#757575" stroke="#757575" points="899.18,-792.73 909.61,-790.85 900.28,-785.82 899.18,-792.73"/>
+</g>
+<!-- scripts/CombatSystem/WeaponBlockExample.ts -->
+<g id="node25" class="node">
+<title>scripts/CombatSystem/WeaponBlockExample.ts</title>
+<path fill="none" stroke="#cfffac" d="M341.83,-936.8C341.83,-936.8 50.67,-936.8 50.67,-936.8 46.71,-936.8 42.75,-932.84 42.75,-928.88 42.75,-928.88 42.75,-920.96 42.75,-920.96 42.75,-917 46.71,-913.05 50.67,-913.05 50.67,-913.05 341.83,-913.05 341.83,-913.05 345.79,-913.05 349.75,-917 349.75,-920.96 349.75,-920.96 349.75,-928.88 349.75,-928.88 349.75,-932.84 345.79,-936.8 341.83,-936.8"/>
+<text xml:space="preserve" text-anchor="middle" x="196.25" y="-919.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/CombatSystem/WeaponBlockExample.ts</text>
+</g>
+<!-- scripts/FourUI/MainSystem/MainUIControlller.ts -->
+<g id="node26" class="node">
+<title>scripts/FourUI/MainSystem/MainUIControlller.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M339.21,-894.8C339.21,-894.8 53.29,-894.8 53.29,-894.8 49.33,-894.8 45.38,-890.84 45.38,-886.88 45.38,-886.88 45.38,-878.96 45.38,-878.96 45.38,-875 49.33,-871.05 53.29,-871.05 53.29,-871.05 339.21,-871.05 339.21,-871.05 343.17,-871.05 347.12,-875 347.12,-878.96 347.12,-878.96 347.12,-886.88 347.12,-886.88 347.12,-890.84 343.17,-894.8 339.21,-894.8"/>
+<text xml:space="preserve" text-anchor="middle" x="196.25" y="-877.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/FourUI/MainSystem/MainUIControlller.ts</text>
+</g>
+<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/GameStartMove.ts -->
+<g id="edge41" class="edge">
+<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/Animations/GameStartMove.ts</title>
+<path fill="none" stroke="#757575" d="M347.36,-888.37C591.71,-895.87 1064.47,-904.24 1226.25,-863.92 1277.78,-851.08 1331.58,-819.69 1362.77,-799.41"/>
+<polygon fill="#757575" stroke="#757575" points="1364.41,-802.52 1370.81,-794.08 1360.54,-796.68 1364.41,-802.52"/>
+</g>
+<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts -->
+<g id="edge43" class="edge">
+<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/SaveDataManager.ts</title>
+<path fill="none" stroke="#757575" d="M312.48,-895.28C349.52,-899.14 390.73,-903.33 428.5,-906.92 695.85,-932.34 761.95,-958.92 1030.5,-958.92 1030.5,-958.92 1030.5,-958.92 1714.75,-958.92 1950.35,-958.92 2009.38,-950.34 2244,-928.92 2279.1,-925.72 2317.43,-921.17 2351.41,-916.77"/>
+<polygon fill="#757575" stroke="#757575" points="2351.8,-920.25 2361.26,-915.49 2350.89,-913.31 2351.8,-920.25"/>
+</g>
+<!-- scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/GameManager.ts -->
+<g id="edge42" class="edge">
+<title>scripts/FourUI/MainSystem/MainUIControlller.ts&#45;&gt;scripts/LevelSystem/GameManager.ts</title>
+<path fill="none" stroke="#757575" d="M220.83,-870.63C291.03,-834.05 498.82,-725.75 580.31,-683.29"/>
+<polygon fill="#757575" stroke="#757575" points="581.45,-686.63 588.7,-678.91 578.22,-680.43 581.45,-686.63"/>
+</g>
+<!-- scripts/FourUI/NavBarController.ts -->
+<g id="node27" class="node">
+<title>scripts/FourUI/NavBarController.ts</title>
+<path fill="none" stroke="#cfffac" d="M298.71,-978.8C298.71,-978.8 93.79,-978.8 93.79,-978.8 89.83,-978.8 85.88,-974.84 85.88,-970.88 85.88,-970.88 85.88,-962.96 85.88,-962.96 85.88,-959 89.83,-955.05 93.79,-955.05 93.79,-955.05 298.71,-955.05 298.71,-955.05 302.67,-955.05 306.62,-959 306.62,-962.96 306.62,-962.96 306.62,-970.88 306.62,-970.88 306.62,-974.84 302.67,-978.8 298.71,-978.8"/>
+<text xml:space="preserve" text-anchor="middle" x="196.25" y="-961.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/FourUI/NavBarController.ts</text>
+</g>
+<!-- scripts/LevelSystem/CombatStateManager.ts -->
+<g id="node28" class="node">
+<title>scripts/LevelSystem/CombatStateManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1849.58,-188.8C1849.58,-188.8 1577.92,-188.8 1577.92,-188.8 1573.96,-188.8 1570,-184.84 1570,-180.88 1570,-180.88 1570,-172.96 1570,-172.96 1570,-169 1573.96,-165.05 1577.92,-165.05 1577.92,-165.05 1849.58,-165.05 1849.58,-165.05 1853.54,-165.05 1857.5,-169 1857.5,-172.96 1857.5,-172.96 1857.5,-180.88 1857.5,-180.88 1857.5,-184.84 1853.54,-188.8 1849.58,-188.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1713.75" y="-171.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/CombatStateManager.ts</text>
+</g>
+<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
+<g id="edge44" class="edge">
+<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#757575" d="M1857.92,-189.19C1863,-191.74 1867.89,-194.63 1872.5,-197.92 2008.08,-294.61 2058.1,-508.5 2071.33,-579.5"/>
+<polygon fill="#757575" stroke="#757575" points="2067.86,-579.97 2073.06,-589.2 2074.75,-578.74 2067.86,-579.97"/>
+</g>
+<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge46" class="edge">
+<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M1854.53,-164.56C2075.56,-147.53 2493.86,-126.28 2622.25,-195.92 2692.4,-233.97 2732.98,-326.5 2748.73,-369.83"/>
+<polygon fill="#757575" stroke="#757575" points="2745.41,-370.95 2752.01,-379.23 2752.02,-368.63 2745.41,-370.95"/>
+</g>
+<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts -->
+<g id="edge47" class="edge">
+<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/PhysicsManager.ts</title>
+<path fill="none" stroke="#757575" d="M1845.61,-164.62C1855.1,-160.98 1864.19,-156.47 1872.5,-150.92 1897.72,-134.06 1883.21,-109.67 1908.5,-92.92 1924.43,-82.37 1943.06,-75.51 1961.98,-71.14"/>
+<polygon fill="#757575" stroke="#757575" points="1962.57,-74.59 1971.66,-69.15 1961.16,-67.74 1962.57,-74.59"/>
+</g>
+<!-- scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
+<g id="edge45" class="edge">
+<title>scripts/LevelSystem/CombatStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M1779.98,-164.6C1826.18,-156.1 1884.1,-145.98 1908.5,-143.92 2224.59,-117.19 2307.52,-104.25 2622.25,-143.92 2728.88,-157.36 2767.03,-144.38 2856.5,-203.92 2915.6,-243.25 2958.67,-318.3 2977.49,-355.66"/>
+<polygon fill="#757575" stroke="#757575" points="2974.13,-356.75 2981.67,-364.19 2980.41,-353.67 2974.13,-356.75"/>
+</g>
+<!-- scripts/LevelSystem/LevelStateManager.ts -->
+<g id="node31" class="node">
+<title>scripts/LevelSystem/LevelStateManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M1841.71,-230.8C1841.71,-230.8 1585.79,-230.8 1585.79,-230.8 1581.83,-230.8 1577.88,-226.84 1577.88,-222.88 1577.88,-222.88 1577.88,-214.96 1577.88,-214.96 1577.88,-211 1581.83,-207.05 1585.79,-207.05 1585.79,-207.05 1841.71,-207.05 1841.71,-207.05 1845.67,-207.05 1849.62,-211 1849.62,-214.96 1849.62,-214.96 1849.62,-222.88 1849.62,-222.88 1849.62,-226.84 1845.67,-230.8 1841.71,-230.8"/>
+<text xml:space="preserve" text-anchor="middle" x="1713.75" y="-213.5" font-family="Arial" font-size="14.00" fill="#c6c5fe">scripts/LevelSystem/LevelStateManager.ts</text>
+</g>
+<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts -->
+<g id="edge62" class="edge">
+<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/CombatSystem/EnemyController.ts</title>
+<path fill="none" stroke="#757575" d="M1726.34,-231.26C1778.46,-286.78 1991.5,-513.71 2056.4,-582.84"/>
+<polygon fill="#757575" stroke="#757575" points="2053.45,-584.82 2062.85,-589.71 2058.56,-580.03 2053.45,-584.82"/>
+</g>
+<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/EventBus.ts -->
+<g id="edge64" class="edge">
+<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M1850.01,-210.01C2068.69,-197.72 2488.84,-183.48 2622.25,-244.92 2680.23,-271.62 2724.18,-336.45 2744.29,-370.76"/>
+<polygon fill="#757575" stroke="#757575" points="2741.24,-372.47 2749.23,-379.43 2747.32,-369.01 2741.24,-372.47"/>
+</g>
+<!-- scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
+<g id="edge63" class="edge">
+<title>scripts/LevelSystem/LevelStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M1804.77,-206.56C1837.37,-202.65 1874.53,-198.84 1908.5,-196.92 2225.22,-179 2313.36,-124.67 2622.25,-196.92 2759.2,-228.95 2903.69,-320.15 2961.67,-359.49"/>
+<polygon fill="#757575" stroke="#757575" points="2959.37,-362.15 2969.6,-364.92 2963.33,-356.38 2959.37,-362.15"/>
+</g>
+<!-- scripts/LevelSystem/UIStateManager.ts -->
+<g id="node32" class="node">
+<title>scripts/LevelSystem/UIStateManager.ts</title>
+<path fill="none" stroke="#c6c5fe" d="M2569.71,-584.8C2569.71,-584.8 2332.54,-584.8 2332.54,-584.8 2328.58,-584.8 2324.62,-580.84 2324.62,-576.88 2324.62,-576.88 2324.62,-568.96 2324.62,-568.96 2324.62,-565 2328.58,-561.05 2332.54,-561.05 2332.54,-561.05 2569.71,-561.05 2569.71,-561.05 2573.67,-561.05 2577.62,-565 2577.62,-568.96 2577.62,-568.96 2577.62,-576.88 2577.62,-576.88 2577.62,-580.84 2573.67,-584.8 2569.71,-584.8"/>
+<text xml:space="preserve" text-anchor="middle" x="2451.12" y="-567.5" 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="edge66" class="edge">
+<title>scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/EventBus.ts</title>
+<path fill="none" stroke="#757575" d="M2577.83,-571.83C2593.73,-567.66 2609.03,-561.31 2622.25,-551.92 2651.74,-530.97 2636.22,-507.62 2658.25,-478.92 2678.58,-452.43 2708.04,-427.93 2729.37,-411.91"/>
+<polygon fill="#757575" stroke="#757575" points="2731.33,-414.81 2737.31,-406.07 2727.18,-409.17 2731.33,-414.81"/>
+</g>
+<!-- scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts -->
+<g id="edge65" class="edge">
+<title>scripts/LevelSystem/UIStateManager.ts&#45;&gt;scripts/Core/BaseSingleton.ts</title>
+<path fill="none" stroke="#757575" d="M2578.02,-562.01C2593.07,-559.35 2608.11,-556.04 2622.25,-551.92 2754.36,-513.44 2898.2,-432.12 2958.65,-395.94"/>
+<polygon fill="#757575" stroke="#757575" points="2960.24,-399.07 2966.99,-390.91 2956.62,-393.08 2960.24,-399.07"/>
+</g>
+<!-- scripts/test/WeaponRandomSpawner.ts -->
+<g id="node33" class="node">
+<title>scripts/test/WeaponRandomSpawner.ts</title>
+<path fill="none" stroke="#cfffac" d="M314.83,-1020.8C314.83,-1020.8 77.67,-1020.8 77.67,-1020.8 73.71,-1020.8 69.75,-1016.84 69.75,-1012.88 69.75,-1012.88 69.75,-1004.96 69.75,-1004.96 69.75,-1001 73.71,-997.05 77.67,-997.05 77.67,-997.05 314.83,-997.05 314.83,-997.05 318.79,-997.05 322.75,-1001 322.75,-1004.96 322.75,-1004.96 322.75,-1012.88 322.75,-1012.88 322.75,-1016.84 318.79,-1020.8 314.83,-1020.8"/>
+<text xml:space="preserve" text-anchor="middle" x="196.25" y="-1003.5" font-family="Arial" font-size="14.00" fill="#cfffac">scripts/test/WeaponRandomSpawner.ts</text>
+</g>
+</g>
+</svg>

Some files were not shown because too many files changed in this diff