Una delle cose più importanti di AWS sono le condizioni. Esse
sono il cuore di ogni avventura perché dicono al programma,
all’interprete, come comportarsi in base agli input del
giocatore ed a come è stato previsto lo svolgimento della
storia.
Prenderemo ad esempio una serie di condizioni che
servono a risolvere un certo problema in Iunnuh2, La maledizione
che viene dal passato.
Cominciamo
Il problema che ho creato, prevede come scendere in un buco
che si trova sotto il sarcofago. Spostare il sarcofago rivela il
buco ma poi? Il sarcofago si trova nella locazione 25
e decido di utilizzare il marker 9 come
indicatore del fatto che il sarcofago sia stato spostato (e
quindi il buco è presente).
La sequenza corretta è:
lega la corda al sarcofago
getta la corda nel buco
Questo presuppone di avere la corda e di aver spostato il
sarcofago. Inoltre queste condizioni valgono solo nella
locazione 25 perché al di fuori di essa non c’è un sarcofago e
nemmeno un buco! Per semplificare un po’, ho deciso che fuori
dalla locazione 25 non serva a nulla legare la corda (al
sarcofago o meno) e gettare la corda nel buco. Getta la corda,
ovviamente, ci fa … buttare la corda in terra!
![](condizioni.png)
Il foglio di carta nell’immagine è dove ho
scritto, a penna, le istruzioni delle varie condizioni. Nella
parte bassa ci sono le condizioni a bassa priorità (low),
etichettate con “al di fuori della loc 25”.
Fate caso come, a fianco dell’input (es:
lega corda al sarcofago) ci sia la sequenza di istruzioni da
eseguire, in questo caso un semplice mess (stampa messaggio) che
non abbiamo nemmeno scritto preferendo scrivere direttamente il
messaggio con a fianco il numero d’ordine nell’elenco dei
messaggi. Praticamente, nell’editor delle condizioni a bassa
priorità abbiamo scritto:
IF VERB lega AND NOUN corda AND NO2EQ
sarcofago THEN MESS 215 WAIT ENDIF
Il messaggio 215 è: E dove lo vedi un
sarcofago?
Abbiamo giocato sul fatto che, come detto, al
di fuori della locazione 25 non ci sono sarcofagi e certe azioni
hanno poco senso. Inoltre scrivere così ci fa preparare tutti i
messaggi prima di inserirli in AWS. In effetti possiamo fare
così anche con i verbi e i nomi. Poi, una volta inseriti,
riportiamo i loro numeri sul foglio di carta, che rimane come
traccia leggibile di quel che abbiamo fatto. Anche perché è più
semplice ricostruire il problema che non analizzando solamente
il codice inserito nelle condizioni in AWS.
Ricordate che la parte IF delle condizioni
viene eseguita una riga dopo l’altra finchè non se ne trova una
che è soddisfatta. A quel punto si esegue la parte dopo il THEN,
le azioni. Se c’è un WAIT si esce dal ciclo delle condizioni,
altrimenti si continua. Notate come nelle condizioni ad alta
priorità, che vanno eseguite tutte, non ci siano WAIT. In quelle
locali e quelle a bassa priorità invece si.
Passiamo ora la cuore del problema, le
condizioni locali. Ho bisogno di altri due
marker, il 16 ed il 18. Il 16 sarà ON se la corda è stata
legata al sarcofago, il 18 sarà on se la corda scende nel buco.
Le azioni da analizzare sono:
lega la corda
lega la corda al
sarcofago
getta la corda
getta la corda nel buco
ovviamente diamo per scontato di avere
la corda. Se diciamo LEGA LA CORDA e basta, ci becchiamo come
risposta “E dove dovrei legarla?”. E’ un aiuto che diamo al
giocatore, un suggerimento che implicitamente gli dice che manca
qualcosa nella frase, molto meglio di un “Non posso”.
Scrivere invece LEGA LA CORDA AL SARCOFAGO ci da come risposta
“Fatto. Ho legato la corda ad una delle zampe del sarcofago” ed
imposta il marker 16 (corda legata) ad ON. Di nuovo, ricordate
che nel codice andremo anche a scrivere la parte in cui diciamo
la stessa frase ma non abbiamo la corda.
Passiamo ora a getta la corda e getta
la corda nel buco.
GETTA LA CORDA, molto semplicemente, fa
deporre la corda sul pavimento.
Simpatico è invece il caso di GETTA LA
CORDA NEL BUCO. Se un capo è stato legato al sarcofago (marker
16 ON), allora l’altro capo finisce nel foro. Si imposta il
marker 18 a ON (corda nel buco) e si scrive il messaggio
“L’altro capo della corda cala nel buco”.
E se non ho legato
l’altro capo (marker 16 off)? Leggete il messaggio di risposta e
capirete: “La corda va giù per il buco ed atterra con un forte
tonfo sul pavimento del piano inferiore.”. Insomma, avete perso
la corda e non potete più risolvere il problema e continuare. E
non dite che è l’equivalente di una morte improvvisa e senza
ragione. Nel mondo reale, se butto una corda giù per un buco non
la recupero certo. Perciò un po’ di logica, su!
Ora non ci rimangono che le condizioni ad
alta priorità (HI). Perché? Perché abbiamo una serie di
condizioni possibili, per la precisione quattro:
non ho legato la corda al sarcofago
(marker 16 off)
ho legato la corda al sarcofago (marker 16
on)
ho gettato l’altro capo nel buco (marker 18 on)
non ho
gettato l’altro capo nel buco (marker 18 off)
La prima è la condizione iniziale e non
devo fare nulla.
La seconda fa scrivere “C’è una corda legata
ad una delle gambe del sarcofago”. In effetti il giocatore
potrebbe non avere ancora completamente risolto il problema.
La terza fa scrivere “L’altro capo della corda cala nel buco”.
L’ultima fa scrivere “La corda è sul pavimento”.
In questo
modo caratterizziamo completamente la locazione 25 e abbiamo
anche dei suggerimenti nascosti su cosa fare.
Di seguito
trovate il codice completo che ho scritto per questo problema.
Ovviamente le condizioni locali possono essere molte di più,
riferite a più problemi.
Condizioni alta priorità
IF set? 16 THEN mess 212 ENDIF
IF set? 16 AND res?
18 THEN mess 213 ENDIF
IF set? 16 AND set? 18 THEN mess 214
ENDIF
Condizioni locali per la locazione 25
IF verb 219 AND noun 8 AND no2eq 19 AND avai 8 AND res? 16 THEN
mess 211 set 16 WAIT ENDIF LEGA CORDA SARCOFAGO ho la CORDA
IF verb 219 AND noun 8 AND no2eq 19 AND res? 16 THEN mess 218
WAIT ENDIF LEGA CORDA SARCOFAGO no CORDA
IF verb 219 AND noun
8 AND no2eq 19 AND set? 16 THEN mess 217 WAIT ENDIF LEGA CORDA
SARCOFAGO già legata
IF verb 219 AND noun 8 AND no2eq 408 AND
avai 8 AND res? 16 THEN mess 211 set 16 WAIT ENDIF LEGA CORDA
zampe ho CORDA
IF verb 219 AND noun 8 AND no2eq 408 AND res?
16 THEN mess 218 WAIT ENDIF LEGA CORDA zampe no CORDA
IF verb
219 AND noun 8 AND no2eq 408 AND set? 16 THEN mess 217 WAIT
ENDIF LEGA CORDA SARCOFAGO già legata
IF verb 55 AND noun 8
AND no2eq 221 AND avai 8 AND set? 9 AND set? 16 THEN set 18 mess
221 WAIT ENDIF GETTA CORDA BUCO ho CORDA
IF VERB 55 AND NOUN
8 AND NO2EQ 221 AND AVAI 8 AND SET? 9 THEN MESS 222 TO 8 27 WAIT
ENDIF GETTA CORDA BUCO ho CORDA non legata
IF verb 219 AND
noun 8 AND avai 8 THEN mess 210 WAIT ENDIF LEGA CORDA
IF verb
220 AND noun 8 AND set? 16 THEN mess 220 WAIT ENDIF SLEGA CORDA
è legata
IF verb 220 AND noun 8 AND res? 16 THEN mess 219
WAIT ENDIF SLEGA CORDA non è legata
IF verb 50 AND noun 8 AND
avai 8 AND res? 16 THEN get 8 OKAY ENDIF PRENDI CORDA e c’è
CORDA e non è legata
IF verb 85 OR verb 215 AND noun 221 AND
set? 18 THEN mess 223 res 121 goto 27 look WAIT ENDIF SCENDI
BUCO e c’è corda legata e che scende nel buco
IF verb 85 OR
verb 215 AND noun 221 AND res? 18 THEN mess 224 quit ENDIF
SCENDI BUCO e non c’è corda legata
IF verb 85 OR verb 230 AND
noun 8 AND set? 18 THEN mess 223 res 121 goto 27 look WAIT ENDIF
SCENDI corda
IF verb 85 OR verb 230 AND noun 8 AND res? 18
THEN mess 224 exit ENDIF SCENDI corda
IF verb 85 THEN mess
227 WAIT ENDIF giù, basso
Condizioni bassa
priorità
IF verb 55 AND noun 8 AND no2eq 221 THEN
mess 216 WAIT ENDIF GETTA CORDA BUCO
IF verb 219 AND noun 8
AND no2eq 19 THEN mess 215 WAIT ENDIF LEGA CORDA SARCOFAGO
IF verb 219 AND noun 8 THEN mess 177 WAIT ENDIF LEGA CORDA
IF
verb 85 OR verb 215 AND noun 221 THEN mess 216 WAIT ENDIF SCENDI
SALTA BUCO
IF verb 85 AND noun 8 THEN mess 177 WAIT ENDIF
SCENDI CORDA
IF verb 230 AND noun 8 THEN mess 225 WAIT ENDIF
USA CORDA
IF verb 215 THEN mess 134 WAIT ENDIF SALTA
IF
verb 407 AND noun 8 THEN mess 233 WAIT ENDIF TAGLIA CORDA
Un ultimo consiglio: usate i commenti dopo ENDIF.
AWS li trascura ma a voi possono fare tanto
comodo quando dovete raccapezzarvi tra tutte le condizioni
scritte per capire come mai non viene preso in considerazione un
certo comando che invece dovrebbe funzionare.