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

@ -28,6 +28,11 @@ const ENEMY_DEATH: String = "enemy_death"
const BUILDING_DEATH: String = "building_death"
const DIALOG: String = "dialog"
const BOSS_SCREAM: String = "boss_scream"
# #210, #213, #214, #208.
const PICKUP: String = "pickup"
const ASTEROID_BREAK: String = "asteroid_break"
const GAS_BLAST: String = "gas_blast"
const BLACK_HOLE: String = "black_hole"
const SOUNDS: Dictionary = {
SHOT: "res://audio/sfx_shot.wav",
@ -36,6 +41,10 @@ const SOUNDS: Dictionary = {
BUILDING_DEATH: "res://audio/sfx_building_death.wav",
DIALOG: "res://audio/sfx_dialog.wav",
BOSS_SCREAM: "res://audio/sfx_boss_scream.wav",
PICKUP: "res://audio/sfx_pickup.wav",
ASTEROID_BREAK: "res://audio/sfx_asteroid_break.wav",
GAS_BLAST: "res://audio/sfx_gas_blast.wav",
BLACK_HOLE: "res://audio/sfx_black_hole.wav",
}
# Per-sound level. A shot is fired constantly and a death happens once, so
@ -47,12 +56,29 @@ const LEVELS: Dictionary = {
BUILDING_DEATH: -23.0,
DIALOG: -19.0,
BOSS_SCREAM: -13.0,
# Quieter than everything else by a clear margin: it is the only sound
# here that can happen several times a second for minutes at a time, and
# a pickup blip at shot volume would be the loudest thing in the game.
PICKUP: -32.0,
ASTEROID_BREAK: -24.0,
GAS_BLAST: -21.0,
# The prologue's one irreversible moment, and nothing else is playing
# under it.
BLACK_HOLE: -11.0,
}
# Shots vary a little in pitch so a stream of them does not turn into one
# flat machine-gun note. The deaths do not: they are events, and a wobbling
# explosion sounds broken rather than varied.
const SHOT_PITCH_SPREAD: float = 0.12
# Pickups repeat harder than shots do, so they vary too - but less, because a
# pickup is a short bright tone and a wide spread on one reads as wrong notes
# rather than as variety. Rocks also break in twos and threes.
const PITCH_SPREAD: Dictionary = {
SHOT: SHOT_PITCH_SPREAD,
PICKUP: 0.07,
ASTEROID_BREAK: 0.09,
}
static func _pool(tree: SceneTree) -> Node:
@ -99,7 +125,6 @@ static func play(tree: SceneTree, id: String) -> void:
return
voice.stream = stream
voice.volume_db = float(LEVELS.get(id, -10.0))
voice.pitch_scale = 1.0
if id == SHOT:
voice.pitch_scale = 1.0 + randf_range(-SHOT_PITCH_SPREAD, SHOT_PITCH_SPREAD)
var spread: float = float(PITCH_SPREAD.get(id, 0.0))
voice.pitch_scale = 1.0 if spread <= 0.0 else 1.0 + randf_range(-spread, spread)
voice.play()