195 lines
6.2 KiB
GDScript
195 lines
6.2 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(func(): AudioManager.play("ui_click"); _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(func(): AudioManager.play("ui_click"); _on_withdraw())
|
|
action_row.add_child(wth_btn)
|
|
|
|
# Close
|
|
var close_btn := Button.new()
|
|
close_btn.text = "CLOSE"
|
|
close_btn.pressed.connect(func(): AudioManager.play("ui_click"); 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(func(): AudioManager.play("ui_click"); cb.call())
|
|
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 |