feat(boss): 瞬时远程弹幕招式 ring/spread/aimed/spiral(经 EnemyBulletManager 发射)

This commit is contained in:
2026-07-23 10:12:21 +08:00
parent f8b05551e2
commit c566eb16a0
+39 -1
View File
@@ -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:
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: