Più avanti vedremo come Idra consenta di modificare le stesse descrizioni delle pagine in base alla situazione corrente, possibilità che ovviamente manca nei libri-gioco stampati.
Per segnalare che qualcosa è cambiato si usa una variabile, cioè un contenitore per numeri o per stringhe (scritte). Il caso più semplice è quello di una variabile che contenga solo 1 (uno) oppure 0 (zero): essa corrisponde a una casellina che può essere barrata oppure no.
Quando il giocatore chiede di salvare la situazione su disco, i valori di tutte le variabili vengono anch'essi salvati automaticamente (cioè senza che l'autore se ne debba preoccupare), in modo da poter riprendere la situazione esattamente come la si era lasciata.
Ecco alcuni esempi di nomi validi per le variabili:
v.soldi
v.uccisoDrago
v.codice313
v.ha_fame
v.x
v.viaVerdi43interno12
Esempi di nomi non validi per le variabili:
vfatto (manca il punto)
w.porta (non inizia con v.)
v._caduta (non ha una lettera dopo il punto)
v.6porte (non ha una lettera dopo il punto)
v.tic-tac (contiene un trattino)
L'uso di un nome non valido non darà necessariamente un errore, ma causerà con tutta probabilità malfunzionamenti più o meno misteriosi. È bene quindi verificare con cura di aver usato solo nomi validi, secondo le regole sopra riportate.
Attenzione però alle maiuscole e minuscole; i due nomi qui sotto riportati indicano due variabili diverse:
v.trovatoTesoro
v.trovatotesoro
Infine, dato che lo spazio disponibile per il salvataggio su disco è purtroppo assai limitato, è bene impiegare nomi piuttosto corti, specie se si usano parecchie variabili (vedi capitolo 6).
Notiamo tra l'altro che il simbolo // (doppia barra), già incontrato nel capitolo 1, introduce un commento: il resto della riga viene ignorato e serve solo come spiegazione o nota per l'autore. Per inizializzare una variabile, poniamo v.vistaStatua, si aggiunge una riga prima dell'istruzione vai() che inizia il gioco mostrando la prima pagina:// Inizia una nuova lettura: azzera le variabili di gioco e va alla prima pagina function Inizia() { vai(Introduzione) //prima pagina }
All'inizio del gioco, dunque, la variabile v.vistaStatua vale 0 (zero), a significare che la statua non è stata ancora vista. Il commento si può naturalmente tralasciare.function Inizia() { v.vistaStatua = 0 //prepara la variabile vai(Introduzione) }
Una variabile che non sia stata inizializzata contiene il valore undefined (non definito) che può causare errori o complicazioni inattese: un motivo in più per assegnare un valore iniziale significativo, ad esempio zero, a tutte le variabili di gioco nella funzione Inizia().
essa verrà mostrata più o meno in questo modo:function Statua() { titolo("Una statua misteriosa") testo("Vedi la statua di un essere mostruoso con una sola zampa.<br>") testo("Sul petto ha scritto "Blob".") scelta("Torni indietro", Atrio) scelta("Prosegui lungo il corridoio", Altare) }
Vedi la statua di un essere mostruoso con una sola zampa. Sul petto ha scritto "Blob". |
Per fare in modo che Idra ricordi di avere mostrato questa pagina, basta aggiungere una riga (che qui stacchiamo con righe vuote per evidenziarla meglio):
function Statua() { titolo("Una statua misteriosa") testo("Vedi la statua di un essere mostruoso con una sola zampa.<br>") testo("Sul petto ha scritto "Blob".") v.vistaStatua = 1 //cambia il valore della variabile scelta("Torni indietro", Atrio) scelta("Prosegui lungo il corridoio", Altare) }
Dopo aver mostrato la pagina, la variabile v.vistaStatua non conterrà più 0 (zero) ma 1 (uno), sarà cioè passata da falsa (0) a vera (1). Ciò potrà essere sfruttato per condizionare il successivo comportamento del racconto-gioco.
Questa pagina può essere mostrata in due modi diversi; se la variabile v.vistaStatua è falsa, cioè vale zero, la pagina apparirà così:function Altare() { titolo("Altare verde") testo("Ti trovi di fronte a un altare scolpito in un singolo blocco di pietra verde.") scelta("Lo osservi con curiosità", Altare2) scelta(v.vistaStatua, "Dichiari solennemente: "Blob"", Altare3) }
Ti trovi di fronte a un altare scolpito in un singolo blocco di pietra verde. |
Se invece la medesima variabile v.vistaStatua è vera, in quanto il suo valore è stato cambiato a 1 (uno) in una precedente occasione (nel nostro esempio precedente, quando il lettore ha incontrato la statua di Blob), verrà mostrata anche la seconda scelta:
Ti trovi di fronte a un altare scolpito in un singolo blocco di pietra verde. |
Poiché l'apparizione di ciascuna scelta può essere condizionata a una variabile nel modo appena descritto, una medesima pagina può presentare menu del tutto diversi, a seconda delle circostanze (più avanti vedremo come variare anche il testo stesso della pagina). Le scelte appaiono comunque nell'ordine in cui sono elencate nella descrizione della pagina.
Questa scelta verrà quindi mostrata nel caso che il lettore non disponga della chiave; possiamo aggiungere una seconda scelta da presentare nel caso opposto, quello cioè in cui la chiave sia già stata trovata:scelta(! v.chiave, "Cerchi di sfondare la porta", Pagina44)
Queste due scelte sono complementari: una sola di esse apparirà al lettore, a seconda che egli disponga o meno della chiave, ossia a seconda del valore (0 o 1, falso o vero) contenuto nella variabile v.chiave.scelta(! v.chiave, "Cerchi di sfondare la porta", Pagina44) scelta(v.chiave, "Provi ad aprire con la tua chiave", Pagina73)
Si può in questo caso condizionare l'apparizione di una scelta all'esito di un confronto; per esempio un acquisto può essere consentito solo se il giocatore dispone della somma necessaria:
Il simbolo >= significa maggiore o uguale di; la condizione è quindi vera se il contenuto della variabile v.dobloni è almeno pari al numero indicato. Se ad esempio il lettore possiede 30 dobloni, cioè se v.dobloni vale 30, avrà a disposizione due sole scelte:scelta(v.dobloni >= 3, "Chiedi un bicchiere di rum", CompraBicchiere) scelta(v.dobloni >= 10, "Chiedi una bottiglia di rum", CompraBottiglia) scelta(v.dobloni >= 75, "Chiedi una botte di rum", CompraBotte)
|
Difatti la prima condizione è vera (30 è maggiore o uguale a 3) e quindi la prima scelta è visibile, la seconda pure (30 è maggiore o uguale a 10), mentre la terza è falsa (30 è minore di 75) e perciò la scelta corrispondente non viene mostrata.
I vari confronti disponibili sono:
> (maggiore di)
>= (maggiore o uguale a)
< (minore di)
<= (minore o uguale a)
== (uguale a)
!= (diverso da)
Attenzione al penultimo punto, il confronto di uguaglianza: esso richiede un doppio segno di uguale, cioè == e non un singolo segno =.
Il simbolo && significa AND ("e" in inglese) e indica appunto che entrambi i confronti devono essere veri affinché sia vero il risultato; le parentesi non sono in questo caso strettamente necessarie, ma metterle aiuta la lettura e contribuisce a evitare errori.(v.peso < 10) && (v.forza > 72)
Il simbolo || indica invece un OR ("o" in inglese): il risultato è vero se almeno uno dei confronti è vero; l'espressione qui sotto risulta vera se il codice è esattamente 121 oppure esattamente 473:
In generale, un confronto può essere descritto da un'espressione anche molto complessa, purché essa sia valida nel linguaggio JavaScript; ovviamente non è possibile inserire un intero corso sul linguaggio in questo manuale.(v.codice == 121) || (v.codice == 473)
Una sola di queste due scelte verrà mostrata: la prima se la variabile v.paracadute è diversa da zero (vera), la seconda se v.paracadute è zero (falsa). Il lettore però non se ne accorgerà in alcun modo, ma vedrà in ogni caso la stessa scelta:scelta(v.paracadute, "Ti butti dall'aereo", Atterra) scelta(! v.paracadute, "Ti butti dall'aereo", Precipita)
|
Dal punto di vista del gioco si tratta però di due scelte diverse: la prima manda infatti alla pagina Atterra(), mentre la seconda manda alla pagina Precipita().
Poiché questa tecnica è spesso usata con la scelta "Continua", Idra offre una comoda abbreviazione per indicare due diverse destinazioni, a seconda del valore di una variabile:
Anche in questo caso il lettore vedrà una sola scelta:testo("Prendi la rincorsa e salti dal portello aperto.") continua(v.paracadute, Atterra, Precipita)
Prendi la rincorsa e salti dal portello aperto. |
E anche in questo caso verrà presentata una pagina diversa a seconda del valore contenuto nella variabile v.paracadute: la pagina Atterra() se il valore è diverso da zero, la pagina Precipita() se è zero.
«-- Precedente | 1 | 2 | 3 | 4 | 5 | 6 | 7 | A | B | Indice | Successivo --» |