Inform e Glulx/RUINS, l'avventura comincia/L'incrocio di Xibalbá (ma è davvero così pauroso)?

Indice del libro

Vi dirigete verso sudovest e arrivate, finalmente, all’incrocio di Xibalbá. Lo scroscio dell’acqua si sente ovunque e una piccola stele giace su una sporgenza ad altezza d’uomo. A nordest, un percorso scivoloso formato da un’ampia colonna di roccia ricoperta dal ghiaccio vi riporta al Tempio, mentre un canyon prosegue verso l’alto a nord e verso il basso a sud. Percorrete il canyon verso il basso, che però si arresta improvvisamente a un baratro oscuro e vertiginoso. Niente può essere visto o sentito da lì sotto, ma il vero problema è che non c’è nessuna cabina telefonica nelle vicinanze, e non potete così trasformarvi in Superman. Di saltarlo non se ne parla, perché è davvero troppo largo, e siete costretti a tornare indietro. Ripercorrete il canyon nella direzione opposta, ma la più alta e vasta estremità a nord sale soltanto verso una parete irregolare di roccia calcarea vulcanica. Qui, l’unica cosa che potete notare, è la presenza di un'enorme sfera di pietra pomice larga circa due metri e mezzo, su cui vi appoggiate con una mano, incerti sul da farsi.


L'incrocio di Xibalbá (ma è davvero così pauroso)?

modifica

Prima di procedere con la nostra avventura, forse è bene specificare che, come in tutte le avventure testuali che si rispettino, anche con quelle scritte in Inform è possibile salvare lo stato del gioco (tramite il comando "salva") per poi ripristinarlo in seguito (tramite il comando "carica").

