feat(boss): 瞬时远程弹幕招式 ring/spread/aimed/spiral(经 EnemyBulletManager 发射)
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user