Sharpen upgrades, mark the convoy's destination, and give the world sound

#204 the Beam Collimator widens the beam instead of adding range to one that
already crosses the screen; beam width becomes a per-shot vessel stat.
#205 the Energy Propulser gains three upgrades - dash recharge, dash reach,
and boosted-cruise drain - which turns three constants into vessel stats.
#206 three further doctrines carry the fleet from ten to twenty.
#207 the prologue's World Ship gets a marker, through the scanner's own
guidance arrow rather than a second one.
#208 #210 #213 #214 four new synthesised sounds: the breach opening, cargo
reaching the hold, a rock breaking, and a gas bomb blooming.
#215 building health bars are larger, plated and framed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019AJMdB7iuHuLFZM1aBu3GD
This commit is contained in:
Loïc Wisniewski 2026-09-05 12:16:17 +02:00
commit 78836882af
33 changed files with 716 additions and 52 deletions

View file

@ -7,6 +7,8 @@ extends "res://controllers/AimedFleetAbilityController.gd"
# second hull adds a second independently recharging dash.
const DASH_COLOR := Color(0.85, 0.95, 0.15)
# The unupgraded reach, and what the definition declares. #205 made it a
# vessel stat; _aim_max_range() below is the distance actually in force.
const DASH_DISTANCE: float = 520.0
const ENERGY_PER_DASH: int = 15
const TRAIL_SECONDS: float = 0.45
@ -21,13 +23,18 @@ func _component_id() -> String: return "distorder"
func _ammo_resource() -> String: return GameState.RESOURCE_ENERGY
func _ammo_cost() -> int: return ENERGY_PER_DASH
func _aim_padding() -> float: return 36.0
func _aim_max_range() -> float: return DASH_DISTANCE
# Off the PROPULSER that will actually surge, falling back to the definition
# when none is ready - the same shape LaserController._aim_max_range() uses,
# and for the same reason: the guide must not promise reach the fleet has not
# researched.
func _aim_max_range() -> float:
return GameState.vessel_stat(GameState.VESSEL_DISTORDER, "dash_distance")
func _has_effect_visuals() -> bool: return trail_time > 0.0 or fleet.is_dashing()
func _calculate_aim_target(drag: Vector2, origin: Vector2) -> Vector2:
var direction: Vector2 = drag.normalized() if drag.length() > 0.001 else Vector2.UP
return origin + direction * DASH_DISTANCE
return origin + direction * _aim_max_range()
func _consume_shot(component: Node) -> bool:
@ -40,7 +47,7 @@ func _perform_shot(_ship: Node2D, _component: Node) -> void:
return
trail_from = fleet.get_centroid()
trail_time = TRAIL_SECONDS
fleet.dash(direction, DASH_DISTANCE)
fleet.dash(direction, _aim_max_range())
func _advance_effects(delta: float) -> void: