#90: give the laser an ignition instead of a blink

The shot was one flat line that appeared at full length and faded. Nothing
happened at the ship, nothing moved, and a hit looked exactly like a miss.

The blade now runs out of the hull over the first 30% of the flash on a
cubic ease-out, holds white-hot, then falls away, with a hum in its width,
a bright cap at the leading end, a flare at the emitter, and sparks off the
hull that fired it. MuzzleSparkVFX takes an optional colour so the laser
throws cyan where the ordinary gun (#87) keeps its gold.

The extra light is a white-hot rod down the middle at 42% of the width,
deliberately not a wider halo: the note at BEAM_WIDTH_SCALE records that the
drawn beam spans exactly what the beam hits, and a halo past that would put
the "it visibly missed" complaint back the other way round.

The damage is untouched - dealt in full, along the whole beam, on the frame
of the shot. A beam that had to arrive would change how the weapon plays,
which the ticket did not ask for, so the test pins it down: a target at the
far end of the range must be hit before the drawn blade has visibly reached
it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Loïc Wisniewski 2026-08-22 23:29:55 +02:00
commit c8d4731232
4 changed files with 249 additions and 8 deletions

View file

@ -23,15 +23,21 @@ const LENGTH: float = 9.0
const COLOR: Color = Color(1.0, 0.88, 0.42)
var age: float = 0.0
var color: Color = COLOR
var sparks: Array = []
static func spawn(parent: Node, world_position: Vector2, direction: Vector2) -> void:
# The colour is optional and defaults to the gun's own: #90 wanted the laser
# to do something at the hull too, and a cyan weapon throwing gold sparks
# would read as a different weapon firing from the same ship.
static func spawn(parent: Node, world_position: Vector2, direction: Vector2,
spark_color: Color = COLOR) -> void:
if direction.length() < 0.001:
return
var vfx: Node2D = (load(SELF_PATH) as GDScript).new()
vfx.position = world_position
vfx.rotation = direction.angle()
vfx.color = spark_color
parent.add_child(vfx)
@ -63,5 +69,5 @@ func _draw() -> void:
var heading: Vector2 = Vector2.RIGHT.rotated(float(spark.angle))
var start: Vector2 = heading * float(spark.speed) * age
var end: Vector2 = start + heading * float(spark.length)
NeonDraw.draw_glowing_line(self, start, end, COLOR, fade, 0.35,
COLOR.darkened(0.7))
NeonDraw.draw_glowing_line(self, start, end, color, fade, 0.35,
color.darkened(0.7))