remove all upgrades that let the player increase the fleet size #219

Closed
opened 2026-09-05 08:56:01 +00:00 by metaheavens · 1 comment
Owner

to increase the fleet size, player needs to build a new building type: "Fleet office"
Each office adds one more ship available in the fleet. Fleet offices consumes resources depending on the type of vessel that is being assigned in the fleet. The first default vessel in the fleet do not need office. When the fleet office do not have enough resources, it becomes disabled and the related vessel in the fleet is destroyed. A popup is showed to the player when this happens to let them know their ressource flow is not good enough to sustain their fleet.

to increase the fleet size, player needs to build a new building type: "Fleet office" Each office adds one more ship available in the fleet. Fleet offices consumes resources depending on the type of vessel that is being assigned in the fleet. The first default vessel in the fleet do not need office. When the fleet office do not have enough resources, it becomes disabled and the related vessel in the fleet is destroyed. A popup is showed to the player when this happens to let them know their ressource flow is not good enough to sustain their fleet.
Author
Owner

Implemented in commit 1f5fecd on main.

The model
Fleet capacity is 1 + supplied Fleet Offices, capped by the 20 positions the formation defines. All eight fleet-size doctrines are gone from the skill tree. An office charges every 25 seconds for the vessel in its berth, from its own store - hub transporters keep it stocked exactly as they do a gas burner. When it cannot pay it goes dark, the vessel is destroyed, and the player is told.

Upkeep is derived from the vessel's own BUILD price rather than a second authored table: an expensive hull is expensive to keep, and there is no second set of numbers to drift out of step with the first.

The warning goes through the queue quest lines already use, rather than a new popup path. That queue drains into the narration banner, which stops the game until it is acknowledged - and it works from a planet surface, where there is no banner to shout at directly.

Two decisions the ticket did not settle

  1. An empty berth is idle, not starved. My first cut kept a starved office disabled until it paid again, which deadlocks: a disabled office does not count toward capacity, so it can never hold a vessel, so it can never pay, so it stays disabled forever. An office is only failing while there is something in it to fail. The player who fixes their supply gets the berth back without rebuilding.
  2. The lost vessel is scuttled, not damaged. Ships have no hit points - any unabsorbed hit is lethal - and a shield charge absorbs a hit wholesale. Routing this through take_damage would have let a shielded vessel survive its own eviction. scuttle() shares the ending (wreck, sound, signal) without the absorb pass.

And one I want to flag, because you may disagree
The Fleet Office is NOT gated behind research - it sits beside the mothership in the opening build menu at an ore-only price. Gating it would put fleet size back behind the research tree, which is what this ticket removes; and the only cheap gate available (coordination) costs a research point, which comes solely from conquering a planet - so it would demand a planet be taken with a single vessel before the fleet could grow at all. Say the word if you want it gated anyway.

Verification

  • test_fleet_growth.gd rewritten end to end: one vessel and one berth at the start, the whole tree researched moves nothing, each supplied office adds exactly one berth, and the starve -> destroy -> warn -> restock -> re-crew cycle.
  • The change was wide: 33 tests failed on the first full run. Most were the same cause - capacity dropped to 1, so tests flying several vessels flew one - and now grant berths through a shared tests/_berths.gd helper. Four were real findings rather than churn:
    • The office cost energy while being buildable from turn one; an existing invariant test caught that nothing produces energy before the gas-burner chain at depth 4. It is ore-only now.
    • test_skill_tree and test_skill_menu both asserted the tree SCROLLS - the doctrine lane was its deepest branch, so removing it made the tree fit its own view.
    • test_input_after_dialog compared a nested panel's child index against a UI-level index, two different sibling lists; it passed only by luck and broke as soon as the build menu gained nodes. It now walks up to the UI-level ancestor, which is what actually decides draw order.
    • test_build_menu_hides_locked assumed every menu row is full; with an odd count the last row holds one, which the layout centres.
  • Full suite: 162/162 passed.
Implemented in commit `1f5fecd` on `main`. **The model** Fleet capacity is `1 + supplied Fleet Offices`, capped by the 20 positions the formation defines. All eight fleet-size doctrines are gone from the skill tree. An office charges every 25 seconds for the vessel in its berth, from its own store - hub transporters keep it stocked exactly as they do a gas burner. When it cannot pay it goes dark, the vessel is destroyed, and the player is told. Upkeep is derived from the vessel's own BUILD price rather than a second authored table: an expensive hull is expensive to keep, and there is no second set of numbers to drift out of step with the first. The warning goes through the queue quest lines already use, rather than a new popup path. That queue drains into the narration banner, which stops the game until it is acknowledged - and it works from a planet surface, where there is no banner to shout at directly. **Two decisions the ticket did not settle** 1. **An empty berth is idle, not starved.** My first cut kept a starved office disabled until it paid again, which deadlocks: a disabled office does not count toward capacity, so it can never hold a vessel, so it can never pay, so it stays disabled forever. An office is only failing while there is something in it to fail. The player who fixes their supply gets the berth back without rebuilding. 2. **The lost vessel is scuttled, not damaged.** Ships have no hit points - any unabsorbed hit is lethal - and a shield charge absorbs a hit wholesale. Routing this through `take_damage` would have let a shielded vessel survive its own eviction. `scuttle()` shares the ending (wreck, sound, signal) without the absorb pass. **And one I want to flag, because you may disagree** The Fleet Office is NOT gated behind research - it sits beside the mothership in the opening build menu at an ore-only price. Gating it would put fleet size back behind the research tree, which is what this ticket removes; and the only cheap gate available (`coordination`) costs a research point, which comes solely from conquering a planet - so it would demand a planet be taken with a single vessel before the fleet could grow at all. Say the word if you want it gated anyway. **Verification** - `test_fleet_growth.gd` rewritten end to end: one vessel and one berth at the start, the whole tree researched moves nothing, each supplied office adds exactly one berth, and the starve -> destroy -> warn -> restock -> re-crew cycle. - The change was wide: 33 tests failed on the first full run. Most were the same cause - capacity dropped to 1, so tests flying several vessels flew one - and now grant berths through a shared `tests/_berths.gd` helper. Four were real findings rather than churn: - The office cost energy while being buildable from turn one; an existing invariant test caught that nothing produces energy before the gas-burner chain at depth 4. It is ore-only now. - `test_skill_tree` and `test_skill_menu` both asserted the tree SCROLLS - the doctrine lane was its deepest branch, so removing it made the tree fit its own view. - `test_input_after_dialog` compared a nested panel's child index against a UI-level index, two different sibling lists; it passed only by luck and broke as soon as the build menu gained nodes. It now walks up to the UI-level ancestor, which is what actually decides draw order. - `test_build_menu_hides_locked` assumed every menu row is full; with an odd count the last row holds one, which the layout centres. - Full suite: **162/162 passed**.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
metaheavens/spaceship#219
No description provided.