spaceship/Transporter.gd
Loïc Wisniewski d41128bc43 Transporter vessels, an explicit store button, and bottom-anchored menus
Forgejo #19, part 6 of #12. Transporters are built at the ship crafter,
fly themselves to the nearest hub and wait there. When a building is
short of what its queue needs, the nearest idle transporter runs
hub -> mothership -> building -> hub. Ore leaves the bank when it is
loaded and lands in the building's stock on arrival, so what is drawn
and what happens are the same event - the extractor hauler's rule.

Production orders are now TYPED (interceptor / transporter) rather than
a bare count, since the crafter builds two different things. One at a
time is dispatched per building: without that, every idle transporter
chases the same shortfall and they all arrive carrying ore nobody needs.

Three fixes from play-testing feedback:

- Storing ore into a building is now a deliberate button press, not a
  side effect of opening the menu.
- The mothership's load-ore controls were positioned from the TOP of the
  screen, so on any viewport shorter than ~1300px the label fell off the
  bottom. They are anchored to the bottom edge now, and the label had no
  explicit font size so it inherited the theme's 78px and wrapped off
  screen. Checked at 720x960 and 720x1280.
- The craft button looked live and did nothing. It was not the transport
  work: BASE_FLEET_SIZE is 5 and a new game starts with exactly 5 ships,
  so the fleet is at its cap from the first frame and every interceptor
  order was refused. The button is now visibly disabled and says why.
  The underlying balance (crafter useless until Wing Doctrine) is left
  alone - that is a design call, not a bug to quietly change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 19:14:27 +02:00

38 lines
1.1 KiB
GDScript

extends Node2D
# Purely visual: a transport vessel running a hub -> mothership -> building
# supply route. Carries no state of its own; GameState owns the simulation
# and TransporterField creates, positions and frees this to match.
const HULL_COLOR: Color = Color(0.95, 0.55, 0.85)
var laden: bool = false
func _ready() -> void:
add_to_group("transporters")
z_index = -1
queue_redraw()
func set_laden(value: bool) -> void:
if laden == value:
return
laden = value
queue_redraw()
func _draw() -> void:
# Squat and boxy, in the transport hub's own magenta, so it reads as
# "belongs to the hub" and not as an extractor hauler (green) or a fleet
# vessel (sharp cyan triangle).
var hull: PackedVector2Array = PackedVector2Array([
Vector2(0, -16), Vector2(10, -4), Vector2(10, 14), Vector2(-10, 14), Vector2(-10, -4),
])
NeonDraw.draw_glowing_polygon(self, hull, HULL_COLOR, 1.0)
if laden:
# A visible payload, so a loaded run is distinguishable from a
# deadhead back to the hub at a glance.
NeonDraw.draw_glowing_polygon(self, PackedVector2Array([
Vector2(-5, 0), Vector2(5, 0), Vector2(5, 9), Vector2(-5, 9),
]), HULL_COLOR, 0.85)