212 lines
6.4 KiB
GDScript
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
|