84 lines
2.8 KiB
GDScript
84 lines
2.8 KiB
GDScript
class_name Fahrplan extends Node3D
|
|
|
|
## easy graph: <station> : [Track1Train1 (next halt), Track1Train2], [Track2Train1(next halt), ...]
|
|
@onready var fahrplan : Dictionary[Node3D, Array] = {
|
|
$station_hirschfeld: [[$station_university_mensa, $station_parity_square],[]],
|
|
$station_hirschfeld : [[$station_university_mensa, $station_parity_square],[]],
|
|
$station_university_mensa : [[$station_university_main],[]],
|
|
$station_university_main: [[$station_ministry],[$station_rosenthal, $station_university_mensa]],
|
|
$station_parity_square : [[$station_saint_exupery],[$station_rosenthal]],
|
|
$station_saint_exupery : [[$station_saint_exupery],[$station_rosenthal]],
|
|
|
|
$station_ministry : [null,null], # Endstation
|
|
$station_rosenthal : [null,null], # Endstation
|
|
}
|
|
|
|
|
|
@onready var tracks : Array[Dolly] = [%Track0Dolly, %Track1Dolly]
|
|
|
|
@export var random_wait : Vector2 = Vector2(1.0, 10.0)
|
|
|
|
func _set_signage_texts(group: StringName, message: String) -> void:
|
|
get_tree().call_group(group, "set_text", "")
|
|
for i in range(len(message)):
|
|
get_tree().call_group(group, "set_text", message.substr(0, i+1))
|
|
await get_tree().create_timer(0.05).timeout
|
|
|
|
func _ready() -> void:
|
|
var x : Node3D = $station_hirschfeld
|
|
print(x.name)
|
|
await get_tree().process_frame
|
|
|
|
tracks[0].departure.connect(player_departed)
|
|
tracks[1].departure.connect(player_departed)
|
|
enter_station($station_hirschfeld)
|
|
|
|
|
|
var current_station : Node3D = null
|
|
var stop := false
|
|
|
|
var destinations : Array[Node3D] = [null, null]
|
|
|
|
func train_traffic_loop(track: Dolly, cancel: Array) -> void:
|
|
|
|
if fahrplan[current_station][track.index] == null: # empty array (just no routes) would be falsy
|
|
track.arrive(true)
|
|
_set_signage_texts(track.signage_group, "Endstation")
|
|
return
|
|
|
|
var routes : Array = fahrplan[current_station][track.index]
|
|
if routes.is_empty():
|
|
_set_signage_texts(track.signage_group, "Verkehr z. Zt.\nunregelmäßig")
|
|
return
|
|
|
|
while true:
|
|
if cancel.is_empty(): return # abort the loop
|
|
|
|
var next : Node = routes.pop_front()
|
|
routes.append(next) # It's a ring buffer
|
|
|
|
destinations[track.index] = next
|
|
_set_signage_texts(track.signage_group, next.name) # TODO: load nice string
|
|
|
|
await get_tree().create_timer(randf_range(random_wait.x, random_wait.y)).timeout
|
|
|
|
if cancel.is_empty(): return # abort the loop
|
|
await track.cycle() # arrive and depart
|
|
|
|
|
|
var cancellation_token : Array
|
|
|
|
func enter_station(station: Node):
|
|
prints("------------", "ENTER STATION", station, station.name, "------------")
|
|
if current_station: current_station.visible = false
|
|
current_station = station
|
|
current_station.visible = true
|
|
cancellation_token = ["go"] # Allocate a new stopping token
|
|
train_traffic_loop(tracks[0], cancellation_token)
|
|
train_traffic_loop(tracks[1], cancellation_token)
|
|
|
|
|
|
func player_departed(track_index : int) -> void:
|
|
cancellation_token.clear()
|
|
enter_station(destinations[track_index])
|