Inform e Glulx/RUINS, l'avventura comincia/La cassa d'imballaggio (riuscirete a riempirla tutta)?
Inform? Oggetti? Funzioni? Vi chiedete a cosa possano servire tutte queste nozioni, e vi chiedete anche chi possa essere così pazzo da scrivere un manuale del genere. Urla di scimmie, pipistrelli, pappagalli, macao sono i soli suoni che in questo momento vi fanno compagnia. Vi guardate intorno e vedete che una cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. Abbandonate il manuale di Inform al suo destino e andate a esaminare la cassa che a sua volta contiene un ingombrante, robusto e tenace modello di macchina fotografica a lastre con la struttura di legno, e un giornale stropicciato di un mese fa. Li prendete entrambi e li mettete nel vostro inventario, insieme agli oggetti che già possedete: la mappa di Quintana Roo, la lampada al sodio e il dizionario Maya di Waldeck.
La cassa d'imballaggio (riuscirete a riempirla tutta)?
modificaAbbiamo detto che un’avventura testuale è costituita da un insieme di oggetti. Ora, quello che occorre capire, è come (e soprattutto quando) si devono collegare tra loro; ecco perché nel nostro programma sono state inserite le definizioni di alcuni nuovi oggetti:
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; Include "Parser"; Include "VerbLib"; Include "replace"; ! -------------------------------------------------------------------- ! ! Il Grande Altopiano ! -------------------------------------------------------------------- ! Object Forest "Il Grande Altopiano" with description ... u_to ... cant_go ... before [; Listen: "Urla di scimmie, pipistrelli, pappagalli, macao."; ], has light; Object -> packing_case "cassa d'imballaggio" with name 'imballaggio' 'cassetta' 'cassa', initial "La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civilt@`a.", before [; Take, Remove, PushDir: "La cassa @`e troppo pesante per preoccuparsi di spostarla, almeno finch@'e la spedizione @`e ancora incompleta."; ], has female static container open openable; Object -> -> camera "macchina fotografica a lastre" with name 'lastre' 'macchina' 'fotografica', description "@`E un ingombrante, robusto e tenace modello di macchina fotografica a lastre con la struttura di legno: come tutti gli archeologi, le sei particolarmente affezionato.", has female; Object -> -> newspaper "giornale di un mese fa" with name 'times' 'giornale' 'mese', description "Il ~Times~ del 26 febbraio 1938, che si @`e subito bagnato e stropicciato dopo essere stato esposto per un mese a questo clima, pi@`u o meno come ti senti tu ora. Forse c'@`e la nebbia a Londra. Forse ci sono le bombe."; ! -------------------------------------------------------------------- ! ! Questi oggetti vengono spostati nelle locazioni a mano a mano che ! il gioco procede. ! -------------------------------------------------------------------- ! Object sodium_lamp "lampada al sodio" ... Object dictionary "dizionario maya di Waldeck" ... Object map "mappa di Quintana Roo" with article "la", name 'mappa' 'schizzo' 'abbozzo' 'quintana' 'roo', description "Questa mappa evidenzia meglio il ruscello che ti ha portato qui, al di l@`a del confine meridionale del Messico, nella pi@`u profonda foresta pluviale, interrotta solo da questo altopiano.", has female; ! -------------------------------------------------------------------- ! ! Utility routines. ! -------------------------------------------------------------------- ! [ Initialise; location = Forest; move map to player; move sodium_lamp to player; move dictionary to player; "^^^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!^"; ]; ! -------------------------------------------------------------------- ! Include "ItalianG";
Partiamo dall’oggetto packing_case
(la nostra cassa d’imballaggio). La prima cosa che si può notare, è la presenza, alla prima riga, del simbolo ->
: in questo modo, diciamo ad Inform che questo oggetto è visibile nell’oggetto Forest
(che cioè la cassa d’imballaggio è visibile dal giocatore quando si trova nel Grande Altopiano). Esiste comunque un modo più semplice per mettere in relazione i due oggetti. Scrivendo infatti:
Object packing_case "cassa d'imballaggio" Forest
otteniamo lo stesso e identico risultato, ma per questa avventura si è deciso di adottare il simbolo ->
anziché il nome dell’oggetto di appartenenza. Ogni oggetto inoltre, può essere chiamato con dei nomi diversi durante il gioco. È quello che accade nella riga with name...
e se scrivo ad esempio: prendi la cassetta
o prendi la cassa
, per Inform il riferimento all’oggetto packing_case
è identico per entrambi i comandi (esegue cioè la stessa azione in entrambi i casi)[1].
Il testo posto dopo la proprietà initial
è quello che appare tutte le volte che il giocatore si trova nel Grande Altopiano e descrive la cassa in questione. Se si cerca invece di prenderla (Take
), rimuoverla (Remove
), o spingerla in una direzione (PushDir
), la risposta è sempre che è troppo pesante da spostare...
Gli oggetti camera
(la macchina fotografica) e newspaper
(il giornale) presentano solo una novità: la presenza del doppio simbolo -> ->
per dire a Inform che sono visibili all’interno della cassa d’imballaggio. Occorre notare che, in questo caso, l’ordine di definizione degli oggetti è molto importante: in poche parole, l’oggetto packing_case
deve essere messo subito dopo l’oggetto Forest
, mentre gli oggetti newspaper
e camera
devono essere messi subito dopo l’oggetto packing_case
.
La mappa si trova invece nell’inventario del giocatore, e questo è possibile grazie all’istruzione move
che nella funzione Initialise
la sposta insieme al dizionario e alla lampada al sodio che verranno descritti in dettaglio più avanti.
Per quanto riguarda gli attributi, qui ne abbiamo in abbondanza, nell’ordine:
female
: indica che l’oggetto è femminile (se invece è maschile – in inglesemale
- non si mette nulla, perché è il valore di default);static
: l’oggetto è fisso al suo posto e non può essere preso o spostato dal giocatore;container
: l’oggetto in questione è un contenitore che, come dice la parola stessa, può contenere al suo interno altri oggetti che possono essere a loro volta presi, esaminati, usati e riposti;open
: "Elementare Watson" come direbbe Sherlock Holmes; la cassa è aperta, ma il giocatore non può entrarvi dentro. Se questo attributo non è presente la cassa è chiusa di default;openable
: la cassa può essere aperta o chiusa dal giocatore o da un altro personaggio del gioco (che in gergo "informiano" è un NPC[2] o, in italiano, PNG[3]).
Inform prevede anche la possibilità di associare uno specifico articolo a ogni oggetto. Di default, se è maschile gli viene attribuito l’articolo indeterminativo un
, se è femminile una
. Nel caso della mappa però, essendo proprio la mappa di Quintana Roo (nel senso che ne esiste una sola), è meglio attribuirle l’articolo la
. Ora, se durante il gioco proviamo a fare una lista dell’inventario:
>i Stai portando: il dizionario maya di Waldeck una lampada al sodio la mappa di Quintana Roo
Inform si "accorge" del nuovo articolo e lo visualizza insieme al nome dell’oggetto cui appartiene[4].
Le ultime due cose da notare in questo paragrafo sono:
- l’aggiunta del verbo
Listen
(in italianoAscolta
) all’oggettoForest
. In questo modo, se durante il gioco il giocatore si trova nel Grande Altopiano e dà il comando "ascolta
", viene visualizzato il messaggio "Urla di scimmie, pipistrelli, pappagalli, macao.
". Notate che di default questo comando dà il messaggio "Non si sente niente di particolare.
" e questa è la dimostrazione pratica di come Inform offra un ambiente integrato ma anche altamente personalizzabile. Attenzione però: il messaggio da noi voluto viene visualizzato solo nell’oggettoForest
, mentre per tutte le altre locazioni il messaggio sarà sempre quello di default (a meno che non si prevederanno nuovi messaggi in altre locazioni); - l’inserimento della costante
MAX_CARRIED
, il cui valore indica il numero massimo di oggetti trasportabili dal giocatore (100 di default). Quindi, quando il nostro inventario è pieno (se possediamo cioè il numero massimo di oggetti ➨ nel nostro caso 7), non è più possibile prenderne altri, a meno che non se ne posi qualcuno (per es.posa il giornale
).
Note
modifica- ↑ Vi consiglio di abbondare sempre con i nomi alternativi, perché in questo modo non si limita il campo di azione del giocatore (si evita che l’oggetto possa essere chiamato in un modo soltanto, rendendo così le azioni meno frustranti).
- ↑ Acronimo inglese di Non Player Characters.
- ↑ Acronimo di Personaggi Non Giocatori.
- ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 4.02.inf).