diff --git a/scripts/autoloads/wave_manager.gd b/scripts/autoloads/wave_manager.gd index 5064b10..8e57049 100644 --- a/scripts/autoloads/wave_manager.gd +++ b/scripts/autoloads/wave_manager.gd @@ -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 diff --git a/scripts/domain/combat/combat_manager.gd b/scripts/domain/combat/combat_manager.gd index 09528b3..5c17a59 100644 --- a/scripts/domain/combat/combat_manager.gd +++ b/scripts/domain/combat/combat_manager.gd @@ -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, {