Inform e Glulx/Inform e ancora Inform/Varie, listati e decompilatore

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

Varie, listati e decompilatore[modifica]

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.

Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto.

>guarda a nord
Vedi il muro.

>guarda a est
Non vedi niente di strano in quella direzione.

>guarda su
Puoi vedere le scale che ti riportano alla foresta.

>

è 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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.
Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

>mangia il fungo
(prima prendi il fungo macchiato)
Hai raccolto abilmente il fungo, senza staccarlo dal suo gambo sottile.

>mangia il fungo
Lo sgranocchi ad un angolo, incapace di capire l'origine di un gusto così acre, distratto dal volo di un 
macao sopra la tua testa che sembra quasi un'esplosione nel sole. Il battito delle sue ali è quasi
assordante, e delle pietre crollano una sull'altra.

>

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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.
Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

>mangia il fungo
Lo sgranocchi ad un angolo, incapace di capire l'origine di un gusto così acre, distratto dal volo di un 
macao sopra la tua testa che sembra quasi un'esplosione nel sole. Il battito delle sue ali è quasi
assordante, e delle pietre crollano una sull'altra.

>

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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.

Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

Puoi anche vedere un sacco di tela (nel quale ci sono una macchina fotografica a lastre e un giornale di un mese fa) qui.

>

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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.

Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

Puoi anche vedere un sacco pieno di oggetti qui.

>esamina il sacco
Dentro il sacco di tela vedi una macchina fotografica a lastre e un giornale di un mese fa.

>svuota il sacco
macchina fotografica a lastre: Posata.
giornale di un mese fa: Posato.

>g

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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.

Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

Puoi anche vedere un giornale di un mese fa, una macchina fotografica a lastre e un sacco vuoto qui.

>prendi il giornale
Preso.

>metti il giornale nel sacco
Hai messo il giornale di un mese fa dentro il sacco di tela.

>g

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.
La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità.

Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo.

La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà.

Puoi anche vedere una macchina fotografica a lastre e un sacco contenente un giornale di un mese fa qui.

>prendi il sacco
Preso.

>i
Stai portando:
 un sacco contenente un giornale di un mese fa
 un dizionario maya di Waldeck
 una lampada al sodio
 la mappa di Quintana Roo

>

È 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[4].

Perché però non giocarle? Le avventure testuali si "conoscono" anche imparando a risolvere i vari enigmi che ci vengono proposti durante lo svolgimento del gioco: è indubbio quindi, che un buon programmatore di avventure testuali deve anche essere a sua volta un buon giocatore. Personalmente consiglio quindi d’inizare con Flamel (di Francesco Cordella), WarMage (di Giancarlo Niccolai), la Pietra della Luna (di Paolo Lucchesi), Filaments (di JB Ferrant – tradotta in italiano da Marco Totolo) ed Enigma di Marco Vallarino. Altre avventure italiane potete trovarle sul portale di If-Italia, mentre all’indirizzo http://www.wurb.com/if/ potete trovare tutte (o quasi) quelle scritte nelle altre lingue (inglese in primis e poi, a seguire, spagnolo, francese, tedesco e - ovviamente - italiano).

Note[modifica]

  1. Per ottenere questo simbolo, premete contemporaneamente i tasti Alt (destro) + E della vostra tastiera.
  2. Cliccate qui per scaricare il listato di questo esercizio (il file 5.10.inf).
  3. 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.
  4. 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.