feat(boss): wave_manager 接入 BossManager(移除旧内联阶段逻辑)+ combat_manager 重置敌弹/Boss
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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, {
|
||||
|
||||
Reference in New Issue
Block a user