feat(boss): wave_manager 接入 BossManager(移除旧内联阶段逻辑)+ combat_manager 重置敌弹/Boss

This commit is contained in:
2026-07-23 10:22:25 +08:00
parent af535f1ed0
commit aa516bcb50
2 changed files with 7 additions and 34 deletions
+1 -34
View File
@@ -16,7 +16,6 @@ const MAX_WAVE: int = 20
## Boss 追踪
var _boss_id: int = -1
var _boss_max_hp: float = 0.0
var _boss_phase: int = 0
var _boss_wave: bool = false
## 波次配置表:纯数据驱动,唯一来源 data/waves.json(游戏设计器「波次」面板维护)
@@ -40,17 +39,12 @@ func _load_json_waves() -> void:
else:
push_error("WaveManager: waves.json 格式错误(应为非空数组)")
func _physics_process(_delta: float) -> void:
if _boss_wave and _boss_id >= 0:
_update_boss_phase()
## 开始指定波次(由 CombatManager 调用)
func start_wave(wave_num: int) -> void:
current_wave = wave_num
wave_state = WaveState.BATTLE
_wave_start_time = Time.get_ticks_msec() / 1000.0
_boss_id = -1
_boss_phase = 0
_boss_wave = false
var cfg: Dictionary = _get_wave_config(wave_num)
enemies_alive = int(cfg["count"])
@@ -84,38 +78,12 @@ func _spawn_boss(boss_type: int, wave_num: int) -> void:
# Boss 在玩家上方稍远处入场
_boss_id = EnemyManager.spawn_enemy(Vector2(0.0, -ARENA_RADIUS * 0.8), hp, boss_type)
_boss_wave = true
_boss_phase = 1
enemies_alive += 1
EventBus.emit(EventID.BOSS_SPAWNED, {
"boss_id": _boss_id, "boss_type": boss_type, "wave": wave_num, "max_hp": hp})
BossManager.register_boss(_boss_id, boss_type, hp, wave_num)
print("[WaveManager] Boss 入场!type=%d hp=%.0f (wave %d)" % [boss_type, hp, wave_num])
## Boss 阶段:HP 跨越阈值时进阶并召唤援军(简化 AI,game_design §4.5
func _update_boss_phase() -> void:
if not EnemyManager.has_entity(_boss_id):
return
var frac: float = EnemyManager.get_hp_percent(_boss_id)
var target_phase: int = 1
if frac <= 0.33:
target_phase = 3
elif frac <= 0.66:
target_phase = 2
if target_phase > _boss_phase:
_boss_phase = target_phase
_on_boss_phase_enter(target_phase)
func _on_boss_phase_enter(phase: int) -> void:
# 进阶召唤一批援军施压(Phase 2/3)
var add_count: int = 4 + phase * 2
var boss_pos: Vector2 = EnemyManager.get_pos_by_id(_boss_id)
for _i in add_count:
var off := Vector2(randf_range(-120, 120), randf_range(-120, 120))
var aid: int = EnemyManager.spawn_enemy(boss_pos + off, 40.0, EnemyManager.Type.FAST)
if aid >= 0:
enemies_alive += 1
EventBus.emit(EventID.GAME_STATE_CHANGED, {"from": "BATTLE", "to": "BOSS_PHASE_%d" % phase})
print("[WaveManager] Boss 进入 Phase %d,召唤 %d 援军" % [phase, add_count])
func _ring_pos() -> Vector2:
var angle: float = randf() * TAU
var radius: float = randf_range(250.0, ARENA_RADIUS)
@@ -170,5 +138,4 @@ func reset() -> void:
wave_state = WaveState.IDLE
enemies_alive = 0
_boss_id = -1
_boss_phase = 0
_boss_wave = false
+6
View File
@@ -47,6 +47,8 @@ func start_game() -> void:
VFXManager.reset()
ZoneManager.reset()
MinionManager.reset()
EnemyBulletManager.reset()
BossManager.reset()
SpatialGrid.clear()
_core_idx = 0
_equipped_core = WandPreset.make_core_by_id("wand_basic")
@@ -223,6 +225,8 @@ func close_shop_and_next_wave() -> void:
EnemyManager.reset()
ZoneManager.reset()
MinionManager.reset()
EnemyBulletManager.reset()
BossManager.reset()
SpatialGrid.clear()
var next_wave: int = WaveManager.current_wave + 1
_transition_to_battle(next_wave)
@@ -243,6 +247,8 @@ func _on_player_died(_payload: Dictionary) -> void:
EnemyManager.reset()
ZoneManager.reset()
MinionManager.reset()
EnemyBulletManager.reset()
BossManager.reset()
SpatialGrid.clear()
ProfileManager.clear_run()
EventBus.emit(EventID.GAME_OVER, {