La versione 3.6 di Train Director aumenta il livello di personalizzazione degli scenari rispetto alle versioni precedenti. Infatti è ora possibile associare degli scritti a quasi tutti gli elementi presenti in un tracciato: segnali, binari, pedali e treni! Tramite l'uso di scritti, è possibile creare condizioni complesse come per esempio la creazione di itinerari multipli e il controllo della marcia dei treni, compresa la possibilità di creare ritardi casuali nella marcia dei treni.

Il principio su cui si basano gli script è l'esecuzione di funzioni specifiche che vengono attivate quando si verifica un particolare evento. Ogni elemento sul tracciato riconosce eventi diversi. La pagina di riassunto degli script elenca i vari eventi per i vari elementi del tracciato.

Per spiegare l'uso degli script, le seguenti simulazioni di esempio sono incluse con l'eseguibile di Train Director:

  • trainscr.trk: esempio di uso degli script associati ai treni. La simulazione stampa nella finestra degli avvisi quando lo stato del treno cambia (per esempio qunado il treno entra nel tracciato, o quando la sua direzione viene invertita).
  • signalscr.trk: esempio di uso degli script associati ai segnali. La simulazione mostra come sia possibile implementare segnali di avviso o segnali di protezione condizionati all'itinerario di ingresso in una stazione.
  • trackscr.trk: esempio di uso degli script associati ai binari e ai pedali.
  • linkedImages.trk: esempio di uso degli script associati a icone collegate a enti.

Come Associare gli Script agli Elementi

Ogni script è una porzione di un file testo associato a un elemento del tracciato. Il programma permette l'introduzione degli script per i binari direttamente dal dialogo delle proprietà del binario. Il dialogo delle proprietà viene aperto cliccando col bottone destro sull'ente (per le icone si deve usare Ctrl+bottone destro):

Per quel che riguarda i treni, gli script sono specificati nel file .sch insieme all'orario del treno. Questo è un esempio di script associato a un treno:

Train: T3
    Enter: 0:12, A
        0:14, -, S1
    Script:
        OnShunt:
            do showalert T3 shunting
        end
        OnReverse:
            do showalert T3 reversed
        end
    EndScript
.

Per quel che riguarda i segnali, gli script sono file testo separati chiamati "Train Director Scripts", o più semplicemente file .tds. Questi file possono essere associati ai vari segnali tramite il dialogo delle proprietà del segnale.

La ragione per questa differenza sta nel fatto che per i segnali è molto comune riutilizzare lo stesso script per più di un segnale (per esempio tutti i segnali di avviso con protezione accoppiata avranno lo stesso script).

Tutti gli script usano una sintassi comune, composta dal nome dell'evento, seguito da uno o più righe di condizioni, espressioni o comandi. Gli eventi hanno la seguente struttura:

OnXXXXX:
    # condizioni, espressioni e comandi
    ....
end

dove XXXXX specifica l'evento, ed end specifica la fine delle condizioni, espressioni o comandi associato a tale evento.

Le espressioni servono a leggere o cambiare le proprietà di binari, segnali, treni ecc. Mentre le proprietà sono specifiche dell'elemento, e sono elencate per ogni tipo di elemento nella pagina di riassunto degli script, gli elementi stessi possono essere indicati in vario modo:

  • tramite la coordinata dell'elemento:   Track(x, y)  specifica l'elemento di binario alla coordinata x, y.
  • relativamente al treno o segnale o binario interessato dall'evento:   Track.proprieta, Train.proprieta, Signal.proprieta.
  • relativamente all'elemento che ha scatenato l'evento:  .proprieta.

Per esempio, la proprietà ".aspect" di un segnale può essere cambiata con la seguente espressione:

    .aspect = red

Le espressioni sono anche usate per specificare delle condizioni, tramite l'uso di "operatori" di confronto.

Il seguente è un esempio di espressione condizionale:

    Signal(10,23).aspect = red and Train(R2001).speed > 100 or Train(R2004).status = stopped

Come si vede, diverse espressioni possono essere collegate dagli operatori "and" e "or".

Gli operatori condizionali sono i seguenti:

=     uguale a
!      diverso da
>     maggiore di
>=   maggiore o uguale a
<     minore di
<=   minore o uguale a

and   verificato se la condizione di sinistra e la condizione di destra sono entrambe verificate
or      verificato se o la condizione di sinistra o la condizione di destra è verificata

Oltre agli elementi del tracciato, si può usare l'operando "random" in un'espressione per ottenere un valore da 0 a 99 compresi, come nel seguente esempio:

    random < 40

In questo caso la condizione sarà verificata (in media) il 40% delle volte.

Un altro operando che può essere usato nelle espressioni è "time", per riferirsi all'orologio della simulazione:

    time > 1430

Il valore dell'operando "time" è in hhmm, cioè ore+minuti; nell'esempio precedente la condizione è verificata dopo le 14:30.

