# Inform e Glulx/RUINS, l'avventura comincia/La fine di RUINS è giunta (ma con Inform siete solo all'inizio)

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
Vi dirigete verso l’alto e vi ritrovate dentro la gabbia di ferro (questa volta senza scheletri). Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta, ma voi non ne volete assolutamente sapere di tornare là sotto; c’è troppa umidità, che fa solo male alle vostre povere ossa. Uscite dalla gabbia e spingete la lampada al sodio verso nordovest. Dovete fare presto, perché la luce da essa emessa diventa sempre più debole: procedete allora verso nord più velocemente che potete, fino poi a ritrovarvi nella Sala Quadrata. Qui, la lampada al sodio si affievolisce e improvvisamente si spegne. Siete letteralmente disperati: la vostra cara lampada è morta e non potete neanche farle un funerale. La raccogliete con le lacrime agli occhi e salite finalmente verso la superficie. Vi dirigete verso la vostra cassa da imballaggio, depositate tutti i tesori che avete trovato e vi lasciate infine cadere, esausti come non mai, per terra. Un macao dalla coda rossa fluttua giù dalle cime degli alberi, con le piume appesantite dalla pioggia recente. Il battito delle sue ali è quasi assordante, e delle pietre crollano una sull'altra. Come il cielo si schiarisce, una luna crescente sorge sopra una tranquilla giungla. È la fine di marzo del 1938, ed è l'ora di tornare a casa...

## La fine di RUINS è giunta (ma con Inform siete solo all'inizio)

