extends Area2D @export var speed: float = 500.0 @export var lifetime: float = 1.5 @export var damage: int = 1 @export var bolt_length: float = 20.0 var velocity: Vector2 = Vector2.ZERO var age: float = 0.0 func _ready() -> void: add_to_group("player_projectiles") area_entered.connect(_on_area_entered) # Draw once. The earlier invisible-bolt bug came from _draw() deriving # the bolt's look from `age` - drawing only at age==0 froze it at # whatever the age==0 case rendered as. _draw() below is now a fixed # shape with no age dependency, so one draw is safe and matches the # Ship.gd/Asteroid.gd pattern: position/rotation are transform # properties Godot applies at render time without re-tessellating. queue_redraw() func launch(direction: Vector2) -> void: velocity = direction.normalized() * speed rotation = direction.angle() + PI / 2.0 func _physics_process(delta: float) -> void: position += velocity * delta age += delta if age >= lifetime: queue_free() func _on_area_entered(area: Area2D) -> void: if area.is_in_group("enemies"): area.take_damage(damage) queue_free() func _draw() -> void: # Fixed-length, constant-brightness bolt. Drawn once and left alone. var tip: Vector2 = Vector2(0, -bolt_length * 0.6) var tail: Vector2 = Vector2(0, bolt_length * 0.4) NeonDraw.draw_glowing_line(self, tail, tip, Color(1.0, 0.85, 0.3), 1.0, 0.5)