Files
train-game/scripts/station.gd
2026-09-16 17:55:38 +02:00

91 lines
2.8 KiB
GDScript

extends Node3D
## Bahnhof: Bahnsteig, Gebaeude, Warteplaetze, Warenlager.
const Mat = preload("res://scripts/mat.gd")
const Deco = preload("res://scripts/deco.gd")
const Cargo = preload("res://scripts/cargo.gd")
const PLATFORM_LEN := 44.0
const PLATFORM_H := 0.95
var station_name := ""
var seg := 0
var progress := 0.0
var side := 1.0
var produces := -1
var accepts: Array[int] = []
var stock := 0.0
var max_stock := 30.0
var rate := 0.55
var waiting_spots: Array[Vector3] = [] ## Weltpositionen auf dem Bahnsteig
var waiting: Array = [] ## wartende Passagiere
func setup(nm: String, seg_id: int, prog: float, prod: int, acc: Array[int]) -> void:
station_name = nm
seg = seg_id
progress = prog
produces = prod
accepts = acc
func tick(delta: float) -> void:
if produces >= 0:
stock = minf(stock + rate * delta, max_stock)
func _box(parent: Node3D, center: Vector3, size: Vector3, color: Color) -> MeshInstance3D:
var m := MeshInstance3D.new()
m.mesh = Deco.box(size)
m.material_override = Mat.flat(color)
m.position = center
parent.add_child(m)
return m
func build_visuals(track_xf: Transform3D, s: float, wall: Color, roof: Color, chimney: bool) -> void:
transform = track_xf
side = s
var edge := s * 2.4
# Bahnsteig
_box(self, Vector3(edge + s * 1.6, PLATFORM_H * 0.5, 0),
Vector3(3.2, PLATFORM_H, PLATFORM_LEN), Color("cfc3a8"))
_box(self, Vector3(edge + s * 0.06, PLATFORM_H - 0.04, 0),
Vector3(0.35, 0.1, PLATFORM_LEN), Color("e8e0cc"))
# Vordach
for i in 3:
var z := -PLATFORM_LEN * 0.22 + i * PLATFORM_LEN * 0.22
_box(self, Vector3(edge + s * 4.1, PLATFORM_H + 1.75, z),
Vector3(0.24, 3.5, 0.24), Color("6b5a45"))
_box(self, Vector3(edge + s * 3.0, PLATFORM_H + 3.6, 0),
Vector3(3.4, 0.22, PLATFORM_LEN * 0.5), roof)
# Empfangsgebaeude
var h := Deco.house(wall, roof, 11.0, 8.0, 4.6, chimney)
h.position = Vector3(edge + s * 11.5, 0.0, -PLATFORM_LEN * 0.18)
h.rotate_y(PI * 0.5 * -s)
add_child(h)
# Baenke
for i in 3:
var z := -PLATFORM_LEN * 0.25 + i * PLATFORM_LEN * 0.25
_box(self, Vector3(edge + s * 2.5, PLATFORM_H + 0.28, z),
Vector3(0.55, 0.12, 1.6), Color("8a6b4a"))
_box(self, Vector3(edge + s * 2.75, PLATFORM_H + 0.6, z),
Vector3(0.1, 0.55, 1.6), Color("8a6b4a"))
# Namensschild
var label := Label3D.new()
label.text = station_name
label.font_size = 64
label.pixel_size = 0.014
label.billboard = BaseMaterial3D.BILLBOARD_ENABLED
label.outline_size = 18
label.outline_modulate = Color(0, 0, 0, 0.7)
label.position = Vector3(edge + s * 3.0, PLATFORM_H + 4.9, 0)
add_child(label)
# Warteplaetze auf dem Bahnsteig
for i in 10:
var lz := -PLATFORM_LEN * 0.34 + i * PLATFORM_LEN * 0.075
var lx := edge + s * (1.1 + (0.9 if i % 2 == 0 else 0.0))
waiting_spots.append(to_global(Vector3(lx, PLATFORM_H, lz)))