Inform e Glulx/RUINS, l'avventura comincia/Il fungo (velenoso o non velenoso)?

Indice del libro

Vorreste esplorare la piramide, ma l’entrata è bloccata dalle macerie e non avete la più pallida idea di come toglierle. Stanchi e affamati, vi sedete per terra e notate che poco distante c’è un fungo macchiato con il gambo sottile. Vorreste provare a mangiarlo, ma non siete del tutto sicuri che non sia velenoso. Se poi state male, chi vi viene a soccorrere? Il telefonino non è stato ancora inventato, e sapete bene che ci vorranno ancora moltissimi anni prima che qualcuno lo costruirà. Al diavolo, quando si ha fame si ha fame. Raccogliete delicatamente il fungo e ne assaggiate un pezzetto. Il sapore è orribile, ma almeno non siete ancora morti, è già qualcosa. Improvvisamente, un macao passa sopra la vostra testa... il battito delle sue ali è assordante... delle pietre crollano l’una sull’altra... Le macerie sono sparite e l’entrata si è liberata! Ora potete vedere dei gradini rotti e logori che conducono verso una sala poco illuminata: potreste essere le prime persone a mettervi piede dopo cinquecento anni...


Il fungo (velenoso o non velenoso)? modifica

La definizione dell’oggetto mushroom (il nostro fungo, per l’appunto), presenta alcune novità rispetto a quanto visto finora:

Object  -> mushroom "fungo macchiato"
  with  name 'macchiato' 'macchiettato' 'fungo' 'velenoso',
        initial
            "Un fungo macchiato cresce dalla terra fradicia, su un gambo 
             lungo.",
        description
            "Il fungo @`e ricoperto da delle macchie e non sei del tutto 
             sicuro che non sia velenoso.",
        after [;
            Take:
                if (self.mushroom_picked)
                    "Hai raccolto il fungo mezzo marcio.";
                self.mushroom_picked = true;
                "Hai raccolto abilmente il fungo, senza staccarlo dal suo 
                 gambo sottile.";
            Drop:
                "Il fungo cade sul terreno e comincia a decomporsi.";
            Eat:
                steps.rubble_filled = false;
                "Lo sgranocchi ad un angolo, incapace di capire l'origine 
                 di un gusto cos@`i acre, distratto dal volo di un macao 
                 sopra la tua testa che sembra quasi un'esplosione nel 
                 sole. Il battito delle sue ali @`e quasi assordante, e 
                 delle pietre crollano una sull'altra.";
            ],
       mushroom_picked false,
 has   edible;

Allora... qui, il messaggio della proprietà description, appare solo quando si dà il comando "esamina":

>esamina il fungo
Il fungo è ricoperto da delle macchie e non sei del tutto sicuro che non sia velenoso.

mentre il messaggio della proprietà initial, come già sappiamo, appare insieme alla descrizione del Grande Altopiano. Un’altra cosa molto importante in Inform, è la gestione delle azioni (o dei verbi). Nel nostro caso, sono stati previsti dei controlli per i verbi prendi (Take), posa (Drop) e mangia (Eat). Alcune azioni sono possibili solo se l’oggetto che le contiene ha dei determinati attributi: il giocatore può mangiare il fungo perché l’oggetto mushroom contiene l’attributo edible.

La variabile locale mushroom_picked viene dichiarata con il valore false (falso)[1] e viene usata da Inform per vedere se il giocatore ha raccolto il fungo per la prima volta oppure no. Non appena questi lo raccoglie, Inform si chiede se il valore di mushroom_picked è uguale a true (vero)[2]. Se no, glielo assegna (il fungo è stato raccolto per la prima volta) e stampa a video il messaggio che segue. Se il giocatore lo posa poi a terra e lo raccoglie una seconda volta, la variabile vale true e viene quindi stampato l’altro messaggio.Ecco in pratica cosa accade:

>prendi il fungo
Hai raccolto abilmente il fungo, senza staccarlo dal suo gambo sottile.</code>


<code>>posa il fungo
Il fungo cade sul terreno e comincia a decomporsi.</code>


<code>>prendi il fungo
Hai raccolto il fungo mezzo marcio.</code>


<code>>

Il nome della variabile è preceduto da self. per dire a Inform che mushroom_picked appartiene solo e soltanto all’oggetto mushroom. La stessa cosa vale per la variabile locale rubble_filled che però appartiene all’oggetto steps e serve per verificare se l’ingresso della piramide è bloccato oppure no. Questo oggetto dichiara il valore della variabile come true:

Object  -> steps "gradini scolpiti nella roccia"
  with  article "dei",
        name 'gradino' 'gradini' 'roccia' 'scale' 'scolpiti' 'piramide' 
             'funebre’ 'struttura' 'dieci' '10',
        description [;
            if (self.rubble_filled)
                "Le macerie ostruiscono il passaggio dopo appena pochi 
                 passi.";
            print "Dei gradini rotti e logori conducono verso una sala 
                   poco illuminata. Potresti essere ";
            if (Square_Chamber hasnt visited)
                print "la prima persona a mettervi piede ";
            else
                print "stata la prima persona ad avervi messo piede ";
            "dopo cinquecento anni. Sul primo gradino @`e inscritto il 
             simbolo Q1.";
            ],
        door_to [;
            if (self.rubble_filled)
                "Le macerie ostruiscono il passaggio dopo appena pochi 
                 passi.";
            return Square_Chamber;
            ],
        door_dir d_to,
        rubble_filled true,
  has   scenery pluralname door open;

facendo così in modo che all’inizio l’entrata resti bloccata dalle macerie. Quando invece il giocatore mangia il fungo, la variabile vale false e le macerie spariscono:

>prendi il fungo
Hai raccolto abilmente il fungo, senza staccarlo dal suo gambo sottile.</code>


<code>>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.</code>


<code>>esamina la struttura
Dei gradini rotti e logori conducono verso una sala poco illuminata. Potresti essere la prima persona a mettervi piede dopo cinquecento anni. Sul primo gradino è inscritto il simbolo Q1.</code>


<code>>

Tutte le volte poi che il giocatore visita una locazione, Inform le attribuisce il valore visited. Se proviamo a scendere i gradini e subito dopo a risalirli, accade una cosa interessante:

>giù

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.
</code>


<code>>su

Il Grande Altopiano

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


<code>>esamina la struttura
Dei gradini rotti e logori conducono verso una sala poco illuminata. Potresti essere stata la prima persona ad avervi messo piede dopo cinquecento anni. Sul primo gradino è inscritto il simbolo Q1.</code>


<code>>

L’oggetto Square_Chamber (la Sala Quadrata) è (almeno per ora) piuttosto semplice:

Object  Square_Chamber "La Sala Quadrata"
  with  name 'sala' 'quadrata' 'architrave' 'architravi' 'est' 'sud' 
             '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.",
        u_to Forest,
  has   female light;

non appena il giocatore vi mette piede, la sala è visited (visitata). Quando ritorna poi in superficie e riesamina la struttura, i giochi sono fatti: essendo la Sala Quadrata stata visitata, viene stampato il secondo messaggio ("stata la prima persona ad avervi messo piede") anziché il primo ("la prima persona a mettervi piede")[3].

Un’altra cosa da notare è che quando si ritorna in una stanza visitata, il testo della sua descrizione scompare: perché? Perché, di default, Inform è in modalità normale, e dà descrizioni lunghe per i luoghi mai visitati prima e brevi se già visitati. Esistono altre due modalità che sono la breve (dà descrizioni brevi per tutti i luoghi, anche se mai visitati) e la completa (dà descrizioni lunghe per tutti i luoghi, anche se già visitati). A livello di codice, queste tre modalità possono essere impostate usando la variabile di libreria lookmode[4] nella funzione Initialise, come segue:

[ Initialise;
        location = Forest;
        move map to player;
        move sodium_lamp to player;
        move dictionary to player;
        lookmode = 1;
        "^^^Dopo giorni di inutili ricerche, passati senz'acqua 
            attraversando i rovi della foresta, alla fine la tua pazienza 
            @`e stata ricompensata: hai fatto una scoperta!^";
        ];

Se lookmode vale 1, come nel nostro esempio, è impostata la modalità normale; se vale 2, è impostata la modalità completa e se invece vale 3 è impostata la modalità breve. A ogni modo, non dovete preoccuparvi se la descrizione della stanza visitata scompare: basta dare il comando "guarda" (o "g" in forma abbreviata) e tutto torna come prima (tranne però che nella modalità breve, dove le descrizioni non compaiono per tutta la durata del gioco)[5].

 

Inform mette a disposizione delle istruzioni specifiche anche per collegare tra di loro gli oggetti in termini di direzioni. Come tutti ben sappiamo, in un’avventura testuale il giocatore può muoversi di locazione in locazione attraverso l’uso dei punti cardinali:

 ISTRUZIONE   COMANDO 
 n_to   "nord" o "n" o "vai a nord/n" 
 ne_to   "nordest" o "ne" o "vai a nordest/ne" 
 nw_to   "nordovest" o "no" o "vai a nordovest/no" 
 s_to   "sud" o "s" o "vai a sud/s" 
 se_to   "sudest" o "se" o "vai a sudest/se" 
 so_to   "sudovest" o "so" o "vai a sudovest/so" 
 e_to   "est" o "e" o "vai a est/e" 
 w_to   "ovest" o "o" o "vai a ovest/o" 
 u_to   "su" o "sopra" o "vai su/sopra" 
 d_to   "giù" o "sotto" o "vai giù/sotto" 
 in_to   "entra" o "vai dentro" 
 out_to   "esci" o "vai fuori" 
 cant go   "tutte le direzioni che non possono essere prese" 

ma è bene tenere presente che è anche possibile spostarsi da una locazione all’altra senza che esse siano necessariamente collegate tra di loro (avete presente il teletrasporto?). Questo è possibile grazie all’istruzione PlayerTo, che verrà spiegata verso la fine di questo capitolo.

 

Infine, focalizzando nuovamente la nostra attenzione sull’oggetto steps, diamo un’occhiata a tre nuovi attributi:

  • scenery: in questo caso, viene usato per impedire a Inform di visualizzare il messaggio "Puoi anche vedere dei gradini scolpiti nella roccia qui." quando il giocatore si trova nel Grande Altopiano. L’oggetto in questione, inoltre, non può essere preso, spinto, tirato o girato;
  • pluralname: indica che il nome dell’oggetto a cui si riferisce è plurale;
  • door: questo attributo viene usato quando un oggetto deve fare da tramite tra due diverse locazioni. I gradini infatti, sono collegati da una parte al Grande Altopiano, e dall’altra alla Sala Quadrata: in questo modo, se il giocatore si trova nel Grande Altopiano può percorrerli verso il basso per esplorare i meandri più oscuri della piramide e poter così continuare la sua avventura. Occorre però fare molta attenzione a due proprietà fondamentali: door_dir che indica la direzione verso la quale si incontra la porta (in questo caso giù), e door_to che indica la stanza che si trova dietro la porta (in questo caso la Sala Quadrata). Ovviamente, la porta è aperta per la presenza dell’attributo open.

Note modifica

  1. mushroom_picked false è l’equivalente di mushroom_picked = false.
  2. if (self.mushroom_picked) è l’equivalente di if (self.mushroom_picked == true).
  3. Ricordatevi che has = ha e hasnt = non ha.
  4. Ricordatevi che tutte le variabili e le funzioni di libreria non hanno bisogno di essere dichiarate per poter essere utilizzate.
  5. Cliccate qui per scaricare il listato di questo esercizio (il file 4.03.inf).