Improve ship crafter and hangar controls
This commit is contained in:
parent
82552464d2
commit
06081c41b0
4 changed files with 348 additions and 56 deletions
|
|
@ -49,14 +49,28 @@ extends Node2D
|
|||
@onready var queue_detail: Label = get_node("../UI/CraftMenu/QueueDetail")
|
||||
@onready var hangar_button: IconButton = get_node("../UI/HangarButton")
|
||||
@onready var hangar_menu: Control = get_node("../UI/HangarMenu")
|
||||
@onready var hangar_list: Label = get_node("../UI/HangarMenu/ListLabel")
|
||||
@onready var hangar_status: Label = get_node("../UI/HangarMenu/StatusLabel")
|
||||
@onready var hangar_next_button: IconButton = get_node("../UI/HangarMenu/NextButton")
|
||||
@onready var hangar_crew_button: IconButton = get_node("../UI/HangarMenu/CrewButton")
|
||||
@onready var hangar_close_button: IconButton = get_node("../UI/HangarMenu/CloseButton")
|
||||
|
||||
# Which stored vessel the hangar is offering to crew.
|
||||
var hangar_choice: int = 0
|
||||
@onready var hangar_available_slots: Array = [
|
||||
get_node("../UI/HangarMenu/AvailableInterceptor"),
|
||||
get_node("../UI/HangarMenu/AvailableShield"),
|
||||
get_node("../UI/HangarMenu/AvailableTransporter"),
|
||||
]
|
||||
@onready var hangar_available_labels: Array = [
|
||||
get_node("../UI/HangarMenu/AvailableInterceptorLabel"),
|
||||
get_node("../UI/HangarMenu/AvailableShieldLabel"),
|
||||
get_node("../UI/HangarMenu/AvailableTransporterLabel"),
|
||||
]
|
||||
@onready var hangar_fleet_slots: Array = [
|
||||
get_node("../UI/HangarMenu/FleetInterceptor"),
|
||||
get_node("../UI/HangarMenu/FleetShield"),
|
||||
get_node("../UI/HangarMenu/FleetTransporter"),
|
||||
]
|
||||
@onready var hangar_fleet_labels: Array = [
|
||||
get_node("../UI/HangarMenu/FleetInterceptorLabel"),
|
||||
get_node("../UI/HangarMenu/FleetShieldLabel"),
|
||||
get_node("../UI/HangarMenu/FleetTransporterLabel"),
|
||||
]
|
||||
@onready var build_menu_entries: Array = [
|
||||
[GameState.BUILDING_MOTHERSHIP, build_mothership_button,
|
||||
get_node("../UI/BuildMenu/MothershipLabel"), get_node("../UI/BuildMenu/MothershipCost")],
|
||||
|
|
@ -91,6 +105,9 @@ var lab_choice: int = 0
|
|||
@onready var craft_transporter_button: IconButton = get_node("../UI/CraftMenu/TransporterButton")
|
||||
@onready var craft_close_button: IconButton = get_node("../UI/CraftMenu/CloseButton")
|
||||
@onready var craft_status: Label = get_node("../UI/CraftMenu/StatusLabel")
|
||||
@onready var craft_interceptor_label: Label = get_node("../UI/CraftMenu/InterceptorLabel")
|
||||
@onready var craft_transporter_label: Label = get_node("../UI/CraftMenu/TransporterLabel")
|
||||
@onready var craft_shield_label: Label = get_node("../UI/CraftMenu/ShieldLabel")
|
||||
|
||||
# --- the transfer panel (#24) ---------------------------------------------
|
||||
# Ore used to be moved from inside whichever panel happened to be open: "load
|
||||
|
|
@ -216,8 +233,9 @@ func _ready() -> void:
|
|||
transfer_button.pressed.connect(_on_transfer_pressed)
|
||||
hangar_button.pressed.connect(_on_hangar_pressed)
|
||||
hangar_close_button.pressed.connect(func(): hangar_menu.visible = false)
|
||||
hangar_next_button.pressed.connect(_on_hangar_next)
|
||||
hangar_crew_button.pressed.connect(_on_hangar_crew)
|
||||
for i in range(hangar_available_slots.size()):
|
||||
hangar_available_slots[i].pressed.connect(_on_hangar_crew_type.bind(i))
|
||||
hangar_fleet_slots[i].pressed.connect(_on_hangar_store_type.bind(i))
|
||||
for i in range(queue_slots.size()):
|
||||
queue_slots[i].pressed.connect(_on_queue_slot.bind(i))
|
||||
transfer_close_button.pressed.connect(func(): transfer_menu.visible = false)
|
||||
|
|
@ -245,6 +263,7 @@ func _ready() -> void:
|
|||
transfer_button.visible = false
|
||||
hangar_button.visible = false
|
||||
hangar_menu.visible = false
|
||||
_layout_context_buttons()
|
||||
|
||||
|
||||
# True while a building prompt or panel owns the shared action slot, so the
|
||||
|
|
@ -340,6 +359,20 @@ func _process(delta: float) -> void:
|
|||
if current_building != null:
|
||||
action_button.icon = _action_icon_for(current_building.building_type)
|
||||
action_button.queue_redraw()
|
||||
_layout_context_buttons()
|
||||
|
||||
|
||||
func _layout_context_buttons() -> void:
|
||||
# Every contextual action uses a distinct, fixed berth above Build. This
|
||||
# replaces the old hand-picked offsets where Hangar overlapped Action at a
|
||||
# mothership (#25).
|
||||
var buttons: Array = [action_button, transfer_button]
|
||||
if hangar_button.visible:
|
||||
buttons.append(hangar_button)
|
||||
for i in range(buttons.size()):
|
||||
var button: Control = buttons[i]
|
||||
button.offset_top = -720 + i * 164
|
||||
button.offset_bottom = button.offset_top + 148
|
||||
|
||||
|
||||
func _action_icon_for(type: String) -> int:
|
||||
|
|
@ -672,16 +705,13 @@ func _say(message: String) -> void:
|
|||
|
||||
|
||||
func _refresh_craft_status() -> void:
|
||||
# The bank/hold/here figures moved out to the shared header (#24), so this
|
||||
# line is now only what is specific to a crafter: prices, the queue, and
|
||||
# berth pressure. It used to restate "Here %d" itself, which is exactly
|
||||
# the per-panel improvisation the header replaces.
|
||||
var queued: int = GameState.pending_orders(craft_building_id)
|
||||
var queue_text: String = "" if queued == 0 else " Queued %d" % queued
|
||||
craft_status.text = "Interceptor %d Transporter %d%s Transporters %d/%d" % [
|
||||
GameState.SHIP_COST, GameState.TRANSPORTER_COST, queue_text,
|
||||
GameState.transporters_claimed(), GameState.transport_capacity()
|
||||
]
|
||||
# Prices live with the buttons they describe. The top of the screen is
|
||||
# intentionally reserved for the shared resource bar and a short action
|
||||
# message; repeating fleet, queue and transport counts here buried the UI.
|
||||
craft_interceptor_label.text = "Interceptor\n%d ore" % GameState.SHIP_COST
|
||||
craft_transporter_label.text = "Transporter\n%d ore" % GameState.TRANSPORTER_COST
|
||||
craft_shield_label.text = "Shield Vessel\n%d ore" % GameState.SHIELD_COST
|
||||
craft_status.text = ""
|
||||
# Nowhere to station one means the order would be refused, so say so
|
||||
# rather than letting the button look available and do nothing.
|
||||
craft_transporter_button.enabled = GameState.has_transport_hub() \
|
||||
|
|
@ -698,11 +728,6 @@ func _refresh_craft_status() -> void:
|
|||
# where the fleet starts at exactly its cap.
|
||||
craft_interceptor_button.enabled = true
|
||||
craft_interceptor_button.queue_redraw()
|
||||
craft_status.text += " Fleet %d/%d Ready %d" % [
|
||||
fleet.ships.size(), GameState.max_fleet_size(), GameState.stored_vessels.size()
|
||||
]
|
||||
# LAST, so a message about what just happened is the first line the
|
||||
# player reads rather than being buried under the standing state.
|
||||
_refresh_queue()
|
||||
if craft_message != "":
|
||||
if Time.get_ticks_msec() < craft_message_until:
|
||||
|
|
@ -995,55 +1020,67 @@ func _on_queue_slot(index: int) -> void:
|
|||
# --- hangar (#23) ---------------------------------------------------------
|
||||
|
||||
func _on_hangar_pressed() -> void:
|
||||
hangar_choice = 0
|
||||
hangar_status.text = ""
|
||||
hangar_menu.visible = true
|
||||
_refresh_hangar()
|
||||
|
||||
|
||||
func _on_hangar_next() -> void:
|
||||
if GameState.stored_vessels.is_empty():
|
||||
return
|
||||
hangar_choice = (hangar_choice + 1) % GameState.stored_vessels.size()
|
||||
_refresh_hangar()
|
||||
|
||||
|
||||
func _on_hangar_crew() -> void:
|
||||
if GameState.stored_vessels.is_empty():
|
||||
hangar_status.text = "Nothing built yet - order vessels at a ship crafter"
|
||||
return
|
||||
func _on_hangar_crew_type(index: int) -> void:
|
||||
var type: String = _hangar_types()[index]
|
||||
if fleet.ships.size() >= GameState.max_fleet_size():
|
||||
hangar_status.text = "Fleet is full (%d/%d) - research capacity at the mothership" % [
|
||||
fleet.ships.size(), GameState.max_fleet_size()
|
||||
]
|
||||
return
|
||||
var product: String = GameState.claim_stored_vessel(hangar_choice)
|
||||
if product == "" or not fleet.add_ship(product):
|
||||
var stored_index: int = GameState.stored_vessels.find(type)
|
||||
if stored_index < 0:
|
||||
hangar_status.text = "No %s available" % GameState.VESSEL_NAMES.get(type, type)
|
||||
return
|
||||
if not fleet.add_ship(GameState.take_stored_vessel(stored_index)):
|
||||
hangar_status.text = "Could not crew that vessel"
|
||||
return
|
||||
GameState.take_stored_vessel(hangar_choice)
|
||||
hangar_status.text = "%s joined the fleet" % GameState.VESSEL_NAMES.get(product, product)
|
||||
hangar_choice = 0
|
||||
hangar_status.text = "%s joined the fleet" % GameState.VESSEL_NAMES.get(type, type)
|
||||
_refresh_hangar()
|
||||
|
||||
|
||||
func _on_hangar_store_type(index: int) -> void:
|
||||
var type: String = _hangar_types()[index]
|
||||
var ship_index: int = -1
|
||||
for i in range(fleet.ships.size()):
|
||||
if String(fleet.ships[i].vessel_type) == type:
|
||||
ship_index = i
|
||||
break
|
||||
if ship_index < 0:
|
||||
hangar_status.text = "No %s in the fleet" % GameState.VESSEL_NAMES.get(type, type)
|
||||
return
|
||||
var stored: String = fleet.store_ship(ship_index)
|
||||
if stored == "":
|
||||
hangar_status.text = "Keep one ship deployed"
|
||||
return
|
||||
GameState.stored_vessels.append(stored)
|
||||
hangar_status.text = "%s stored in the hangar" % GameState.VESSEL_NAMES.get(stored, stored)
|
||||
_refresh_hangar()
|
||||
|
||||
|
||||
func _hangar_types() -> Array:
|
||||
return [GameState.VESSEL_INTERCEPTOR, GameState.VESSEL_SHIELD, GameState.VESSEL_TRANSPORTER]
|
||||
|
||||
|
||||
func _refresh_hangar() -> void:
|
||||
var stored: Array = GameState.stored_vessels
|
||||
if stored.is_empty():
|
||||
hangar_list.text = "No vessels waiting.\n\nOrder them at a ship crafter - finished vessels are delivered here."
|
||||
hangar_crew_button.enabled = false
|
||||
hangar_next_button.enabled = false
|
||||
else:
|
||||
hangar_choice = clampi(hangar_choice, 0, stored.size() - 1)
|
||||
var lines: Array = []
|
||||
for i in range(stored.size()):
|
||||
var marker: String = ">" if i == hangar_choice else " "
|
||||
lines.append("%s %s" % [marker, GameState.VESSEL_NAMES.get(stored[i], stored[i])])
|
||||
hangar_list.text = "\n".join(lines)
|
||||
hangar_crew_button.enabled = fleet.ships.size() < GameState.max_fleet_size()
|
||||
hangar_next_button.enabled = stored.size() > 1
|
||||
hangar_crew_button.queue_redraw()
|
||||
hangar_next_button.queue_redraw()
|
||||
var types: Array = _hangar_types()
|
||||
for i in range(types.size()):
|
||||
var type: String = types[i]
|
||||
var available: int = GameState.stored_vessels.count(type)
|
||||
var deployed: int = 0
|
||||
for ship in fleet.ships:
|
||||
if is_instance_valid(ship) and String(ship.vessel_type) == type:
|
||||
deployed += 1
|
||||
hangar_available_labels[i].text = "%s\n%d available" % [GameState.VESSEL_NAMES.get(type, type), available]
|
||||
hangar_fleet_labels[i].text = "%s\n%d in fleet" % [GameState.VESSEL_NAMES.get(type, type), deployed]
|
||||
hangar_available_slots[i].enabled = available > 0 and fleet.ships.size() < GameState.max_fleet_size()
|
||||
hangar_fleet_slots[i].enabled = deployed > 0 and fleet.ships.size() > 1
|
||||
hangar_available_slots[i].queue_redraw()
|
||||
hangar_fleet_slots[i].queue_redraw()
|
||||
|
||||
|
||||
func _on_formation_changed() -> void:
|
||||
|
|
|
|||
Loading…
Reference in a new issue