extends ProjectileBase var _is_spread_child := false var _spiral_rotation_rate: float = 0.0 var _lifetime: float = 0.0 var _max_lifetime: float = 0.0 const DIRS := [ Vector2(1, 0), Vector2(0.707107, 0.707107), Vector2(0, 1), Vector2(-0.707107, 0.707107), Vector2(-1, 0), Vector2(-0.707107, -0.707107), Vector2(0, -1), Vector2(0.707107, -0.707107), ] func _on_body_entered(body: Node2D) -> void: if body.is_in_group("enemies"): body.take_damage(damage) func _process(delta: float) -> void: if _max_lifetime > 0.0: _lifetime += delta if _lifetime >= _max_lifetime: queue_free() return if _spiral_rotation_rate != 0.0: direction = direction.rotated(_spiral_rotation_rate * delta) super(delta) func _ready() -> void: damage = 6 if _is_spread_child: super() return var perk_effects = get_node("/root/Game/PerkEffects") if perk_effects.get_mode("fire_swirl.cast") == "spiral": _spawn_spiral() else: _spawn_burst() queue_free() func _spawn_burst() -> void: var spawn_pos = global_position for dir in DIRS: var bullet = duplicate() bullet._is_spread_child = true get_parent().add_child(bullet) bullet.global_position = spawn_pos bullet.launch(spawn_pos + dir * 1000) func _spawn_spiral() -> void: var spawn_pos = global_position for i in range(8): var angle = TAU * float(i) / 8.0 var bullet = duplicate() bullet._is_spread_child = true bullet._spiral_rotation_rate = 2.0 bullet._max_lifetime = 3.0 get_parent().add_child(bullet) bullet.global_position = spawn_pos bullet.launch(spawn_pos + Vector2.from_angle(angle) * 1000)