Inform e Glulx/RUINS, l'avventura comincia/La sfera di pietra pomice (avete indossato il casco)?
Wikibooks, manuali e libri di testo liberi.
Non potete stare tutto il tempo a poltrire, perché la prima regola che vi hanno insegnato alla scuola serale di archeologia è stata quella di non perdersi mai d’animo. Il vostro fiuto "infallibile" vi dice che dovete dirigervi verso il Tempio, ma pochi attimi dopo aver tolto la mano dalla sfera di pietra pomice, essa comincia rotolare a sud, diretta verso il baratro oscuro e profondo. La rincorrete più veloce che potete, ma non potete fare nulla per impedire che la sfera rotoli giù nel canyon senza controllo per alcuni metri, prima di sussultare nelle fauci del baratro. Con un piccolo rimbalzo, però, vi colpisce di striscio sulla fronte. Perdete i sensi e cadete in avanti sanguinanti; quando riprendete conoscenza, l'estremità sud del canyon continua sopra la sfera di pietra pomice incastrata nel baratro e vi compiacete nuovamente con voi stessi per il vostro incredibile "acume" archeologico. Un osso inciso, più luminoso di quello che sembra, sporge da una polla di limo bagnato nella parete del canyon. Lo raccogliete chiedendovi se piacerà al vostro cane e, dal momento che non potete più proseguire, tornate indietro in direzione della Sala del Tempio.
[modifica] La sfera di pietra pomice (avete indossato il casco)?
Sulla base di quanto abbiamo visto finora, il nuovo codice di Ruins non presenta delle grosse novità, a parte la funzione each_turn dell’oggetto chasm:
Object -> chasm "baratro pauroso"
with name 'oscuro' 'baratro' 'buca' 'pauroso' 'profondo',
.
.
.
each_turn [;
if (huge_ball in parent(self)) {
remove huge_ball;
Canyon_S.s_to = On_Ball;
Canyon_S.description =
"L'estremit@`a sud del canyon continua ora sopra la
sfera di pietra pomice incastrata nel baratro.";
"^La sfera di pietra pomice rotola gi@`u nel canyon senza
controllo per alcuni metri, prima di sussultare nelle
fauci del baratro. Con un piccolo rimbalzo, ti colpisce
di striscio sulla fronte: cadi in avanti sanguinante
e... la sfera di pietra pomice diventa pi@`u piccola
oppure @`e la tua mano
che cresce, perch@'e ora ti sembra di tenerla, mentre
fissi l'Alligatore, figlio di sette Macao, le teste dei
suoi ultimi avversari infilzati sulle punte, una
congregazione che scalpita per il tuo sangue, e comunque
non c'@`e nulla che tu possa fare e... ma tutto questo
non ha senso e hai un mal di testa martellante.";
}
],
has scenery open container;
Se la sfera di pietra pomice si trova nel baratro (if huge_ball in parent(self)), a ogni mossa del giocatore la direzione sud dell’oggetto Canyon_S (l’estremità inferiore del canyon) punta alla nuova locazione On_Ball (la sporgenza di pietra pomice). Per quanto riguarda invece le descrizioni, se la sfera di pietra pomice non è ancora rotolata nel baratro, Inform stampa a video il messaggio "La sfera di pietra pomice rotola giù nel canyon senza controllo..." altrimenti viene stampato a video il messaggio "L'estremità sud del canyon continua ora sopra la sfera di pietra pomice incastrata nel baratro.". Ecco la dimostrazione "pratica":
| Estremità superiore del canyon La più alta e vasta estremità a nord del canyon sale soltanto verso una parete irregolare di roccia calcarea vulcanica. |
Qualcuno di voi può ancora confondersi con la nuova parte di codice relativa alla sfera di pietra pomice (l’oggetto huge_ball):
Object -> huge_ball "enorme sfera di pietra pomice"
with name 'enorme' 'pomice' 'pietra' 'sfera',
initial
"C'@`e un'enorme sfera di pietra pomice larga circa due metri
e mezzo qui.",
description
"@`E larga circa due metri e mezzo, sebbene sembri piuttosto
leggera.",
before [;
PushDir:
if (location == Junction && second == ne_obj)
"L'entrata del Tempio non @`e abbastanza larga.";
AllowPushDir();
rtrue;
Pull, Push, Turn:
"Non dovrebbe essere cos@`i difficile farla rotolare.";
Take, Remove:
"@`E troppo ingombrante.";
],
after [;
PushDir:
if (second == n_obj) "Spingere la sfera in salita @`e
troppo faticoso.";
if (second == u_obj) <<PushDir self n_obj>>;
if (second == s_obj) "La sfera @`e difficile da fermare
una volta che @`e stata mossa.";
if (second == d_obj) <<PushDir self s_obj>>;
],
has female static;
Per quanto riguarda l’azione PushDir appartenente alla proprietà before, se il giocatore si trova all’incrocio di Xibalbá e cerca di spingere la sfera (che deve ovviamente trovarsi anch’essa lì) verso nordest, Inform stampa a video un messaggio che ci avvisa che l’entrata del Tempio non è abbastanza larga. Ricordo ancora per l’ennesima volta, che l’istruzione second si riferisce alla direzione inclusa nel comando (ad esempio "spingi la sfera a nordest", dove noun è la sfera e second è nordest)[1].
Tra le innumerevoli possibilità offerte da Inform, c’è anche quella di stabilire se un oggetto debba essere visibile o meno al buio. Ecco infatti quello che succede quando il giocatore si trova nella Sala del Tempio e prova a spegnere la lampada al sodio:
| Il Tempio Questo magnifico tempio mostra segni di scavi da preesistenti miniere di calcare, specialmente verso il lato occidentale, dove due lunghi cornicioni si dirigono verso sud. |
Per non confondere troppo le idee, ho preferito disattivare momentaneamente il daemon degli insetti carnivori . Come potete vedere, di default, se ci si trova al buio Inform non riconosce nessun oggetto all’infuori di quelli contenuti nell’inventario del giocatore. Quando però uno di essi viene posato a terra, diventa irriconoscibile come tutti gli altri. Ora, questa situazione mi sembra alquanto irreale ed esagerata; tenendo infatti conto che la lampada al sodio si trova accanto al nostro archeologo, non credo proprio che gli risulti così difficile riuscire ad accenderla anche se si trova al buio. La funzione di libreria InScope, posta subito dopo la funzione di libreria DeathMessage, è proprio quella che fa al caso nostro:
[ InScope temp;
if (temp == player && location == thedark)
PlaceInScope(sodium_lamp);
return false;
];
Così facendo, rendiamo riconoscibile la lampada al sodio anche al buio:
| Oscurità L'oscurità intorno a te è opprimente e ti senti quasi soffocare. |
C’è un problema però: la lampada al sodio si può accendere solo se l’oggetto a cui appartiene ha l’attributo supporter. Occorre quindi fare una piccola modifica all’oggetto sodium_lamp:
if (location ~= thedark) {
if (parent(self) hasnt supporter && self notin location)
"La lampada deve essere ben posizionata prima di essere accesa.";
}
Così facendo, se si cerca di accendere la lampada in una locazione che è diversa da thedark (quando cioè non si è al buio), viene verificato che la lampada sia effettivamente posata a terra, altrimenti si procede normalmente alla sua accensione:
| Oscurità L'oscurità intorno a te è opprimente e ti senti quasi soffocare. |
Possiamo anche fare in modo che la lampada possa essere riconosciuta al buio ed accesa solo in una locazione ben precisa (ad esempio il corridoio in pendenza):
[ InScope temp;
if (temp == player && location == thedark && real_location ==
Corridor)
PlaceInScope(sodium_lamp);
return false ;
];
o dappertutto tranne che nel corridoio:
[ InScope temp;
if (temp == player && location == thedark && real_location ~=
Corridor)
PlaceInScope(sodium_lamp);
return false ;
];
In una situazione reale, se siamo al buio e procediamo a tentoni all’interno di una grande piramide sepolcrale, corriamo il serio rischio di farci male se non addirittura di perdere la vita cadendo in una buca molto profonda. Che ci crediate o no, Inform ci viene incontro anche in questo caso, mettendoci a disposizione la funzione di libreria DarkToDark. Per prima cosa, occorre definire una variabile globale denominata dark:
. . . Include "VerbLib"; Include "replace";
Global dark;
che vale false anche se non viene esplicitamente dichiarato. Segue poi la parte di codice relativa alla funzione vera e propria, che va posizionata subito dopo la funzione di libreria DeathMessage (o eventualmente InScope se presente):
[ DarkToDark;
if (dark == false) {
dark = true;
"@`E pericoloso procedere con il buio; potresti cadere in una
buca...";
}
if (random(3) == 1)
{
deadflag = 3;
"Sei caduto in una buca e ti sei rotto tutte le ossa!";
}
rfalse; !o return false;
];
La variabile dark viene immediatamente testata: se vale false, le viene allora assegnato il valore true e viene stampato a video il relativo messaggio; altrimenti, si passa alla seconda if, dove viene generato un numero casuale da 1 a 3 a ogni mossa del giocatore. Se non "esce" il numero 1 il gioco può proseguire:
| Il Tempio Questo magnifico tempio mostra segni di scavi da preesistenti miniere di calcare, specialmente verso il lato occidentale, dove due lunghi cornicioni si dirigono verso sud. |
altrimenti, ecco la fine che fa il nostro povero archeologo:
| Oscurità L'oscurità intorno a te è opprimente e ti senti quasi soffocare. |
[modifica] Note