Files
Station-0/scripts/ui/atm_ui.gd
T

195 lines
6.0 KiB
GDScript

extends CanvasLayer
# ---------------------------------------------------------------------------
# ATM / Deposit Machine UI
#
# BANK — safe storage, never lost on death (hub_credits)
# ON HAND — scrap the player is currently carrying (wallet_credits)
#
# DEPOSIT moves ON HAND → BANK
# WITHDRAW moves BANK → ON HAND
# ---------------------------------------------------------------------------
var _bank_label: Label = null
var _hand_label: Label = null
var _amount_label: Label = null
var _custom_input: LineEdit = null
var _transfer_amount: int = 0
const STEP_SMALL := 10
const STEP_LARGE := 100
func _ready() -> void:
layer = 9
process_mode = Node.PROCESS_MODE_ALWAYS
_build_ui()
visible = false
func _build_ui() -> void:
var bg := ColorRect.new()
bg.color = Color(0, 0, 0, 0.65)
bg.anchor_right = 1.0
bg.anchor_bottom = 1.0
bg.mouse_filter = Control.MOUSE_FILTER_STOP
add_child(bg)
var panel := PanelContainer.new()
panel.anchor_left = 0.5
panel.anchor_top = 0.5
panel.anchor_right = 0.5
panel.anchor_bottom = 0.5
panel.offset_left = -200.0
panel.offset_top = -160.0
panel.offset_right = 200.0
panel.offset_bottom = 160.0
bg.add_child(panel)
var vbox := VBoxContainer.new()
vbox.add_theme_constant_override("separation", 10)
panel.add_child(vbox)
# Title
var title := Label.new()
title.text = "SCRAP DEPOSIT MACHINE"
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(title)
vbox.add_child(HSeparator.new())
# Balance display — two rows
_bank_label = Label.new()
_bank_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(_bank_label)
_hand_label = Label.new()
_hand_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(_hand_label)
vbox.add_child(HSeparator.new())
# Transfer amount row
var amt_row := HBoxContainer.new()
amt_row.alignment = BoxContainer.ALIGNMENT_CENTER
amt_row.add_theme_constant_override("separation", 6)
vbox.add_child(amt_row)
var amt_lbl := Label.new()
amt_lbl.text = "AMOUNT:"
amt_row.add_child(amt_lbl)
_add_btn(amt_row, "-100", func(): _adjust_amount(-STEP_LARGE))
_add_btn(amt_row, "-10", func(): _adjust_amount(-STEP_SMALL))
_amount_label = Label.new()
_amount_label.custom_minimum_size = Vector2(80, 0)
_amount_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
amt_row.add_child(_amount_label)
_add_btn(amt_row, "+10", func(): _adjust_amount(STEP_SMALL))
_add_btn(amt_row, "+100", func(): _adjust_amount(STEP_LARGE))
# Custom input row
var custom_row := HBoxContainer.new()
custom_row.alignment = BoxContainer.ALIGNMENT_CENTER
custom_row.add_theme_constant_override("separation", 6)
vbox.add_child(custom_row)
_custom_input = LineEdit.new()
_custom_input.placeholder_text = "Custom amount..."
_custom_input.custom_minimum_size = Vector2(140, 0)
_custom_input.text_submitted.connect(_on_custom_submitted)
custom_row.add_child(_custom_input)
_add_btn(custom_row, "SET", func(): _on_custom_submitted(_custom_input.text))
vbox.add_child(HSeparator.new())
# Deposit / Withdraw row
var action_row := HBoxContainer.new()
action_row.alignment = BoxContainer.ALIGNMENT_CENTER
action_row.add_theme_constant_override("separation", 16)
vbox.add_child(action_row)
var dep_btn := Button.new()
dep_btn.text = "DEPOSIT\n(ON HAND → BANK)"
dep_btn.pressed.connect(_on_deposit)
action_row.add_child(dep_btn)
var wth_btn := Button.new()
wth_btn.text = "WITHDRAW\n(BANK → ON HAND)"
wth_btn.pressed.connect(_on_withdraw)
action_row.add_child(wth_btn)
# Close
var close_btn := Button.new()
close_btn.text = "CLOSE"
close_btn.pressed.connect(close)
vbox.add_child(close_btn)
func _add_btn(parent: Node, text: String, cb: Callable) -> void:
var b := Button.new()
b.text = text
b.pressed.connect(cb)
parent.add_child(b)
# ---------------------------------------------------------------------------
# Open / close
# ---------------------------------------------------------------------------
func open() -> void:
_transfer_amount = 0
_custom_input.text = ""
_refresh()
visible = true
func close() -> void:
visible = false
func _unhandled_input(event: InputEvent) -> void:
if visible and event.is_action_pressed("ui_cancel"):
close()
# ---------------------------------------------------------------------------
# Transfer amount controls
# ---------------------------------------------------------------------------
func _adjust_amount(delta: int) -> void:
_transfer_amount = maxi(_transfer_amount + delta, 0)
_refresh()
func _on_custom_submitted(text: String) -> void:
_transfer_amount = maxi(text.to_int(), 0)
_custom_input.text = ""
_refresh()
# ---------------------------------------------------------------------------
# Deposit / Withdraw
# ---------------------------------------------------------------------------
func _on_deposit() -> void:
# Move from wallet to bank — capped by what the player actually has on hand
var amount := mini(_transfer_amount, UpgradeManager.wallet_credits)
if amount <= 0:
return
UpgradeManager.wallet_credits -= amount
UpgradeManager.hub_credits += amount
EventBus.credits_changed.emit(UpgradeManager.wallet_credits)
SaveManager.save()
_refresh()
func _on_withdraw() -> void:
# Move from bank to wallet — capped by bank balance
var amount := mini(_transfer_amount, UpgradeManager.hub_credits)
if amount <= 0:
return
UpgradeManager.hub_credits -= amount
UpgradeManager.wallet_credits += amount
EventBus.credits_changed.emit(UpgradeManager.wallet_credits)
SaveManager.save()
_refresh()
# ---------------------------------------------------------------------------
# Refresh display
# ---------------------------------------------------------------------------
func _refresh() -> void:
_bank_label.text = "BANK (SAFE): %d SCRAP" % UpgradeManager.hub_credits
_hand_label.text = "ON HAND: %d SCRAP" % UpgradeManager.wallet_credits
_amount_label.text = "%d" % _transfer_amount