Teach the crews and the berths the game now asks the player to keep

#216 and #219 turned two things into player work without saying so anywhere:
transporters are built and assigned by hand, and a berth in the fleet is a
structure that has to be supplied. Five quests now teach both.

For the hub: build a transporter at a crafter, then assign it. Two steps,
because they happen in different places and one quest covering both strands
whoever misses the second in front of a hub that does nothing. The closing
line warns that they wear out, since the alternative is finding out when a
route quietly stops.

For the fleet: research Berth Authority, build an office, PUT ORE IN IT, and
only then crew the berth. The stocking step comes before the vessel on
purpose - the other way to learn it is to watch a vessel you paid for be
destroyed.

And a campaign-breaking bug of my own: #219 moved capacity onto the office,
so "fly two vessels at once" - sixth in the chain, six quests before
anything that could hold a second - could not be finished at all. It sits
after the office now, and a new rule in the chain test refuses any quest
that asks for more hulls than the player can yet hold. Verified by putting
the bug back: it fails, naming both steps.

Also: the conquest quest still said "take every capture point", which #211
deleted from the game.

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-06 14:43:35 +02:00
commit aca04ad4cf
3 changed files with 136 additions and 12 deletions

View file

@ -3945,6 +3945,31 @@ func quest_progress(quest: Dictionary) -> Vector2i:
QUESTS.GOAL_GARRISONED:
var stationed: int = int(goal.get("count", 1))
return Vector2i(mini(garrisoned_vessel_count(), stationed), stationed)
QUESTS.GOAL_VESSEL_BUILT:
# Counted ANYWHERE, not just in the fleet: a transporter never
# joins one, and the step being taught here is "you built it".
var built: int = int(goal.get("count", 1))
return Vector2i(mini(vessel_census(String(goal.get("vessel", ""))), built), built)
QUESTS.GOAL_BUILDING_STOCK:
# The fullest one of its kind, not the total: the lesson is that
# a SINGLE office has to be stocked, and summing across three
# half-empty ones would credit it without teaching it.
var stocked: int = int(goal.get("amount", 1))
var resource_type: String = String(goal.get("resource", RESOURCE_ORE))
var wanted_type: String = String(goal.get("building", ""))
var fullest: int = 0
for building in buildings:
if String(building.get("type", "")) == wanted_type:
fullest = maxi(fullest, building_resource(int(building.id), resource_type))
return Vector2i(mini(fullest, stocked), stocked)
QUESTS.GOAL_STATION_CREW:
var crewed: int = int(goal.get("count", 1))
var capability: String = String(goal.get("capability", "transport_hub"))
var standing: int = 0
for building in buildings:
if building_has_capability(building, capability):
standing += station_crew(int(building.id))
return Vector2i(mini(standing, crewed), crewed)
QUESTS.GOAL_BANKED:
var banked: int = int(goal.get("amount", 1))
return Vector2i(mini(banked_resource(String(goal.get("resource",