From c566eb16a05380b73e177041f9544dedb9b3dd58 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 23 Jul 2026 10:12:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(boss):=20=E7=9E=AC=E6=97=B6=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E5=BC=B9=E5=B9=95=E6=8B=9B=E5=BC=8F=20ring/spread/aim?= =?UTF-8?q?ed/spiral=EF=BC=88=E7=BB=8F=20EnemyBulletManager=20=E5=8F=91?= =?UTF-8?q?=E5=B0=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/autoloads/boss_manager.gd | 42 +++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) 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: