*****************************************************************
Verbi in Inform
(tratto dal manuale di Vincenzo Scarpa su Inform)
http://www.casalengo.it/vscarpa/inform/manuale
*****************************************************************


Vediamo allora alcuni esempi sull'utilizzo dei verbi:

Verb 'salta' * -> Jump;

Beh, questo è elementare: basta digitare SALTA che far sì che l'azione 
Jump abbia luogo. Occorre notare che, a differenza dell'azione Photograph, 
in questo caso non è necessario creare una funzione JumpSub, perché l'azione
Jump è una di quelle riconosciute da Inform come standard.

Vediamo invece la definizione del verbo scava:

Verb 'scava' * noun -> Dig
* noun 'con'/'col' held -> Dig;

Come potete vedere, 
È POSSIBILE DEFINIRE, PER UN VERBO, UNA STESSA AZIONE IN MODALITÀ DIFFERENTI. 

La prima funziona esattamente come l'azione Photograph, mentre la seconda 
presenta una novità: held. Questa parola-chiave si riferisce agli oggetti 
posseduti dal giocatore nel suo inventario: in questo caso, è possibile prevedere 
un comando del tipo 

SCAVA LA TERRA CON LA PALA

a patto però che il giocatore abbia nel suo inventario la pala medesima.
Il verbo bacia (poteva mai mancare un verbo così?) ci riserva altre novità:

Verb 'bacia' 'abbraccia'
* creature -> Kiss;

Quindi, 
È POSSIBILE DEFINIRE PIÙ VERBI PER UNA STESSA AZIONE. 

La parola-chiave creature si riferisce a tutti quegli oggetti che hanno l'attributo
animate. Invece, la definizione del verbo apri:

Verb 'apri' 'scopri'
* noun -> Open
* noun 'con'/'col'/'a' held -> Unlock;

mostra chiaramente che 
È POSSIBILE DEFINIRE AZIONI DIVERSE PER UNO O PIÙ VERBI.

Un'altra caratteristica interessante può essere poi notata per il verbo chiedi:

Verb 'chiedi' 'domanda'
* noun 'a'/'ad'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/
'alle' creature -> AskFor reverse;

In questo caso, reverse inverte di posto noun e creature, dando al giocatore la 
possibilità di digitare un comando del tipo CHIEDI AL SACERDOTE DELLE ROVINE (e 
non CHIEDI DELLE ROVINE AL SACERDOTE, come avverrebbe se si lasciasse solo AskFor).
Ecco poi, come si possono inserire delle abbreviazioni:

Verb 'esamina' 'x//' 'descrivi'
* noun -> Examine;

dove digitare ESAMINA LA CASSA e X CASSA equivale alla stessa azione.

Ci sono poi alcuni verbi che, per poter essere utilizzati, richiedono la presenza 
di almeno due oggetti visibili dal giocatore:

Verb 'lega' 'fissa' 'congiungi' 'unisci' 'allaccia' 'annoda'
* noun -> Tie
* noun 'a'/'ad'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/
'alle' noun -> Tie
* noun 'con'/'col' noun -> Tie;

come accade, ad esempio, se si digita un comando del tipo LEGA LA CORDA AL LAMPADARIO,
dove abbiamo appunto due oggetti: la corda (il primo noun) e il lampadario (il secondo
noun). Ricordatevi però, che per testare in Inform un'azione di questo tipo occorre 
rifarsi al seguente codice:

Tie: if (noun == corda && second == lampadario)...

Un'altra esigenza, potrebbe essere legata al fatto che alcuni verbi possono essere 
utilizzati con più oggetti alla volta:

Verb 'prendi' 'trasporta' 'afferra' 'raccogli'
* multi -> Take
* multiinside 'da'/'dal'/'dallo'/'dalla'/'dall^'/
'dagli'/'dalle'/'dai' noun -> Remove;
Verb 'metti'
* held -> Wear
* 'gi@`u'/'giu' multiheld -> Drop
* multiheld 'gi@`u'/'giu' -> Drop
* multiexcept 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'
/'negli'/'nelle'/'nei' noun -> Insert
* multiexcept 'su'/'sul'/'sullo'/'sull^'/'sulla'/'sui'/
'sugli'/'sulle'/'sopra' noun -> PutOn;

