3 - Variabili di gioco


 

indice Effetti delle azioni

In un tipico racconto-gioco è necessario tenere conto delle azioni del giocatore (e degli eventuali altri personaggi): esse possono difatti influenzare sia le scelte disponibili, sia l'esito delle scelte stesse.

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.
 

indice Nomi di variabili

In Idra i nomi di tutte le variabili di gioco devono iniziare con una v minuscola seguita da un punto, poi una lettera seguita da altre lettere, numeri o il segno di sottolineato ( _ ); per convenzione è meglio che la prima lettera sia minuscola, in modo da non confondersi con i nomi delle funzioni che rappresentano le pagine (vedi capitolo 2).

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).
 

indice Preparare una variabile

È buona norma (per quanto non sia formalmente obbligatorio) inizializzare le variabili di gioco che si usano, cioè assegnare loro fin dall'inizio un valore ben definito, in modo da evitare problemi in seguito. Lo si fa nell'apposita funzione Inizia() che si trova nel file gioco.js e che all'inizio contiene solo:
// Inizia una nuova lettura: azzera le variabili di gioco e va alla prima pagina

function Inizia() {
  vai(Introduzione) //prima pagina
}
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:
function Inizia() {
  v.vistaStatua = 0  //prepara la variabile
  vai(Introduzione)
}
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.

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().
 

indice Modificare la variabile

A un certo punto, ad esempio durante la presentazione di una pagina, si può decidere di cambiare il valore di una variabile, cioè il suo contenuto, per ricordarsi che si è verificato un certo evento. Se ad esempio una pagina è descritta da questa funzione (che per ora non agisce su alcuna variabile):
function Statua() {
  titolo("Una statua misteriosa")
  testo("Vedi la statua di un essere mostruoso con una sola zampa.<br>")
  testo("Sul petto ha scritto &quot;Blob&quot;.")
  scelta("Torni indietro", Atrio)
  scelta("Prosegui lungo il corridoio", Altare)
}
essa verrà mostrata più o meno in questo modo:


Una statua misteriosa

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 &quot;Blob&quot;.")

  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.
 

indice Scelte condizionate

È possibile fare in modo che una scelta venga mostrata al lettore solo se una certa variabile è vera (o, più esattamente, se è diversa da zero); basta indicare la variabile come prima cosa (tecnicamente, come primo "argomento") nella chiamata alla funzione scelta(), 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: &quot;Blob&quot;", Altare3)

}
Questa pagina può essere mostrata in due modi diversi; se la variabile v.vistaStatua è falsa, cioè vale zero, la pagina apparirà così:


Altare verde

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:


Altare verde

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.
 

indice Scelte alternative

Si può far sì che una scelta appaia solo se una data variabile è falsa, cioè se essa vale 0 (zero). Basta precedere la variabile, nella chiamata alla funzione scelta(), con un punto esclamativo:
scelta(! v.chiave, "Cerchi di sfondare la porta", Pagina44)
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)
scelta(v.chiave, "Provi ad aprire con la tua chiave", Pagina73)
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.
 

indice Quantità e confronti

Una variabile non deve necessariamente contenere i valori 1 e 0, da interpretarsi come "vero" e "falso", ma può anche ad esempio indicare una quantità, come il denaro posseduto.

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:

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)
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:


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 =.
 

indice Confronti complessi

Due o più confronti possono essere combinati in modo che il risultato sia vero soltanto se sono veri entrambi; per esempio questa espressione è vera se il valore contenuto in v.peso è minore di 10 e il valore contenuto in v.forza è maggiore di 72:
(v.peso < 10) && (v.forza > 72)
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.

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:

(v.codice == 121) || (v.codice == 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.
 

indice Destinazione variabile

Una stessa scelta può avere effetti diversi a seconda delle circostanze. Anche senza ricorrere alle tecniche più evolute descritte nei capitoli 5 e 6, c'è un semplice trucco per ottenere questo risultato:
scelta(v.paracadute, "Ti butti dall'aereo", Atterra)
scelta(! v.paracadute, "Ti butti dall'aereo", Precipita)
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:


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:

testo("Prendi la rincorsa e salti dal portello aperto.")
continua(v.paracadute, Atterra, Precipita)
Anche in questo caso il lettore vedrà una sola scelta:


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  --»