Inform e Glulx/RUINS, l'avventura comincia/La chiave di pietra (così non si arruginisce)

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

Avete sempre odiato le porte chiuse, soprattutto quelle di pietra. Avete tentato di tutto, dal pronunciare arcane formule magiche (Apriti Sesamo) a prenderla a calci e pugni, ma a parte il dolore lancinante alle mani e ai piedi, non avete risolto un bel nulla: la porta continua a non aprirsi. Ritornate nella Sala Quadrata, sconsolati e sempre più decisi a rinunciare alla spedizione, quando all’improvviso vi ricordate che verso est c’è un altro passaggio che non avete ancora percorso. Vi dirigete verso quella direzione e vi ritrovate in quella che a prima vista sembra essere la tana di un verme gigante: un groviglio di cunicoli disordinati come una ragnatela si dirige verso le fessure tra le pietre e, appiccicato alla fessura di una parete, c’è un bozzolo bianco e scintillante grande come un pallone da spiaggia. Lo raccogliete (non senza un certo ribrezzo) e ritornate nella Sala Quadrata: qui, il bozzolo vi scivola dalle mani e cade nel bagliore solare, dove ribolle oscenamente, si dilata e poi scoppia. Centinaia di piccoli insetti corrono in tutte le direzioni nell'oscurità; gli spruzzi di melma e una curiosa chiave di pietra gialla sono tutto ciò che rimane sul pavimento. Ma che fortuna! Raccogliete la chiave, correte verso la porta di pietra e… incredibile, ora si apre e potete finalmente proseguire: chi è Indiana Jones al vostro confronto?


La chiave di pietra (così non si arrugginisce)[modifica]

La Tana del Verme è un oggetto che si trova a est della Sala Quadrata:

Object  Wormcast "Tana Del Verme"
  with  description
            "Un groviglio di cunicoli disordinati come una ragnatela si 
	      dirige verso le fessure tra le pietre. I soli abbastanza 
             larghi da poterci strisciare dentro sono quelli che si 
             dirigono verso l'alto, a nordest e a sud.",
        w_to Square_Chamber,
        s_to [;
            print "La tana diventa scivolosa intorno a te, come se il 
                   calore del tuo corpo stesse sciogliendo le resine 
                   indurite, e chiudi gli occhi con forza mentre 
                   precipiti nelle tenebre...^";
            if (eggsac in player) return Square_Chamber;
            return random(Square_Chamber, Corridor, Forest);
            ],
        ne_to [; return self.s_to(); ],
        u_to [; return self.s_to(); ],
        after [;
            Drop:
                move noun to Square_Chamber;
                print_ret (The)noun," scivola attraverso uno dei cunicoli 
                          e ", (itorthem) noun, " perdi rapidamente di 
                          vista.";
            ],
  has   light;

La particolarità che lo contraddistingue da quanto visto finora, si può mettere in evidenza quando il giocatore si dirige verso sud; in questo caso, se questi ha preso il bozzolo (un oggetto che esamineremo fra poco) allora ritorna nella Sala Quadrata, altrimenti (se il bozzolo non è ancora stato raccolto) il giocatore ritorna, a caso, o nella Sala Quadrata, o nel Corridoio in pendenza o nel Grande Altopiano. Se invece viene posato a terra un oggetto qualsiasi, viene immediatamente spostato nella Sala Quadrata.

È importante osservare che la funzione di stampa (The) stampa a video l’articolo determinativo (Il, Lo, La, I, Gli, Le)  ➨  con l’iniziale maiuscola) opportunamente correlato con l’oggetto associato (in questo caso l’oggetto posato dal giocatore), mentre l’istruzione itorthem (che appartiene a Infit e non a Inform) stampa lo, la, li, le a seconda del genere (maschile o femminile) e del numero (singolare o plurale)[1]. La funzione di stampa (the) ha la stessa funzione della (The) con la differenza che la lettera iniziale dell’articolo determinativo è minuscola anziché maiuscola. La funzione di stampa (A), invece, stampa a video l’articolo indeterminativo (Un, Uno, Una, Un’)  ➨  con l’iniziale maiuscola) dell’oggetto ad essa associato, mentre la funzione di stampa (a) ha la stessa funzione della (A) con la differenza che la lettera iniziale dell’articolo indeterminativo è minuscola anziché maiuscola.

