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

@ -68,6 +68,10 @@ func take_damage(amount: int) -> bool:
func shatter(drop_ore: bool) -> void:
AsteroidExplosionVFX.spawn(get_tree().root, position)
# #213. Here rather than in take_damage(), so a rock broken by a ramming
# hull is heard too - and NOT in AsteroidField's despawn, which frees
# rocks the player has simply flown away from.
Sfx.play(get_tree(), Sfx.ASTEROID_BREAK)
if drop_ore:
_drop_ore()
queue_free()

View file

@ -330,6 +330,13 @@ func _begin(next: int) -> void:
match beat:
Beat.BRIEF:
start_at = fleet.get_centroid()
# #207: the World Ship is 16000 units north and never on screen,
# so "straight ahead" was a line of dialogue with nothing behind
# it. The flight marker gives it a place.
GameState.intro_destination = {
"name": "World Ship",
"world_position": WORLD_SHIP_AT,
}
GameState.intro_fleet_size = CONVOY.size()
# #125: the convoy flies in its own spread-out box, escorts on
# the corners. spawn_ships seats vessel i in formation slot i,
@ -358,8 +365,15 @@ func _begin(next: int) -> void:
GameState.intro_locks_movement = true
breach_at = fleet.get_centroid() + Vector2(0.0, -900.0)
_open_breach()
# #208: on the beat that OPENS it, not the one that falls through
# it - the sound is what tells the player something has happened
# while the guide is still saying it has not.
Sfx.play(get_tree(), Sfx.BLACK_HOLE)
narration.say("Kestrel, your course is - something is opening ahead of you -", "CONVOY CONTROL")
Beat.VORTEX:
# Nothing to steer toward any more: the breach has the convoy, and
# what is on the other side is not the World Ship.
GameState.intro_destination = {}
vortex_time = 0.0
_ensure_survivor_hull()
narration.clear()