Prioritize queued logistics deliveries
This commit is contained in:
parent
eb79efdafe
commit
f5c60f8805
2 changed files with 46 additions and 29 deletions
63
GameState.gd
63
GameState.gd
|
|
@ -1155,6 +1155,40 @@ func _dispatch_transporters() -> void:
|
|||
var mothership: Variant = get_mothership_position()
|
||||
if mothership == null:
|
||||
return # nowhere to load from
|
||||
# Supply already-queued production and research before collecting passive
|
||||
# extractor output. Extractors can refill forever, so servicing them first
|
||||
# can otherwise consume every transporter each time one becomes idle and
|
||||
# permanently starve a partly supplied order.
|
||||
for b in buildings:
|
||||
var needed_resource := ""
|
||||
for resource_type in resource_types():
|
||||
if outstanding_resource_cost(int(b.id), resource_type) > 0 \
|
||||
and bank_inventory.amount(resource_type) > 0:
|
||||
needed_resource = resource_type
|
||||
break
|
||||
if needed_resource == "":
|
||||
continue
|
||||
# One at a time per building: without this every idle transporter
|
||||
# would be sent after the same shortfall and they would all arrive
|
||||
# carrying resources nobody needs any more.
|
||||
if _transporter_inbound_to(int(b.id)):
|
||||
continue
|
||||
var chosen: Dictionary = {}
|
||||
var best_d: float = INF
|
||||
for t in transporters:
|
||||
if t.state != TRANSPORTER_IDLE:
|
||||
continue
|
||||
var here: Vector2 = transporter_position(t)
|
||||
var d: float = here.distance_squared_to(b.position)
|
||||
if d < best_d:
|
||||
best_d = d
|
||||
chosen = t
|
||||
if chosen.is_empty():
|
||||
return # every transporter is busy
|
||||
chosen.target_id = int(b.id)
|
||||
chosen.resource_type = needed_resource
|
||||
_begin_leg(chosen, transporter_position(chosen), mothership, TRANSPORTER_TO_MOTHERSHIP)
|
||||
|
||||
# A distant extractor is worth visiting only once it has a full hold ready.
|
||||
# This keeps the transporter system meaningful: mining is local until a
|
||||
# vessel physically carries a researched-sized load home.
|
||||
|
|
@ -1180,35 +1214,6 @@ func _dispatch_transporters() -> void:
|
|||
chosen_extractor.target_id = 0
|
||||
_begin_leg(chosen_extractor, transporter_position(chosen_extractor), extractor.position,
|
||||
TRANSPORTER_TO_EXTRACTOR)
|
||||
for b in buildings:
|
||||
var needed_resource := ""
|
||||
for resource_type in resource_types():
|
||||
if outstanding_resource_cost(int(b.id), resource_type) > 0 \
|
||||
and bank_inventory.amount(resource_type) > 0:
|
||||
needed_resource = resource_type
|
||||
break
|
||||
if needed_resource == "":
|
||||
continue
|
||||
# One at a time per building: without this every idle transporter
|
||||
# would be sent after the same shortfall and they would all arrive
|
||||
# carrying ore nobody needs any more.
|
||||
if _transporter_inbound_to(int(b.id)):
|
||||
continue
|
||||
var chosen: Dictionary = {}
|
||||
var best_d: float = INF
|
||||
for t in transporters:
|
||||
if t.state != TRANSPORTER_IDLE:
|
||||
continue
|
||||
var here: Vector2 = transporter_position(t)
|
||||
var d: float = here.distance_squared_to(b.position)
|
||||
if d < best_d:
|
||||
best_d = d
|
||||
chosen = t
|
||||
if chosen.is_empty():
|
||||
return # every transporter is busy
|
||||
chosen.target_id = int(b.id)
|
||||
chosen.resource_type = needed_resource
|
||||
_begin_leg(chosen, transporter_position(chosen), mothership, TRANSPORTER_TO_MOTHERSHIP)
|
||||
|
||||
|
||||
func _advance_transporters(delta: float) -> void:
|
||||
|
|
|
|||
Loading…
Reference in a new issue