diff --git a/scripts/autoloads/boss_manager.gd b/scripts/autoloads/boss_manager.gd index f06902c..2100f38 100644 --- a/scripts/autoloads/boss_manager.gd +++ b/scripts/autoloads/boss_manager.gd @@ -122,9 +122,47 @@ func _tick_action(boss_id: int, st: Dictionary, delta: float) -> void: st["pattern_index"] = int(st["pattern_index"]) + 1 _start_pattern(boss_id, st, patterns[idx]) -# 招式起手(Task 7/8 补齐分支);未知 kind 兜底置冷却 +# 招式起手(Task 8 再补 timed 招式分支) func _start_pattern(boss_id: int, st: Dictionary, p: Dictionary) -> void: - st["cooldown"] = float(p.get("cooldown", 2.0)) + var kind: String = String(p.get("kind", "ring")) + var pos: Vector2 = EnemyManager.get_pos_by_id(boss_id) + match kind: + "ring", "spread", "aimed", "spiral": + _fire_ranged(boss_id, st, kind, p, pos) + st["cooldown"] = float(p.get("cooldown", 2.0)) + _: + st["cooldown"] = float(p.get("cooldown", 2.0)) + +## 瞬时弹幕发射(ring/spread/aimed/spiral) +func _fire_ranged(boss_id: int, st: Dictionary, kind: String, p: Dictionary, pos: Vector2) -> void: + var count: int = maxi(1, int(p.get("count", 12))) + var speed: float = float(p.get("speed", 200.0)) + var dmg: float = float(p.get("bullet_damage", 8.0)) + var r: float = float(p.get("bullet_radius", 8.0)) + var life: float = float(p.get("lifetime", 4.0)) + var to_player: Vector2 = PlayerManager.get_position() - pos + var aim: float = to_player.angle() if to_player.length() > 0.01 else 0.0 + match kind: + "ring": + for i in count: + _spawn_dir(pos, TAU * float(i) / float(count), speed, life, r, dmg) + "spread": + var half: float = deg_to_rad(float(p.get("half_angle", 30.0))) + for i in count: + var t: float = 0.0 if count <= 1 else (float(i) / float(count - 1)) * 2.0 - 1.0 + _spawn_dir(pos, aim + half * t, speed, life, r, dmg) + "aimed": + for i in count: + _spawn_dir(pos, aim, speed, life, r, dmg) + "spiral": + var step: float = deg_to_rad(float(p.get("angle_step", 15.0))) + var base_a: float = float(st.get("spiral_phase", 0.0)) + for i in count: + _spawn_dir(pos, base_a + TAU * float(i) / float(count), speed, life, r, dmg) + st["spiral_phase"] = base_a + step + +func _spawn_dir(pos: Vector2, angle: float, speed: float, life: float, r: float, dmg: float) -> void: + EnemyBulletManager.spawn_bullet(pos, Vector2(cos(angle), sin(angle)) * speed, life, r, dmg) # 招式推进(Task 8 补齐三段式);骨架版直接结束 func _advance_action(boss_id: int, st: Dictionary, action: Dictionary, delta: float) -> void: