feat(boss): wave_manager 接入 BossManager(移除旧内联阶段逻辑)+ combat_manager 重置敌弹/Boss
This commit is contained in:
@@ -16,7 +16,6 @@ const MAX_WAVE: int = 20
|
|||||||
## Boss 追踪
|
## Boss 追踪
|
||||||
var _boss_id: int = -1
|
var _boss_id: int = -1
|
||||||
var _boss_max_hp: float = 0.0
|
var _boss_max_hp: float = 0.0
|
||||||
var _boss_phase: int = 0
|
|
||||||
var _boss_wave: bool = false
|
var _boss_wave: bool = false
|
||||||
|
|
||||||
## 波次配置表:纯数据驱动,唯一来源 data/waves.json(游戏设计器「波次」面板维护)
|
## 波次配置表:纯数据驱动,唯一来源 data/waves.json(游戏设计器「波次」面板维护)
|
||||||
@@ -40,17 +39,12 @@ func _load_json_waves() -> void:
|
|||||||
else:
|
else:
|
||||||
push_error("WaveManager: waves.json 格式错误(应为非空数组)")
|
push_error("WaveManager: waves.json 格式错误(应为非空数组)")
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
|
||||||
if _boss_wave and _boss_id >= 0:
|
|
||||||
_update_boss_phase()
|
|
||||||
|
|
||||||
## 开始指定波次(由 CombatManager 调用)
|
## 开始指定波次(由 CombatManager 调用)
|
||||||
func start_wave(wave_num: int) -> void:
|
func start_wave(wave_num: int) -> void:
|
||||||
current_wave = wave_num
|
current_wave = wave_num
|
||||||
wave_state = WaveState.BATTLE
|
wave_state = WaveState.BATTLE
|
||||||
_wave_start_time = Time.get_ticks_msec() / 1000.0
|
_wave_start_time = Time.get_ticks_msec() / 1000.0
|
||||||
_boss_id = -1
|
_boss_id = -1
|
||||||
_boss_phase = 0
|
|
||||||
_boss_wave = false
|
_boss_wave = false
|
||||||
var cfg: Dictionary = _get_wave_config(wave_num)
|
var cfg: Dictionary = _get_wave_config(wave_num)
|
||||||
enemies_alive = int(cfg["count"])
|
enemies_alive = int(cfg["count"])
|
||||||
@@ -84,38 +78,12 @@ func _spawn_boss(boss_type: int, wave_num: int) -> void:
|
|||||||
# Boss 在玩家上方稍远处入场
|
# Boss 在玩家上方稍远处入场
|
||||||
_boss_id = EnemyManager.spawn_enemy(Vector2(0.0, -ARENA_RADIUS * 0.8), hp, boss_type)
|
_boss_id = EnemyManager.spawn_enemy(Vector2(0.0, -ARENA_RADIUS * 0.8), hp, boss_type)
|
||||||
_boss_wave = true
|
_boss_wave = true
|
||||||
_boss_phase = 1
|
|
||||||
enemies_alive += 1
|
enemies_alive += 1
|
||||||
EventBus.emit(EventID.BOSS_SPAWNED, {
|
EventBus.emit(EventID.BOSS_SPAWNED, {
|
||||||
"boss_id": _boss_id, "boss_type": boss_type, "wave": wave_num, "max_hp": hp})
|
"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])
|
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:
|
func _ring_pos() -> Vector2:
|
||||||
var angle: float = randf() * TAU
|
var angle: float = randf() * TAU
|
||||||
var radius: float = randf_range(250.0, ARENA_RADIUS)
|
var radius: float = randf_range(250.0, ARENA_RADIUS)
|
||||||
@@ -170,5 +138,4 @@ func reset() -> void:
|
|||||||
wave_state = WaveState.IDLE
|
wave_state = WaveState.IDLE
|
||||||
enemies_alive = 0
|
enemies_alive = 0
|
||||||
_boss_id = -1
|
_boss_id = -1
|
||||||
_boss_phase = 0
|
|
||||||
_boss_wave = false
|
_boss_wave = false
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ func start_game() -> void:
|
|||||||
VFXManager.reset()
|
VFXManager.reset()
|
||||||
ZoneManager.reset()
|
ZoneManager.reset()
|
||||||
MinionManager.reset()
|
MinionManager.reset()
|
||||||
|
EnemyBulletManager.reset()
|
||||||
|
BossManager.reset()
|
||||||
SpatialGrid.clear()
|
SpatialGrid.clear()
|
||||||
_core_idx = 0
|
_core_idx = 0
|
||||||
_equipped_core = WandPreset.make_core_by_id("wand_basic")
|
_equipped_core = WandPreset.make_core_by_id("wand_basic")
|
||||||
@@ -223,6 +225,8 @@ func close_shop_and_next_wave() -> void:
|
|||||||
EnemyManager.reset()
|
EnemyManager.reset()
|
||||||
ZoneManager.reset()
|
ZoneManager.reset()
|
||||||
MinionManager.reset()
|
MinionManager.reset()
|
||||||
|
EnemyBulletManager.reset()
|
||||||
|
BossManager.reset()
|
||||||
SpatialGrid.clear()
|
SpatialGrid.clear()
|
||||||
var next_wave: int = WaveManager.current_wave + 1
|
var next_wave: int = WaveManager.current_wave + 1
|
||||||
_transition_to_battle(next_wave)
|
_transition_to_battle(next_wave)
|
||||||
@@ -243,6 +247,8 @@ func _on_player_died(_payload: Dictionary) -> void:
|
|||||||
EnemyManager.reset()
|
EnemyManager.reset()
|
||||||
ZoneManager.reset()
|
ZoneManager.reset()
|
||||||
MinionManager.reset()
|
MinionManager.reset()
|
||||||
|
EnemyBulletManager.reset()
|
||||||
|
BossManager.reset()
|
||||||
SpatialGrid.clear()
|
SpatialGrid.clear()
|
||||||
ProfileManager.clear_run()
|
ProfileManager.clear_run()
|
||||||
EventBus.emit(EventID.GAME_OVER, {
|
EventBus.emit(EventID.GAME_OVER, {
|
||||||
|
|||||||
Reference in New Issue
Block a user