181404010226 4 месяцев назад
Родитель
Сommit
6f6c3dbc09

+ 375 - 45
assets/resources/data/enemies.json

@@ -58,6 +58,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/zombie_walk",
+      "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
     }
   },
   {
@@ -67,12 +97,12 @@
     "stats": {
       "health": 50,
       "maxHealth": 50,
-      "defense": 0,
+      "defense": 1,
       "speed": 25.0
     },
     "movement": {
       "pattern": "direct",
-      "speed": 25.0,
+      "speed": 40.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -83,12 +113,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.3,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 3.0,
       "attackType": "melee",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -119,6 +149,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/roadblock_walk",
+      "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
     }
   },
   {
@@ -133,7 +193,7 @@
     },
     "movement": {
       "pattern": "direct",
-      "speed": 35.0,
+      "speed": 45.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -144,12 +204,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.4,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 3.0,
       "attackType": "melee_weapon",
       "attackDelay": 1.0,
       "weaponType": "baseball_bat",
@@ -180,6 +240,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/wandering_walk",
+      "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
     }
   },
   {
@@ -194,7 +284,7 @@
     },
     "movement": {
       "pattern": "direct",
-      "speed": 15.0,
+      "speed": 35.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -205,12 +295,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 200.0,
+      "attackSpeed": 0.2,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 4.0,
       "attackType": "magic_projectile",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -241,6 +331,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/mage_walk",
+      "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
     }
   },
   {
@@ -255,7 +375,7 @@
     },
     "movement": {
       "pattern": "direct",
-      "speed": 15.0,
+      "speed": 40.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -266,12 +386,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 250.0,
+      "attackSpeed": 0.2,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 4.0,
       "attackType": "arrow_projectile",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -302,6 +422,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/archer_walk",
+      "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
     }
   },
   {
@@ -316,7 +466,7 @@
     },
     "movement": {
       "pattern": "direct",
-      "speed": 35.0,
+      "speed": 60.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -327,12 +477,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.4,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 3.0,
       "attackType": "stealth_strike",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -363,6 +513,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/stealth_walk",
+      "block_sound": "nan",
+      "stealth_sound": "audio/stealth_activate",
+      "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
     }
   },
   {
@@ -372,12 +552,12 @@
     "stats": {
       "health": 70,
       "maxHealth": 70,
-      "defense": 0,
+      "defense": 2,
       "speed": 15.0
     },
     "movement": {
       "pattern": "direct",
-      "speed": 15.0,
+      "speed": 30.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -388,12 +568,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.3,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 4.0,
       "attackType": "heavy_melee",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -424,6 +604,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/bucket_walk",
+      "block_sound": "nan",
+      "stealth_sound": "nan",
+      "armor_break_sound": "audio/armor_break",
+      "fuse_sound": "nan"
+    },
+    "boss": {
+      "is_boss": false,
+      "phases": 1,
+      "rage_threshold": 0.3,
+      "rage_damage_multiplier": 1.0,
+      "rage_speed_multiplier": 1.0
     }
   },
   {
@@ -438,7 +648,7 @@
     },
     "movement": {
       "pattern": "direct",
-      "speed": 30.0,
+      "speed": 45.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -449,12 +659,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.3,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 3.0,
       "attackType": "melee",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -485,6 +695,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/barrel_walk",
+      "block_sound": "nan",
+      "stealth_sound": "nan",
+      "armor_break_sound": "nan",
+      "fuse_sound": "audio/barrel_fuse"
+    },
+    "boss": {
+      "is_boss": false,
+      "phases": 1,
+      "rage_threshold": 0.3,
+      "rage_damage_multiplier": 1.0,
+      "rage_speed_multiplier": 1.0
     }
   },
   {
@@ -494,12 +734,12 @@
     "stats": {
       "health": 500,
       "maxHealth": 500,
-      "defense": 0,
+      "defense": 2,
       "speed": 10.0
     },
     "movement": {
       "pattern": "direct",
-      "speed": 10.0,
+      "speed": 25.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -510,12 +750,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.2,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 4.0,
       "attackType": "gate_slam",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -567,6 +807,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/boss1_walk",
+      "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
     }
   },
   {
@@ -576,12 +846,12 @@
     "stats": {
       "health": 500,
       "maxHealth": 500,
-      "defense": 0,
+      "defense": 3,
       "speed": 10.0
     },
     "movement": {
       "pattern": "direct",
-      "speed": 10.0,
+      "speed": 20.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -592,12 +862,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 30.0,
+      "attackSpeed": 0.2,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 5.0,
       "attackType": "tombstone_smash",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -649,6 +919,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/boss2_walk",
+      "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
     }
   },
   {
@@ -658,12 +958,12 @@
     "stats": {
       "health": 250,
       "maxHealth": 250,
-      "defense": 0,
+      "defense": 1,
       "speed": 10.0
     },
     "movement": {
       "pattern": "direct",
-      "speed": 10.0,
+      "speed": 35.0,
       "patrolRange": 100,
       "chaseRange": 200,
       "rotationSpeed": 180.0,
@@ -674,12 +974,12 @@
     },
     "combat": {
       "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
+      "attackRange": 80.0,
+      "attackSpeed": 0.2,
       "canBlock": false,
       "blockChance": 0.0,
       "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
+      "attackCooldown": 4.0,
       "attackType": "cyber_arm_combo",
       "attackDelay": 1.0,
       "weaponType": "none",
@@ -731,6 +1031,36 @@
       "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": "enemy_attack",
+      "death_sound": "enemy_death",
+      "hit_sound": "enemy_hit",
+      "walk_sound": "audio/boss3_walk",
+      "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
     }
   }
 ]

+ 0 - 736
assets/resources/data/enemies.json.backup_20250812_103852

