Dalla versione 3.3, Train Director permette ai creatori di scenari di specificare sia l'apparenza che il significato dei segnali.
L'introduzione di questa funzionalità permette di visualizzare gli aspetti dei segnali corrispondenti a segnali di avviso, di protezione con avviso accoppiato, di limitazione della velocità in base all'itinerario prescelto, e così via.
Diventa inoltre possibile visualizzare gli aspetti dei segnali usati da varie amministrazioni ferroviarie.
Tutto cioè viene realizzato con l'utilizzo di file testo separati dallo scenario, che descrivono le varie icone da usare, il comportamento che il treno dovrà mantenere nell'avvicinarsi al segnale, e come decidere quale aspetto il segnale deve presentare in base alle condizioni della linea.
Questi file testo separati sono chiamati "Train Director Scripts", o più semplicemente file .tds.
Ad ogni segnale può venire associato un file .tds che ne descrive le caratteristiche tramite il dialogo delle proprietà del segnale.
Il seguente è un esempio di un file .tds:
# Segnale di protezione a 1 luce (rosso,giallo,verde) Aspect: red IconE: rE.xpm IconW: rW.xpm IconS: rS.xpm IconN: rN.xpm Action: stop Aspect: yellow IconE: yE.xpm Action: proceed Aspect: green IconE: gE.xpm Action: proceed OnInit: .aspect = red end OnCleared: if .aspect = red if next.aspect = red .aspect = yellow else .aspect = green end end end OnUpdate: if .aspect = red return end if next.aspect = red .aspect = yellow else .aspect = green end end
Vediamo di descrivere le varie parti del file:
Commenti
La prima riga del file è una riga di commento, ed indica quale tipo di segnale stiamo trattando:
# Segnale di protezione a 1 luce (rosso,giallo,verde)
Tutti i caratteri dal # compreso fino alla fine della riga vengono ignorati dal programma.
I commenti sono del tutto opzionali, per cui non è strettamente necessario usarli, anche se il loro uso aiuta molto chi vuole capire meglio la logica del file stesso e a quale tipo di segnale applicarla.
Aspetti
La sezione successiva descrive i vari aspetti che il segnale può assumere:
Aspect: red IconE: rE.xpm IconW: rW.xpm IconS: rS.xpm IconN: rN.xpm Action: stop Aspect: yellow IconE: yE.xpm Action: proceed Aspect: green IconE: gE.xpm Action: proceed
Il nome dell'aspetto è indicato dalle linee "Aspect:". In questo caso abbiamo 3 aspetti: "red" (cioè rosso), "yellow" (cioè giallo), e "green" (cioè verde).
Per ogni aspetto è necessario indicare l'icona da visualizzare quando il segnale è nello stato corrispondente "per ciascuna delle 4 direzioni", est, ovest, sud, nord.
Se lo scenario non ha segnali disposti in direzione nord o sud, è possibile non specificare tali direzioni.
Negli esempi in questa pagina verrà sempre indicata l'icona da usare per la direzione est, intendendosi comunque l'autore dovrà specificare sempre anche le altre direzioni.
È anche possibile indicare più di una icona per ogni direzione. Le varie icone verranno visualizzate in sequenza, ritornando alla prima icona dopo che l'ultima icona è stata visualizzata. Questo consente di "animare" il segnale, per esempio per visualizzare i segnali lampeggianti. Per esempio:
Aspect: blinking_yellow IconE: yellowE.xpm blackE.xpm Action: speedLimit 60
Oltre all'icona, ogni aspetto ha associata un'azione, specificata dalle righe "Action:". Questa azione verrà eseguita da ogni treno che viaggia nel blocco precedente il segnale. Le azioni possibili sono:
- "stop": il segnale non può essere oltrepassato. Il treno si fermerà prima del segnale.
- "proceed": il segnale può essere oltrepassato senza particolari condizioni. Il treno proseguirà oltre il segnale.
- "speedLimit X": il segnale può essere oltrepassato alla velocità X (rimpiazzare X con un numero). Il treno inizierà a rallentare prima di impegnare il segnale; cioè il segnale si comporta come un limite di velocità associato all'elemento di binario linkato al segnale stesso.
- "none": il segnale verrà ignorato sia dai treni, che quando l'utente clicca sul segnale stesso. Il segnale sarà controllato completamente dal programma. I segnali di avviso sono caratterizzati da questa azione.
Con queste semplici istruzioni è possibile creare una molteplicità di casi, tali da descrivere le più comuni combinazioni.
Le sezioni successive dicono a Train Director quando cambiare l'aspetto del segnale.
Eventi e Condizioni
Chiaramente un segnale deve cambiare il suo aspetto quando si verificano certe condizioni nel tracciato. Tali condizioni possono essere generate sia dal giocatore che dal movimento dei treni.
Vediamo di seguito per ogni condizione le azioni che è possibile prendere.
OnInit : al caricamento dello scenario
Le azioni associate a "OnInit:" vengono eseguite quando lo scenario viene aperto. Tipicamente l'azione associata è la definizione dell'aspetto iniziale del segnale (di solito al rosso):
OnInit: .aspect = red end
Vediamo più in dettaglio la sintassi da usare in questa parte del file .tds.
La sezione inizia con l'evento che vogliamo descrivere, cioè "OnInit:".
Dopo il nome dell'evento vengono specificate una serie di azioni in forma di espressioni. Nel caso in esame, ".aspect = red" significa "cambia l'aspetto del segnale in base alle istruzioni indicate nel blocco "Aspect: red". "
L'azione di assegnare un nome all'aspetto dice a Train Director di cambiare l'icona e l'azione associata a quel segnale, usando i dati specificati nella sezione "Aspect:" corrispondente al nome.
L'uso del "punto" in ".aspect", indica che ci riferiamo al segnale associato a questo file .tds. Vedremo in seguito come sia possibile riferirsi ad altri segnali.
La sezione viene sempre terminata da una riga con la parola "end".
OnCleared : l'utente apre il segnale
Quando l'utente clicca sull'icona di un segnale, se il blocco successivo è libero, Train Director guarda alle istruzioni associate all'evento "OnCleared:" per decidere come cambiare l'aspetto del segnale. In questo caso, le azioni da prendere sono più complesse:
OnCleared: if .aspect = red if next.aspect = red .aspect = yellow else .aspect = green end end end
Come si vede, è possibile chiedersi se certe condizioni sono valide usando la parola "if". Nella prima riga ci chiediamo se l'aspetto corrente del segnale è rosso ("if .aspect = red"). Se non lo è, il programma ignora tutte le azioni comprese tra la riga con l"if" e il corrispondente "end".
Se invece la condizione è verificata, il progamma prosegue con l'esecuzione della riga successiva. Nell'esempio, ci chiediamo qual'è l'aspetto del segnale successivo a quello attuale è rosso ("if next.aspect = xxxx"). Come si vede, l'uso della parola "next" prima della parola ".aspect" indica al programma di "guardare avanti" nel blocco protetto dal segnale stesso. E' anche possibile guardare 2 o più blocchi a valle del segnale, semplicemente concatenando varie parole "next", per esempio "next.next.aspect".
Se quindi il segnale successivo è rosso ("if next.aspect = red"), allora il segnale corrente deve mostrare l'avviso di arresto, per cui cambiamo l'aspetto a giallo (".aspect = yellow").
Se invece il segnale successivo non è rosso, Train Director eseguirà l'azione associata alla parola "else", in questo caso mettendo il segnale al verde (".aspect = green").
Si noti come ad ogni "if" corrisponde sempre un "end" (2 if, 2 end più quello di fine sezione). La convenzione di spostare le istruzioni relative a ciascun "if" aiuta a capire a quale condizione tali istruzioni si riferiscono.
OnUpdate : un'altro segnale ha cambiato aspetto
Quando un'altro segnale nel tracciato cambia aspetto, Train Director esegue le istruzioni associate alla sezione "OnUpdate:". Questo consente per esempio di cambiare l'aspetto di un segnale quando il segnale succcessivo cambia aspetto. Nel nostro esempio:
OnUpdate: if .aspect = red return end if next.aspect = red .aspect = yellow else .aspect = green end end
La logica è la seguente: se il segnale corrente è rosso, non viene eseguita alcuna azione; la riga con "return" indica che Train Director pu&ò ignorare le istruzioni seguenti per questo segnale.
Se invece il segnale corrente non è rosso, allora dobbiamo guardare al segnale successivo, per vedere quale aspetto ha assunto ("if next.aspect = xxxx").
Se il segnale successivo è diventato rosso, allora dobbiamo cambiare l'aspetto del segnale corrente a giallo (".aspect = yellow").
Se il segnale successivo non è rosso, allora dobbiamo cambiare l'aspetto del segnale corrente a verde (".aspect = green").
L'approccio descritto finora consente di rappresentare molte delle combinazioni presentate nel "Regolamento Segnali" di Trenitalia, e si spera di altre amministrazioni sia nazionali che estere.
Nella pagina successiva vengono presentati casi più complessi.