# Inform e Glulx/RUINS, l'avventura comincia/Il primo tesoro (speriamo che non sia un anello)

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
Siete pronti a dirigervi verso sud, impazienti di vedere cosa nasconde l’imponente porta di pietra, ma c’è uno strano oggetto che attira la vostra attenzione: una statuetta minacciosa di uno spirito pigmeo, di aspetto quasi grottesco, che giace per terra alla vostra destra. Se non fosse per quel serpente intorno al collo, potreste usarla come soprammobile, ma decidete comunque di prenderla e riporla nella cassa, se non altro per non tornare a mani vuote da quelli della fondazione. Posate quindi a terra tutti gli oggetti che possedete, ad eccezione dell'elefantiaca macchina fotografica a lastre che sistemate invece accanto alla lampada al sodio. Mettete poi in posa la statuetta... et voilà, la foto è fatta. E mentre ritornate verso la superficie, vi chiedete quando inventeranno la Polaroid.

## Il primo tesoro (speriamo che non sia un anello)

In Inform esiste la possibilità di creare delle azioni nuove. Quelle elencate nell’appendice A infatti, sono "solo" quelle standard ma se, come nel nostro caso, volessimo fotografare un oggetto? Come potete vedere, questo verbo non c’è, ed ecco perché proprio verso la fine del listato troviamo la seguente riga di codice:
che può essere così interpretata: il verbo (Verb) FOTOGRAFA ('fotografa') [OGGETTO] (* noun) equivale all’azione PHOTOGRAPH (-> Photograph;). Ricordatevi però, che ogni nuova azione ha bisogno di un'apposita subroutine definita come [nome_azione + sub] (nel nostro specifico caso PhotographSub):
Se il giocatore non possiede la macchina fotografica (camera notin player) Inform stampa a video il messaggio corrispondente ("Non puoi farlo senza la tua macchina fotografica."); se prova invece a fotografare se stesso ("fotografa me stesso") viene stampato a video il messaggio "Meglio di no. Non ti sei fatto la barba da quando hai lasciato il Messico.", un pizzico di umorismo che mette però in risalto un’altra importante caratteristica di Inform: il player. Esso infatti, viene considerato come un oggetto vero e proprio, che di default ha la seguente descrizione:
Se poi il giocatore possiede più di un oggetto (children(player) > 1), ecco che diventa impossibile fare delle fotografie. I children (in inglese "bambini" o "figli") del player sono proprio tutti gli oggetti che lui possiede. E se avete capito la descrizione della lampada al sodio, dovreste già sapere che gli oggetti del player hanno come parent il player stesso. Chiaro, no?
Dal momento però, che questo povero archeologo non si è fatto la barba da quando ha lasciato il Messico, non credo che questo messaggio corrisponda proprio alla verità. Come vedete, è molto importante personalizzare "l’ambiente", se non altro per rendere più veritiera l’avventura in sé. Ecco quindi come possiamo modificare anche questo messaggio:
ottenendo così il seguente risultato:
Volendo, è perfino possibile aggiungere delle parti del corpo:
In questo esempio abbiamo definito il naso. Di per sé, l’oggetto nose non ha nulla di particolare, mentre la riga selfobj.add_to_scope = nose; contenuta nella funzione Initialise è quella che dice a Inform di assegnare l’oggetto in questione al player (selfobj). Il risultato che si ottiene è il seguente:
Nel caso in cui si vogliano aggiungere più parti del corpo, si deve allora ricorrere al seguente stratagemma:
Quella che viene adesso associata al player è l’intera funzione IncludeBodyParts al cui interno vengono resi visibili, tramite l’istruzione PlaceInScope, il naso e i capelli. Ecco allora il risultato:
Provare per credere.
La rimanente parte del codice dovrebbe essere ormai abbastanza chiara, tranne che per quella strana istruzione denominata AfterRoutines. Una cosa molto importante da tenere a mente quando si descrive una nuova azione, è a quale gruppo essa deve appartenere (in genere 2 o 3). Ora, come dice Paolo Lucchesi, se l’azione non fa praticamente nulla (ed è quindi molto semplice), appartiene al gruppo 3 e dipende dalla proprietà before:
Se invece l’azione compie delle operazioni complesse, appartiene allora al gruppo 2 e dipende dalla proprietà after. Quindi, dopo quanto detto, è facile dedurre che l’azione Photograph fa parte del gruppo 2, e l’istruzione AfterRoutines si prende cura di tutto quello che avviene in questa azione quando fa parte della proprietà after di un oggetto qualsiasi: se ritorna true, tutto è andato bene, se invece ritorna false, qualcosa è andato storto:
La variabile locale photographed_in_situ vale inizialmente false. Quando il giocatore riesce in qualche modo a fotografare la statuetta, il valore della variabile diventa true. Ora, se omettiamo la riga di codice relativa alla AfterRoutines in PhotographSub, ecco cosa accade:
Nonostante la statuetta sia stata fotografata, non si può ancora prendere. Ecco quindi spiegato il motivo della presenza della AfterRoutines: senza, viene ignorata l’azione Photograph della proprietà after dell’oggetto statuette, la variabile locale photographed_in_situ continua a valere false e di conseguenza la statuetta continua a non poter essere fotografata (e a non poter essere presa dal giocatore).
Occupiamoci adesso del punteggio:
La costante MAX_SCORE determina il punteggio massimo, mentre la variabile locale cultural_value determina il punteggio della statuetta. Nella proprietà after, l’azione Insert ("posa la statuetta nella cassa) incrementa il valore della variabile di libreria score di 5 (il punteggio della statuetta); se score vale 30, allora il nostro archeologo ha raccolto tutti i tesori e ha finito la sua avventura nel migliore dei modi (non è stato cioè ucciso ma ha invece vinto). PrintRank è una funzione di libreria che, a seconda del punteggio, stampa a video il relativo messaggio; questo avviene però, solo se il gioco termina o se si danno i comandi "punteggio" e "punteggio pieno".
Esiste poi, una modalità completa del punteggio, nel senso che è possibile stabilire, per un’azione qualsiasi, quanti punti assegnarle. Se, ad esempio, vogliamo dare 5 punti al giocatore quando mangia il fungo e 10 punti quando posa il bozzolo nel raggio di sole, ecco cosa dobbiamo fare:
* Per prima cosa, bisogna definire un array di nome task_scores nel seguente modo:
Il numero 5 è il punteggio che viene assegnato alla prima azione (quando il giocatore mangia il fungo) mentre il numero 10 viene assegnato alla seconda azione (quando il giocatore posa il bozzolo nel raggio). A questo array, si associano sempre le costanti NUMBER_TASKS (che contiene, a sua volta, il numero dei punteggi totali - in questo caso 5 e 10 ➨ 2) e TASKS_PROVIDED. Ricordatevi inoltre, che l’array deve avere una lunghezza massima di 255 celle (da 0 a 254) e che i punteggi non possono essere negativi o maggiori di 255.
* Occorre poi, modificare l’azione Eat dell’oggetto mushroom come segue:
L’istruzione Achieved(0); è proprio quella che assegna 5 punti alla prima azione, e li va a prelevare dalla posizione 0 dell’array task_scores. Una modifica abbastanza simile va fatta per l’azione Insert dell’oggetto Square_Chamber:
L’unica differenza, sta nel fatto che ora l’istruzione Achieved va a prelevare il valore 10 anziché il valore 5. Per verificare che le azioni di assegnamento dei punteggi abbiano avuto effettivamente luogo, basta testarle con l’istruzione task_done:
Vediamo allora in pratica quanto è stato appena detto:
Bisogna anche considerare, come dice lo stesso Paolo Lucchesi, la modalità a punteggio pieno, dove è necessario inserire la funzione di libreria PrintTaskName:
In poche parole, se il giocatore ha mangiato il fungo e ha posato il bozzolo nel raggio di sole, ecco cosa stampa a video Inform con il comando "punteggio pieno":
A ogni modo, non siete obbligati a supportare questa funzione nella gestione del punteggio in modalità completa; se il giocatore, durante il gioco, dà questo comando senza che la funzione PrintTaskName sia stata implementata, Inform stampa a video lo stesso messaggio previsto per il comando "punteggio".
Non sempre le azioni effettuate dal giocatore meritano di essere premiate. Ecco allora come procedere per far sì che il punteggio possa anche essere diminuito:
* La prima cosa da fare è quella di definire un array di nome task_scores nel seguente modo:
* Dal momento che è presente l’istruzione replace, occorre poi ridefinire la funzione di libreria TaskScore:
Ecco fatto. Ora potete sia punire che premiare il giocatore a seconda dell’azione da lui effettuata:
Supponendo per assurdo che il bozzolo debba in qualche modo rimanere intatto, se il giocatore lo lascia cadere nel bagliore solare il punteggio viene diminuito di 5 punti.
Definendo, infine, la costante NO_SCORE nel seguente modo:
è possibile disabilitare il punteggio, che non viene più segnalato sulla status line. Inoltre, perdono la loro efficacia le funzioni di libreria PrintRank; e PrintTaskName;

## Note

* ↑ Autore di "La pietra della Luna", Paolo Lucchesi è anche il creatore di MAC (Mistery Adventure Creator), uno strumento di creazione per le avventure testuali rivolto ai meno esperti della programmazione. Ulteriori informazioni potete trovarle all’indirizzo http://www.paololucchesi.it/).
* ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 4.07.inf).