Inform e Glulx/Inform e ancora Inform/La Status Line

Wikibooks, manuali e libri di testo liberi.
Indice del libro

La Status Line[modifica]

Se qualcuno di voi ha pensato che Inform si possa fermare al solo Capitolo 4, beh... inutile dire che si è sbagliato di grosso; d’altra parte, un linguaggio di programmazione non si pone dei limiti particolari (anche se qualcuno ha fatto giustamente notare che Inform non appartiene alla famiglia dei linguaggi di programmazione general-purpouse - con Inform, cioè, potete scrivere solo delle avventure testuali[1]).

Iniziamo subito con la status line. Con questo termine si intende la barra in alto che compare nella finestra di Windows Frotz 2002 (o in qualsiasi altro interprete Z-code) quando iniziate a giocare ad un’avventura testuale :

Di default, appaiono il nome della stanza in cui si trova il giocatore e due numeri che indicano rispettivamente il punteggio e il numero di mosse che si stanno effettuando durante il gioco. Tuttavia, non è così chiaro al giocatore quale dei due numeri indica il punteggio e quale il numero di mosse[2]. È molto meglio una status line del tipo:

che si può tranquillamente ottenere grazie al seguente codice:

Constant Story "RUINS";
.
.
.
Constant MAX_CARRIED = 7;       
Constant MAX_SCORE = 30;  

Replace DrawStatusLine;
Include "Parser";
[DrawStatusLine width; StatusLineHeight(1); width = ScreenWidth(); if (width == 0) width = 80; MoveCursor(1, 1); spaces width; MoveCursor(1, 2); width = width - 35; MoveCursor(1, width); print (string) SCORE__TX, sline1; width = width + 15; MoveCursor(1, width); print (string) MOVES__TX, sline2; MainWindow(); ]; . . .

Come si può facilmente intuire, la funzione che si occupa dell’inizializzazione della status line si chiama in Inform DrawStatusLine. L’istruzione StatusLineHeight stabilisce di quante righe la status line deve essere costituita (nel nostro caso una), mentre l’istruzione MoveCursor posiziona il cursore del testo ad una posizione ben precisa della status line (visualizzata sullo schermo grazie all’istruzione spaces width; ) dopo aver specificato un certo numero di riga (nel nostro caso 1) e di colonna (il numero contenuto nella variabile locale width, che viene inizializzata la prima volta – tramite l’istruzione ScreenWidth() – alla lunghezza dell’intero schermo). Sottraendo poi un certo valore alla variabile locale width, spostiamo di n posizioni a sinistra il testo che viene successivamente stampato a video (il punteggio); viceversa, sommando un certo valore alla variabile omonima, spostiamo di n posizioni più a destra il testo che viene successivamente stampato a video (il numero di mosse o d’azioni). Fatto questo, segue l’istruzione MainWindow che fa in modo che il cursore punti alla finestra principale.

Tuttavia, come fa giustamente notare Paolo Lucchesi, la funzione DrawStatusLine così com’è porta una semplificazione pericolosa nel non andare a cercare il Visibility Level. Se il giocatore si trova ad esempio in una cassa chiusa, sulla status line viene mostrata solo la cassa e non il nome della stanza (che non risulta visibile al giocatore). Ecco allora come riscrivere la funzione:

[DrawStatusLine width;
     StatusLineHeight(1); 
     width = ScreenWidth(); if (width == 0) width = 80;
     MoveCursor(1, 1); spaces width;
     MoveCursor(1, 2);
     if (location == thedark) {
         print (name) location;
     }
     else {
         FindVisibilityLevels();
         if (visibility_ceiling == location)
             print (name) location;
         else
             print (The) visibility_ceiling;
     }
     
width = width - 35; MoveCursor(1, width); print (string) SCORE__TX, sline1; width = width + 15; MoveCursor(1, width); print (string) MOVES__TX, sline2; MainWindow(); ];

Se vogliamo invece cambiare le parole Punti e Azioni rispettivamente in Punteggio e Turni, dobbiamo ricorrere all’utilizzo delle variabili di libreria score (per il punteggio) e turns (per il numero d’azioni):

[DrawStatusLine width;
     .
     .
     .
   width = width - 35;
   MoveCursor(1, width); print "Punteggio: ", score;
   width = width + 20;
   MoveCursor(1, width); print "Turni: ", turns;
   MainWindow(); 
];

Ricordatevi inoltre, che per essere utilizzata, la funzione DrawStatusLine deve essere sempre messa dopo l’istruzione Include "Parser", a sua volta preceduta dall’istruzione Replace DrawStatusLine[3].

E se la status line non ci piace e vogliamo eliminarla? Basta definire la funzione DrawStatusLine come segue:

[ DrawStatusLine; ];

Provare per credere...

Note[modifica]

  1. In realtà, alcuni programmatori si sono divertiti a scrivere degli "abuse", ovvero dei listati Inform che non sono però delle avventure testuali. Devono tuttavia essere considerati - soprattutto in virtù delle limitate capacità grafiche di questo linguaggio - degli esperimenti di programmazione piuttosto che dei programmi veri e propri, che meritano comunque di essere studiati (anche se parzialmente) se non altro per alcuni effetti particolarmente interessanti. Li potete scaricare, gratuitamente, all’indirizzo ftp://ftp.ifarchive.org/if-archive/games/source/inform/. Paolo Lucchesi, inoltre, ha scritto una libreria (la cyoa.h) che permette di usare Inform per creare delle avventure testuali a scelte multiple (più conosciute da alcuni come libri-game).
  2. Questo inconveniente si verifica o meno a seconda della grandezza della finestra (o, se preferite, dello schermo) di Windows Frotz 2002. Di "default", infatti, la status line visualizza entrambe le scritte ma – come potete ben vedere – questo non rappresenta affatto una garanzia e di conseguenza è sempre meglio inizializzarla.
  3. Cliccate qui per scaricare i listati di questi esercizi (i file 5.01_1.inf, 5.01_2.inf e 5.01_3.inf).