@@ -1,736 +0,0 @@
-[
-  {
-    "id": "normal_zombie",
-    "name": "普通僵尸",
-    "type": "basic",
-    "stats": {
-      "health": 10,
-      "maxHealth": 10,
-      "defense": 0,
-      "speed": 50.0
-    },
-    "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": 5,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "roadblock_zombie",
-    "name": "路障僵尸",
-    "type": "armored",
-    "stats": {
-      "health": 20,
-      "maxHealth": 20,
-      "defense": 5,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "wandering_zombie",
-    "name": "漫步僵尸",
-    "type": "wanderer",
-    "stats": {
-      "health": 12,
-      "maxHealth": 12,
-      "defense": 2,
-      "speed": 45.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 45.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "mage_zombie",
-    "name": "法师僵尸",
-    "type": "ranged_caster",
-    "stats": {
-      "health": 8,
-      "maxHealth": 8,
-      "defense": 0,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 50.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": true,
-      "blockChance": 50.0,
-      "blockDamageReduction": 1.0,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "archer_zombie",
-    "name": "弓箭僵尸",
-    "type": "ranged_archer",
-    "stats": {
-      "health": 9,
-      "maxHealth": 9,
-      "defense": 1,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "stealth_zombie",
-    "name": "隐身僵尸",
-    "type": "stealth",
-    "stats": {
-      "health": 7,
-      "maxHealth": 7,
-      "defense": 0,
-      "speed": 60.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 60.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "bucket_zombie",
-    "name": "铁桶僵尸",
-    "type": "heavy_armor",
-    "stats": {
-      "health": 30,
-      "maxHealth": 30,
-      "defense": 10,
-      "speed": 30.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 30.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "barrel_zombie",
-    "name": "火药桶僵尸",
-    "type": "explosive",
-    "stats": {
-      "health": 6,
-      "maxHealth": 6,
-      "defense": 0,
-      "speed": 45.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 45.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "boss1_gatekeeper",
-    "name": "BOSS1",
-    "type": "boss",
-    "stats": {
-      "health": 80,
-      "maxHealth": 80,
-      "defense": 15,
-      "speed": 25.0
-    },
-    "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": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 160,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 120,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  },
-  {
-    "id": "boss2_gravedigger",
-    "name": "BOSS2",
-    "type": "boss",
-    "stats": {
-      "health": 100,
-      "maxHealth": 100,
-      "defense": 20,
-      "speed": 20.0
-    },
-    "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": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 200,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 150,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  },
-  {
-    "id": "boss3_cyborg",
-    "name": "BOSS3",
-    "type": "boss",
-    "stats": {
-      "health": 120,
-      "maxHealth": 120,
-      "defense": 25,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 240,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 180,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  }
-]

+ 0 - 12
assets/resources/data/enemies.json.backup_20250812_103852.meta

@@ -1,12 +0,0 @@
-{
-  "ver": "1.0.0",
-  "importer": "*",
-  "imported": true,
-  "uuid": "e8f3f59f-da4c-454c-91b8-053ee2cd475c",
-  "files": [
-    ".backup_20250812_103852",
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

+ 0 - 736
assets/resources/data/enemies.json.backup_20250812_191822

@@ -1,736 +0,0 @@
-[
-  {
-    "id": "normal_zombie",
-    "name": "普通僵尸",
-    "type": "basic",
-    "stats": {
-      "health": 10,
-      "maxHealth": 10,
-      "defense": 0,
-      "speed": 50.0
-    },
-    "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": 5,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "roadblock_zombie",
-    "name": "路障僵尸",
-    "type": "armored",
-    "stats": {
-      "health": 20,
-      "maxHealth": 20,
-      "defense": 5,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 10,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "wandering_zombie",
-    "name": "漫步僵尸",
-    "type": "wanderer",
-    "stats": {
-      "health": 12,
-      "maxHealth": 12,
-      "defense": 2,
-      "speed": 45.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 45.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 10,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "mage_zombie",
-    "name": "法师僵尸",
-    "type": "ranged_caster",
-    "stats": {
-      "health": 8,
-      "maxHealth": 8,
-      "defense": 0,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 50.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": true,
-      "blockChance": 50.0,
-      "blockDamageReduction": 1.0,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "archer_zombie",
-    "name": "弓箭僵尸",
-    "type": "ranged_archer",
-    "stats": {
-      "health": 9,
-      "maxHealth": 9,
-      "defense": 1,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "weaponType": "none",
-      "projectileType": "none",
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "stealth_zombie",
-    "name": "隐身僵尸",
-    "type": "stealth",
-    "stats": {
-      "health": 7,
-      "maxHealth": 7,
-      "defense": 0,
-      "speed": 60.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 60.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "bucket_zombie",
-    "name": "铁桶僵尸",
-    "type": "heavy_armor",
-    "stats": {
-      "health": 30,
-      "maxHealth": 30,
-      "defense": 10,
-      "speed": 30.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 30.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "barrel_zombie",
-    "name": "火药桶僵尸",
-    "type": "explosive",
-    "stats": {
-      "health": 6,
-      "maxHealth": 6,
-      "defense": 0,
-      "speed": 45.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 45.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    }
-  },
-  {
-    "id": "boss1_gatekeeper",
-    "name": "BOSS1",
-    "type": "boss",
-    "stats": {
-      "health": 80,
-      "maxHealth": 80,
-      "defense": 15,
-      "speed": 25.0
-    },
-    "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": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": ""
-    },
-    "audioConfig": {
-      "attackSound": "enemy_attack",
-      "deathSound": "enemy_death",
-      "hitSound": "enemy_hit",
-      "walkSound": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 160,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 120,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  },
-  {
-    "id": "boss2_gravedigger",
-    "name": "BOSS2",
-    "type": "boss",
-    "stats": {
-      "health": 100,
-      "maxHealth": 100,
-      "defense": 20,
-      "speed": 20.0
-    },
-    "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": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 200,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 150,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  },
-  {
-    "id": "boss3_cyborg",
-    "name": "BOSS3",
-    "type": "boss",
-    "stats": {
-      "health": 120,
-      "maxHealth": 120,
-      "defense": 25,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 0.5,
-      "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": "",
-      "blockSound": "",
-      "stealthSound": "",
-      "armorBreakSound": "",
-      "fuseSound": "",
-      "volume": 1.0
-    },
-    "specialAbilities": [
-      {
-        "type": "charge_attack",
-        "damage": 240,
-        "range": 150.0,
-        "cooldown": 8.0
-      },
-      {
-        "type": "area_attack",
-        "damage": 180,
-        "range": 100.0,
-        "cooldown": 12.0
-      }
-    ],
-    "bossConfig": {
-      "isBoss": true,
-      "phases": 1,
-      "enrageThreshold": 0.3,
-      "enrageDamageMultiplier": 1.5,
-      "enrageSpeedMultiplier": 1.3
-    }
-  }
-]

+ 0 - 12
assets/resources/data/enemies.json.backup_20250812_191822.meta

@@ -1,12 +0,0 @@
-{
-  "ver": "1.0.0",
-  "importer": "*",
-  "imported": true,
-  "uuid": "5e07c1dd-49e3-448b-af8b-cacc775d9f00",
-  "files": [
-    ".backup_20250812_191822",
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

+ 0 - 736
assets/resources/data/enemies.json.backup_20250815_125751

@@ -1,736 +0,0 @@
-[
-  {
-    "id": "normal_zombie",
-    "name": "普通僵尸",
-    "type": "basic",
-    "stats": {
-      "health": 25,
-      "maxHealth": 25,
-      "defense": 0,
-      "speed": 50.0
-    },
-    "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": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "melee",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "none",
-      "projectileSpeed": 100.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
-    }
-  },
-  {
-    "id": "roadblock_zombie",
-    "name": "路障僵尸",
-    "type": "armored",
-    "stats": {
-      "health": 35,
-      "maxHealth": 35,
-      "defense": 1,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "wandering_zombie",
-    "name": "漫步僵尸",
-    "type": "wanderer",
-    "stats": {
-      "health": 38,
-      "maxHealth": 38,
-      "defense": 0,
-      "speed": 50.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 50.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "sway",
-      "swingAmplitude": 20.0,
-      "swingFrequency": 2.0,
-      "speedVariation": 0.2
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "mage_zombie",
-    "name": "法师僵尸",
-    "type": "ranged_caster",
-    "stats": {
-      "health": 16,
-      "maxHealth": 16,
-      "defense": 0,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.0,
-      "attackType": "magic_projectile",
-      "attackDelay": 1.0,
-      "weaponType": "none",
-      "projectileType": "magic_bolt",
-      "projectileSpeed": 150.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
-    }
-  },
-  {
-    "id": "archer_zombie",
-    "name": "弓箭僵尸",
-    "type": "ranged_archer",
-    "stats": {
-      "health": 18,
-      "maxHealth": 18,
-      "defense": 0,
-      "speed": 40.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 40.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "stealth_zombie",
-    "name": "隐身僵尸",
-    "type": "stealth",
-    "stats": {
-      "health": 28,
-      "maxHealth": 28,
-      "defense": 0,
-      "speed": 60.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 60.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "bucket_zombie",
-    "name": "铁桶僵尸",
-    "type": "heavy_armor",
-    "stats": {
-      "health": 55,
-      "maxHealth": 55,
-      "defense": 2,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "barrel_zombie",
-    "name": "火药桶僵尸",
-    "type": "explosive",
-    "stats": {
-      "health": 15,
-      "maxHealth": 15,
-      "defense": 0,
-      "speed": 50.0
-    },
-    "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": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "boss1_gatekeeper",
-    "name": "BOSS1",
-    "type": "boss",
-    "stats": {
-      "health": 500,
-      "maxHealth": 500,
-      "defense": 2,
-      "speed": 15.0
-    },
-    "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": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "boss2_gravedigger",
-    "name": "BOSS2",
-    "type": "boss",
-    "stats": {
-      "health": 500,
-      "maxHealth": 500,
-      "defense": 3,
-      "speed": 20.0
-    },
-    "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": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  },
-  {
-    "id": "boss3_cyborg",
-    "name": "BOSS3",
-    "type": "boss",
-    "stats": {
-      "health": 250,
-      "maxHealth": 250,
-      "defense": 1,
-      "speed": 35.0
-    },
-    "movement": {
-      "pattern": "direct",
-      "speed": 35.0,
-      "patrolRange": 100,
-      "chaseRange": 200,
-      "rotationSpeed": 180.0,
-      "moveType": "straight",
-      "swingAmplitude": 0.0,
-      "swingFrequency": 0.0,
-      "speedVariation": 0.1
-    },
-    "combat": {
-      "attackDamage": 1,
-      "attackRange": 1.0,
-      "attackSpeed": 1.0,
-      "canBlock": false,
-      "blockChance": 0.0,
-      "blockDamageReduction": 0.5,
-      "attackCooldown": 1.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
-    }
-  }
-]

+ 0 - 12
assets/resources/data/enemies.json.backup_20250815_125751.meta

@@ -1,12 +0,0 @@
-{
-  "ver": "1.0.0",
-  "importer": "*",
-  "imported": true,
-  "uuid": "3dfdcaeb-85e5-4546-b89f-d8fb82f2cbbc",
-  "files": [
-    ".backup_20250815_125751",
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

+ 0 - 12
assets/resources/data/enemies.json.backup_20250815_141815.meta

@@ -1,12 +0,0 @@
-{
-  "ver": "1.0.0",
-  "importer": "*",
-  "imported": true,
-  "uuid": "a7774c95-6c96-41c9-8d78-c97522ec85c9",
-  "files": [
-    ".backup_20250815_141815",
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}

+ 6 - 6
assets/resources/data/enemies.json.backup_20250815_141815 → assets/resources/data/enemies_backup_20250820_103011.json

@@ -67,7 +67,7 @@
     "stats": {
       "health": 50,
       "maxHealth": 50,
-      "defense": 1,
+      "defense": 0,
       "speed": 25.0
     },
     "movement": {
@@ -215,7 +215,7 @@
       "attackDelay": 1.0,
       "weaponType": "none",
       "projectileType": "magic_bolt",
-      "projectileSpeed": 150.0
+      "projectileSpeed": 50.0
     },
     "visualConfig": {
       "spritePath": "Animation/EnemyAni/004",
@@ -372,7 +372,7 @@
     "stats": {
       "health": 70,
       "maxHealth": 70,
-      "defense": 2,
+      "defense": 0,
       "speed": 15.0
     },
     "movement": {
@@ -494,7 +494,7 @@
     "stats": {
       "health": 500,
       "maxHealth": 500,
-      "defense": 2,
+      "defense": 0,
       "speed": 10.0
     },
     "movement": {
@@ -576,7 +576,7 @@
     "stats": {
       "health": 500,
       "maxHealth": 500,
-      "defense": 3,
+      "defense": 0,
       "speed": 10.0
     },
     "movement": {
@@ -658,7 +658,7 @@
     "stats": {
       "health": 250,
       "maxHealth": 250,
-      "defense": 1,
+      "defense": 0,
       "speed": 10.0
     },
     "movement": {

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


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


+ 84 - 573
assets/resources/data/excel/config_manager.py

@@ -38,7 +38,14 @@ try:
     WEAPON_MANAGER_AVAILABLE = True
 except ImportError:
     WEAPON_MANAGER_AVAILABLE = False
-    print("警告: 武器配置管理器未找到,武器配置功能将不可用")
+    print("警告: weapon_config_manager.py 未找到,武器配置功能将不可用")
+
+try:
+    from enemy_config_manager import EnemyConfigManager
+    ENEMY_MANAGER_AVAILABLE = True
+except ImportError:
+    ENEMY_MANAGER_AVAILABLE = False
+    print("警告: enemy_config_manager.py 未找到,敌人配置功能将不可用")
 
 class SkillConfigImporter:
     """技能配置表导入工具类"""
@@ -457,10 +464,14 @@ class ConfigManagerGUI:
         enemy_btn_frame = ttk.Frame(right_frame)
         enemy_btn_frame.grid(row=3, column=0, sticky=(tk.W, tk.E), pady=(10, 0))
         
-        ttk.Button(enemy_btn_frame, text="修复敌人JSON", 
-                  command=self.fix_enemies_json).pack(side=tk.LEFT)
-        ttk.Button(enemy_btn_frame, text="自动导入敌人配置", 
-                  command=self.auto_import_enemies_from_excel).pack(side=tk.LEFT, padx=(10, 0))
+        if ENEMY_MANAGER_AVAILABLE:
+            ttk.Button(enemy_btn_frame, text="导入敌人配置", 
+                      command=self.import_enemy_config).pack(side=tk.LEFT)
+        else:
+            ttk.Label(enemy_btn_frame, text="敌人配置管理器不可用", 
+                     foreground="red").pack(side=tk.LEFT)
+        
+
         
         # 底部状态栏
         self.status_var = tk.StringVar()
@@ -1169,246 +1180,7 @@ class ConfigManagerGUI:
         
         return skills_config
     
-    def parse_enemy_multi_sheet_data(self, all_sheets_data, filename):
-        """解析敌人配置的多工作表数据"""
-        enemies_config = []
-        
-        try:
-            # 获取敌人基础配置数据(支持中英文工作表名)
-            enemy_info = None
-            for sheet_name in ['敌人基础配置', 'Enemy Config', 'enemies', '敌人配置']:
-                if sheet_name in all_sheets_data:
-                    enemy_info = all_sheets_data[sheet_name]
-                    break
-            
-            if enemy_info is None:
-                print("错误: 未找到敌人基础配置工作表(支持的工作表名: 敌人基础配置, Enemy Config, enemies, 敌人配置)")
-                return enemies_config
-            
-            # 获取其他配置工作表
-            combat_sheet = all_sheets_data.get('战斗配置')
-            movement_sheet = all_sheets_data.get('移动配置')
-            visual_sheet = all_sheets_data.get('视觉配置')
-            audio_sheet = all_sheets_data.get('音频配置')
-            special_sheet = all_sheets_data.get('特殊能力配置')
-            boss_sheet = all_sheets_data.get('BOSS配置')
-            
-            def get_field_value(row, cn_field, en_fields, default_value, value_type=str):
-                """获取字段值,支持中英文字段名"""
-                for field in [cn_field] + (en_fields if isinstance(en_fields, list) else [en_fields]):
-                    if field in row and pd.notna(row[field]):
-                        try:
-                            return value_type(row[field])
-                        except (ValueError, TypeError):
-                            continue
-                return default_value
-            
-            def find_row_by_id(sheet, enemy_id):
-                """根据敌人ID查找对应行"""
-                if sheet is None:
-                    return None
-                for _, row in sheet.iterrows():
-                    if str(row.get('敌人ID', '')) == enemy_id:
-                        return row
-                return None
-            
-            # 处理每个敌人(支持中英文字段名)
-            for _, enemy_row in enemy_info.iterrows():
-                # 获取敌人ID(支持中英文字段名)
-                enemy_id_field = None
-                for field in ['id', '敌人ID', 'enemy_id', 'ID']:
-                    if field in enemy_row and pd.notna(enemy_row[field]):
-                        enemy_id_field = field
-                        break
-                
-                if enemy_id_field is None:
-                    continue
-                
-                enemy_id = str(enemy_row[enemy_id_field])
-                
-                # 基础配置(不包含攻击伤害,攻击伤害从战斗配置表获取)
-                enemy_data = {
-                    'id': enemy_id,
-                    'name': get_field_value(enemy_row, '敌人名称', ['name', 'enemy_name'], ''),
-                    'type': get_field_value(enemy_row, '敌人类型', ['type', 'enemy_type'], 'basic'),
-                    'health': get_field_value(enemy_row, '生命值', ['health', 'hp'], 100, int),
-                    'speed': get_field_value(enemy_row, '移动速度', ['speed', 'move_speed'], 1.0, float),
-                    'attackRange': get_field_value(enemy_row, '攻击范围', ['attackRange', 'attack_range', 'range'], 1.0, float),
-                    'attackSpeed': get_field_value(enemy_row, '攻击速度', ['attackSpeed', 'attack_speed'], 1.0, float),
-                    'defense': get_field_value(enemy_row, '防御力', ['defense'], 0, int),
-                    'attackDamage': 10  # 默认值,将从战斗配置表覆盖
-                }
-                
-                # 获取战斗配置
-                combat_row = find_row_by_id(combat_sheet, enemy_id)
-                if combat_row is not None:
-                    enemy_data.update({
-                        'attackDamage': get_field_value(combat_row, '攻击伤害', ['attackDamage', 'attack'], 10, int),
-                        'attackType': get_field_value(combat_row, '攻击类型', ['attackType'], 'melee'),
-                        'attackDelay': get_field_value(combat_row, '攻击延迟', ['attackDelay'], 0.5, float),
-                        'weaponType': get_field_value(combat_row, '武器类型', ['weaponType'], 'none'),
-                        'projectileType': get_field_value(combat_row, '投射物类型', ['projectileType'], 'none'),
-                        'projectileSpeed': get_field_value(combat_row, '投射物速度', ['projectileSpeed'], 100, float),
-                        'canBlock': get_field_value(combat_row, '能否格挡', ['canBlock'], False, bool),
-                        'blockChance': get_field_value(combat_row, '格挡几率', ['blockChance'], 0.0, float),
-                        'blockDamageReduction': get_field_value(combat_row, '格挡伤害减免', ['blockDamageReduction'], 0.5, float)
-                    })
-                
-                # 获取移动配置
-                movement_row = find_row_by_id(movement_sheet, enemy_id)
-                if movement_row is not None:
-                    enemy_data.update({
-                        'movementPattern': get_field_value(movement_row, '移动模式', ['movementPattern'], 'walk_forward'),
-                        'patrolRange': get_field_value(movement_row, '巡逻范围', ['patrolRange'], 100, int),
-                        'chaseRange': get_field_value(movement_row, '追击范围', ['chaseRange'], 200, int),
-                        'rotationSpeed': get_field_value(movement_row, '旋转速度', ['rotationSpeed'], 180, float),
-                        'moveType': get_field_value(movement_row, '移动类型', ['moveType'], 'straight'),
-                        'swingAmplitude': get_field_value(movement_row, '摆动幅度', ['swingAmplitude'], 0.0, float),
-                        'swingFrequency': get_field_value(movement_row, '摆动频率', ['swingFrequency'], 0.0, float),
-                        'speedVariation': get_field_value(movement_row, '速度变化', ['speedVariation'], 0.1, float)
-                    })
-                
-                # 获取视觉配置
-                visual_row = find_row_by_id(visual_sheet, enemy_id)
-                if visual_row is not None:
-                    enemy_data.update({
-                        'spritePath': get_field_value(visual_row, '精灵路径', ['spritePath'], f'enemies/{enemy_id}'),
-                        'scale': get_field_value(visual_row, '缩放比例', ['scale'], 1.0, float),
-                        'animationSpeed': get_field_value(visual_row, '动画速度', ['animationSpeed'], 1.0, float),
-                        'flipX': get_field_value(visual_row, '水平翻转', ['flipX'], False, bool),
-                        'idleAnimation': get_field_value(visual_row, '待机动画', ['idleAnimation'], 'idle'),
-                        'walkAnimation': get_field_value(visual_row, '行走动画', ['walkAnimation'], 'walk'),
-                        'attackAnimation': get_field_value(visual_row, '攻击动画', ['attackAnimation'], 'attack'),
-                        'deathAnimation': get_field_value(visual_row, '死亡动画', ['deathAnimation'], 'dead'),
-                        'weaponProp': get_field_value(visual_row, '武器道具', ['weaponProp'], '')
-                    })
-                
-                # 获取音频配置
-                audio_row = find_row_by_id(audio_sheet, enemy_id)
-                if audio_row is not None:
-                    enemy_data.update({
-                        'attackSound': get_field_value(audio_row, '攻击音效', ['attackSound'], 'enemy_attack'),
-                        'deathSound': get_field_value(audio_row, '死亡音效', ['deathSound'], 'enemy_death'),
-                        'hitSound': get_field_value(audio_row, '受击音效', ['hitSound'], 'enemy_hit'),
-                        'walkSound': get_field_value(audio_row, '行走音效', ['walkSound'], ''),
-                        'blockSound': get_field_value(audio_row, '格挡音效', ['blockSound'], ''),
-                        'stealthSound': get_field_value(audio_row, '隐身音效', ['stealthSound'], ''),
-                        'armorBreakSound': get_field_value(audio_row, '护甲破碎音效', ['armorBreakSound'], ''),
-                        'fuseSound': get_field_value(audio_row, '引信音效', ['fuseSound'], '')
-                    })
-                
-                # 获取特殊能力配置
-                special_abilities = []
-                if special_sheet is not None:
-                    for _, special_row in special_sheet.iterrows():
-                        if str(special_row.get('敌人ID', '')) == enemy_id:
-                            ability_type = get_field_value(special_row, '能力类型', ['abilityType'], '')
-                            if ability_type:  # 只添加有效的特殊能力
-                                special_abilities.append({
-                                    'type': ability_type,
-                                    'damage': get_field_value(special_row, '伤害', ['damage'], 0, int),
-                                    'range': get_field_value(special_row, '范围', ['range'], 0, float),
-                                    'cooldown': get_field_value(special_row, '冷却时间', ['cooldown'], 0, float)
-                                })
-                if special_abilities:
-                    enemy_data['specialAbilities'] = special_abilities
-                
-                # 获取BOSS配置
-                boss_row = find_row_by_id(boss_sheet, enemy_id)
-                if boss_row is not None:
-                    is_boss = get_field_value(boss_row, '是否BOSS', ['isBoss'], False, bool)
-                    if is_boss:
-                        enemy_data['bossConfig'] = {
-                            'isBoss': True,
-                            'phases': get_field_value(boss_row, '阶段数', ['phases'], 1, int),
-                            'enrageThreshold': get_field_value(boss_row, '狂暴阈值', ['enrageThreshold'], 0.3, float),
-                            'enrageDamageMultiplier': get_field_value(boss_row, '狂暴伤害倍数', ['enrageDamageMultiplier'], 1.5, float),
-                            'enrageSpeedMultiplier': get_field_value(boss_row, '狂暴速度倍数', ['enrageSpeedMultiplier'], 1.3, float)
-                        }
-                
-                # 转换为嵌套结构
-                nested_enemy_data = {
-                    'id': enemy_data['id'],
-                    'name': enemy_data['name'],
-                    'type': enemy_data['type'],
-                    'stats': {
-                        'health': enemy_data.get('health', 100),
-                        'maxHealth': enemy_data.get('health', 100),
-                        'defense': enemy_data.get('defense', 0),
-                        'speed': enemy_data.get('speed', 50)
-                    },
-                    'movement': {
-                        'pattern': enemy_data.get('movementPattern', 'direct'),
-                        'speed': enemy_data.get('speed', 50),
-                        'patrolRange': enemy_data.get('patrolRange', 100),
-                        'chaseRange': enemy_data.get('chaseRange', 200),
-                        'rotationSpeed': enemy_data.get('rotationSpeed', 180),
-                        'moveType': enemy_data.get('moveType', 'straight'),
-                        'swingAmplitude': enemy_data.get('swingAmplitude', 0.0),
-                        'swingFrequency': enemy_data.get('swingFrequency', 0.0),
-                        'speedVariation': enemy_data.get('speedVariation', 0.1)
-                    },
-                    'combat': {
-                        'attackDamage': enemy_data.get('attackDamage', 10),
-                        'attackRange': enemy_data.get('attackRange', 100),
-                        'attackSpeed': enemy_data.get('attackSpeed', 1.0),
-                        'canBlock': enemy_data.get('canBlock', False),
-                        'blockChance': enemy_data.get('blockChance', 0.0),
-                        'blockDamageReduction': enemy_data.get('blockDamageReduction', 0.5),
-                        'attackCooldown': enemy_data.get('attackCooldown', 1.0),
-                        'attackType': enemy_data.get('attackType', 'melee'),
-                        'attackDelay': enemy_data.get('attackDelay', 0.5),
-                        'weaponType': enemy_data.get('weaponType', 'none'),
-                        'projectileType': enemy_data.get('projectileType', 'none'),
-                        'projectileSpeed': enemy_data.get('projectileSpeed', 100.0)
-                    },
-                    'visualConfig': {
-                        'spritePath': enemy_data.get('spritePath', f'Animation/EnemyAni/001'),
-                        'scale': enemy_data.get('scale', 1.0),
-                        'animationSpeed': enemy_data.get('animationSpeed', 1.0),
-                        'flipX': enemy_data.get('flipX', False),
-                        'tint': enemy_data.get('tint', '#FFFFFF'),
-                        'animations': {
-                            'idle': 'idle',
-                            'walk': 'walk',
-                            'attack': 'attack',
-                            'death': 'dead'
-                        },
-                        'weaponProp': enemy_data.get('weaponProp', '')
-                    },
-                    'audioConfig': {
-                        'attackSound': enemy_data.get('attackSound', 'enemy_attack'),
-                        'deathSound': enemy_data.get('deathSound', 'enemy_death'),
-                        'hitSound': enemy_data.get('hitSound', 'enemy_hit'),
-                        'walkSound': enemy_data.get('walkSound', ''),
-                        'blockSound': enemy_data.get('blockSound', ''),
-                        'stealthSound': enemy_data.get('stealthSound', ''),
-                        'armorBreakSound': enemy_data.get('armorBreakSound', ''),
-                        'fuseSound': enemy_data.get('fuseSound', ''),
-                        'volume': enemy_data.get('volume', 1.0)
-                    }
-                }
-                
-                # 添加特殊能力配置
-                if 'specialAbilities' in enemy_data:
-                    nested_enemy_data['specialAbilities'] = enemy_data['specialAbilities']
-                
-                # 添加BOSS配置
-                if 'bossConfig' in enemy_data:
-                    nested_enemy_data['bossConfig'] = enemy_data['bossConfig']
-                
-                enemies_config.append(nested_enemy_data)
-                print(f"处理敌人: {enemy_data['id']} - {enemy_data['name']}")
-                print(f"敌人 {enemy_data['id']} 的生命值: {nested_enemy_data['stats']['health']}")
-            
-            print(f"成功解析敌人配置,共 {len(enemies_config)} 个敌人")
-            
-        except Exception as e:
-            print(f"解析敌人多工作表数据时出错: {e}")
-            import traceback
-            traceback.print_exc()
-        
-        return enemies_config
+
     
     def parse_multi_sheet_data(self, all_sheets_data, filename):
         """解析通用多工作表数据"""
@@ -1789,6 +1561,71 @@ class ConfigManagerGUI:
             print(error_details)
             messagebox.showerror("错误", f"启动武器配置导入失败: {str(e)}\n\n详细错误信息已输出到控制台,请查看。")
     
+    def import_enemy_config(self):
+        """导入敌人配置"""
+        try:
+            if not ENEMY_MANAGER_AVAILABLE:
+                messagebox.showerror("错误", "敌人配置管理器不可用,请检查enemy_config_manager.py文件是否存在")
+                return
+            
+            # 创建敌人配置管理器
+            excel_dir = Path(self.excel_dir)
+            enemy_excel_file = excel_dir / "敌人配置表.xlsx"
+            enemy_json_file = excel_dir.parent / "enemies.json"
+            
+            if not enemy_excel_file.exists():
+                messagebox.showwarning("警告", f"未找到敌人配置文件: {enemy_excel_file}")
+                return
+            
+            # 使用EnemyConfigManager导入配置
+            enemy_manager = EnemyConfigManager(
+                excel_path=str(enemy_excel_file),
+                json_path=str(enemy_json_file)
+            )
+            
+            # 在后台线程中执行导入
+            def import_thread():
+                try:
+                    success = enemy_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 _import_vertical_config(self):
         """导入纵向表格配置"""
         # 读取现有JSON配置
@@ -2327,241 +2164,7 @@ class ConfigManagerGUI:
             print(f"配置类型检测出错: {e}")
             return 'unknown'
     
-    def _convert_enemy_data(self, item):
-        """转换敌人数据格式 - 支持嵌套结构"""
-        try:
-            print(f"开始转换敌人数据: {item}")
-            # 支持中英文字段名
-            enemy_id = item.get('id', item.get('敌人ID', ''))
-            enemy_name = item.get('name', item.get('敌人名称', ''))
-            enemy_type = item.get('type', item.get('敌人类型', ''))
-            print(f"敌人ID: {enemy_id}, 敌人名称: {enemy_name}, 类型: {enemy_type}")
-            
-            # 检查必要字段
-            if not enemy_id:
-                print(f"跳过无效敌人数据: 缺少敌人ID - {item}")
-                return None
-            
-            # 获取基础属性
-            health = item.get('health', item.get('生命值', 100))
-            speed = item.get('speed', item.get('移动速度', 50))
-            attack_damage = item.get('attackDamage', item.get('攻击伤害', 10))
-            attack_range = item.get('range', item.get('攻击范围', 100))
-            attack_speed = item.get('attackSpeed', item.get('攻击速度', 1.0))
-            defense = item.get('defense', item.get('防御力', 0))
-            
-            # 调试信息
-            print(f"转换敌人 {enemy_id} 的属性: health={health}, speed={speed}, attackDamage={attack_damage}, defense={defense}")
-            print(f"原始数据中的字段: {list(item.keys())}")
-            if '生命值' in item:
-                print(f"找到生命值字段,值为: {item['生命值']}")
-            if 'health' in item:
-                print(f"找到health字段,值为: {item['health']}")
-            
-            # 获取格挡相关属性
-            can_block = item.get('canBlock', item.get('可格挡', False))
-            block_chance = item.get('blockChance', item.get('格挡概率', 0.0))
-            block_damage_reduction = item.get('blockDamageReduction', item.get('格挡伤害减免', 0.5))
-            
-            # 获取移动相关属性
-            movement_pattern = item.get('movementPattern', item.get('移动模式', 'direct'))
-            patrol_range = item.get('patrolRange', item.get('巡逻范围', 100))
-            chase_range = item.get('chaseRange', item.get('追击范围', 200))
-            
-            # 获取视觉配置
-            # 敌人ID到动画编号的映射
-            enemy_to_ani = {
-                'normal_zombie': '001',
-                'roadblock_zombie': '002',
-                'wandering_zombie': '003',
-                'mage_zombie': '004',
-                'archer_zombie': '005',
-                'stealth_zombie': '006',
-                'bucket_zombie': '007',
-                'barrel_zombie': '008',
-                'boss1_gatekeeper': '009',
-                'boss2_gravedigger': '010',
-                'boss3_cyborg': '011'
-            }
-            ani_num = enemy_to_ani.get(enemy_id, '001')
-            default_sprite_path = f'Animation/EnemyAni/{ani_num}'
-            sprite_path = item.get('spritePath', item.get('精灵路径', default_sprite_path))
-            scale = item.get('scale', item.get('缩放', 1.0))
-            
-            # 获取音效配置
-            attack_sound = item.get('attackSound', item.get('攻击音效', 'enemy_attack'))
-            death_sound = item.get('deathSound', item.get('死亡音效', 'enemy_death'))
-            
-            # 构建嵌套结构的配置
-            result = {
-                'id': enemy_id,
-                'name': enemy_name,
-                'type': enemy_type,
-                'stats': {
-                    'health': health,
-                    'maxHealth': health,
-                    'defense': defense,
-                    'speed': speed
-                },
-                'movement': {
-                    'pattern': movement_pattern,
-                    'speed': speed,
-                    'patrolRange': patrol_range,
-                    'chaseRange': chase_range,
-                    'rotationSpeed': item.get('rotationSpeed', item.get('旋转速度', 180)),
-                    'moveType': item.get('moveType', item.get('移动类型', 'straight')),
-                    'swingAmplitude': item.get('swingAmplitude', item.get('摆动幅度', 0.0)),
-                    'swingFrequency': item.get('swingFrequency', item.get('摆动频率', 0.0)),
-                    'speedVariation': item.get('speedVariation', item.get('速度变化', 0.1))
-                },
-                'combat': {
-                    'attackDamage': attack_damage,
-                    'attackRange': attack_range,
-                    'attackSpeed': attack_speed,
-                    'canBlock': can_block,
-                    'blockChance': block_chance,
-                    'blockDamageReduction': block_damage_reduction,
-                    'attackCooldown': 1.0 / attack_speed if attack_speed > 0 else 1.0,
-                    'attackType': item.get('attackType', item.get('攻击类型', 'melee')),
-                    'attackDelay': item.get('attackDelay', item.get('攻击延迟', 0.5)),
-                    'weaponType': item.get('weaponType', item.get('武器类型', 'none')),
-                    'projectileType': item.get('projectileType', item.get('投射物类型', 'none')),
-                    'projectileSpeed': item.get('projectileSpeed', item.get('投射物速度', 100))
-                },
-                'visualConfig': {
-                    'spritePath': sprite_path,
-                    'scale': scale,
-                    'animationSpeed': item.get('animationSpeed', item.get('动画速度', 1.0)),
-                    'flipX': item.get('flipX', item.get('水平翻转', False)),
-                    'tint': item.get('tint', item.get('着色', '#FFFFFF')),
-                    'animations': {
-                        'idle': item.get('idleAnimation', item.get('待机动画', 'idle')),
-                        'walk': item.get('walkAnimation', item.get('行走动画', 'walk')),
-                        'attack': item.get('attackAnimation', item.get('攻击动画', 'attack')),
-                        'death': item.get('deathAnimation', item.get('死亡动画', 'dead'))
-                    },
-                    'weaponProp': item.get('weaponProp', item.get('武器道具', ''))
-                },
-                'audioConfig': {
-                    'attackSound': attack_sound,
-                    'deathSound': death_sound,
-                    'hitSound': item.get('hitSound', item.get('受击音效', 'enemy_hit')),
-                    'walkSound': item.get('walkSound', item.get('行走音效', '')),
-                    'blockSound': item.get('blockSound', item.get('格挡音效', '')),
-                    'stealthSound': item.get('stealthSound', item.get('隐身音效', '')),
-                    'armorBreakSound': item.get('armorBreakSound', item.get('护甲破碎音效', '')),
-                    'fuseSound': item.get('fuseSound', item.get('引信音效', '')),
-                    'volume': item.get('volume', item.get('音量', 1.0))
-                }
-            }
-            
-            # 添加特殊能力配置
-            special_abilities = item.get('specialAbilities', [])
-            if special_abilities:
-                result['specialAbilities'] = special_abilities
-            
-            # 添加BOSS配置
-            boss_config = item.get('bossConfig', {})
-            if boss_config and boss_config.get('isBoss', False):
-                result['bossConfig'] = boss_config
-            
-            # 根据敌人类型添加特殊配置
-            result = self._add_enemy_special_config(result, enemy_type, item)
-            
-            print(f"成功转换敌人数据: {enemy_id}")
-            return result
-        except Exception as e:
-            print(f"转换敌人数据失败: {e} - 数据: {item}")
-            return None
-    
-    def _add_enemy_special_config(self, result, enemy_type, item):
-        """根据敌人类型添加特殊配置"""
-        try:
-            # 根据敌人类型添加特殊能力和配置
-            special_abilities = []
-            
-            if enemy_type == 'stealth_zombie':
-                # 隐身僵尸特殊配置
-                special_abilities.append({
-                    'type': 'stealth',
-                    'duration': item.get('stealthDuration', item.get('隐身持续时间', 3.0)),
-                    'cooldown': item.get('stealthCooldown', item.get('隐身冷却时间', 8.0)),
-                    'alpha': item.get('stealthAlpha', item.get('隐身透明度', 0.3))
-                })
-                result['stealthConfig'] = {
-                    'canStealth': True,
-                    'stealthDuration': item.get('stealthDuration', item.get('隐身持续时间', 3.0)),
-                    'stealthCooldown': item.get('stealthCooldown', item.get('隐身冷却时间', 8.0)),
-                    'stealthAlpha': item.get('stealthAlpha', item.get('隐身透明度', 0.3))
-                }
-            
-            elif enemy_type == 'bucket_zombie':
-                # 铁桶僵尸特殊配置
-                result['armorConfig'] = {
-                    'hasArmor': True,
-                    'armorHealth': item.get('armorHealth', item.get('护甲血量', 50)),
-                    'armorDefense': item.get('armorDefense', item.get('护甲防御', 5)),
-                    'armorSprite': item.get('armorSprite', item.get('护甲精灵', 'bucket_armor'))
-                }
-            
-            elif enemy_type == 'explosive_zombie':
-                # 火药桶僵尸特殊配置
-                special_abilities.append({
-                    'type': 'explosion',
-                    'damage': item.get('explosionDamage', item.get('爆炸伤害', 30)),
-                    'radius': item.get('explosionRadius', item.get('爆炸半径', 80)),
-                    'triggerOnDeath': True
-                })
-                result['explosiveConfig'] = {
-                    'explosionDamage': item.get('explosionDamage', item.get('爆炸伤害', 30)),
-                    'explosionRadius': item.get('explosionRadius', item.get('爆炸半径', 80)),
-                    'fuseTime': item.get('fuseTime', item.get('引爆时间', 2.0)),
-                    'chainExplosion': item.get('chainExplosion', item.get('连锁爆炸', False))
-                }
-            
-            elif enemy_type == 'ranged_enemy':
-                # 远程敌人特殊配置
-                result['rangedConfig'] = {
-                    'projectileType': item.get('projectileType', item.get('弹药类型', 'bullet')),
-                    'projectileSpeed': item.get('projectileSpeed', item.get('弹药速度', 100)),
-                    'projectileDamage': item.get('projectileDamage', item.get('弹药伤害', item.get('attack', item.get('攻击力', 10)))),
-                    'fireRate': item.get('fireRate', item.get('射速', 1.0)),
-                    'accuracy': item.get('accuracy', item.get('精度', 0.9))
-                }
-            
-            elif 'boss' in enemy_type.lower():
-                # BOSS特殊配置
-                special_abilities.extend([
-                    {
-                        'type': 'charge_attack',
-                        'damage': item.get('chargeDamage', item.get('冲锋伤害', item.get('attack', item.get('攻击力', 10)) * 2)),
-                        'range': item.get('chargeRange', item.get('冲锋范围', 150)),
-                        'cooldown': item.get('chargeCooldown', item.get('冲锋冷却', 8.0))
-                    },
-                    {
-                        'type': 'area_attack',
-                        'damage': item.get('areaDamage', item.get('范围伤害', item.get('attack', item.get('攻击力', 10)) * 1.5)),
-                        'radius': item.get('areaRadius', item.get('范围半径', 100)),
-                        'cooldown': item.get('areaCooldown', item.get('范围攻击冷却', 12.0))
-                    }
-                ])
-                result['bossConfig'] = {
-                    'isBoss': True,
-                    'phases': item.get('phases', item.get('阶段数', 1)),
-                    'enrageThreshold': item.get('enrageThreshold', item.get('狂暴阈值', 0.3)),
-                    'enrageDamageMultiplier': item.get('enrageDamageMultiplier', item.get('狂暴伤害倍数', 1.5)),
-                    'enrageSpeedMultiplier': item.get('enrageSpeedMultiplier', item.get('狂暴速度倍数', 1.3))
-                }
-            
-            # 添加特殊能力到结果中
-            if special_abilities:
-                result['specialAbilities'] = special_abilities
-            
-            return result
-            
-        except Exception as e:
-            print(f"添加特殊配置失败: {e}")
-            return result
+
     
 
     
@@ -2672,99 +2275,7 @@ class ConfigManagerGUI:
             print(f"转换关卡数据时出错: {e}")
             return None
     
-    def fix_enemies_json(self):
-        """修复enemies.json文件 - 删除attack字段"""
-        try:
-            # 获取enemies.json路径
-            enemies_json_path = Path(self.json_path_var.get()) if self.json_path_var.get() else None
-            if not enemies_json_path or not enemies_json_path.exists():
-                # 尝试默认路径
-                enemies_json_path = Path(os.path.dirname(__file__)).parent / "enemies.json"
-                if not enemies_json_path.exists():
-                    messagebox.showerror("错误", "未找到enemies.json文件")
-                    return False
-            
-            # 备份原文件
-            backup_path = f"{enemies_json_path}.backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
-            with open(enemies_json_path, 'r', encoding='utf-8') as src:
-                with open(backup_path, 'w', encoding='utf-8') as dst:
-                    dst.write(src.read())
-            
-            # 读取JSON文件
-            with open(enemies_json_path, 'r', encoding='utf-8') as f:
-                data = json.load(f)
-            
-            # 递归删除attack字段
-            def remove_attack_fields(obj):
-                if isinstance(obj, dict):
-                    if 'attack' in obj:
-                        del obj['attack']
-                    for value in obj.values():
-                        remove_attack_fields(value)
-                elif isinstance(obj, list):
-                    for item in obj:
-                        remove_attack_fields(item)
-            
-            remove_attack_fields(data)
-            
-            # 写回文件
-            with open(enemies_json_path, 'w', encoding='utf-8') as f:
-                json.dump(data, f, ensure_ascii=False, indent=2)
-            
-            messagebox.showinfo("成功", f"已修复enemies.json文件\n备份文件: {backup_path}\n已删除所有attack字段")
-            return True
-            
-        except Exception as e:
-            messagebox.showerror("错误", f"修复enemies.json失败: {str(e)}")
-            return False
-    
-    def auto_import_enemies_from_excel(self):
-        """自动从Excel导入敌人配置"""
-        try:
-            # 查找敌人配置表.xlsx
-            excel_dir = Path(os.path.dirname(__file__))
-            excel_file = excel_dir / "敌人配置表.xlsx"
-            
-            if not excel_file.exists():
-                messagebox.showerror("错误", f"未找到敌人配置表.xlsx文件: {excel_file}")
-                return False
-            
-            # 读取Excel文件
-            if not PANDAS_AVAILABLE:
-                messagebox.showerror("错误", "pandas未安装,无法读取Excel文件")
-                return False
-            
-            all_sheets = pd.read_excel(excel_file, sheet_name=None)
-            
-            # 解析敌人配置
-            enemies_config = self.parse_enemy_multi_sheet_data(all_sheets, "敌人配置表.xlsx")
-            
-            if not enemies_config:
-                messagebox.showerror("错误", "未能解析到任何敌人配置")
-                return False
-            
-            # 获取输出路径
-            enemies_json_path = Path(self.json_path_var.get()) if self.json_path_var.get() else None
-            if not enemies_json_path:
-                enemies_json_path = excel_dir.parent / "enemies.json"
-            
-            # 备份现有文件
-            if enemies_json_path.exists():
-                backup_path = f"{enemies_json_path}.backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
-                with open(enemies_json_path, 'r', encoding='utf-8') as src:
-                    with open(backup_path, 'w', encoding='utf-8') as dst:
-                        dst.write(src.read())
-            
-            # 写入新配置
-            with open(enemies_json_path, 'w', encoding='utf-8') as f:
-                json.dump(enemies_config, f, ensure_ascii=False, indent=2)
-            
-            messagebox.showinfo("成功", f"已成功导入{len(enemies_config)}个敌人配置到: {enemies_json_path}")
-            return True
-            
-        except Exception as e:
-            messagebox.showerror("错误", f"自动导入敌人配置失败: {str(e)}")
-            return False
+
     
     def restore_default_config(self):
         """恢复默认配置"""

+ 548 - 0
assets/resources/data/excel/enemy_config_manager.py

@@ -0,0 +1,548 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+敌人配置管理器
+负责从Excel文件读取敌人配置并与现有JSON配置合并
+只修改策划配置的值,保持JSON中其他字段不变
+
+作者: AI Assistant
+日期: 2024
+"""
+
+import json
+import os
+from pathlib import Path
+from datetime import datetime
+import copy
+
+try:
+    import pandas as pd
+    PANDAS_AVAILABLE = True
+except ImportError:
+    PANDAS_AVAILABLE = False
+    print("警告: pandas未安装,敌人配置管理器将不可用")
+
+class EnemyConfigManager:
+    """敌人配置管理器类"""
+    
+    def __init__(self, excel_path=None, json_path=None):
+        """初始化敌人配置管理器"""
+        if not PANDAS_AVAILABLE:
+            raise ImportError("pandas未安装,无法使用敌人配置管理器")
+        
+        # 设置文件路径
+        self.script_dir = Path(__file__).parent
+        self.excel_path = Path(excel_path) if excel_path else self.script_dir / "敌人配置表.xlsx"
+        self.json_path = Path(json_path) if json_path else self.script_dir.parent / "enemies.json"
+        
+        # 存储配置数据
+        self.excel_data = {}
+        self.existing_json = []
+        self.merged_config = []
+        
+        print(f"敌人配置管理器初始化完成")
+        print(f"Excel文件: {self.excel_path}")
+        print(f"JSON文件: {self.json_path}")
+    
+    def load_existing_json(self):
+        """加载现有的JSON配置"""
+        if self.json_path.exists():
+            try:
+                with open(self.json_path, 'r', encoding='utf-8') as f:
+                    self.existing_json = json.load(f)
+                print(f"成功加载现有JSON配置,包含 {len(self.existing_json)} 个敌人")
+                return True
+            except Exception as e:
+                print(f"加载JSON配置失败: {e}")
+                self.existing_json = []
+                return False
+        else:
+            print("JSON文件不存在,将创建新配置")
+            self.existing_json = []
+            return True
+    
+    def read_excel_data(self):
+        """从Excel文件读取敌人配置数据"""
+        if not self.excel_path.exists():
+            raise FileNotFoundError(f"Excel文件不存在: {self.excel_path}")
+        
+        try:
+            # 读取所有工作表
+            excel_data = pd.read_excel(self.excel_path, sheet_name=None)
+            print(f"找到工作表: {list(excel_data.keys())}")
+            
+            # 解析各个工作表
+            self.excel_data = {
+                'basic': self._parse_basic_config(excel_data.get('敌人基础配置')),
+                'combat': self._parse_combat_config(excel_data.get('战斗配置')),
+                'movement': self._parse_movement_config(excel_data.get('移动配置')),
+                'visual': self._parse_visual_config(excel_data.get('视觉配置')),
+                'audio': self._parse_audio_config(excel_data.get('音频配置')),
+                'special': self._parse_special_abilities(excel_data.get('特殊能力配置')),
+                'boss': self._parse_boss_config(excel_data.get('BOSS配置'))
+            }
+            
+            print("Excel数据解析完成")
+            return True
+            
+        except Exception as e:
+            print(f"读取Excel文件失败: {e}")
+            return False
+    
+    def _parse_basic_config(self, df):
+        """解析敌人基础配置"""
+        if df is None:
+            return {}
+        
+        config = {}
+        for index, row in df.iterrows():
+            if index == 0:  # 跳过标题行
+                continue
+            
+            enemy_id = str(row.iloc[0]).strip()
+            if pd.isna(row.iloc[0]) or enemy_id == '':
+                continue
+            
+            config[enemy_id] = {
+                'name': str(row.iloc[1]) if not pd.isna(row.iloc[1]) else '',
+                'type': str(row.iloc[2]) if not pd.isna(row.iloc[2]) else '',
+                'health': int(row.iloc[3]) if not pd.isna(row.iloc[3]) else 100,
+                'maxHealth': int(row.iloc[4]) if not pd.isna(row.iloc[4]) else 100,
+                'defense': int(row.iloc[5]) if not pd.isna(row.iloc[5]) else 0,
+                'speed': float(row.iloc[6]) if not pd.isna(row.iloc[6]) else 30.0
+            }
+        
+        print(f"解析基础配置: {len(config)} 个敌人")
+        return config
+    
+    def _parse_combat_config(self, df):
+        """解析战斗配置"""
+        if df is None:
+            return {}
+        
+        config = {}
+        for index, row in df.iterrows():
+            if index == 0:  # 跳过标题行
+                continue
+            
+            enemy_id = str(row.iloc[0]).strip()
+            if pd.isna(row.iloc[0]) or enemy_id == '':
+                continue
+            
+            config[enemy_id] = {
+                'attackDamage': int(row.iloc[1]) if not pd.isna(row.iloc[1]) else 1,
+                'attackRange': float(row.iloc[2]) if not pd.isna(row.iloc[2]) else 1.0,
+                'attackSpeed': float(row.iloc[3]) if not pd.isna(row.iloc[3]) else 1.0,
+                'canBlock': bool(row.iloc[4]) if not pd.isna(row.iloc[4]) else False,
+                'blockChance': float(row.iloc[5]) if not pd.isna(row.iloc[5]) else 0.0,
+                'blockDamageReduction': float(row.iloc[6]) if not pd.isna(row.iloc[6]) else 0.5,
+                'attackCooldown': float(row.iloc[7]) if not pd.isna(row.iloc[7]) else 1.0,
+                'attackType': str(row.iloc[8]) if not pd.isna(row.iloc[8]) else 'melee',
+                'attackDelay': float(row.iloc[9]) if not pd.isna(row.iloc[9]) else 1.0,
+                'weaponType': str(row.iloc[10]) if not pd.isna(row.iloc[10]) else 'none',
+                'projectileType': str(row.iloc[11]) if not pd.isna(row.iloc[11]) else 'none',
+                'projectileSpeed': float(row.iloc[12]) if not pd.isna(row.iloc[12]) else 100.0
+            }
+        
+        print(f"解析战斗配置: {len(config)} 个敌人")
+        return config
+    
+    def _parse_movement_config(self, df):
+        """解析移动配置"""
+        if df is None:
+            return {}
+        
+        config = {}
+        for index, row in df.iterrows():
+            if index == 0:  # 跳过标题行
+                continue
+            
+            enemy_id = str(row.iloc[0]).strip()
+            if pd.isna(row.iloc[0]) or enemy_id == '':
+                continue
+            
+            config[enemy_id] = {
+                'pattern': str(row.iloc[1]) if not pd.isna(row.iloc[1]) else 'direct',
+                'speed': float(row.iloc[2]) if not pd.isna(row.iloc[2]) else 30.0,
+                'patrolRange': int(row.iloc[3]) if not pd.isna(row.iloc[3]) else 100,
+                'chaseRange': int(row.iloc[4]) if not pd.isna(row.iloc[4]) else 200,
+                'rotationSpeed': float(row.iloc[5]) if not pd.isna(row.iloc[5]) else 180.0,
+                'moveType': str(row.iloc[6]) if not pd.isna(row.iloc[6]) else 'straight',
+                'swingAmplitude': float(row.iloc[7]) if not pd.isna(row.iloc[7]) else 0.0,
+                'swingFrequency': float(row.iloc[8]) if not pd.isna(row.iloc[8]) else 0.0,
+                'speedVariation': float(row.iloc[9]) if not pd.isna(row.iloc[9]) else 0.1
+            }
+        
+        print(f"解析移动配置: {len(config)} 个敌人")
+        return config
+    
+    def _parse_visual_config(self, df):
+        """解析视觉配置"""
+        if df is None:
+            return {}
+        
+        visual_config = {}
+        
+        for _, row in df.iterrows():
+            enemy_id = str(row.get('敌人ID', '')).strip()
+            if not enemy_id or enemy_id == '敌人ID':
+                continue
+                
+            config = {
+                'sprite_path': str(row.get('精灵路径', '')).strip(),
+                'scale': float(row.get('缩放比例', 1.0)),
+                'animation_speed': float(row.get('动画速度', 1.0)),
+                'flip_horizontal': bool(row.get('水平翻转', False)),
+                'animations': {
+                    'idle': str(row.get('待机动画', 'idle')).strip(),
+                    'walk': str(row.get('行走动画', 'walk')).strip(),
+                    'attack': str(row.get('攻击动画', 'attack')).strip(),
+                    'death': str(row.get('死亡动画', 'dead')).strip()
+                }
+            }
+            
+            # 武器道具(可选)
+            weapon_prop = str(row.get('武器道具', '')).strip()
+            if weapon_prop:
+                config['weapon_prop'] = weapon_prop
+                
+            visual_config[enemy_id] = config
+            
+        return visual_config
+    
+    def _parse_audio_config(self, df):
+        """解析音频配置"""
+        if df is None:
+            return {}
+        
+        audio_config = {}
+        
+        for _, row in df.iterrows():
+            enemy_id = str(row.get('敌人ID', '')).strip()
+            if not enemy_id or enemy_id == '敌人ID':
+                continue
+                
+            config = {
+                'attack_sound': str(row.get('攻击音效', '')).strip(),
+                'death_sound': str(row.get('死亡音效', '')).strip(),
+                'hit_sound': str(row.get('受击音效', '')).strip(),
+                'walk_sound': str(row.get('行走音效', '')).strip()
+            }
+            
+            # 可选音效
+            optional_sounds = {
+                'block_sound': '格挡音效',
+                'stealth_sound': '隐身音效', 
+                'armor_break_sound': '护甲破碎音效',
+                'fuse_sound': '引信音效'
+            }
+            
+            for key, col_name in optional_sounds.items():
+                sound = str(row.get(col_name, '')).strip()
+                if sound:
+                    config[key] = sound
+                    
+            audio_config[enemy_id] = config
+            
+        return audio_config
+    
+    def _parse_special_abilities(self, df):
+        """解析特殊能力配置"""
+        if df is None:
+            return {}
+        
+        abilities_config = {}
+        
+        for _, row in df.iterrows():
+            enemy_id = str(row.get('敌人ID', '')).strip()
+            if not enemy_id or enemy_id == '敌人ID':
+                continue
+                
+            ability_type = str(row.get('能力类型', '')).strip()
+            if not ability_type:
+                # 没有特殊能力的敌人
+                if enemy_id not in abilities_config:
+                    abilities_config[enemy_id] = []
+                continue
+                
+            ability = {
+                'type': ability_type,
+                'damage': int(row.get('伤害', 0)),
+                'range': int(row.get('范围', 0)),
+                'cooldown': int(row.get('冷却时间', 0))
+            }
+            
+            if enemy_id not in abilities_config:
+                abilities_config[enemy_id] = []
+            abilities_config[enemy_id].append(ability)
+            
+        return abilities_config
+    
+    def _parse_boss_config(self, df):
+        """解析BOSS配置"""
+        if df is None:
+            return {}
+        
+        boss_config = {}
+        
+        for _, row in df.iterrows():
+            enemy_id = str(row.get('敌人ID', '')).strip()
+            if not enemy_id or enemy_id == '敌人ID':
+                continue
+                
+            config = {
+                'is_boss': bool(row.get('是否BOSS', False)),
+                'phases': int(row.get('阶段数', 1)),
+                'rage_threshold': float(row.get('狂暴阈值', 0.3)),
+                'rage_damage_multiplier': float(row.get('狂暴伤害倍数', 1.0)),
+                'rage_speed_multiplier': float(row.get('狂暴速度倍数', 1.0))
+            }
+            
+            boss_config[enemy_id] = config
+            
+        return boss_config
+    
+    def merge_configurations(self):
+        """合并Excel配置和现有JSON配置"""
+        print("开始合并配置...")
+        
+        # 创建敌人ID到JSON索引的映射
+        json_enemy_map = {}
+        for i, enemy in enumerate(self.existing_json):
+            json_enemy_map[enemy.get('id', '')] = i
+        
+        # 获取所有Excel中的敌人ID
+        excel_enemy_ids = set()
+        for config_type in ['basic', 'combat', 'movement', 'visual', 'audio', 'special_abilities', 'boss']:
+            if config_type in self.excel_data:
+                excel_enemy_ids.update(self.excel_data[config_type].keys())
+        
+        # 复制现有JSON作为基础
+        self.merged_config = copy.deepcopy(self.existing_json)
+        
+        # 处理每个敌人
+        for enemy_id in excel_enemy_ids:
+            if enemy_id in json_enemy_map:
+                # 更新现有敌人
+                json_index = json_enemy_map[enemy_id]
+                self._update_enemy_config(self.merged_config[json_index], enemy_id)
+                print(f"更新敌人配置: {enemy_id}")
+            else:
+                # 创建新敌人(如果需要)
+                new_enemy = self._create_new_enemy_config(enemy_id)
+                if new_enemy:
+                    self.merged_config.append(new_enemy)
+                    print(f"创建新敌人配置: {enemy_id}")
+        
+        print(f"配置合并完成,共 {len(self.merged_config)} 个敌人")
+    
+    def _update_enemy_config(self, enemy_config, enemy_id):
+        """更新单个敌人的配置"""
+        # 更新基础配置
+        if 'basic' in self.excel_data and enemy_id in self.excel_data['basic']:
+            basic_data = self.excel_data['basic'][enemy_id]
+            if 'name' in basic_data:
+                enemy_config['name'] = basic_data['name']
+            if 'type' in basic_data:
+                enemy_config['type'] = basic_data['type']
+            
+            # 更新stats部分
+            if 'stats' not in enemy_config:
+                enemy_config['stats'] = {}
+            
+            stats_mapping = {
+                'health': 'health',
+                'maxHealth': 'maxHealth', 
+                'defense': 'defense',
+                'speed': 'speed'
+            }
+            
+            for excel_key, json_key in stats_mapping.items():
+                if excel_key in basic_data:
+                    enemy_config['stats'][json_key] = basic_data[excel_key]
+        
+        # 更新战斗配置
+        if 'combat' in self.excel_data and enemy_id in self.excel_data['combat']:
+            combat_data = self.excel_data['combat'][enemy_id]
+            
+            if 'combat' not in enemy_config:
+                enemy_config['combat'] = {}
+            
+            combat_mapping = {
+                'attackDamage': 'attackDamage',
+                'attackRange': 'attackRange',
+                'attackSpeed': 'attackSpeed',
+                'canBlock': 'canBlock',
+                'blockChance': 'blockChance',
+                'blockDamageReduction': 'blockDamageReduction',
+                'attackCooldown': 'attackCooldown',
+                'attackType': 'attackType',
+                'attackDelay': 'attackDelay',
+                'weaponType': 'weaponType',
+                'projectileType': 'projectileType',
+                'projectileSpeed': 'projectileSpeed'
+            }
+            
+            for excel_key, json_key in combat_mapping.items():
+                if excel_key in combat_data:
+                    enemy_config['combat'][json_key] = combat_data[excel_key]
+        
+        # 更新移动配置
+        if 'movement' in self.excel_data and enemy_id in self.excel_data['movement']:
+            movement_data = self.excel_data['movement'][enemy_id]
+            
+            if 'movement' not in enemy_config:
+                enemy_config['movement'] = {}
+            
+            movement_mapping = {
+                'pattern': 'pattern',
+                'speed': 'speed',
+                'patrolRange': 'patrolRange',
+                'chaseRange': 'chaseRange',
+                'rotationSpeed': 'rotationSpeed',
+                'moveType': 'moveType',
+                'swingAmplitude': 'swingAmplitude',
+                'swingFrequency': 'swingFrequency',
+                'speedVariation': 'speedVariation'
+            }
+            
+            for excel_key, json_key in movement_mapping.items():
+                if excel_key in movement_data:
+                    enemy_config['movement'][json_key] = movement_data[excel_key]
+        
+        # 更新视觉配置
+        if 'visual' in self.excel_data and enemy_id in self.excel_data['visual']:
+            visual_data = self.excel_data['visual'][enemy_id]
+            
+            if 'visual' not in enemy_config:
+                enemy_config['visual'] = {}
+            
+            # 直接映射视觉配置
+            for key, value in visual_data.items():
+                enemy_config['visual'][key] = value
+        
+        # 更新音频配置
+        if 'audio' in self.excel_data and enemy_id in self.excel_data['audio']:
+            audio_data = self.excel_data['audio'][enemy_id]
+            
+            if 'audio' not in enemy_config:
+                enemy_config['audio'] = {}
+            
+            # 直接映射音频配置
+            for key, value in audio_data.items():
+                enemy_config['audio'][key] = value
+        
+        # 更新特殊能力配置
+        if 'special_abilities' in self.excel_data and enemy_id in self.excel_data['special_abilities']:
+            abilities_data = self.excel_data['special_abilities'][enemy_id]
+            
+            if 'special_abilities' not in enemy_config:
+                enemy_config['special_abilities'] = []
+            
+            # 替换特殊能力列表
+            enemy_config['special_abilities'] = abilities_data
+        
+        # 更新BOSS配置
+        if 'boss' in self.excel_data and enemy_id in self.excel_data['boss']:
+            boss_data = self.excel_data['boss'][enemy_id]
+            
+            if 'boss' not in enemy_config:
+                enemy_config['boss'] = {}
+            
+            # 直接映射BOSS配置
+            for key, value in boss_data.items():
+                enemy_config['boss'][key] = value
+    
+    def _create_new_enemy_config(self, enemy_id):
+        """创建新的敌人配置(基于Excel数据)"""
+        # 这里可以根据需要实现创建新敌人的逻辑
+        # 暂时返回None,只更新现有敌人
+        return None
+    
+    def backup_json(self):
+        """备份原始JSON文件"""
+        if not self.json_path.exists():
+            return True
+        
+        try:
+            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+            backup_path = self.json_path.parent / f"{self.json_path.stem}_backup_{timestamp}.json"
+            
+            with open(self.json_path, 'r', encoding='utf-8') as src:
+                with open(backup_path, 'w', encoding='utf-8') as dst:
+                    dst.write(src.read())
+            
+            print(f"备份文件已创建: {backup_path}")
+            return True
+            
+        except Exception as e:
+            print(f"备份失败: {e}")
+            return False
+    
+    def save_merged_config(self):
+        """保存合并后的配置到JSON文件"""
+        try:
+            # 确保目录存在
+            self.json_path.parent.mkdir(parents=True, exist_ok=True)
+            
+            with open(self.json_path, 'w', encoding='utf-8') as f:
+                json.dump(self.merged_config, f, ensure_ascii=False, indent=2)
+            
+            print(f"配置已保存到: {self.json_path}")
+            return True
+            
+        except Exception as e:
+            print(f"保存配置失败: {e}")
+            return False
+    
+    def import_config(self):
+        """执行完整的配置导入流程"""
+        print("=== 敌人配置导入开始 ===")
+        
+        try:
+            # 1. 加载现有JSON配置
+            if not self.load_existing_json():
+                print("加载现有JSON配置失败")
+                return False
+            
+            # 2. 读取Excel数据
+            if not self.read_excel_data():
+                print("读取Excel数据失败")
+                return False
+            
+            # 3. 合并配置
+            self.merge_configurations()
+            
+            # 4. 备份原文件
+            if not self.backup_json():
+                print("备份失败,但继续执行")
+            
+            # 5. 保存新配置
+            if not self.save_merged_config():
+                print("保存配置失败")
+                return False
+            
+            print("=== 敌人配置导入完成 ===")
+            return True
+            
+        except Exception as e:
+            print(f"配置导入过程中发生错误: {e}")
+            return False
+
+# 测试函数
+def test_enemy_config_manager():
+    """测试敌人配置管理器"""
+    try:
+        manager = EnemyConfigManager()
+        success = manager.import_config()
+        if success:
+            print("敌人配置导入测试成功")
+        else:
+            print("敌人配置导入测试失败")
+        return success
+    except Exception as e:
+        print(f"测试失败: {e}")
+        return False
+
+if __name__ == "__main__":
+    test_enemy_config_manager()

BIN
assets/resources/data/excel/~$BallController标准配置表.xlsx


BIN
assets/resources/data/excel/~$局外技能配置表.xlsx


BIN
assets/resources/data/excel/~$技能配置表.xlsx


BIN
assets/resources/data/excel/~$敌人配置表.xlsx


BIN
assets/resources/data/excel/关卡配置/~$关卡配置表.xlsx


+ 0 - 2380
assets/resources/data/weapons.json.backup_1755508737

@@ -1,2380 +0,0 @@
-{
-  "weapons": [
-    {
-      "id": "pea_shooter",
-      "name": "毛豆射手",
-      "type": "single_shot",
-      "rarity": "common",
-      "weight": 30,
-      "stats": {
-        "damage": 10,
-        "fireRate": 5.0,
-        "range": 450,
-        "bulletSpeed": 30
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "straight",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "normal_damage",
-            "priority": 1,
-            "damage": 10
-          }
-        ],
-        "lifecycle": {
-          "type": "hit_destroy",
-          "maxLifetime": 5.0,
-          "penetration": 1,
-          "ricochetCount": 0,
-          "returnToOrigin": false
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Pea_ShooterBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/001-1",
-          "H-I": "images/PlantsSprite/001-1",
-          "L": "images/PlantsSprite/001-1",
-          "S": "images/PlantsSprite/001-1",
-          "D-T": "images/PlantsSprite/001-1"
-        },
-        "fireSound": "audio/pea_shooter_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 100,
-            "damage": 10
-          },
-          "2": {
-            "cost": 150,
-            "damage": 11
-          },
-          "3": {
-            "cost": 200,
-            "damage": 12
-          },
-          "4": {
-            "cost": 250,
-            "damage": 13
-          },
-          "5": {
-            "cost": 300,
-            "damage": 14
-          },
-          "6": {
-            "cost": 350,
-            "damage": 15
-          },
-          "7": {
-            "cost": 400,
-            "damage": 16
-          },
-          "8": {
-            "cost": 450,
-            "damage": 17
-          },
-          "9": {
-            "cost": 500,
-            "damage": 18
-          },
-          "10": {
-            "cost": 550,
-            "damage": 19
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 5,
-        "shapeCosts": {
-          "I": 10,
-          "H-I": 10,
-          "L": 15,
-          "S": 20,
-          "D-T": 20
-        }
-      }
-    },
-    {
-      "id": "sharp_carrot",
-      "name": "尖胡萝卜",
-      "type": "piercing",
-      "rarity": "common",
-      "weight": 25,
-      "stats": {
-        "damage": 8,
-        "fireRate": 5.0,
-        "range": 400,
-        "bulletSpeed": 20
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "straight",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "pierce_damage",
-            "priority": 1,
-            "damage": 8,
-            "pierceCount": 999
-          }
-        ],
-        "lifecycle": {
-          "type": "range_limit",
-          "maxLifetime": 5.0,
-          "penetration": 999,
-          "ricochetCount": 0,
-          "returnToOrigin": false,
-          "maxRange": 800
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Sharp_CarrotBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": "Animation/WeaponTx/tx0001/tx0001"
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/002",
-          "H-I": "images/PlantsSprite/002",
-          "L": "images/PlantsSprite/002",
-          "S": "images/PlantsSprite/002",
-          "D-T": "images/PlantsSprite/002"
-        },
-        "fireSound": "audio/sharp_carrot_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 120,
-            "damage": 8
-          },
-          "2": {
-            "cost": 180,
-            "damage": 9
-          },
-          "3": {
-            "cost": 240,
-            "damage": 10
-          },
-          "4": {
-            "cost": 300,
-            "damage": 11
-          },
-          "5": {
-            "cost": 360,
-            "damage": 12
-          },
-          "6": {
-            "cost": 420,
-            "damage": 13
-          },
-          "7": {
-            "cost": 480,
-            "damage": 14
-          },
-          "8": {
-            "cost": 540,
-            "damage": 15
-          },
-          "9": {
-            "cost": 600,
-            "damage": 16
-          },
-          "10": {
-            "cost": 660,
-            "damage": 17
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 6,
-        "shapeCosts": {
-          "I": 12,
-          "H-I": 12,
-          "L": 18,
-          "S": 24,
-          "D-T": 24
-        }
-      }
-    },
-    {
-      "id": "saw_grass",
-      "name": "锯齿草",
-      "type": "ricochet_piercing",
-      "rarity": "uncommon",
-      "weight": 20,
-      "stats": {
-        "damage": 8,
-        "fireRate": 5.0,
-        "range": 350,
-        "bulletSpeed": 30
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "straight",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "ricochet_damage",
-            "priority": 1,
-            "damage": 8,
-            "ricochetCount": 2,
-            "ricochetAngle": 45
-          },
-          {
-            "type": "pierce_damage",
-            "priority": 2,
-            "damage": 8,
-            "pierceCount": 3
-          }
-        ],
-        "lifecycle": {
-          "type": "ricochet_counter",
-          "maxLifetime": 8.0,
-          "penetration": 3,
-          "ricochetCount": 3,
-          "returnToOrigin": false
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Saw_GrassBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/003",
-          "H-I": "images/PlantsSprite/003",
-          "L": "images/PlantsSprite/003",
-          "S": "images/PlantsSprite/003",
-          "D-T": "images/PlantsSprite/003"
-        },
-        "fireSound": "audio/saw_grass_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 120,
-            "damage": 8
-          },
-          "2": {
-            "cost": 180,
-            "damage": 9
-          },
-          "3": {
-            "cost": 240,
-            "damage": 10
-          },
-          "4": {
-            "cost": 300,
-            "damage": 11
-          },
-          "5": {
-            "cost": 360,
-            "damage": 12
-          },
-          "6": {
-            "cost": 420,
-            "damage": 13
-          },
-          "7": {
-            "cost": 480,
-            "damage": 14
-          },
-          "8": {
-            "cost": 540,
-            "damage": 15
-          },
-          "9": {
-            "cost": 600,
-            "damage": 16
-          },
-          "10": {
-            "cost": 660,
-            "damage": 17
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 6,
-        "shapeCosts": {
-          "I": 12,
-          "H-I": 12,
-          "L": 18,
-          "S": 24,
-          "D-T": 24
-        }
-      }
-    },
-    {
-      "id": "watermelon_bomb",
-      "name": "西瓜炸弹",
-      "type": "explosive",
-      "rarity": "rare",
-      "weight": 15,
-      "stats": {
-        "damage": 15,
-        "fireRate": 2.0,
-        "range": 500,
-        "bulletSpeed": 20
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "arc",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "explosion",
-            "priority": 1,
-            "damage": 35,
-            "radius": 100,
-            "delay": 0.1
-          }
-        ],
-        "lifecycle": {
-          "type": "ground_impact",
-          "maxLifetime": 5.0,
-          "penetration": 1,
-          "ricochetCount": 0,
-          "returnToOrigin": false
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Watermelon_BombBullet",
-          "hitEffect": "Animation/WeaponTx/tx0007/tx0007",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/007",
-          "H-I": "images/PlantsSprite/007",
-          "L": "images/PlantsSprite/007",
-          "S": "images/PlantsSprite/007",
-          "D-T": "images/PlantsSprite/007"
-        },
-        "fireSound": "audio/watermelon_bomb_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 150,
-            "damage": 15
-          },
-          "2": {
-            "cost": 225,
-            "damage": 17
-          },
-          "3": {
-            "cost": 300,
-            "damage": 19
-          },
-          "4": {
-            "cost": 375,
-            "damage": 21
-          },
-          "5": {
-            "cost": 450,
-            "damage": 23
-          },
-          "6": {
-            "cost": 525,
-            "damage": 25
-          },
-          "7": {
-            "cost": 600,
-            "damage": 27
-          },
-          "8": {
-            "cost": 675,
-            "damage": 29
-          },
-          "9": {
-            "cost": 750,
-            "damage": 31
-          },
-          "10": {
-            "cost": 825,
-            "damage": 33
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 10,
-        "shapeCosts": {
-          "I": 20,
-          "H-I": 20,
-          "L": 30,
-          "S": 40,
-          "D-T": 40
-        }
-      }
-    },
-    {
-      "id": "boomerang_plant",
-      "name": "回旋镖盆栽",
-      "type": "boomerang",
-      "rarity": "uncommon",
-      "weight": 18,
-      "stats": {
-        "damage": 10,
-        "fireRate": 2.0,
-        "range": 300,
-        "bulletSpeed": 20
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "homing",
-          "speed": 15,
-          "gravity": 0,
-          "homingStrength": 0.5,
-          "homingDelay": 0.3
-        },
-        "hitEffects": [
-          {
-            "type": "pierce_damage",
-            "priority": 1,
-            "damage": 10,
-            "pierceCount": 999
-          }
-        ],
-        "lifecycle": {
-          "type": "return_trip",
-          "maxLifetime": 10.0,
-          "penetration": 999,
-          "ricochetCount": 0,
-          "returnToOrigin": true,
-          "returnDelay": 1.0
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Boomerang_PlantBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/004",
-          "H-I": "images/PlantsSprite/004",
-          "L": "images/PlantsSprite/004",
-          "S": "images/PlantsSprite/004",
-          "D-T": "images/PlantsSprite/004"
-        },
-        "fireSound": "audio/boomerang_plant_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 120,
-            "damage": 10
-          },
-          "2": {
-            "cost": 180,
-            "damage": 11
-          },
-          "3": {
-            "cost": 240,
-            "damage": 12
-          },
-          "4": {
-            "cost": 300,
-            "damage": 13
-          },
-          "5": {
-            "cost": 360,
-            "damage": 14
-          },
-          "6": {
-            "cost": 420,
-            "damage": 15
-          },
-          "7": {
-            "cost": 480,
-            "damage": 16
-          },
-          "8": {
-            "cost": 540,
-            "damage": 17
-          },
-          "9": {
-            "cost": 600,
-            "damage": 18
-          },
-          "10": {
-            "cost": 660,
-            "damage": 19
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 6,
-        "shapeCosts": {
-          "I": 12,
-          "H-I": 12,
-          "L": 18,
-          "S": 24,
-          "D-T": 24
-        }
-      }
-    },
-    {
-      "id": "hot_pepper",
-      "name": "炙热辣椒",
-      "type": "area_burn",
-      "rarity": "rare",
-      "weight": 12,
-      "stats": {
-        "damage": 15,
-        "fireRate": 2.0,
-        "range": 500,
-        "bulletSpeed": 20
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "straight",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "normal_damage",
-            "priority": 1,
-            "damage": 15
-          },
-          {
-            "type": "ground_burn",
-            "priority": 2,
-            "damage": 5,
-            "duration": 3.0,
-            "tickInterval": 0.5
-          }
-        ],
-        "lifecycle": {
-          "type": "hit_destroy",
-          "maxLifetime": 5.0,
-          "penetration": 1,
-          "ricochetCount": 0,
-          "returnToOrigin": false
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Hot_PepperBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/005",
-          "H-I": "images/PlantsSprite/005",
-          "L": "images/PlantsSprite/005",
-          "S": "images/PlantsSprite/005",
-          "D-T": "images/PlantsSprite/005"
-        },
-        "fireSound": "audio/hot_pepper_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 150,
-            "damage": 10
-          },
-          "2": {
-            "cost": 225,
-            "damage": 11
-          },
-          "3": {
-            "cost": 300,
-            "damage": 12
-          },
-          "4": {
-            "cost": 375,
-            "damage": 13
-          },
-          "5": {
-            "cost": 450,
-            "damage": 14
-          },
-          "6": {
-            "cost": 525,
-            "damage": 15
-          },
-          "7": {
-            "cost": 600,
-            "damage": 16
-          },
-          "8": {
-            "cost": 675,
-            "damage": 17
-          },
-          "9": {
-            "cost": 750,
-            "damage": 18
-          },
-          "10": {
-            "cost": 825,
-            "damage": 19
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 10,
-        "shapeCosts": {
-          "I": 20,
-          "H-I": 20,
-          "L": 30,
-          "S": 40,
-          "D-T": 40
-        }
-      }
-    },
-    {
-      "id": "cactus_shotgun",
-      "name": "仙人散弹",
-      "type": "shotgun",
-      "rarity": "uncommon",
-      "weight": 22,
-      "stats": {
-        "damage": 6,
-        "fireRate": 2.0,
-        "range": 500,
-        "bulletSpeed": 30
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "spread",
-          "amount": 5,
-          "spreadAngle": 30,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "straight",
-          "speed": 200,
-          "gravity": 0,
-          "arcHeight": 0,
-          "homingStrength": 0,
-          "homingDelay": 0
-        },
-        "hitEffects": [
-          {
-            "type": "normal_damage",
-            "priority": 1,
-            "damage": 6
-          }
-        ],
-        "lifecycle": {
-          "type": "range_limit",
-          "maxLifetime": 5.0,
-          "penetration": 1,
-          "ricochetCount": 0,
-          "returnToOrigin": false,
-          "maxRange": 1000
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Cactus_ShotgunBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/008",
-          "H-I": "images/PlantsSprite/008",
-          "L": "images/PlantsSprite/008",
-          "S": "images/PlantsSprite/008",
-          "D-T": "images/PlantsSprite/008"
-        },
-        "fireSound": "audio/cactus_shotgun_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 150,
-            "damage": 5
-          },
-          "2": {
-            "cost": 225,
-            "damage": 6
-          },
-          "3": {
-            "cost": 300,
-            "damage": 7
-          },
-          "4": {
-            "cost": 375,
-            "damage": 8
-          },
-          "5": {
-            "cost": 450,
-            "damage": 9
-          },
-          "6": {
-            "cost": 525,
-            "damage": 10
-          },
-          "7": {
-            "cost": 600,
-            "damage": 11
-          },
-          "8": {
-            "cost": 675,
-            "damage": 12
-          },
-          "9": {
-            "cost": 750,
-            "damage": 13
-          },
-          "10": {
-            "cost": 825,
-            "damage": 14
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 10,
-        "shapeCosts": {
-          "I": 20,
-          "H-I": 20,
-          "L": 30,
-          "S": 40,
-          "D-T": 40
-        }
-      }
-    },
-    {
-      "id": "okra_missile",
-      "name": "秋葵导弹",
-      "type": "homing_missile",
-      "rarity": "epic",
-      "weight": 8,
-      "stats": {
-        "damage": 20,
-        "fireRate": 2.0,
-        "range": 500,
-        "bulletSpeed": 15
-      },
-      "bulletConfig": {
-        "count": {
-          "type": "single",
-          "amount": 1,
-          "spreadAngle": 0,
-          "burstCount": 1,
-          "burstDelay": 0
-        },
-        "trajectory": {
-          "type": "homing",
-          "speed": 20,
-          "gravity": 0.2,
-          "arcHeight": 100,
-          "homingStrength": 0.8,
-          "homingDelay": 0.3
-        },
-        "hitEffects": [
-          {
-            "type": "explosion",
-            "priority": 1,
-            "damage": 20,
-            "radius": 150,
-            "delay": 0
-          }
-        ],
-        "lifecycle": {
-          "type": "target_impact",
-          "maxLifetime": 5.0,
-          "penetration": 1,
-          "ricochetCount": 0,
-          "returnToOrigin": false
-        },
-        "visual": {
-          "bulletPrefab": "bullets/Okra_MissileBullet",
-          "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-          "trailEffect": null
-        }
-      },
-      "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/006",
-          "H-I": "images/PlantsSprite/006",
-          "L": "images/PlantsSprite/006",
-          "S": "images/PlantsSprite/006",
-          "D-T": "images/PlantsSprite/006"
-        },
-        "fireSound": "audio/okra_missile_shot"
-      },
-      "upgradeConfig": {
-        "maxLevel": 10,
-        "levels": {
-          "1": {
-            "cost": 200,
-            "damage": 20
-          },
-          "2": {
-            "cost": 300,
-            "damage": 22
-          },
-          "3": {
-            "cost": 400,
-            "damage": 24
-          },
-          "4": {
-            "cost": 500,
-            "damage": 26
-          },
-          "5": {
-            "cost": 600,
-            "damage": 28
-          },
-          "6": {
-            "cost": 700,
-            "damage": 30
-          },
-          "7": {
-            "cost": 800,
-            "damage": 32
-          },
-          "8": {
-            "cost": 900,
-            "damage": 34
-          },
-          "9": {
-            "cost": 1000,
-            "damage": 36
-          },
-          "10": {
-            "cost": 1100,
-            "damage": 38
-          }
-        }
-      },
-      "inGameCostConfig": {
-        "baseCost": 15,
-        "shapeCosts": {
-          "I": 30,
-          "H-I": 30,
-          "L": 45,
-          "S": 60,
-          "D-T": 60
-        }
-      }
-    }
-  ],
-  "blockSizes": [
-    {
-      "id": "I",
-      "name": "I形",
-      "shape": [
-        [
-          1,
-          0,
-          0,
-          0
-        ],
-        [
-          1,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ]
-      ],
-      "gridCount": 2,
-      "costMultiplier": 2,
-      "description": "最简单的直线形状"
-    },
-    {
-      "id": "H-I",
-      "name": "横I形",
-      "shape": [
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          1,
-          1,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ]
-      ],
-      "gridCount": 2,
-      "costMultiplier": 2,
-      "description": "水平直线形状"
-    },
-    {
-      "id": "L",
-      "name": "L形",
-      "shape": [
-        [
-          1,
-          1,
-          0,
-          0
-        ],
-        [
-          1,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ]
-      ],
-      "gridCount": 3,
-      "costMultiplier": 3,
-      "description": "L型转角形状"
-    },
-    {
-      "id": "S",
-      "name": "S形",
-      "shape": [
-        [
-          0,
-          1,
-          1,
-          0
-        ],
-        [
-          1,
-          1,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ]
-      ],
-      "gridCount": 4,
-      "costMultiplier": 4,
-      "description": "S型曲线形状"
-    },
-    {
-      "id": "D-T",
-      "name": "T形",
-      "shape": [
-        [
-          0,
-          1,
-          0,
-          0
-        ],
-        [
-          1,
-          1,
-          1,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ],
-        [
-          0,
-          0,
-          0,
-          0
-        ]
-      ],
-      "gridCount": 4,
-      "costMultiplier": 4,
-      "description": "T型十字形状"
-    }
-  ],
-  "enemies": [
-    {
-      "id": "normal_zombie",
-      "name": "普通僵尸",
-      "type": "basic",
-      "rarity": "common",
-      "stats": {
-        "health": 10,
-        "maxHealth": 10,
-        "attack": 20,
-        "defense": 0,
-        "speed": 50.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 50.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 20,
-        "attackRange": 100,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.0
-      },
-      "visualConfig": {
-        "spritePath": "enemies/normal_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "roadblock_zombie",
-      "name": "路障僵尸",
-      "type": "armored",
-      "rarity": "common",
-      "stats": {
-        "health": 18,
-        "maxHealth": 18,
-        "attack": 25,
-        "defense": 5,
-        "speed": 40.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 40.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 25,
-        "attackRange": 100,
-        "attackSpeed": 0.8,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.25
-      },
-      "visualConfig": {
-        "spritePath": "enemies/roadblock_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "wandering_zombie",
-      "name": "漫步僵尸",
-      "type": "wanderer",
-      "rarity": "uncommon",
-      "stats": {
-        "health": 12,
-        "maxHealth": 12,
-        "attack": 30,
-        "defense": 2,
-        "speed": 45.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 45.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 30,
-        "attackRange": 100,
-        "attackSpeed": 1.2,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 0.8333333333333334
-      },
-      "visualConfig": {
-        "spritePath": "enemies/wandering_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "mage_zombie",
-      "name": "法师僵尸",
-      "type": "ranged_caster",
-      "rarity": "uncommon",
-      "stats": {
-        "health": 8,
-        "maxHealth": 8,
-        "attack": 35,
-        "defense": 0,
-        "speed": 35.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 35.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 35,
-        "attackRange": 100,
-        "attackSpeed": 0.6,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.6666666666666667
-      },
-      "visualConfig": {
-        "spritePath": "enemies/mage_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "archer_zombie",
-      "name": "弓箭僵尸",
-      "type": "ranged_archer",
-      "rarity": "uncommon",
-      "stats": {
-        "health": 9,
-        "maxHealth": 9,
-        "attack": 40,
-        "defense": 1,
-        "speed": 40.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 40.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 40,
-        "attackRange": 100,
-        "attackSpeed": 0.7,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.4285714285714286
-      },
-      "visualConfig": {
-        "spritePath": "enemies/archer_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "stealth_zombie",
-      "name": "隐身僵尸",
-      "type": "stealth",
-      "rarity": "rare",
-      "stats": {
-        "health": 7,
-        "maxHealth": 7,
-        "attack": 45,
-        "defense": 0,
-        "speed": 60.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 60.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 45,
-        "attackRange": 100,
-        "attackSpeed": 1.5,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 0.6666666666666666
-      },
-      "visualConfig": {
-        "spritePath": "enemies/stealth_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "bucket_zombie",
-      "name": "铁桶僵尸",
-      "type": "heavy_armor",
-      "rarity": "uncommon",
-      "stats": {
-        "health": 30,
-        "maxHealth": 30,
-        "attack": 35,
-        "defense": 10,
-        "speed": 30.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 30.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 35,
-        "attackRange": 100,
-        "attackSpeed": 0.6,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.6666666666666667
-      },
-      "visualConfig": {
-        "spritePath": "enemies/bucket_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "barrel_zombie",
-      "name": "火药桶僵尸",
-      "type": "explosive",
-      "rarity": "rare",
-      "stats": {
-        "health": 6,
-        "maxHealth": 6,
-        "attack": 25,
-        "defense": 0,
-        "speed": 45.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 45.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 25,
-        "attackRange": 100,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.0
-      },
-      "visualConfig": {
-        "spritePath": "enemies/barrel_zombie",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      }
-    },
-    {
-      "id": "boss1_gatekeeper",
-      "name": "BOSS1",
-      "type": "boss",
-      "rarity": "boss",
-      "stats": {
-        "health": 80,
-        "maxHealth": 80,
-        "attack": 80,
-        "defense": 15,
-        "speed": 25.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 25.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 80,
-        "attackRange": 100,
-        "attackSpeed": 0.4,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 2.5
-      },
-      "visualConfig": {
-        "spritePath": "enemies/boss1_gatekeeper",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      },
-      "bossConfig": {
-        "isBoss": true,
-        "phases": 1,
-        "enrageThreshold": 0.3,
-        "enrageDamageMultiplier": 1.5,
-        "enrageSpeedMultiplier": 1.3
-      },
-      "specialAbilities": [
-        {
-          "type": "charge_attack",
-          "damage": 160,
-          "range": 150,
-          "cooldown": 8.0
-        },
-        {
-          "type": "area_attack",
-          "damage": 120.0,
-          "radius": 100,
-          "cooldown": 12.0
-        }
-      ]
-    },
-    {
-      "id": "boss2_gravedigger",
-      "name": "BOSS2",
-      "type": "boss",
-      "rarity": "boss",
-      "stats": {
-        "health": 100,
-        "maxHealth": 100,
-        "attack": 100,
-        "defense": 20,
-        "speed": 20.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 20.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 100,
-        "attackRange": 100,
-        "attackSpeed": 0.3,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 3.3333333333333335
-      },
-      "visualConfig": {
-        "spritePath": "enemies/boss2_gravedigger",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      },
-      "bossConfig": {
-        "isBoss": true,
-        "phases": 1,
-        "enrageThreshold": 0.3,
-        "enrageDamageMultiplier": 1.5,
-        "enrageSpeedMultiplier": 1.3
-      },
-      "specialAbilities": [
-        {
-          "type": "charge_attack",
-          "damage": 200,
-          "range": 150,
-          "cooldown": 8.0
-        },
-        {
-          "type": "area_attack",
-          "damage": 150.0,
-          "radius": 100,
-          "cooldown": 12.0
-        }
-      ]
-    },
-    {
-      "id": "boss3_cyborg",
-      "name": "BOSS3",
-      "type": "boss",
-      "rarity": "boss",
-      "stats": {
-        "health": 120,
-        "maxHealth": 120,
-        "attack": 120,
-        "defense": 25,
-        "speed": 35.0,
-        "goldReward": 10
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 35.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180
-      },
-      "combat": {
-        "attackDamage": 120,
-        "attackRange": 100,
-        "attackSpeed": 0.5,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 2.0
-      },
-      "visualConfig": {
-        "spritePath": "enemies/boss3_cyborg",
-        "scale": 1.0,
-        "animationSpeed": 1.0,
-        "flipX": false,
-        "tint": "#FFFFFF"
-      },
-      "audioConfig": {
-        "attackSound": "enemy_attack",
-        "deathSound": "enemy_death",
-        "hitSound": "enemy_hit",
-        "volume": 1.0
-      },
-      "bossConfig": {
-        "isBoss": true,
-        "phases": 1,
-        "enrageThreshold": 0.3,
-        "enrageDamageMultiplier": 1.5,
-        "enrageSpeedMultiplier": 1.3
-      },
-      "specialAbilities": [
-        {
-          "type": "charge_attack",
-          "damage": 240,
-          "range": 150,
-          "cooldown": 8.0
-        },
-        {
-          "type": "area_attack",
-          "damage": 180.0,
-          "radius": 100,
-          "cooldown": 12.0
-        }
-      ]
-    }
-  ],
-  "敌人配置表": [
-    {
-      "id": "normal_zombie",
-      "name": "普通僵尸",
-      "type": "basic",
-      "stats": {
-        "health": 35,
-        "maxHealth": 35,
-        "defense": 0,
-        "speed": 30.0
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 30.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180.0,
-        "moveType": "straight",
-        "swingAmplitude": 0.0,
-        "swingFrequency": 0.0,
-        "speedVariation": 0.1
-      },
-      "combat": {
-        "attackDamage": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.0,
-        "attackType": "melee",
-        "attackDelay": 1.0,
-        "weaponType": "none",
-        "projectileType": "none",
-        "projectileSpeed": 100.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
-      }
-    },
-    {
-      "id": "roadblock_zombie",
-      "name": "路障僵尸",
-      "type": "armored",
-      "stats": {
-        "health": 50,
-        "maxHealth": 50,
-        "defense": 1,
-        "speed": 25.0
-      },
-      "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": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "wandering_zombie",
-      "name": "漫步僵尸",
-      "type": "wanderer",
-      "stats": {
-        "health": 42,
-        "maxHealth": 42,
-        "defense": 0,
-        "speed": 35.0
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 35.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180.0,
-        "moveType": "sway",
-        "swingAmplitude": 20.0,
-        "swingFrequency": 2.0,
-        "speedVariation": 0.2
-      },
-      "combat": {
-        "attackDamage": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "mage_zombie",
-      "name": "法师僵尸",
-      "type": "ranged_caster",
-      "stats": {
-        "health": 25,
-        "maxHealth": 25,
-        "defense": 0,
-        "speed": 15.0
-      },
-      "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": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.0,
-        "attackType": "magic_projectile",
-        "attackDelay": 1.0,
-        "weaponType": "none",
-        "projectileType": "magic_bolt",
-        "projectileSpeed": 150.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
-      }
-    },
-    {
-      "id": "archer_zombie",
-      "name": "弓箭僵尸",
-      "type": "ranged_archer",
-      "stats": {
-        "health": 25,
-        "maxHealth": 25,
-        "defense": 0,
-        "speed": 15.0
-      },
-      "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": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "stealth_zombie",
-      "name": "隐身僵尸",
-      "type": "stealth",
-      "stats": {
-        "health": 42,
-        "maxHealth": 42,
-        "defense": 0,
-        "speed": 35.0
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 35.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180.0,
-        "moveType": "straight",
-        "swingAmplitude": 0.0,
-        "swingFrequency": 0.0,
-        "speedVariation": 0.1
-      },
-      "combat": {
-        "attackDamage": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "bucket_zombie",
-      "name": "铁桶僵尸",
-      "type": "heavy_armor",
-      "stats": {
-        "health": 70,
-        "maxHealth": 70,
-        "defense": 2,
-        "speed": 15.0
-      },
-      "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": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "barrel_zombie",
-      "name": "火药桶僵尸",
-      "type": "explosive",
-      "stats": {
-        "health": 35,
-        "maxHealth": 35,
-        "defense": 0,
-        "speed": 30.0
-      },
-      "movement": {
-        "pattern": "direct",
-        "speed": 30.0,
-        "patrolRange": 100,
-        "chaseRange": 200,
-        "rotationSpeed": 180.0,
-        "moveType": "straight",
-        "swingAmplitude": 0.0,
-        "swingFrequency": 0.0,
-        "speedVariation": 0.1
-      },
-      "combat": {
-        "attackDamage": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "boss1_gatekeeper",
-      "name": "BOSS1",
-      "type": "boss",
-      "stats": {
-        "health": 500,
-        "maxHealth": 500,
-        "defense": 2,
-        "speed": 10.0
-      },
-      "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": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "boss2_gravedigger",
-      "name": "BOSS2",
-      "type": "boss",
-      "stats": {
-        "health": 500,
-        "maxHealth": 500,
-        "defense": 3,
-        "speed": 10.0
-      },
-      "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": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    },
-    {
-      "id": "boss3_cyborg",
-      "name": "BOSS3",
-      "type": "boss",
-      "stats": {
-        "health": 250,
-        "maxHealth": 250,
-        "defense": 1,
-        "speed": 10.0
-      },
-      "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": 1,
-        "attackRange": 1.0,
-        "attackSpeed": 1.0,
-        "canBlock": false,
-        "blockChance": 0.0,
-        "blockDamageReduction": 0.5,
-        "attackCooldown": 1.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
-      }
-    }
-  ]
-}

+ 0 - 12
assets/resources/data/weapons.json.backup_1755508737.meta

@@ -1,12 +0,0 @@
-{
-  "ver": "1.0.0",
-  "importer": "*",
-  "imported": true,
-  "uuid": "dc003864-1888-47f5-a6f0-bf6e9efb2256",
-  "files": [
-    ".backup_1755508737",
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {}
-}