Oltre alle espressioni per cambiare le proprietà di un elemento, gli script consentono anche l'uso di 2 tipi di comandi:

  • I comandi di condizione
  • I comandi imperativi

I comandi di condizione hanno la seguente struttura:

    if espressione
        comando1
        comando2
        ...
    else
        comando3
        comando4
        ...
    end

Il comando valuta se l'espressione è verificata, ed in caso affermativo esegue la serie di comandi 1, 2 ecc. ignorando la serie di comandi 3, 4, ecc.
Nel caso l'espressione non sia verificata, il comando ignora la serie di comandi 1,2 ecc. ed esegue invece la serie di comandi 3, 4, ecc.

Si noti che la parte "else" è facoltativa, e può essere omessa se non ci sono comandi da eseguire quando l'espressione non è verificata.

Si noti inoltre che un comando può contenere altri comandi "if", in modo tale da poter specificare ulteriori condizioni che saranno controllate solo dopo che l' "if" esterno è stato verificato.

Sono anche disponibili alcuni comandi imperativi. Tali comandi vengono eseguiti in sequenza, uno dopo l'altro.

Il comando "do" consente di modificare l'operatività del simulatore, similmente a quanto succede già per i pedali.

I possibili usi del comando do sono i seguenti:

do stationsched mostra l'orario delle stazioni
do fast aumenta la velocità della simulazione
do slow diminuisce la velocità della simulazione
do stopsim Ferma l'orologio. Utile quando si evidenzia una condizione che richiede l'intervento del giocatore.
do shunt train inizia la manovra del treno specificato
do traininfopage train mostra l'orario del treno specificato in una pagina HTML
do traininfo train mostra l'orario del treno specificato in un dialogo
do decelerate value train rallenta la velocità del treno specificato del valore di km/h specificato
do accelerate value train aumenta la velocità del treno specificato del valore di km/h specificato
do reverse train inverte la marcia del treno specificato
do click x, y simula un click del bottone sinistro del mouse alla coordinata specificata
do rclick x, y simula un click del bottone destro del mouse alla coordinata specificata
do ctrlclick x, y simula un click del bottone sinistro del mouse col tastro Ctrl premuto
do itinerary name attiva l'itinerario specificato. Non è necessario avere un pulsante associato all'itinerario.
do assign oldtrain,newtrain assegna il materiale di "oldtrain" (che deve essere arrivato a destinazione) al treno "newtrain". I nomi dei treni devono essere separati da una virgola.
do play soundfile suona il file specificato
do skip fa avanzare la simulazione a 3 minuti prima del prossimo evento (utile per non dover aspettare delle ore quando non sono previsti movimenti di treni)
do split train,length spezza il treno specificato in due treni, e fa avanzare in manovra il primo troncone
do script file esegue lo scritto contenuto nel file specificato
do showinfo file.htm mostra il contenuto del file HTML nella finestra "Scenario Info"
do showalert text mostra la frase specificata nella finestra degli avvisi
do clearalert cancella tutti i messaggi dalla finestra degli avvisi
 

Il comando "call" permette di eseguire i comandi definiti in una procedura predefinita. La sintassi è la seguente:

    call procName

dove procName è il nome di una procedura. Si veda il capitolo "Procedure" per maggiori dettagli.

Il comando "return" interrompe l'esecuzione di una sequenza di comandi ed esce dalla procedura corrente, o, se presente in un blocco di comandi attivato da un evento, ritorna immediatamente alla simulazione. Per esempio:

OnUpdate:
    if .aspect = red
        return
    end
    ...
end

Tutti i comandi dopo la riga return verranno ignorati.

Nella pagina successiva vengono presentati in dettaglio gli scritti associabili ai segnali. Si veda inoltre vari scenari disponibili dalla pagina delle simulazioni per esempi di come utilizzare gli scritti.

Procedure

La versione 3.9p di Train Director introduce la possibilità di riutilizzare sequenze di comandi indipendentemente dall'ente che ha attivato lo script. Se quindi ci sono azioni che devono essere attivate più volte all'interno di uno scenario, non è più necessario copiare le sequenze di comandi in più scritti.

I blocchi di comandi riutilizzabili sono identificati da una linea simile alla seguente:

procedure nome
...
end

dove nome è il nome identificativo della sequenza di comandi. La linea end termina la sequenza dei comandi. È ovviamente possibile definire più procedure in sequenza, come nel seguente esempio:

procedure nome1
...
end

procedure nome2
...
end

Per chiamare una procedura, si utilizzi il comando call fornendo il nome della procedura desiderata. Per esempio:

OnUpdate:
    call nome1
    call nome2
end

In questo esempio, saranno eseguiti in sequenza tutti comandi definiti nella procedura nome1, seguiti dai comandi definiti nella procedura nome2.

Si veda il tracciato di esempio 39pCall.trk presente nella cartella Examples nel pacchetto di Train Director per vedere le procedure in azione!