Transporter capacity per hub, and research to raise it
Forgejo #20, part 7 of #12 and the last of it. A hub stations BASE_HUB_CAPACITY (2) transporters. Total berths are hubs x per-hub capacity, so building another hub or researching "Freight Yards" both raise it - which is the choice #12 asks the player to make. Capacity follows the same shape as max_fleet_size() (sum a bonus over `unlocked`) rather than being a second mechanism doing the same job, so research applies to hubs already built, not only to ones placed afterwards. A queued-but-unbuilt transporter holds its berth. Without that a player could order ten against two berths and only discover the problem when they refused to appear. Ordering past the cap is refused outright, and the two refusals - no hub at all, versus every berth taken - say which, because "nothing happened" is exactly the bug reported against the craft button. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
d41128bc43
commit
f19807618a
3 changed files with 214 additions and 4 deletions
60
GameState.gd
60
GameState.gd
|
|
@ -145,6 +145,11 @@ const SKILL_TREE: Array = [
|
|||
"x": 0.18, "unlocks": BUILDING_TRANSPORT_HUB,
|
||||
"desc": "Build transport hubs, which supply your other buildings with ore.",
|
||||
},
|
||||
{
|
||||
"id": "freight_yards", "name": "Freight Yards", "cost": 80, "requires": "freight",
|
||||
"x": 0.05, "hub_bonus": 1,
|
||||
"desc": "Permanent: +1 transporter stationed at every hub, including ones already built.",
|
||||
},
|
||||
{
|
||||
"id": "wing", "name": "Wing Doctrine", "cost": 30, "requires": "coordination",
|
||||
"x": 0.82, "fleet_bonus": 1,
|
||||
|
|
@ -357,6 +362,9 @@ func queue_order(id: int, product: String = PRODUCT_SHIP) -> bool:
|
|||
# Nowhere to station it. Refused rather than queued, so the player is
|
||||
# told now instead of watching an order sit forever.
|
||||
return false
|
||||
if product == PRODUCT_TRANSPORTER and not can_station_transporter():
|
||||
# Every berth is taken or spoken for (#20).
|
||||
return false
|
||||
(b.orders as Array).append(product)
|
||||
return true
|
||||
|
||||
|
|
@ -374,6 +382,11 @@ func _advance_production() -> void:
|
|||
var cost: int = product_cost(product)
|
||||
if int(b.get("stock", 0)) < cost:
|
||||
break
|
||||
if product == PRODUCT_TRANSPORTER and transporters.size() >= transport_capacity():
|
||||
# A hub was demolished after this was ordered, so the berth it
|
||||
# was going to use is gone. Hold the order rather than
|
||||
# overfilling what is left.
|
||||
break
|
||||
if product == PRODUCT_TRANSPORTER and nearest_hub_to(b.position).is_empty():
|
||||
# Every hub was demolished while this sat in the queue. Leave
|
||||
# it queued and the stock untouched rather than producing a
|
||||
|
|
@ -548,6 +561,11 @@ func _process(delta: float) -> void:
|
|||
# "from", "to"}.
|
||||
const TRANSPORTER_SPEED: float = 340.0
|
||||
|
||||
# How many transporters one hub can station. Raised for EVERY hub - built
|
||||
# already or not - by research, which is the same shape as max_fleet_size()
|
||||
# rather than a second mechanism doing the same job.
|
||||
const BASE_HUB_CAPACITY: int = 2
|
||||
|
||||
const TRANSPORTER_IDLE: String = "idle"
|
||||
const TRANSPORTER_TO_MOTHERSHIP: String = "to_mothership"
|
||||
const TRANSPORTER_TO_BUILDING: String = "to_building"
|
||||
|
|
@ -556,6 +574,48 @@ const TRANSPORTER_RETURNING: String = "returning"
|
|||
var transporters: Array = []
|
||||
|
||||
|
||||
func hub_capacity() -> int:
|
||||
# Per hub.
|
||||
var n: int = BASE_HUB_CAPACITY
|
||||
for id in unlocked:
|
||||
n += int(skill_node(id).get("hub_bonus", 0))
|
||||
return n
|
||||
|
||||
|
||||
func hub_count() -> int:
|
||||
var n: int = 0
|
||||
for b in buildings:
|
||||
if b.type == BUILDING_TRANSPORT_HUB:
|
||||
n += 1
|
||||
return n
|
||||
|
||||
|
||||
func transport_capacity() -> int:
|
||||
# Total berths: more hubs, or more capacity per hub. Either raises it,
|
||||
# which is exactly the choice #12 asks the player to make.
|
||||
return hub_count() * hub_capacity()
|
||||
|
||||
|
||||
func pending_transporter_orders() -> int:
|
||||
var n: int = 0
|
||||
for b in buildings:
|
||||
for o in b.get("orders", []):
|
||||
if o == PRODUCT_TRANSPORTER:
|
||||
n += 1
|
||||
return n
|
||||
|
||||
|
||||
func transporters_claimed() -> int:
|
||||
# Built plus already ordered: an order in the queue has a berth reserved,
|
||||
# or a player could queue ten of them against two berths and only find out
|
||||
# when they refused to appear.
|
||||
return transporters.size() + pending_transporter_orders()
|
||||
|
||||
|
||||
func can_station_transporter() -> bool:
|
||||
return transporters_claimed() < transport_capacity()
|
||||
|
||||
|
||||
func has_transport_hub() -> bool:
|
||||
return not nearest_hub_to(Vector2.ZERO).is_empty()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue