Inform e Glulx/Inform e ancora Inform/Varie, listati e decompilatore
Wikibooks, manuali e libri di testo liberi.
[modifica] Varie, listati e decompilatore
Ci sono ancora diverse caratteristiche di questo linguaggio che meritano di essere esaminate in dettaglio, nell’ordine:
è possibile supportare il set di caratteri in modalità estesa (come ad esempio il simbolo dell’euro "€"[1]). Vediamo allora questo semplice esempio[2]:
Include "Parser"; Include "VerbLib"; Include "Replace";
Global charext_on = 0;
Zcharacter table + '@{20ac}';
[ Stampa; ClearScreen(); ! pulisce lo schermo print "Questa maglietta costa 70"; Euro(); print ".^"; print "Queste scarpe costano 60"; Euro(); print ".^"; print "Questa camicia costa 80"; Euro(); print ".^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
! ----------------------------------------------------------------- [ Initialise; print "Vuoi supportare i caratteri in modalit@`a estesa (s/n)? "; if (yesorno()) charext_on = 1; Stampa(); quit; ! fine del programma ];
[ Euro; if (charext_on == 1) print " @{20ac}"; else print " euro"; ];
! -----------------------------------------------------------------
Include "ItalianG";
Come per i colori, anche qui è meglio chiedere all’inizio se si vogliono o meno supportare i caratteri in modalità estesa (il motivo è sempre lo stesso: non è detto che tutti gli interpreti Z-code supportino correttamente questa modalità). Dopodiché, vengono stampate a video tre frasi che fanno tutte riferimento alla funzione Euro, la quale stampa la parola euro o il simbolo € a seconda del valore memorizzato nella variabile globale charext_on (a seconda, cioè, che l’utente abbia accettato o meno il supporto dei caratteri in modalità estesa). Occorre tuttavia puntualizzare che, per far sì che Inform "capisca" se un dato carattere esteso debba essere supportato o meno, bisogna ricorrere all’istruzione Zcharacter table:
Zcharacter table + '@{20ac}';
dove @{20ac} è proprio il simbolo dell’euro. Ulteriori informazioni potete trovarle all’indirizzo http://www.firthworks.com/roger/informfaq/aa20.html;
il contatore dei turni parte di default da zero. Definendo tuttavia una costante START_MOVE con un valore diverso da zero:
Constant Story "RUINS";
Constant Headline
"^Un esempio di lavoro interattivo.^
Copyright (c) 1999 di Graham Nelson.^
Traduzione e adattamenti di Vincenzo Scarpa e Raffaello
Valesio (c) 2002-2003 su permesso dell'autore.^^";
Constant MAX_CARRIED = 7;
Constant START_MOVE = 1;
.
.
.
il contatore parte da quel valore (in questo esempio 1 anziché zero);
aggiungendo la proprietà compass_look a un oggetto:
Object Square_Chamber "La Sala Quadrata"
with name 'sala' 'quadrata' 'architrave' 'architravi' 'entrata',
description
"Sei in una sala di pietra oscura e profonda, larga circa
dieci metri. Un raggio di sole, proveniente dalla cima
della scalinata, la illumina diffusamente, ma le ombre
del livello pi@`u basso rivelano dei passaggi verso est e
sud, che conducono verso la pi@`u profonda oscurit@`a del
Tempio.",
compass_look [ obj;
if (obj == u_obj) "Puoi vedere le scale che ti riportano
alla foresta.";
if (obj == n_obj or w_obj) "Vedi il muro.";
],
u_to Forest,
e_to Wormcast,
s_to Corridor,
è possibile usare il comando "guarda a [direzione]":
| La Sala Quadrata Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. |
è possibile, mediante la proprietà before_implicit, mangiare un oggetto prima ancora di possederlo:
Object -> mushroom "fungo macchiato" . . . after...
before_implicit [; Take: if (action_to_be == ##Eat) return 2; ], . . .
Per capire meglio quanto è stato detto proviamo a vedere quello che accade normalmente (senza, cioè, la proprietà before_implicit):
| Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi Crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. |
Se il giocatore vuole mangiare il fungo senza ancora possederlo nell’inventario, Inform esegue automaticamente il comando "prendi il fungo" in modo tale che poi il giocatore lo possa finalmente mangiare. Con la proprietà before_implicit, invece:
| Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi Crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. |
il problema non si pone;
l’istruzione ScreenHeight restituisce l’altezza della finestra principale (o meglio, il numero di righe che la costituiscono);
l’istruzione ClearScreen può essere usata in diversi modi; ClearScreen(1) pulisce solo la status line, ClearScreen(2) solo la finestra principale e, infine, ClearScreen(0) - o più semplicemente ClearScreen - che le pulisce entrambe;
se un oggetto di tipo contenitore, come ad esempio un comunissimo sacco di tela, si trova in una locazione:
. . . Object Forest "Il Grande Altopiano"...
Object -> mushroom "fungo macchiato"...
Object -> packing_case "cassa d'imballaggio"...
Object -> Sacco "sacco di tela" with name 'sacco' 'tela', has container open;
Object -> -> camera "macchina fotografica a lastre"...
Object -> -> newspaper "giornale di un mese fa"... . . .
ecco quello che accade se durante il gioco appare la descrizione della stanza:
| Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. |
Come potete vedere, il sacco di tela viene stampato a video insieme a tutto il suo contenuto. Tramite la proprietà invent, invece, è possibile "personalizzare" la sua descrizione:
Object -> Sacco "sacco di tela"
with name 'sacco' 'tela',
invent [;
if (inventory_stage == 1) switch (children(self)) {
0: print "un sacco vuoto";
1: print "un sacco contenente ", (a) child(self);
default: print "un sacco pieno di oggetti";
}
rtrue;
],
has container open;
Così facendo, se il sacco è vuoto viene stampato a video il messaggio "Puoi anche vedere un sacco vuoto qui."; se contiene un oggetto (ad esempio il giornale), viene stampato a video il messaggio "Puoi anche vedere un sacco contenente un giornale di un mese fa qui."; se contiene invece due o più oggetti viene stampato a video il messaggio "Puoi anche vedere un sacco pieno di oggetti qui.":
| Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. |
È tutto. Ovviamente ci sarebbero molte altre cose da dire, ma dal momento che questo manuale è rivolto principalmente ai non esperti della programmazione, è meglio concludere qui il capitolo[3]. A ogni modo, vi consiglio vivamente di prendere la sana abitudine di andare a studiare i listati degli altri autori (se sono ovviamente disponibili) poiché solo così si impara a programmare (e a migliorare, di conseguenza, le proprie avventure testuali). Oltre a Ruins, altri due listati da studiare sono sicuramente Avventura e Negozio; altrimenti, potete sempre rifarvi anche agli altri listati reperibili sul mio sito o sul portale di If-Italia. Esiste infine la possibilità di usare Reform, un decompilatore in grado di estrarre un listato da un file eseguibile Z-code (come spiegato nell’ottimo manuale contenuto all’interno dell’archivio stesso): il risultato ottenuto non è sempre ottimale ma d’altra parte è sempre meglio che niente.
[modifica] Note
- ↑ Per ottenere questo simbolo, premete contemporaneamente i tasti Alt (destro) + E della vostra tastiera.
- ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 5.10.inf).
- ↑ Per ulteriori informazioni su questo linguaggio vi consiglio di consultare, oltre all’Inform Beginner Guide e alla Guida ad Inform per Principianti - più volte citati nel manuale, la Guida a Inform-Glulx di Marco Falcinelli, la Guida a Inform-Glulx di Andrew Plotkin, le Inform Release Notes e le pratiche mini-guide InfoLib e Inform in four minutes scritte entrambe dal bravissimo Roger Firth.