class_name Fahrplan extends Node3D ## easy graph: : [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 : [[],[]], # Endstation $station_rosenthal : [[],[]], # Endstation } @onready var tracks : Array[Dolly] = [%Track0Dolly, %Track1Dolly] @export var random_wait : Vector2 = Vector2(10.0, 20.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: 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: 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: 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 track.cycle() var cancellation_token : Array func enter_station(station: Node): prints("------------", "ENTER STATION", station, station.name, "------------") 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() for track in tracks: track.reset() # Warps the player to the entry point for that track, too enter_station(destinations[track_index])