L’istruzione print_ret stampa a video il relativo messaggio ritornando poi il valore true, e rappresenta l’equivalente del seguente codice:

print (The)noun," scivola attraverso uno dei cunicoli 
                 e ", (itorthem) noun, " perdi rapidamente di vista.";
rtrue; ! o return true;

La sua funzione, in questo caso, è quella di impedire che venga stampato a video il messaggio di default relativo all’azione Drop, come accade se proviamo a usare la sola istruzione print:

Tana Del Verme
Un groviglio di cunicoli disordinati come una ragnatela si dirige verso le fessure tra le pietre. I soli abbastanza larghi da poterci strisciare dentro sono quelli che si dirigono verso l'alto, a nordest e a sud.

Un bozzolo bianco e scintillante, grande come un pallone da spiaggia, è appiccicato alla fessura di una parete.

>posa la macchina
La macchina fotografica a lastre scivola attraverso uno dei cunicoli e la perdi rapidamente di vista.Posata.

>

Non restituendo più il valore true, Inform stampa anche la parola Posata (il messaggio di default, appunto).

Passiamo ora a esaminare il bozzolo citato poco fa:

Object  -> eggsac "bozzolo bianco scintillante",
  with  name 'uovo' 'sacchetto' 'sacco' 'bozzolo',
        initial
            "Un bozzolo bianco e scintillante, grande come un pallone da 
             spiaggia, @`e appiccicato alla fessura di una parete.",
        after [;
            Take: "Bleah!"; 
            ],
        react_before [;
            Go:
                if (location == Square_Chamber && noun == u_obj) {
                    deadflag = true;
                    "Non appena il bozzolo @`e illuminato dalla luce 
                     naturale, ribolle oscenamente e si dilata. Prima che 
                     tu possa gettarlo via, scoppia in centinaia di 
                     piccoli insetti affamati...";
                    }
            ];

Come potete vedere, questo oggetto non è poi così complicato. L’unica cosa da notare, a livello di codice, è che se il giocatore raccoglie il bozzolo e dalla Sala Quadrata si dirige verso l’alto, il bozzolo scoppia e il giocatore viene divorato dai piccoli insetti affamati: un altro modo per farsi uccidere... Per fare poi in modo che dal bozzolo "esca" la chiave di pietra gialla, occorre aggiungere un altro pezzo di codice all’oggetto Square_Chamber:

