Cap fleet cargo capacity by composition (#56)

The fleet hold was unbounded - GameState.fleet_inventory had no
total_capacity, so a lone ship could carry unlimited resources. Capacity
is now data-driven: only vessels declaring the "cargo" capability
contribute their cargo_capacity stat (interceptor: 20; shield vessel and
gas bomber: 0, unarmed transporters are never in the fleet at all).
Fleet.gd recomputes it in the one place composition can change
(spawn_ships/add_ship/store_ship/_on_ship_destroyed), which also covers
the space<->surface scene-swap restore since that goes through
spawn_ships().

Rock.gd and GasVentField.gd (the two "fly over it to collect" pickup
paths) now check what collect_cargo()/collect_gas_cargo() actually
accepted before consuming their source, instead of assuming an
unlimited hold. The HUD's FLEET HOLD caption shows the live total/cap.

Also fixes test_resource_transfer.gd, which pushed more ore through a
2-ship fleet than the new cap allows - it now spawns the largest fleet
every unlocked doctrine permits, since that test is about the transfer
UI rather than the cap itself (test_fleet_cargo_limit.gd owns that).
This commit is contained in:
Loïc Wisniewski 2026-08-16 14:53:26 +02:00
commit f040327523
11 changed files with 250 additions and 12 deletions

View file

@ -16,8 +16,11 @@ func _process(delta: float) -> void:
if fleet.get_centroid().distance_to(vent) < 90.0:
progress += delta
if progress >= 1.0:
GameState.collect_gas_cargo(int(progress))
progress = fmod(progress, 1.0)
# #56: a full fleet hold rejects the deposit - keep the
# undelivered whole units in progress rather than discarding
# them, so gas is only ever lost by not gathering it.
var whole: int = int(progress)
progress -= float(GameState.collect_gas_cargo(whole))
return
progress = 0.0
func _draw() -> void: