Files
train-game/scripts/shop.gd
2026-08-29 11:44:31 +02:00

212 lines
6.4 KiB
GDScript

extends CanvasLayer
## Depot-Terminal: Loks, Waggons und Ausbauten kaufen oder verkaufen.
const Defs = preload("res://scripts/car_defs.gd")
signal closed()
var is_open := false
var _game
var _root: Control
var _tabs: TabContainer
var _money := Label.new()
func setup(game) -> void:
_game = game
layer = 2
_root = Control.new()
_root.set_anchors_preset(Control.PRESET_FULL_RECT)
_root.visible = false
add_child(_root)
var dim := ColorRect.new()
dim.color = Color(0, 0, 0, 0.55)
dim.set_anchors_preset(Control.PRESET_FULL_RECT)
_root.add_child(dim)
var panel := PanelContainer.new()
panel.set_anchors_preset(Control.PRESET_CENTER)
panel.custom_minimum_size = Vector2(760, 520)
panel.grow_horizontal = Control.GROW_DIRECTION_BOTH
panel.grow_vertical = Control.GROW_DIRECTION_BOTH
var sb := StyleBoxFlat.new()
sb.bg_color = Color("1b2420")
sb.set_corner_radius_all(14)
sb.set_content_margin_all(18)
sb.border_color = Color("3d5a4c")
sb.set_border_width_all(2)
panel.add_theme_stylebox_override("panel", sb)
_root.add_child(panel)
var vb := VBoxContainer.new()
vb.add_theme_constant_override("separation", 10)
panel.add_child(vb)
var head := HBoxContainer.new()
var title := Label.new()
title.text = "Depot-Terminal"
title.add_theme_font_size_override("font_size", 26)
head.add_child(title)
var spacer := Control.new()
spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL
head.add_child(spacer)
_money.add_theme_font_size_override("font_size", 22)
_money.add_theme_color_override("font_color", Color("ffd978"))
head.add_child(_money)
vb.add_child(head)
var hint := Label.new()
hint.text = "Esc schließt das Terminal."
hint.add_theme_font_size_override("font_size", 14)
hint.add_theme_color_override("font_color", Color(1, 1, 1, 0.6))
vb.add_child(hint)
_tabs = TabContainer.new()
_tabs.size_flags_vertical = Control.SIZE_EXPAND_FILL
vb.add_child(_tabs)
func open() -> void:
is_open = true
_root.visible = true
_rebuild()
func close() -> void:
is_open = false
_root.visible = false
closed.emit()
func refresh() -> void:
_rebuild()
func _rebuild() -> void:
_money.text = "%d € Ansehen %d" % [_game.money, _game.reputation]
var tab := _tabs.current_tab
for c in _tabs.get_children():
c.queue_free()
_tabs.add_child(_page("Loks", _loco_rows()))
_tabs.add_child(_page("Waggons", _car_rows()))
_tabs.add_child(_page("Mein Zug", _consist_rows()))
_tabs.add_child(_page("Ausbauten", _upgrade_rows()))
if tab >= 0 and tab < 4:
_tabs.current_tab = tab
func _page(title: String, rows: Array) -> Control:
var scroll := ScrollContainer.new()
scroll.name = title
var vb := VBoxContainer.new()
vb.add_theme_constant_override("separation", 8)
vb.size_flags_horizontal = Control.SIZE_EXPAND_FILL
scroll.add_child(vb)
for r in rows:
vb.add_child(r)
return scroll
func _row(title: String, desc: String, right_text: String, button_text: String,
enabled: bool, on_press: Callable) -> Control:
var pc := PanelContainer.new()
var sb := StyleBoxFlat.new()
sb.bg_color = Color(1, 1, 1, 0.05)
sb.set_corner_radius_all(8)
sb.set_content_margin_all(10)
pc.add_theme_stylebox_override("panel", sb)
var hb := HBoxContainer.new()
hb.add_theme_constant_override("separation", 12)
pc.add_child(hb)
var vb := VBoxContainer.new()
vb.size_flags_horizontal = Control.SIZE_EXPAND_FILL
var t := Label.new()
t.text = title
t.add_theme_font_size_override("font_size", 19)
vb.add_child(t)
var d := Label.new()
d.text = desc
d.add_theme_font_size_override("font_size", 14)
d.add_theme_color_override("font_color", Color(1, 1, 1, 0.65))
vb.add_child(d)
hb.add_child(vb)
var r := Label.new()
r.text = right_text
r.add_theme_font_size_override("font_size", 17)
r.custom_minimum_size = Vector2(190, 0)
r.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
hb.add_child(r)
var b := Button.new()
b.text = button_text
b.disabled = not enabled
b.custom_minimum_size = Vector2(120, 40)
b.pressed.connect(func():
if _game.audio != null:
_game.audio.play("click", -14.0)
on_press.call())
hb.add_child(b)
return pc
func _lock_note(rep_needed: int) -> String:
if _game.reputation >= rep_needed:
return ""
return " (ab Ansehen %d)" % rep_needed
func _loco_rows() -> Array:
var rows: Array = []
for id in Defs.LOCOS.keys():
var d: Dictionary = Defs.LOCOS[id]
var owned: bool = _game.train.loco_id == id
var rep: int = int(d["rep"])
var price: int = int(d["price"])
var can: bool = not owned and _game.can_buy(price, rep)
var right := "%d km/h %d €" % [int(float(d["max_speed"]) * 3.6), price]
var name: String = String(d["name"]) + (_lock_note(rep) if not owned else " [im Einsatz]")
rows.append(_row(name, String(d["desc"]), right,
"Im Einsatz" if owned else "Kaufen", can,
func(): _game.request("buy_loco", id); _rebuild()))
return rows
func _car_rows() -> Array:
var rows: Array = []
for id in Defs.CARS.keys():
var d: Dictionary = Defs.CARS[id]
var rep: int = int(d["rep"])
var price: int = int(d["price"])
var can: bool = _game.can_buy(price, rep) and _game.train.consist.size() < 6
rows.append(_row(String(d["name"]) + _lock_note(rep), String(d["desc"]),
"%d €" % price, "Kaufen", can,
func(): _game.request("buy_car", id); _rebuild()))
return rows
func _consist_rows() -> Array:
var rows: Array = []
var d: Dictionary = Defs.LOCOS[_game.train.loco_id]
rows.append(_row(String(d["name"]), "Lok - lässt sich nur ersetzen, nicht verkaufen",
"", "", false, func(): pass))
var list: Array = _game.train.consist
for i in list.size():
var cid: String = list[i]
var cd: Dictionary = Defs.CARS[cid]
var idx := i
rows.append(_row("%d. %s" % [i + 1, String(cd["name"])], String(cd["desc"]),
"Rücknahme %d €" % int(cd["sell"]), "Verkaufen", true,
func(): _game.request("sell_car", "", idx); _rebuild()))
if list.is_empty():
rows.append(_row("Keine Waggons", "Kauf dir mindestens einen Wagen.", "", "", false,
func(): pass))
return rows
func _upgrade_rows() -> Array:
var rows: Array = []
for id in Defs.UPGRADES.keys():
var d: Dictionary = Defs.UPGRADES[id]
var owned: bool = _game.upgrades.has(id)
var rep: int = int(d["rep"])
var price: int = int(d["price"])
var can: bool = not owned and _game.can_buy(price, rep)
rows.append(_row(String(d["name"]) + (_lock_note(rep) if not owned else ""),
String(d["desc"]), "" if owned else "%d €" % price,
"Gekauft" if owned else "Kaufen", can,
func(): _game.request("buy_upgrade", id); _rebuild()))
return rows