first commit
This commit is contained in:
211
scripts/shop.gd
Normal file
211
scripts/shop.gd
Normal file
@@ -0,0 +1,211 @@
|
||||
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
|
||||
Reference in New Issue
Block a user