before [;
            Insert:
                if (noun == eggsac && second == sunlight) {
                    remove eggsac;
                    move stone_key to self;
                    "Lasci cadere il bozzolo nel bagliore solare. Ribolle 
                     oscenamente, si dilata e poi scoppia. Centinaia di 
                     piccoli insetti corrono in tutte le direzioni 
                     nell'oscurit@`a; gli spruzzi di melma e una curiosa 
                     chiave di pietra gialla sono tutto ci@`o che rimane 
                     sul pavimento.";
                    }
            ],

In poche parole, quando il giocatore posa il bozzolo (noun) nel raggio (second), il bozzolo (l’oggetto eggsac) viene rimosso tramite l’istruzione remove e viene sostituito con la chiave di pietra (l’oggetto stone_key) mediante l’istruzione move. Nulla di complicato, come potete vedere.

Qualche difficoltà comincia invece ad esserci nel momento in cui il giocatore deve aprire la porta di pietra con la chiave. Il problema nasce dal fatto che in italiano, a differenza dell’inglese, il verbo "apri" può essere usato a livello di comando sia quando la porta è chiusa a chiave ("apri la porta con la chiave) che quando invece non lo è ("apri la porta"). Inform invece, gestisce questi eventi con due verbi differenti (unlock e open) e se omettiamo il nuovo pezzo di codice presente all’inizio del programma:

Object LibraryMessages
    with before [;
        Unlock: 
          if (lm_n == 4) {
              "Ora ", (the) noun, " non @`e pi@`u chius", 
              (genderandnumber) noun, " a chiave.";
          }
    ];

ecco quello che accade:

Corridoio in pendenza
Un corridoio basso e squadrato va da nord verso sud, inclinandosi verso la fine.

Il passaggio è bloccato da una massiccia porta di pietra gialla.

>apri la porta con la chiave
Ora hai aperto la porta di pietra

>g

Corridoio in pendenza
Un corridoio basso e squadrato va da nord verso sud, inclinandosi verso la fine.

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

Il passaggio è bloccato da una massiccia porta di pietra gialla.

>

Come potete vedere, quando il giocatore dà il comando "apri la porta con la chiave", viene stampato a video il messaggio "Ora hai aperto la porta di pietra." che però non dice la verità, perché la porta è ancora chiusa. Questo problema può essere risolto facilmente andando a personalizzare il messaggio di libreria relativo al verbo Unlock, sostituendo la frase "Ora hai aperto la porta di pietra." con "Ora la porta di pietra non è più chiusa a chiave.":

Corridoio in pendenza
Un corridoio basso e squadrato va da nord verso sud, inclinandosi verso la fine.

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

Il passaggio è bloccato da una massiccia porta di pietra gialla.

>apri la porta con la chiave
Ora la porta di pietra non è più chiusa a chiave.

>apri la porta
Ora hai aperto la porta di pietra.

>g

Corridoio in pendenza
Un corridoio basso e squadrato va da nord verso sud, inclinandosi verso la fine.

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

La grande porta di pietra gialla è aperta.

>

Adesso le cose vanno decisamente meglio, non vi pare?[2]

genderandnumber è un’altra istruzione appartenente a Infit, e riconosce il genere e il numero di un oggetto. Inoltre, viene testato il numero 4 perché il verbo Unlock ha diversi tipi di messaggi, e il quarto è proprio quello che ci interessa[3].

Ricordatevi anche che quando volete personalizzare un messaggio di libreria, dovete inserire l'oggetto LibraryMessages tra le righe di codice Include "parser" e Include "verblib", proprio come accade in questo esempio:

Object LibraryMessages
    with before [;
  	 Sing:   
          "Smettila, accidenti a te...";
        Save:
          if (lm_n == 1) "La partita non è stata salvata.";
        Miscellany:
          if (lm_n == 37) "Non ottieni nessuna risposta.";
    ];

Include "VerbLib";
Include "replace";

Oltre alle azioni, è possibile personalizzare anche i messaggi di errore (testati sotto la voce Miscellany): l’errore numero 38, per esempio, si verifica quando il giocatore vuole eseguire un’azione con un verbo che non esiste (che non è stato, cioè, dichiarato in Infit o all’interno dell’avventura stessa  ➨  es.: "allaga la casa").

Già che ci siamo, vediamo come si può personalizzare anche il prompt dei comandi. Per fare in modo che al posto del segno di maggiore appaia una frase del tipo "Cosa vuoi fare?", occorre creare un oggetto LibraryMessages nel seguente modo:

Object LibraryMessages
    with before [;
   	 Prompt: print "^Cosa vuoi fare?";
    ];

Infit, inoltre, mette a disposizione quindici domande: per usarle, basta inserire l’istruzione constant PROMPT; all’inizio del programma e Inform ne sceglierà una a caso ogni volta che il giocatore effettuerà una nuova mossa. È perfino possibile stabilire il tipo di prompt da usare in base a una determinata mossa del giocatore, come accade in quest’altro esempio:

Object LibraryMessages
    with before [;
  	 Prompt: switch (turns) {
           1: print "^E adesso?^>";
           2 to 5: print "^Cosa vuoi fare?^>";
           default: print "^Sono ai tuoi ordini:^>";
        }
        rtrue;    
    ];

turns è una variabile di libreria che contiene il numero delle mosse effettuate dal giocatore. Dopo la quinta mossa, il messaggio del prompt ("Sono ai tuoi ordini:") non cambia più fino alla fine del gioco.

Note[modifica]

  1. Per ulteriori informazioni su come usare le funzioni di Infit, consultate la breve guida contenuta all’interno del file Infit25.zip.
  2. Cliccate qui per scaricare il listato di questo esercizio (il file 4.06.inf).
  3. Potete trovare un elenco completo dei messaggi della libreria all’appendice B.