Inform e Glulx/RUINS, l'avventura comincia/La porta di pietra (gialla è più carina)
E ora come potete procedere? Di affrontare nuovamente gli insetti non se ne parla... avete bisogno di luce. Vi vengono in mente un paio di trovate geniali, come cospargere di benzina l’intera piramide per poterle poi dare fuoco, oppure di abbattere un paio di alberi (a mani nude) per avere della legna da ardere. Ma all’improvviso vi ricordate di avere nel vostro inventario una robusta lampada al sodio da archeologo che "forse" fa proprio al caso vostro. La posate per terra, la accendete e la spingete verso sud. Dopo avere sudato sette camicie e nove fazzoletti, vi ritrovate nello stesso punto di poco fa, quando eravate al buio e a momenti finivate in pasto a quelle orribili creature. Ora, la brillante luce gialla emessa dalla lampada le fa scappare via, ma il passaggio è bloccato da una massiccia porta di pietra gialla.
La porta di pietra (gialla è più carina)
modificaIn Inform bisogna distinguere due tipi di oggetti: quelli che fungono da scenario, e quelli che fungono da contorno. Quelli che fungono da scenario (nel nostro caso Forest
, Square_Chamber
, Corridor
) si riconoscono perché si richiamano tra di loro attraverso le istruzioni di direzione viste nel terzo paragrafo di questo capitolo. Questi oggetti non possono essere esaminati o manipolati dal giocatore e su di essi non si usa la proprietà initial
.
All’inizio del gioco, la prima cosa che appare è la descrizione della foresta:
>i 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à.
come è giusto che sia, la curiosità porta spesso a voler esaminare in dettaglio qualche oggetto citato, come ad esempio gli ulivi cupi:
>esamina gli ulivi cupi Non vedi nulla del genere.
ma la risposta non sembra essere delle migliori. Ora, dal momento che l’oggetto Forest
funge da scenario, se vogliamo che Inform "veda" gli ulivi cupi dobbiamo definire un nuovo oggetto:
Object Ulivi "ulivi cupi" Forest with article "degli", name 'ulivi' 'cupi' 'uliveti' 'alberi', description "Potresti farci dell'ottimo olio d’oliva.", has pluralname scenery;
e a questo punto il problema è risolto[1]:
>esamina gli ulivi cupi Potresti farci dell'ottimo olio d’oliva.
Gli oggetti che fungono da contorno, invece, possono appartenere a uno scenario o al giocatore stesso, e possono essere esaminati e manipolati da quest’ultimo (a meno che, ovviamente, non abbiano l’attributo static
o scenery
). Praticamente, quasi tutti quelli che abbiamo visto finora.
Passiamo ora a esaminare l’oggetto sodium_lamp
(la lampada al sodio):
Object sodium_lamp "lampada al sodio" with name 'sodio' 'lampada' 'pesante', describe [; if (self has on) "^La lampada al sodio, posata a terra, si sta lentamente consumando."; "^La lampada al sodio @`e posata saldamente a terra."; ], before [; Examine: print "@`E una pesante e robusta lampada da archeologo,"; if (self hasnt on) "attualmente spenta."; if (self.battery_power < 10) "che emette una fioca luce gialla."; "che risplende di una brillante luce gialla."; Burn: <<SwitchOn self>>; SwitchOn: if (self.battery_power <= 0) "Sfortunatamente, le batterie sembrano essere scariche."; if (parent(self) hasnt supporter && self notin location) "La lampada deve essere ben posizionata prima di essere accesa."; Take, Remove: if (self has on) "La lampadina @`e troppo fragile e la maniglia metallica @`e troppo calda per poter alzare la lampada mentre @`e ancora accesa."; PushDir: AllowPushDir(); rtrue; ], after [; SwitchOn: give self light; SwitchOff: give self ~light; ], daemon [; if (self hasnt on) return; if (--self.battery_power == 0) give self ~light ~on; if (self in location) { switch (self.battery_power) { 10: "^La lampada al sodio diventa sempre pi@`u debole!"; 5: "^La lampada al sodio non far@`a luce ancora per molto."; 0: "^La lampada al sodio si affievolisce e improvvisamente si spegne."; } } ], battery_power 100, has female switchable;
L’attributo switchable
indica che l’oggetto in questione può essere acceso (on
) o spento (off
), mentre la variabile locale battery_power
funge da "batteria", e viene decrementata di 1 a ogni mossa del giocatore con la lampada accesa (operazione che, come già sapete, si effettua tramite un daemon
). Quando battery_power
vale zero (dopo cioè che il giocatore ha effettuato 100 mosse con la lampada accesa), la batteria si scarica e la lampada non può più essere usata.
Per quanto riguarda la proprietà describe
, il suo messaggio viene stampato sempre (mentre il messaggio della proprietà initial
non viene più stampato una volta che l'oggetto è stato rimosso). Se ad esempio il giocatore si trova nel Grande Altopiano
e posa la lampada accesa a terra, l’oggetto sodium_lamp
viene rimosso dall’inventario e inserito nella locazione Forest. Se vogliamo quindi che Inform stampi a video il messaggio "La lampada al sodio, posata a terra, si sta lentamente consumando.
", dobbiamo usare questa proprietà che ha, tra l’altro, la priorità su initial
.
Per quanto riguarda invece l’azione SwitchOn
(usata per stabilire quello che accade quando l’oggetto a cui si riferisce è acceso), dobbiamo dare un’occhiata a una particolare condizione if che le appartiene: (parent(self) hasnt supporter && self notin location)
Questo è un modo un po’ complicato per far sì che Inform si chieda se la lampada, quando deve essere accesa, si trovi nell’inventario del giocatore oppure no. L’istruzione parent(self)
ci permette di sapere, in qualsiasi momento, chi è il "possessore" della lampada al sodio: se si trova nell’inventario il parent
(che in inglese significa "genitore" e non "parente") è il giocatore, mentre se si trova in una locazione il parent
è la locazione stessa. Quindi, se ci troviamo ad esempio nel Grande Altopiano
e posiamo la lampada a terra, il parent
di quest’ultima sarà l’oggetto Forest
.
L’attributo supporter
si usa per quegli oggetti su cui è possibile posare qualcosa (come ad esempio un tavolo o il pavimento); quindi, ritornando alla nostra condizione if
, se l’oggetto che possiede la lampada non ha l’attributo supporter
e se la lampada non si trova in quella locazione (e si trova invece nell’inventario del giocatore che quindi non l’ha posata) non è possibile accenderla. Tutto questo per dire che la lampada, per poter essere accesa, deve essere prima posata a terra.
Sempre per quanto riguarda l’azione SwitchOn
, un’altra cosa molto interessante da esaminare è l’azione PushDir
che permette al giocatore di spostare l’oggetto a cui si riferisce con un comando del tipo SPINGI [OGGETTO] A [DIREZIONE]
. Le regole principali da seguire sono tre:
- descriverla sempre sotto la proprietà
before
; - richiamare sempre l’istruzione
AllowPushDir()
; - restituire sempre il valore
true
con l’istruzionertrue
;
La porta di pietra, invece, è un tipo di door
leggermente più complessa di quella vista nel terzo paragrafo (i gradini scolpiti nella roccia, ricordate?):
Object -> StoneDoor "porta di pietra" with name 'porta' 'massiccia' 'grande' 'pietra' 'gialla', description "@`E solo una grossa porta di pietra.", when_closed "Il passaggio @`e bloccato da una massiccia porta di pietra gialla.", when_open "La grande porta di pietra gialla @`e aperta.", door_to [; if(self in Corridor)return Shrine; return Corridor; ], door_dir [; if (self in Shrine) return n_to; return s_to; ], with_key stone_key, found_in Corridor Shrine, has female static door openable lockable locked;
La prima cosa da notare è un’ulteriore finezza all’interno della proprietà description
, perché è previsto un messaggio di descrizione sia quando la porta è chiusa (when_closed
) che aperta (when_open
). Altra caratteristica che la riguarda, è il fatto che è presente sia nel corridoio che nella stanza del tempio. Ecco quindi cosa accade nella proprietà door_to
: se la porta (self
) è nel Corridor
(se il giocatore, cioè, si trova nel corridoio) ritorna Shrine
(la porta dà sulla stanza del tempio); altrimenti (se il giocatore, cioè, si trova invece nella stanza del tempio) ritorna Corridor
(la porta dà sul corridoio in pendenza). Per quanto riguarda la proprietà door_dir
, se il giocatore si trova nella stanza del tempio la porta di pietra si trova a nord, viceversa se il giocatore si trova nel corridoio la porta di pietra si trova a sud[2].
Occorre poi, spendere ancora due parole su due nuovi attributi:
lockable
che permette a un oggetto di essere chiuso o meno a chiave (in questo caso con una chiave di pietra, come specificato nell’istruzionewith_key stone_key
);locked
che specifica che l’oggetto a cui appartiene è chiuso a chiave.
Ma la chiave di pietra dov’è? È quello che vedremo nel prossimo paragrafo[3].
Note
modifica- ↑ Questo problema può essere risolto in maniera più efficace tramite l’utilizzo della libreria
scenic.h
, che dà la possibilità di attribuire a un oggetto dei nomi "scenici" che estendono la descrizione di default. Ulteriori informazioni sul suo utilizzo potete trovarle nel nono paragrafo del prossimo capitolo. - ↑ È possibile attuare una gestione semplificata di una door grazie alla librerie
doors.h
eeasydoors.h
. Ulteriori informazioni sul loro utilizzo potete trovarle al nono paragrafo del prossimo capitolo. - ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 4.05.inf).