Ma ci sono anche altri comandi su cui è bene spendere due parole[1] :

  • ancora: ripete il comando digitato in precedenza;
  • fine/basta/uscire: come si può facilmente intuire, digitando a scelta uno di questi comandi l’avventura termina; prima però, Inform chiede se si è veramente sicuri di volerlo, e bisogna allora rispondere con un "" (o "s") o con un "no" (o "n");
  • modalità breve/normale/lunga: questo comando attiva, in qualsiasi momento, una delle tre modalità spiegate nel terzo paragrafo di questo capitolo. Di default, è attivata quella normale (descrizioni lunghe per i luoghi mai visitati prima e brevi se già visitati);
  • notify on/off: viene attivata ("notify on") o disattivata ("notify off") la notifica del punteggio. In poche parole, questo comando fa in modo che Inform, nella modalità completa del punteggio, visualizzi o meno il messaggio standard ["Il tuo punteggio è appena aumentato di |n| punti."][2];
  • oggetti: vengono stampati a video i nomi di tutti gli oggetti posseduti nel corso del gioco;
  • posti: vengono stampati a video i nomi di tutte le locazioni visitate fino al momento dell’immissione del comando stesso;
  • pronomi: vengono stampate a video delle informazioni relative ai pronomi (attivati o disattivati) usati da Inform nella stanza in cui il giocatore si trova al momento in cui viene dato il comando;
  • recording on/off: viene attivata ("recording on") o disattivata ("recording off") la trascrizione dei comandi inseriti in un file Script (un file di testo con l’estensione .rec);
  • replay: apre il file con l’estensione .rec; prima di eseguire i comandi in esso contenuti, Inform chiede al giocatore se vuole o meno una pausa a fine pagina durante lo scorrimento del testo ("Do you want MORE prompts? (y/n)) a cui deve seguire – se è attiva quest’ultima – la pressione di un tasto qualsiasi da parte dell’utente;
  • ricomincia/ricominciare: se per un qualsiasi motivo desiderate ricominciare dall’inizio la vostra avventura, ecco quello che fa al caso vostro;
  • transcript on/off: viene attivata ("transcript on") o disattivata ("transcript off") la trascrizione del testo del gioco in un file Script (un file di testo con l’estensione .log apribile tranquillamente da qualsiasi editor di testo);
  • verifica/verificare: con questo comando è possibile verificare l’integrità o meno del file di gioco;
  • versione: vengono stampate a video delle informazioni relative alle versioni delle librerie di sistema, dell’interprete standard e di Infit;
 

Torniamo adesso a Ruins: se esaminiamo la stele, ecco il messaggio che viene stampato a video:

Xibalbá
Sei a cinquanta metri sotto la foresta pluviale e lo scroscio dell'acqua si sente ovunque: queste profonde ed erose miniere di calcare si estendono come radici. Verso nordest un percorso scivoloso, formato da un'ampia colonna di roccia ricoperta dal ghiaccio, ti riporta al Tempio, mentre un canyon prosegue verso l'alto a nord e verso il basso a sud. Alla luce diffusa della lampada al sodio proveniente da sopra, sembra essere bianco come i denti di uno squalo.

Una piccola stele, o forse una pietra di confine, giace su una sporgenza ad altezza d'uomo.

>esamina la stele
Le iscrizioni sembrano avvertirti che il confine di Xibalbá, il Luogo Della Paura, è vicino. Il simbolo di un uccello è predominante.

>

Ora siamo finalmente in grado di esaminare la prima azione del sacerdote, lasciata in sospeso nel paragrafo precedente (la correzione del dizionario Maya):

Show, Give:
        if (noun == dictionary && dictionary.correct == false) {
            dictionary.correct = true;
            "Il sacerdote legge un pezzo del libro, sogghignando 
             sinistramente. Incapace di nascondere il suo divertimento, 
             scarabocchia qualche correzione prima di restituirtelo.";
        }

Quando il giocatore dà il dizionario al sacerdote questi, con un sorriso ironico, assegna il valore true alla variabile locale correct dell’oggetto dictionary. In questo modo, quando gli si chiede del dizionario:

Ask: switch (second) {
         'dizionario', 'libro':
            if (dictionary.correct == false)
                "~Il simbolo dell'uccello... molto divertente.~";
            "~Un dizionario? Davvero?~";

il messaggio stampato a video non è più "Il simbolo dell'uccello... molto divertente." ma "Un dizionario? Davvero?". Ecco dimostrata, ancora una volta, l’estrema flessibilità di questo straordinario linguaggio di programmazione, che offre la possibilità di verificare "dall’esterno" il valore di una variabile locale appartenente a un dato oggetto (notate bene: locale, quindi visibile in teoria solo all’interno dell’oggetto di appartenenza)[3].

 

Focalizziamo ora la nostra attenzione sulla descrizione di Xibalbá: a un certo punto, più precisamente verso la fine, essa dice: "Alla luce diffusa della lampada al sodio proveniente da sopra, sembra essere bianco come i denti di uno squalo.". Ma è davvero così? Facciamo una prova: dirigiamoci verso nordest, spegniamo la lampada e ritorniamo al punto di partenza:

Il Tempio
Questo magnifico tempio mostra segni di scavi da preesistenti miniere di calcare, specialmente verso il lato occidentale, dove due lunghi cornicioni si dirigono verso sud.

La lampada al sodio, posata a terra, si sta lentamente consumando.

La grande porta di pietra gialla è aperta.

Ci sono delle pitture impegnative e vivide qui, troppo lucide per essere guardate e ottenute mediante 
incisione da parte di un popolo altamente organizzato. Mostrano un sovrano corazzato che calpesta un prigioniero.

Una grande lastra di pietra che funge da tavolo o altare, domina il Tempio.

>spegni la lampada
Hai spento la lampada al sodio.

È completamente buio qui!

>g

Oscurità
L'oscurità intorno a te è opprimente e ti senti quasi soffocare.

Da qualche parte, dei piccoli artigli si stanno muovendo velocemente.

>so

Xibalbá
Sei a cinquanta metri sotto la foresta pluviale e lo scroscio dell'acqua si sente ovunque: queste profonde ed erose miniere di calcare si estendono come radici. Verso nordest un percorso scivoloso, formato da un'ampia colonna di roccia ricoperta dal ghiaccio, ti riporta al Tempio, mentre un canyon prosegue verso l'alto a nord e verso il basso a sud. Alla luce diffusa della lampada al sodio proveniente da sopra, sembra essere bianco come i denti di uno squalo.

Una piccola stele, o forse una pietra di confine, giace su una sporgenza ad altezza d'uomo.

>

Come potete vedere, la piccola stele continua a essere visibile insieme a tutto il resto, nonostante la lampada al sodio sia spenta. Senza contare che c’è un ulteriore problema: anche le locazioni adiacenti all’incrocio di Xibalbá (rispettivamente l’estremità superiore e l’estremità inferiore del canyon) sono visibili (mentre dovrebbero essere anch’esse al buio poiché situate al di sotto della sala del Tempio). Paolo Maroncelli, altro autore di avventure testuali, consiglia in questo caso di utilizzare l’istruzione objectloop nel seguente modo:

  • Per prima cosa bisogna definire una nuova classe denominata Room:
.
.
.
Include "VerbLib";
Include "replace";

Class Room 
  has;
  • Occorre poi "marcare" le stanze interessate (Junction, Canyon_N e Canyon_S) con la classe medesima:
Room    Canyon_N "Estremit@`a superiore del canyon"
   .
   .
   .
   d_to Junction;

Room    Junction "Xibalb@'a"
   .
   .
   .
   d_to Canyon_S;

Room    Canyon_S "Estremit@`a inferiore del canyon"
   .
   .
   .
   d_to nothing;
  • E definire, infine, le due funzioni light_room e nolight_room che potete posizionare, ad esempio, subito sotto la funzione PrintRank:
[light_room x;
   objectloop(x ofclass Room) give x light; 
];

[nolight_room x;
   objectloop(x ofclass Room) give x ~light; 
];

da richiamare all’occorrenza tramite la proprietà after dell’oggetto sodium_lamp:

after [;
     SwitchOn:
         give self light;     
         light_room();
     SwitchOff:
         give self ~light;
         nolight_room();
     ],

I giochi sono fatti. L’istruzione objectloop testa tutte locazioni appartenenti alla classe Room e, se la lampada al sodio è spenta, assegna loro l’attributo ~light, mentre se è accesa assegna loro l’attributo light.

 

Per quanto riguarda invece l’oggetto chasm (il baratro):

Object  -> chasm "baratro pauroso"
  with  name 'oscuro' 'baratro' 'buca' 'pauroso' 'profondo',
        before [;
            Enter:
                deadflag = 3;
                "Precipiti attraverso il vuoto silenzio dell'oscurit@`a, 
                 sbattendo la testa contro una sporgenza della roccia. 
                 Ferito e dolorante, non puoi fare altro che raccomandare 
                 a Dio la tua anima...";
            JumpOver:
                "@`E davvero troppo largo.";
            ],
        after [;
            Receive:
                remove noun;
                print_ret (The) noun,
                          " cade silenziosamente nell'oscurit@`a del 
                           baratro.";
            Search:
                "Il baratro @`e profondo e fangoso.";
            ],
        react_before [;
            Jump:
                <<Enter self>>;
            Go:
                if (noun == d_obj) <<Enter self>>;
            ],
  has   scenery open container;

possiamo notare il terzo e ultimo valore che può assumere la variabile di libreria deadflag. Abbiamo visto che se essa vale 1, il gioco termina con una morte "standard" (Inform stampa cioè a video il messaggio "***Sei Morto***"), mentre se vale 2 il giocatore ha terminato l’avventura in maniera positiva (Inform stampa cioè a video il messaggio "***Hai vinto***"). E se vale 3 come in questo caso? Beh, abbiamo l’onore di assistere a una morte personalizzata, nel senso che Inform stampa, alla fine della partita, il messaggio da noi voluto anziché quello standard. Per fare questo però, occorre definire la funzione di libreria DeathMessage, posizionata in genere subito sotto la funzione di libreria PrintRank:

[ DeathMessage;
        if (deadflag == 3) print "Sei stato inghiottito dalle tenebre";
        ];

e se proviamo, magari, a lanciarci nel vuoto:

Estremità inferiore del canyon
All'estremità sud, più bassa e stretta, il canyon si arresta ad un baratro oscuro e vertiginoso. Niente può essere visto o sentito da lì sotto.

>giù
Precipiti attraverso il vuoto silenzio dell'oscurità, sbattendo la testa contro una sporgenza della roccia. Ferito e dolorante, non puoi fare altro che raccomandare a Dio la tua anima...

   *** Sei stato inghiottito dalle tenebre ***

In questa partita hai totalizzato 0 punti su 30 possibili, in 27 turni, guadagnando il rango di Turista.

Vuoi RICOMINCIARE, CARICARE una partita salvata o USCIRE ?
>

Per rendere più "realistica" la situazione, possiamo rifarci all’attributo talkable che permette al giocatore di parlare anche a un oggetto privo dell’attributo animate:

Object  -> chasm "baratro pauroso"
  with  name 'oscuro' 'baratro' 'buca' 'pauroso' 'profondo',
        before [;
            Enter:
                deadflag = 3;
                "Precipiti attraverso il vuoto silenzio dell'oscurit@`a, 
                 sbattendo la testa contro una sporgenza della roccia. 
                 Ferito e dolorante, non puoi fare altro che raccomandare 
                 a Dio la tua anima...";
            JumpOver:
                "@`E davvero troppo largo.";
            Tell: "Il rimbombo della tua voce @`e quasi assordante. 
                   Questo baratro sembra essere davvero molto profondo.";
            ],
        after [;
            Receive:
                remove noun;
                print_ret (The) noun,
                          " cade silenziosamente nell'oscurit@`a del 
                           baratro.";
            Search:
                "Il baratro @`e profondo e fangoso.";
            ],
        react_before [;
            Jump:
                <<Enter self>>;
            Go:
                if (noun == d_obj) <<Enter self>>;
            ],
  has   scenery open container talkable;

In questo modo, se viene dato il comando "parla al baratro":

>parla al baratro
Il rimbombo della tua voce è quasi assordante. Questo baratro sembra essere davvero molto profondo.

ecco che viene stampato a video il relativo messaggio di risposta. Volendo, possiamo estendere il significato del verbo parla:

Extend 'parla' * 'nel'/'nello'/'nella' creature            -> Tell;

e magari, già che ci siamo, definire anche dei sinonimi:

Verb 'urla' 'grida' = 'parla'; 

Così facendo, se ora digitiamo i comandi "parla nel baratro", "urla nel baratro" o "grida nel baratro", otteniamo la risposta di prima.

 

Vediamo, infine, com'è possibile creare un ponte sospeso:

Object Bridge "ponte di legno"
  with description [;
          if (self has crossable) "@`E l'ideale per chi soffre di 
                                   vertigini.";
          "Non serve pi@`u a nulla ormai.";
       ],
       name 'fragile' 'pericolante' 'legno' 'ponte' 'passaggio',
       when_open [;
          if (self has crossable) "Un ponte di legno pericolante 
                                   attraversa il baratro.";
          "Puoi vedere alcuni resti del ponte crollato qui."; 
       ],     
       door_to [;
         if (self has crossable) {
            if (children(player) > 1) {
                 give self ~crossable;
                 print "Dopo appena pochi passi, il ponte comincia a 
                        crollare, ma riesci comunque ad arrivare di 
                        corsa dall'altra parte.^";
            }
            else print "Hai attraversato il ponte pericolante.^";
            if (location == Canyon_S) return South_side; return Canyon_S;
         }
         else print "Vuoi forse cadere nel baratro?^";
         rtrue;
       ],
       door_dir [;
          if (location == Canyon_S) return s_to; return n_to;
       ],
       found_in Canyon_S South_side,
has  static door open crossable;

Object South_side "Lato sud del baratro"
  with description
               "Ti trovi sul lato sud del baratro. Delle chiazze di 
                muschio, sparse un po' dappertutto, emettono una strana 
                luce verde che ti permette di vedere dove ti trovi.",
       n_to Bridge,
  has  light scenery;

L’oggetto Bridge, presente nelle locazioni Canyon_S e South_side, l’ho inserito, per comodità, subito sotto l’oggetto chasm. Quello che forse può stupire, è che venga dichiarato come door (come abbiamo visto per gli oggetti steps e Stonedoor), ma in fin dei conti non è forse un ponte un punto di collegamento tra due locazioni? Comunque, la vera novità di questo oggetto è l’attributo crossable: Inform, infatti, dà anche la possibilità di creare dei nuovi attributi da applicare a qualsiasi oggetto, tramite l’istruzione Attribute:

.
.
.
Include "VerbLib";
Include "replace";

Attribute crossable;

All’inizio, il ponte è agibile (l’oggetto Bridge ha l’attributo crossable). Però, se il giocatore attraversa il ponte con più di un oggetto nel suo inventario, ecco quello che accade:

Estremità inferiore del canyon
All'estremità sud, più bassa e stretta, il canyon si arresta ad un baratro oscuro e vertiginoso. Niente può essere visto o sentito da lì sotto.

Un ponte di legno pericolante attraversa il baratro.

>i
Stai portando:
  una maschera facciale in mosaico di giada (indossata)
  una macchina fotografica a lastre

>s
Dopo appena pochi passi, il ponte comincia a crollare, ma riesci comunque ad arrivare di corsa dall'altra parte.

Lato sud del baratro
Ti trovi sul lato sud del baratro. Delle chiazze di muschio, sparse un po' dappertutto, emettono una strana luce verde che ti permette di vedere dove ti trovi.

Puoi vedere alcuni resti del ponte crollato qui.

>esamina il ponte
Non serve più a nulla ormai.

>n
Vuoi forse cadere nel baratro?

>

Come potete vedere, il povero archeologo è rimasto intrappolato nel muschio per il resto dei suoi miseri giorni. Se invece attraversiamo il ponte con un solo (o ancora meglio, nessuno) oggetto nell’inventario, è possibile tornare indietro:

Estremità inferiore del canyon
All'estremità sud, più bassa e stretta, il canyon si arresta ad un baratro oscuro e vertiginoso. Niente può essere visto o sentito da lì sotto.

Un ponte di legno pericolante attraversa il baratro.

>posa la macchina
Posata.

>attraversa il ponte
Hai attraversato il ponte pericolante.

Lato sud del baratro
Ti trovi sul lato sud del baratro. Delle chiazze di muschio, sparse un po' dappertutto, emettono una strana luce verde che ti permette di vedere dove ti trovi.

Un ponte di legno pericolante attraversa il baratro.

>esamina il ponte
È l'ideale per chi soffre di vertigini.

>n
Hai attraversato il ponte pericolante.

Estremità inferiore del canyon

Un ponte di legno pericolante attraversa il baratro.

Puoi anche vedere una macchina fotografica a lastre qui.

>g

Estremità inferiore del canyon
All'estremità sud, più bassa e stretta, il canyon si arresta ad un baratro oscuro e vertiginoso. Niente può essere visto o sentito da lì sotto.

Un ponte di legno pericolante attraversa il baratro.

Puoi anche vedere una macchina fotografica a lastre qui.

>

Il verbo attraversa corrisponde all’azione Enter, che viene automaticamente attivata da Inform quando si definisce un oggetto di tipo door. Non deve quindi stupire se è possibile utilizzare questo verbo pur non avendolo dichiarato da nessuna parte. Per far sì però che il ponte "funzioni", dobbiamo però fare ancora alcune piccole modifiche agli oggetti Canyon_S e chasm:

Object  Canyon_S "Estremit@`a inferiore del canyon"
  with  description
            "All'estremit@`a sud, pi@`u bassa e stretta, il canyon si 
             arresta ad un baratro oscuro e vertiginoso. Niente pu@`o 
             essere visto o sentito da l@`i sotto.",
        n_to Junction,
        u_to Junction,
        s_to Bridge,
        d_to nothing,
  has   light;

Object  chasm "baratro pauroso"
  with  name 'oscuro' 'baratro' 'buca' 'pauroso' 'profondo',
        before [;
            Enter:
                deadflag = 3;
                "Precipiti attraverso il vuoto silenzio dell'oscurit@`a, 
                 sbattendo la testa contro una sporgenza della roccia. 
                 Ferito e dolorante, non puoi fare altro che raccomandare 
                 a Dio la tua anima...";
            JumpOver:
                "@`E davvero troppo largo.";
            ],
        after [;
            Receive:
                remove noun;
                print_ret (The) noun,
                          " cade silenziosamente nell'oscurit@`a del 
                           baratro.";
            Search:
                "Il baratro @`e profondo e fangoso.";
            ],
        react_before [;
            Jump:
                <<Enter self>>;
            Go:
                if (noun == d_obj) <<Enter self>>;
            ],
            found_in Canyon_S South_side,
  has   scenery open container;

Nell’oggetto Canyon_S la direzione sud punta ora all’oggetto Bridge, mentre chasm è ora visibile nelle locazioni Canyon_S e South_side (esattamente come per l’oggetto Bridge); questo per evitare che il baratro sia visibile da una parte sola e non da entrambe. Dal momento poi, che è ora presente l’istruzione found_in, non è più necessario per quest’ultimo oggetto il simbolo ->.

  1. La libreria command_it.h, da me scritta, mostra un menu di aiuto per i comandi. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo.
  2. A livello di programmazione, è possibile controllare questo evento tramite la variabile di libreria notify_mode; se essa vale true  ➨  notify_mode = true; la notifica del punteggio è attiva, se vale false  ➨  notify_mode = false; la notifica del punteggio non è attiva (di default, notify_mode vale true).
  3. Cliccate qui per scaricare il listato di questo esercizio (il file 4.10.inf).