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