65 lines
1.6 KiB
GDScript
65 lines
1.6 KiB
GDScript
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)
|