Spesso, non basta assegnare una semplice direzione a una stanza. È quello che accade in questa "nuova" versione della Cripta:
Quando il giocatore si dirige verso l’alto (quando tenta, cioè, di uscire dalla cripta), accadono diverse cose:
* la variabile locale floor_open (vedremo fra poco a cosa serve) appartenente all’oggetto cage (la gabbia di ferro) vale true;
* l’istruzione u_to punta alla funzione opened_u_to;
* il giocatore viene, come abbiamo già visto nel paragrafo precedente, trasformato da facocero in archeologo.
La funzione opened_u_to, a sua volta, "teletrasporta" il giocatore nella gabbia di ferro:
Per quanto riguarda la proprietà inside_description, se la variabile locale floor_open vale true, allora Inform stampa a video il messaggio "Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta.". Altrimenti (se, cioè, floor_open vale false), stampa a video il messaggio alternativo ("Sei circondato dalle sbarre della gabbia."):
Un altro esercizio che può essere utile a scopo didattico, è la creazione di un trono su cui potersi sedere sopra:
Questo oggetto, come potete facilmente vedere, si trova nella Sala Quadrata. Ecco come funziona:
Il primo problema da risolvere è che in Infit (v2.5) manca di fatto la definizione del verbo alzati, ma, come dice un vecchio detto, a tutto c’è rimedio:
Grazie a questa riga di codice (da posizionare alla fine del listato di Ruins, subito sotto la riga di codice Verb 'fotografa' * noun..., abbiamo il nostro verbo funzionante e pronto per essere usato:
Volendo, è possibile fare in modo che il giocatore non sia costretto a digitare tutte le volte i comandi "siediti sul trono" e "alzati dal trono" ma, più semplicemente, "siediti" e "alzati". Ecco allora le modifiche da apportare all’oggetto throne:
L’uso più comune della proprietà react_before, come abbiamo già visto nel quarto paragrafo di questo capitolo, è quello di evitare le azioni senza oggetto. Per quanto riguarda l’azione Enter, se noun == nothing (se cioè il giocatore digita solo "siediti"), Inform fa sedere l’archeologo sul trono; per quanto riguarda invece l’azione Exit, se noun == nothing (se cioè il giocatore digita solo "alzati"), Inform fa alzare l’archeologo dal trono, solo però se è seduto su di esso (&& player in self). Ma c’è ancora un piccolo problema:
Come potete vedere, il comando "siediti" non funziona ancora da solo. Il problema è relativo alla definizione del verbo siediti in Infit:
Manca, in poche parole, la seguente riga di codice:
che va inserita alla fine del listato di Ruins subito sotto la riga di codice Verb 'alzati' = 'esci'; Provare per credere...
L’ultima parte di codice da esaminare in Ruins, è la funzione TitlePage:
con la quale si ottiene il seguente risultato:
Siamo quindi di fronte a una sorta di "presentazione" dell’avventura. L’istruzione ClearScreen, come abbiamo già visto, pulisce lo schermo. Per quanto riguarda invece gli stili, Inform ne mette a disposizione cinque:
che corrispondono alle seguenti istruzioni:
style roman; ! (normale) style bold; ! (grassetto) style underline; ! (corsivo) style reverse; ! (reverse) style fixed; ! (preformattato) – equivalente a font off
L’istruzione font off attiva il font a spaziatura fissa, dove i singoli caratteri hanno la stessa distanza fra di loro (il Times New Roman, uno dei font che ho utilizzato per scrivere questo manuale, è ad esempio uno di quelli che non ha questa caratteristica). Detto questo, occorre capire che in inform, azioni come la centratura del testo rispetto allo schermo sono possibili solo con un font a spaziatura fissa, e quindi solo in modalità font off.
L’istruzione spaces(i) sposta il testo alla destra dello schermo di n posizioni. L’istruzione if relativa alla variabile i è un sistema piuttosto contorto per far sì che il testo appaia sempre in una specifica posizione tenendo però conto della larghezza dello schermo (che è di fatto il valore restituito alla variabile locale i dall’istruzione ScreenWidth), che varia al variare della dimensione della finestra di Windows Frotz 2002 (o di qualsiasi altro interprete Z-code). La larghezza della mia finestra di Windows Frotz 2002 è, tanto per fare un esempio, 70: questo significa che il numero massimo di posizioni consentite per un singolo carattere è 69, mentre per quanto riguarda una parola o addirittura un’intera frase, il numero massimo di posizioni consentite cambia a seconda del numero di caratteri che compongono queste ultime. A ogni modo, se il numero di posizioni supera il "limite" consentito, Inform continua la visualizzazione del testo alla riga successiva, come accade nel seguente esempio:
Per questa frase il limite massimo di posizioni onde evitare che una parte del testo possa andare a capo, è 43. Comunque, vi consiglio di posizionare il vostro testo nella posizione in cui vi piace, mantenendo però l’istruzione if come riferimento:
aggiungendo ad esempio il valore 10 alla variabile locale i nella prima istruzione spaces, la scritta "RUINS" risulterà spostata un po’ più a destra, ma verrà sempre presa in considerazione la larghezza dello schermo. Se la si vuole invece centrare si deve allora ricorrere all’istruzione Centre:
ottenendo così il seguente risultato:
Quando invece non si vuole più usare il font a spaziatura fissa previsto da Inform, l’istruzione font on ripristina il font precedentemente usato da Windows Frotz 2002 per visualizzare il testo del gioco. L’istruzione box "..." apre un riquadro al cui interno viene visualizzato il testo racchiuso tra le virgolette, mentre l’istruzione KeyCharPrimitive, come abbiamo già visto, aspetta la pressione di un tasto qualsiasi da parte dell’utente (o meglio, del giocatore).
Se vogliamo fare in modo che il giocatore, anziché premere un tasto qualsiasi, debba aspettare un certo periodo di tempo prima di procedere con l’avventura, si deve ricorrere all’utilizzo dell’istruzione KeyDelay. Sostituendo quindi l’istruzione KeyCharPrimitive con KeyDelay(40) il giocatore aspetterà 40 decimi di secondo; a ogni modo, se è "impaziente", potrà comunque premere un tasto qualsiasi per andare avanti.
È anche possibile fare in modo che Inform stampi a video il numero di versione e il numero di serie da noi voluto:
così come di prevedere, ad esempio, il comando "aiuto":
Se il giocatore digita questo comando quando si trova nel Grande Altopiano e l’entrata della piramide è bloccata dalle macerie, Inform stampa a video il relativo consiglio, altrimenti lo informa che nessun aiuto è disponibile in quel punto del gioco:
Volendo essere estremamente pignoli, possiamo addirittura prevedere l’inserimento di una password:
Alla richiesta di aiuto, se il giocatore non digita la password corretta il suggerimento non viene visualizzato. Naturalmente, oltre alla password corretta, il giocatore si deve trovare nel Grande Altopiano e l’entrata della piramide deve essere bloccata dalle macerie:
Il comando "informazioni":
può essere utile al giocatore per sapere come contattare l’autore nel caso in cui gli voglia chiedere, ad esempio, qual è la soluzione del gioco, se è possibile reperire il listato, o altro ancora:
Un altro comando piuttosto importante da implementare è "istruzioni", con lo scopo di spiegare ai non esperti come giocare a un’avventura testuale, argomento che non deve mai essere dato per scontato. Il codice è praticamente identico al comando precedente tranne, ovviamente, che per il nome.

## Note

* ↑ Quest’azione è possibile perché l’oggetto cage ha l’attributo enterable.
* ↑ Gli stili del testo possono essere gestiti più comodamente con la libreria style.h. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo.
* ↑ In realtà queste azioni sono teoricamente possibili anche con i font a spaziatura variabile ma, poiché i valori delle coordinate di riferimento cambiano di volta in volta a seconda del font utilizzato, non sono fattibili da un punto di vista "pratico" perché in Inform non si può stabilire uno specifico font da utilizzare di default.
* ↑ La libreria boxclever.h permette di creare dei riquadri con, oltre al testo normale, anche il grassetto e il corsivo. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo.
* ↑ I suggerimenti possono essere gestiti anche attraverso le librerie flags_it.h e tutor.h. Ulteriori informazioni sul loro utilizzo potete trovarle nel prossimo capitolo.