# Inform e Glulx/RUINS, l'avventura comincia/Il ritorno della mummia (non è un film, è tutto vero)

Inform e Glulx
Copertina Tutti i moduli · Sviluppo
* IntroduzioneInform e Glulx/Introduzione
* Cosa occorre per iniziareInform e Glulx/Cosa occorre per iniziare
** Compilatore, interprete e altro ancora
** L'installazione
** Perché IF-IDE?
** Per chi non vuole (o non può) usare IF-IDE e Windows Frotz 2002
* Le basi di Inform
** A cosa serve questo capitolo?Inform e Glulx/Le basi di Inform/A cosa serve questo capitolo?
** Benvenuto in InformInform e Glulx/Le basi di Inform/Benvenuto in Inform
** Le funzioniInform e Glulx/Le basi di Inform/Le funzioni
** Variabili numeriche e caratteri specialiInform e Glulx/Le basi di Inform/Variabili numeriche e caratteri speciali
** Un po' di matematica non guasta maiInform e Glulx/Le basi di Inform/Un po' di matematica non guasta mai
** Passaggio dei parametri e ritorno dei valoriInform e Glulx/Le basi di Inform/Passaggio dei parametri e ritorno dei valori
** L'input dei dati numerici: l'istruzione GetnumberInform e Glulx/Le basi di Inform/L'input dei dati numerici: l'istruzione Getnumber
** If (condition) then... else...Inform e Glulx/Le basi di Inform/If (condition) then... else...
** While e do... untilInform e Glulx/Le basi di Inform/While e do... until
** For, break e continueInform e Glulx/Le basi di Inform/For, break e continue
** L'utilizzo delle costantiInform e Glulx/Le basi di Inform/L'utilizzo delle costanti
** Switch... caseInform e Glulx/Le basi di Inform/Switch... case
** Salti ed etichetteInform e Glulx/Le basi di Inform/Salti ed etichette
** Caratteri e stringheInform e Glulx/Le basi di Inform/Caratteri e stringhe
** I vettoriInform e Glulx/Le basi di Inform/I vettori
** Le stringhe numericheInform e Glulx/Le basi di Inform/Le stringhe numeriche
** Le direttiveInform e Glulx/Le basi di Inform/Le direttive
** Il debuggingInform e Glulx/Le basi di Inform/Il debugging
* RUINS, l'avventura comincia
** Il grande altopiano (dalla padella alla brace)Inform e Glulx/RUINS, l'avventura comincia/Il grande altopiano (dalla padella alla brace)
** La cassa d'imballaggio (riuscirete a riempirla tutta)?Inform e Glulx/RUINS, l'avventura comincia/La cassa d'imballaggio (riuscirete a riempirla tutta)?
** Il fungo (velenoso o non velenoso)?Inform e Glulx/RUINS, l'avventura comincia/Il fungo (velenoso o non velenoso)?
** Chi ha paura del buio (gli insetti no di certo)?Inform e Glulx/RUINS, l'avventura comincia/Chi ha paura del buio (gli insetti no di certo)?
** La porta di pietra (gialla è più carina)Inform e Glulx/RUINS, l'avventura comincia/La porta di pietra (gialla è più carina)
** La chiave di pietra (così non si arruginisce)Inform e Glulx/RUINS, l'avventura comincia/La chiave di pietra (così non si arruginisce)
** Il primo tesoro (speriamo che non sia un anello)Inform e Glulx/RUINS, l'avventura comincia/Il primo tesoro (speriamo che non sia un anello)
** La maschera facciale (non di carnevale)Inform e Glulx/RUINS, l'avventura comincia/La maschera facciale (non di carnevale)
** Il ritorno della mummia (non è un film, è tutto vero)Inform e Glulx/RUINS, l'avventura comincia/Il ritorno della mummia (non è un film, è tutto vero)
** L'incrocio di Xibalbá (ma è davvero così pauroso)?Inform e Glulx/RUINS, l'avventura comincia/L'incrocio di Xibalbá (ma è davvero così pauroso)?
** La sfera di pietra pomice (avete indossato il casco)?Inform e Glulx/RUINS, l'avventura comincia/La sfera di pietra pomice (avete indossato il casco)?
** Una gabbia per un facocero (e l'archeologo che fine ha fatto)?Inform e Glulx/RUINS, l'avventura comincia/Una gabbia per un facocero (e l'archeologo che fine ha fatto)?
** La cripta dei nove signori della notte (o sette come i nani)?Inform e Glulx/RUINS, l'avventura comincia/La cripta dei nove signori della notte (o sette come i nani)?
** Un archeologo per un facocero (basta solo che non grugnite)Inform e Glulx/RUINS, l'avventura comincia/Un archeologo per un facocero (basta solo che non grugnite)
** La fine di RUINS è giunta (ma con Inform siete solo all'inizio)Inform e Glulx/RUINS, l'avventura comincia/La fine di RUINS è giunta (ma con Inform siete solo all'inizio)
* Inform e ancora Inform
** La Status LineInform e Glulx/Inform e ancora Inform/La Status Line
** I menuInform e Glulx/Inform e ancora Inform/I menu
** I labirinti e i nomi pluraliInform e Glulx/Inform e ancora Inform/I labirinti e i nomi plurali
** Il tempoInform e Glulx/Inform e ancora Inform/Il tempo
** I coloriInform e Glulx/Inform e ancora Inform/I colori
** I mezzi di trasportoInform e Glulx/Inform e ancora Inform/I mezzi di trasporto
** Su e giù con l'ascensoreInform e Glulx/Inform e ancora Inform/Su e giù con l'ascensore
** Gli NPC (o PNG in italiano)Inform e Glulx/Inform e ancora Inform/Gli NPC (o PNG in italiano)
** Le estensioni (o librerie aggiuntive)Inform e Glulx/Inform e ancora Inform/Le estensioni (o librerie aggiuntive)
** Varie, listati e decompilatoreInform e Glulx/Inform e ancora Inform/Varie, listati e decompilatore
* Inform e Glulx
** Cos'è GlulxInform e Glulx/Inform e Glulx/Cos'è Glulx
** L'installazione di JifInform e Glulx/Inform e Glulx/L'installazione di Jif
** La compilazioneInform e Glulx/Inform e Glulx/La compilazione
** L'esecuzioneInform e Glulx/Inform e Glulx/L'esecuzione
** Da Inform a GlulxInform e Glulx/Inform e Glulx/Da Inform a Glulx
** La grafica e il sonoroInform e Glulx/Inform e Glulx/La grafica e il sonoro
** L'allineamento delle immaginiInform e Glulx/Inform e Glulx/L'allineamento delle immagini
** Avventure senza graficaInform e Glulx/Inform e Glulx/Avventure senza grafica
** I colori e gli stili del testoInform e Glulx/Inform e Glulx/I colori e gli stili del testo
** La personalizzazione della Status LineInform e Glulx/Inform e Glulx/La personalizzazione della Status Line
** output dei datiInform e Glulx/Inform e Glulx/L'input/output dei dati
** VarieInform e Glulx/Inform e Glulx/Varie
** GULL, il manuale ufficialeInform e Glulx/Inform e Glulx/GULL, il manuale ufficiale
* Appendici
** Appendice A - Le azioni principaliInform e Glulx/appendici/Appendice A - Le azioni principali
** Appendice B - I messaggi della libreriaInform e Glulx/appendici/Appendice B - I messaggi della libreria
** Appendice C - Gli errori della compilazioneInform e Glulx/appendici/Appendice C - Gli errori della compilazione
** Appendice D - La soluzione di RuinsInform e Glulx/appendici/Appendice D - La soluzione di Ruins
** Appendice E - Come usare Windows Frotz 2002Inform e Glulx/appendici/Appendice E - Come usare Windows Frotz 2002
** Appendice F - Le mappeInform e Glulx/appendici/Appendice F - Le mappe
** Appendice G - Scrivere, distribuire e reperire delle avventure testualiInform e Glulx/appendici/Appendice G - Scrivere, distribuire e reperire delle avventure testuali
Modifica il sommario
Osservate, spaventati a morte, il sacerdote mummificato: il suo corpo è disidratato, ed è tenuto insieme solo grazie alla sua forza di volontà. Provate a dirigervi verso sudovest ma la crepa, verso cui si dirigono i cornicioni, è ostruita dai ghiaccioli; il ghiaccio non riesce comunque a nascondere completamente il simbolo di una mezzaluna e vi chiedete quale possa essere il suo significato. Vi scervellate come non mai, pensando a uno scarabocchio di qualche bambino Maya o all’opera di due innamorati in vena di romanticismo, ma è ancora una volta il vostro immenso “acume archeologico” che vi toglie le castagne dal fuoco: avete con voi un dizionario Maya, perché non consultarlo? Ed ecco svelato il mistero: quel simbolo si pronuncia “xibalba”, anche se il suo significato è sconosciuto. Bella scoperta, e adesso? Nonostante la paura, provate a chiedere aiuto al sacerdote ed egli, con grande stupore da parte vostra, indica con le dita ossute i ghiaccioli, che si sciolgono come neve al sole quando parla: “Xibalbá, l'Oltretomba." è quello che riesce a dirvi, prima di tossire e di cadere quasi a pezzi.

## Il ritorno della mummia (non è un film, è tutto vero)

Quando si gioca a un’avventura testuale, è logico aspettarsi di dovere prima o poi interagire con qualche personaggio. Nel nostro caso, il personaggio è il sacerdote mummificato:
Sulla base di quanto è stato detto finora, è facile dedurre che gli oggetti di questo tipo hanno l’attributo animate e che la loro "vita" (il loro grado cioè di interazione con il giocatore) è descritto all’interno della proprietà life:
Questi sono solo alcuni esempi delle possibili risposte che il sacerdote può dare. Dobbiamo però fare attenzione a due azioni particolari: la prima (la correzione del dizionario) la vedremo meglio nel prossimo paragrafo, mentre la seconda (lo scioglimento dei ghiaccioli) è fondamentale per il proseguimento del gioco.
Quando il giocatore entra per la prima volta nella sala del Tempio, ecco cosa accade se cerca di dirigersi verso sudovest:
Il passaggio è quindi bloccato dai ghiaccioli; tuttavia, è possibile scorgere il simbolo di una mezzaluna. Se il giocatore cerca di rifarsi ancora una volta all’aiuto dello strano sacerdote:
deve arrangiarsi da solo. A questo punto, ecco che entra in "azione" il dizionario Maya:
e il mistero è risolto: quando si chiede di "xibalba" al sacerdote, se la direzione sudovest del Tempio (Shrine.sw_to) è bloccata, la nuova direzione diventa Junction (Shrine.sw_to = Junction;). Così facendo, è finalmente possibile accedere all’incrocio di Xibalbá:
Leggendo la descrizione di questa nuova locazione, viene quasi istintivo chiedersi come far sì che la lampada non possa in qualche modo "seguire" il nostro archeologo verso sudovest. È presto detto: basta aggiungere le seguenti righe di codice all’azione PushDir dell’oggetto sodium_lamp:
Se il giocatore si trova nella sala del Tempio e dà il comando "spingi la lampada a so", Inform stampa a video il relativo messaggio, altrimenti viene eseguito il comando e la lampada si sposta insieme al giocatore.
Passiamo ora a esaminare il dizionario Maya (l’oggetto dictionary):
Questo oggetto, in effetti, è piuttosto complicato, ma proviamo comunque a dargli ugualmente un’occhiata: la variabile di libreria wn contiene, grazie all’istruzione consult_from, la posizione del simbolo all’interno della frase (o, come dice più "tecnicamente" Giancarlo Niccolai, il numero delle parole riconosciute come topic). Nella definizione in Infit del verbo cerca, la parola-chiave topic (che in Inform si riferisce a qualsiasi testo digitato dal giocatore) occupa la seconda posizione e, con un comando del tipo "cerca freccia nel dizionario", abbiamo che:
* la variabile di libreria wn vale 2 (il testo topic freccia occupa la seconda posizione nel comando digitato dal giocatore;
* Inform mette a disposizione del programmatore le variabili locali w1 e w2.
L’istruzione NextWord, poi, "preleva" dal comando la parola che occupa la posizione wn e l’assegna alla variabile locale w1:
mentre la variabile locale w2, in questo caso, è vuota.
L’istruzione consult_words, si occupa invece del numero delle parole digitate dal giocatore nel topic:
Nel primo esempio, abbiamo nel topic le parole la (prelevata dall’istruzione NextWord e memorizzata in w1) e freccia (prelevata dall’istruzione NextWord e memorizzata in w2); consult_words vale allora 2 (nell’esempio precedente valeva invece 1, perché il giocatore aveva digitato solo "freccia"). Se w1 è uguale a "simbolo" (è il caso del secondo esempio), allora il simbolo da cercare sul dizionario è quello contenuto in w2, altrimenti (è il caso del primo esempio) è sempre quello contenuto in w2.
Concludiamo questo paragrafo con le definizioni dei verbi. Diamo nuovamente un'occhiata alla definizione del verbo fotografa:
dove noun si riferisce a qualsiasi oggetto definito all’interno dell’avventura stessa, che deve però essere visibile dal giocatore (in poche parole, non posso fotografare una statuetta se questa non è presente nella locazione in cui mi trovo). Ma, come è logico che sia, esistono diversi altri modi (alcuni più semplici e altri più complessi) per definire un nuovo verbo (e di conseguenza una nuova azione). Vediamo allora alcuni esempi presi dal file ItalianG.h:
Beh, questo è elementare: basta digitare "salta" per far sì che l’azione Jump abbia luogo. Occorre notare che, a differenza dell’azione Photograph, in questo caso non è necessario creare una funzione JumpSub, perché l’azione Jump è una di quelle riconosciute da Inform come standard.
Vediamo invece la definizione del verbo scava:
Come potete vedere, è possibile definire, per un verbo, una stessa azione in modalità differenti. La prima funziona esattamente come l’azione Photograph, mentre la seconda presenta una novità: held. Questa parola-chiave si riferisce agli oggetti posseduti dal giocatore nel suo inventario: in questo caso, è possibile prevedere un comando del tipo "scala la terra con la pala", a patto però che il giocatore abbia nel suo inventario la pala medesima.
Il verbo bacia (poteva mai mancare un verbo così?) ci riserva altre novità:
Quindi, è possibile definire più verbi per una stessa azione. La parola-chiave creature si riferisce a tutti quegli oggetti che hanno l’attributo animate: in Ruins, infatti, posso baciare il sacerdote, ma questi è talmente timido da ridursi poi in polvere.
Invece, la definizione del verbo apri:
mostra chiaramente che è possibile definire azioni diverse per uno o più verbi.
Un’altra caratteristica interessante può essere poi notata per il verbo chiedi:
In questo caso, reverse inverte di posto noun e creature, dando al giocatore la possibilità di digitare un comando del tipo "chiedi al sacerdote delle rovine" (e non "chiedi delle rovine al sacerdote", come avverrebbe se si lasciasse solo AskFor).
Ecco poi, come si possono inserire delle abbreviazioni:
dove digitare "esamina la cassa e "x cassa" equivale alla stessa azione.
Ci sono poi alcuni verbi che, per poter essere utilizzati, richiedono la presenza di almeno due oggetti visibili dal giocatore:
come accade, ad esempio, se si digita un comando del tipo "lega la corda al lampadario", dove abbiamo appunto due oggetti: la corda (il primo noun) e il lampadario (il secondo noun) . Ricordatevi però, che per testare in Inform un’azione di questo tipo occorre rifarsi al seguente codice:
Un’altra esigenza, potrebbe essere legata al fatto che alcuni verbi possono essere utilizzati con più oggetti alla volta:
In questi esempi, il giocatore ha la possibilità di digitare dei comandi del tipo "prendi il fungo e la mappa" (multi), oppure "prendi il giornale e la macchina dalla cassa" (multiinside ➨ agisce su più oggetti solo se si trovano all’interno di un contenitore), o ancora "metti giù la maschera, la mappa e la macchina" (multiheld ➨ agisce su più oggetti solo se si trovano nell’inventario del giocatore) e "metti la maschera e la mappa sull'altare" (multiexcept ➨ agisce su più oggetti ad eccezione dell’altare stesso). Ovviamente, si possono anche usare forme del tipo "prendi tutto", "prendi tutte le monete", "lascia tutto", ecc.
Se invece dobbiamo rifarci a una direzione ben precisa, diamo allora un’occhiata alla definizione del verbo vai:
dove noun è uguale a una direzione qualsiasi tra quelle permesse da Inform (Adirection). Se invece dobbiamo toglierci un vestito:
ecco la parola-chiave da usare (worn).
Può anche verificarsi il caso in cui si abbia la necessità di ampliare, in qualche modo, l’utilizzo di un verbo già esistente (o meglio, già dichiarato nel file ItalianG.h). In questo caso si deve ricorrere all’istruzione Extend, che possiamo applicare, ad esempio, al verbo cerca, così definito di default:
Facendo riferimento al dizionario Maya, con questo verbo è possibile dare il comando "cerca [nome_simbolo]nel dizionario", ma non "cerca [nome_simbolo] sul dizionario". Ecco allora come ampliare la definizione di questo verbo:
La parola-chiave topic, come abbiamo già detto, si riferisce a un qualsiasi testo digitato dall’utente. Volendo essere estremamente pignoli, possiamo anche usare l’istruzione Extend only, utile nel caso in cui si voglia estendere il significato di un solo verbo, appartenente però a un’azione che ne prevede più di uno:
Così facendo, la seguente regola grammaticale vale solo per il verbo cerca e non per i verbi trova, ricerca e fruga. Nonostante però la definizione estesa del verbo sia giusta, il comando sembra non voler ancora funzionare. Ecco infatti quello che succede:
Questo accade perché, per come è definito questo verbo di default, dobbiamo ricorrere alla parola-chiave first:
che si usa quando abbiamo la necessità di stabilire quale riga della grammatica di un verbo debba essere eseguita per prima. Se invece deve essere eseguita per ultima, si può ricorrere all’utilizzo della parola-chiave last:
Se poi si vuole sostituire un verbo già esistente, si può usare la parola-chiave replace:
con la quale si sostituisce, in questo esempio, il verbo leggi.
La parola-chiave meta è riservata invece solo ai comandi per il gioco (come ad esempio "carica", "salva", "fine", ecc.) e non viene usata quasi mai.
Infine è possibile, come dice Francesco Cordella, aggiungere un sinonimo a un verbo già esistente tramite l’operatore di assegnamento =, come accade nel seguente esempio:
dove perquisisci è il sinonimo in questione.

## Note

* ↑ La libreria wtalk_it.h, scritta da Paolo Lucchesi, permette un sistema di conversazione con dialoghi a menu (in status line o finestra). Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo.
* ↑ Giancarlo Niccolai è l’autore della stratosferica "Warmage", e mi piace definirlo come "un marziano travestito da terrestre". È in grado di fare, con Inform, praticamente tutto (o quasi) quello che vi può passare per la mente. L’indirizzo della pagina web della sua avventura è: http://pitermos.niccolai.cc/diven.php.
* ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 4.09.inf).
* ↑ Attenzione: non si fa riferimento alle parole "corda" e "lampadario", ma a due oggetti denominati corda e lampadario (oppure a due oggetti con dei nomi qualsiasi, ma con sinonimi relativi rispettivamente a corda per il primo e lampadario per il secondo, presenti nelle with name... dei rispettivi oggetti di appartenenza).
* ↑ Questo è ovviamente un caso a sé. Nella maggior parte dei casi, infatti, per estendere il significato di un verbo basta ricorrere alle sole espressioni Extend 'nome_verbo' * ... e Extend only 'nome_verbo' * ...