Inform e Glulx/RUINS, l'avventura comincia/Il fungo (velenoso o non velenoso)?
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 | modifica sorgente]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:
|
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 alGrande Altopiano
, e dall’altra allaSala Quadrata
: in questo modo, se il giocatore si trova nelGrande 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 casogiù
), edoor_to
che indica la stanza che si trova dietro la porta (in questo caso laSala Quadrata
). Ovviamente, la porta è aperta per la presenza dell’attributoopen
.
Note
[modifica | modifica sorgente]- ↑
mushroom_picked false
è l’equivalente dimushroom_picked = false
. - ↑
if (self.mushroom_picked)
è l’equivalente diif (self.mushroom_picked == true
). - ↑ Ricordatevi che
has = ha
ehasnt = non ha
. - ↑ Ricordatevi che tutte le variabili e le funzioni di libreria non hanno bisogno di essere dichiarate per poter essere utilizzate.
- ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 4.03.inf).