A second suicide vessel alongside the chaser, but where the chaser simply beelines, this one is a rhythm the player can read. It drifts in from beyond lock_range at half speed, LOCKS a point, rocks 30px back and forth along the charge axis for 1.2s, draws a thin line down its trajectory for the last 300ms, and only then crosses the gap in one straight 950px/s run before coasting to a stop and starting over. The lock is what makes the wind-up worth anything: nothing re-reads the fleet once it begins, so the charge goes where the target WAS and stepping off the line works. Same bargain as EnemyBigLaserBeam. EnemyLungeComponent is a Node2D rather than a plain Node because the trajectory line has to be drawn somewhere, and top_level keeps that drawing in world space while the hull it hangs off spins to face the lock. The roaming spawner gets a 25% lancer share. It is the only place the player meets an enemy off an authored map, so without that the lancer would exist only in the setup editor. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
19 lines
719 B
Text
19 lines
719 B
Text
[gd_resource type="Resource" script_class="EnemyDefinition" load_steps=3 format=3]
|
|
|
|
[ext_resource type="Script" path="res://enemies/EnemyDefinition.gd" id="1"]
|
|
[ext_resource type="PackedScene" path="res://enemies/EnemyLungeComponent.tscn" id="2"]
|
|
|
|
[resource]
|
|
script = ExtResource("1")
|
|
enemy_id = "lancer"
|
|
display_name = "Lancer"
|
|
max_hp = 2
|
|
speed = 220.0
|
|
acceleration = 420.0
|
|
rotation_speed = 7.0
|
|
hull_points = PackedVector2Array(0, -32, 6, -8, 11, 14, 4, 10, 0, 20, -4, 10, -11, 14, -6, -8)
|
|
glow_color = Color(1, 0.45, 0.15, 1)
|
|
detail_lines = PackedVector2Array(0, -28, 0, 6, -7, -2, 7, -2)
|
|
detail_rings = PackedVector2Array(0, 8, 4, 0)
|
|
dies_on_contact = true
|
|
component_scenes = Array[PackedScene]([ExtResource("2")])
|