In questi esempi, il giocatore ha la possibilità di digitare dei comandi del tipo 
PRENDI IL FUNGO E LA MAPPA (multi), oppure 
PRENDI IL GIORNALE E LA MACCHINA DALLA CASSA (multiinside, agisce su più oggetti solo 
se si trovano all'interno di un contenitore), o ancora 
METTI GIÙ LA MASCHERA, LA MAPPA E LA MACCHINA (multiheld, agisce su più oggetti solo 
se si trovano nell'inventario del giocatore) e 
METTI LA MASCHERA E LA MAPPA SULL'ALTARE (multiexcept, agisce su più oggetti ad eccezione
dell'altare stesso). 

Ovviamente, si possono anche usare forme del tipo 
PRENDI TUTTO, PRENDI TUTTE LE MONETE, LASCIA TUTTO, ecc.

Se invece dobbiamo rifarci a una direzione ben precisa, diamo allora un'occhiata alla 
definizione del verbo vai:

Verb 'vai' 'cammina' 'corri' 'va'
* 'a'/'ad'/'verso' noun=Adirection -> Go

dove noun è uguale a una direzione qualsiasi tra quelle permesse da Inform (Adirection). 
Se invece dobbiamo toglierci un vestito:

Verb 'rimuovi' 'togli'
* worn -> Disrobe

Attenzione: non si fa riferimento alle parole CORDA e LAMPADARIO, ma due oggetti denominati 
corda e lampadario (oppure a due oggetti con dei nomi qualsiasi, ma con sinonimi relativi 
rispettivamente a corda per il primo e lampadario per il secondo, presenti nelle with name
dei rispettivi oggetti di appartenenza).


Può anche verificarsi il caso in cui si abbia la necessità di ampliare, in qualche modo, 
l'utilizzo di un verbo già esistente (o meglio, già dichiarato nel file ItalianG.h). 
In questo caso si deve ricorrere all'istruzione Extend, proprio come accade in Ruins col 
verbo cerca; infatti, a livello standard, questo verbo è così definito:

Verb 'cerca' 'trova' 'ricerca' 'fruga'
* noun -> Search
* 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/
'negli'/'nelle'/'nei'/'fra'/'tra' noun
-> Search
* topic 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/
'negli'/'nelle'/'nei'/'fra'/'tra' noun
-> Consult reverse
* 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/
'negli'/'nelle'/'nei'/'fra'/'tra' noun topic
-> Consult;

Il comando che a noi interessa, come sappiamo, è un'espressione del tipo 
CERCA [NOME_SIMBOLO] SUL/NEL DIZIONARIO
che, come potete ben vedere, non è accettata di default. Ecco perché è stato necessario 
ampliare la definizione di questo verbo:

Extend 'cerca' * topic 'su'/'sul'/'sui'/'nel'/'in'/'nei'/
'dentro'/'nello'/'nella'/'negli'/
'nelle'/'sulle'/'sullo'/'sull^'/
'sulla'/'sugli' noun -> Consult;

La parola-chiave topic, come abbiamo già detto, si riferisce a un qualsiasi testo digitato
dall'utente. Volendo essere estremamente pignoli, possiamo anche usare l'istruzione 
Extend only, utile nel caso in cui si voglia estendere il significato di un solo verbo, 
appartenente però a un'azione che ne prevede più di uno:

Extend only 'cerca' * topic 'su'/'sul'/'sui'/'nel'/'in'/'nei'/
'dentro'/'nello'/'nella'/'negli'/
'nelle'/'sulle'/'sullo'/'sull^'/
'sulla'/'sugli' noun -> Consult;

Così facendo, la seguente regola grammaticale vale solo per il verbo cerca e non per i 
verbi trova, ricerca e fruga. 
Se abbiamo invece la necessità di stabilire quale riga della grammatica di un verbo 
debba essere eseguita per prima (grazie alla parola-chiave first), o per ultima (tramite 
l'utilizzo della parola-chiave last), ecco cosa dobbiamo fare:

Extend "scendi" first * -> Exit;
Extend "spingi" last
* noun 'verso'/'vicino'/'sotto' noun -> PushDir;
Se poi si vuole sostituire un verbo già esistente, si può usare la parola-chiave Replace:
Extend "leggi" replace
* -> Leggi
* noun -> Leggi;

con la quale si sostituisce, in questo esempio, il verbo leggi.
La parola-chiave meta è riservata invece solo ai comandi per il gioco (come ad esempio 
CARICA, SALVA, FINE, ecc.) e non viene usata quasi mai.
Infine è possibile, aggiungere un sinonimo a un verbo già esistente
tramite l'operatore di assegnamento =, come accade nel seguente esempio:

Verb 'perquisisci' = 'cerca';

dove perquisisci è il sinonimo in questione.