Inform e Glulx/Inform e ancora Inform/Gli NPC (o PNG in italiano): differenze tra le versioni
m Bot: sintassi dei link |
m Bot: sostituzione tag obsoleti |
||
Riga 3: | Riga 3: | ||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>La signora Bindi<br> |
||
di Vincenzo Scarpa e Paolo Lucchesi<br> |
di Vincenzo Scarpa e Paolo Lucchesi<br> |
||
Avventura d'esempio per gestire un NPC.<br><br> |
Avventura d'esempio per gestire un NPC.<br><br> |
||
Riga 23: | Riga 23: | ||
Non credi che la signora Bindi sia interessata alle tue attenzioni.<br><br> |
Non credi che la signora Bindi sia interessata alle tue attenzioni.<br><br> |
||
>chiedi alla signora Bindi del giornale<br> |
>chiedi alla signora Bindi del giornale<br> |
||
"È il giornale di oggi."</ |
"È il giornale di oggi."</code> |
||
|} |
|} |
||
La signora Bindi è il nostro PNG per eccellenza, poiché reagisce ai comandi "sociali" (grazie alla proprietà < |
La signora Bindi è il nostro PNG per eccellenza, poiché reagisce ai comandi "sociali" (grazie alla proprietà <code>life</code> che in un oggetto di questo tipo deve essere sempre presente). Ma non è finita: |
||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>>z<br> |
||
Il tempo passa.<br><br> |
Il tempo passa.<br><br> |
||
>z<br> |
>z<br> |
||
Riga 40: | Riga 40: | ||
Il tempo passa.<br><br> |
Il tempo passa.<br><br> |
||
La signora Bindi si dirige verso est.<br><br> |
La signora Bindi si dirige verso est.<br><br> |
||
></ |
></code> |
||
|} |
|} |
||
Riga 46: | Riga 46: | ||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>>e<br><br> |
||
Corridoio<br><br> |
Corridoio<br><br> |
||
Puoi vedere la signora Bindi qui.<br><br> |
Puoi vedere la signora Bindi qui.<br><br> |
||
Riga 64: | Riga 64: | ||
>chiedi alla signora Bindi del pomodoro<br> |
>chiedi alla signora Bindi del pomodoro<br> |
||
"Dovrei fare più attenzione a quello che faccio. A volte sono così distratta..."<br><br> |
"Dovrei fare più attenzione a quello che faccio. A volte sono così distratta..."<br><br> |
||
></ |
></code> |
||
|} |
|} |
||
Riga 70: | Riga 70: | ||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>Soggiorno<br> |
||
Questa è una stanza molto grande. Alla tua sinistra, una finestra dà sulla strada e davanti a te puoi vedere un grosso tavolo in noce circondato ai lati da quattro sedie.<br><br> |
Questa è una stanza molto grande. Alla tua sinistra, una finestra dà sulla strada e davanti a te puoi vedere un grosso tavolo in noce circondato ai lati da quattro sedie.<br><br> |
||
C'è la signora Bindi qui, seduta sul sofà.<br><br> |
C'è la signora Bindi qui, seduta sul sofà.<br><br> |
||
Riga 97: | Riga 97: | ||
"È il giornale di oggi."<br><br> |
"È il giornale di oggi."<br><br> |
||
La signora Bindi si dirige verso nord.<br><br> |
La signora Bindi si dirige verso nord.<br><br> |
||
></ |
></code> |
||
|} |
|} |
||
Riga 103: | Riga 103: | ||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>Cucina<br> |
||
Questa è la cucina della signora Bindi, piuttosto stretta ma completa.<br><br> |
Questa è la cucina della signora Bindi, piuttosto stretta ma completa.<br><br> |
||
Puoi vedere un frigorifero (che è chiuso) e una forchetta qui.<br><br> |
Puoi vedere un frigorifero (che è chiuso) e una forchetta qui.<br><br> |
||
Riga 136: | Riga 136: | ||
>esamina il frigorifero<br> |
>esamina il frigorifero<br> |
||
È tutto sporco di sugo di pomodoro.<br><br> |
È tutto sporco di sugo di pomodoro.<br><br> |
||
></ |
></code> |
||
|} |
|} |
||
Prima del suo arrivo, il frigorifero in questione è pulito e chiuso. Noi lo apriamo, e quando lei arriva in cucina, lo chiude e lo sporca. Un PNG può quindi modificare anche lo stato di uno o più oggetti che non devono, tra l’altro, trovarsi necessariamente nella stanza in cui esso si trova (grazie all’istruzione < |
Prima del suo arrivo, il frigorifero in questione è pulito e chiuso. Noi lo apriamo, e quando lei arriva in cucina, lo chiude e lo sporca. Un PNG può quindi modificare anche lo stato di uno o più oggetti che non devono, tra l’altro, trovarsi necessariamente nella stanza in cui esso si trova (grazie all’istruzione <code>objectloop</code> spiegata nel [[Inform e Glulx/RUINS, l'avventura comincia/L'incrocio di Xibalbá (ma è davvero così pauroso)?|paragrafo 4.10]]). Senza contare che, tramite l’istruzione <code>move</code>, può addirittura prenderli e spostarli (si potrebbe, per assurdo, far sì che al suo arrivo in cucina, la signora Bindi prendesse - se presente - la forchetta e la mettesse nel frigorifero). A ogni modo, al ventiduesimo turno il nostro PNG esce dalla cucina ritornando nuovamente al soggiorno: |
||
{| style="width:100%;" class="wikitable" |
{| style="width:100%;" class="wikitable" |
||
|< |
|<code>Cucina<br> |
||
Questa è la cucina della signora Bindi, piuttosto stretta ma completa.<br><br> |
Questa è la cucina della signora Bindi, piuttosto stretta ma completa.<br><br> |
||
La signora Bindi è qui, intenta a fare le pulizie. Non sembra essere molto contenta.<br><br> |
La signora Bindi è qui, intenta a fare le pulizie. Non sembra essere molto contenta.<br><br> |
||
Riga 160: | Riga 160: | ||
>chiedi alla signora Bindi del frigorifero<br> |
>chiedi alla signora Bindi del frigorifero<br> |
||
È di nuovo pulito ora.<br><br> |
È di nuovo pulito ora.<br><br> |
||
></ |
></code> |
||
|} |
|} |
||
Il frigorifero adesso è di nuovo pulito e sono tutti felici e contenti<ref>La creazione di movimenti relativamente sofisticati per i personaggi non giocatori può essere semplificata con l’utilizzo della libreria < |
Il frigorifero adesso è di nuovo pulito e sono tutti felici e contenti<ref>La creazione di movimenti relativamente sofisticati per i personaggi non giocatori può essere semplificata con l’utilizzo della libreria <code>MoveClass.h</code>. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo paragrafo.</ref>. |
||
Diamo ora un’occhiata al codice (molto meno difficile di quello che a prima vista potrebbe forse sembrare): |
Diamo ora un’occhiata al codice (molto meno difficile di quello che a prima vista potrebbe forse sembrare): |
||
Riga 173: | Riga 173: | ||
]; |
]; |
||
All’inizio, diamo la locazione di partenza del gioco, la posizione iniziale del nostro PNG e facciamo partire il daemon < |
All’inizio, diamo la locazione di partenza del gioco, la posizione iniziale del nostro PNG e facciamo partire il daemon <code>Timerdaemon</code>: |
||
Object Timerdaemon |
Object Timerdaemon |
||
Riga 250: | Riga 250: | ||
has female animate; |
has female animate; |
||
la proprietà describe permette a Inform di stampare a video delle frasi personalizzate a seconda di dove il nostro PNG si trova. La proprietà < |
la proprietà describe permette a Inform di stampare a video delle frasi personalizzate a seconda di dove il nostro PNG si trova. La proprietà <code>life</code>, come abbiamo già detto, stabilisce come esso reagisce ai comandi sociali; in particolare, occorre notare le diverse risposte che esso dà quando il giocatore gli chiede delle informazioni inerenti al frigorifero: se, infatti, la signora Bindi non è ancora uscita dalla cucina viene stampato a video il messaggio "<code>"Dovrei fare più attenzione a quello che faccio. A volte sono così distratta..."</code>", mentre se è invece uscita viene stampato a video il messaggio "<code>"È di nuovo pulito ora."</code>". La proprietà <code>daemon</code> gestisce invece il movimento del PNG dove, a seconda del valore della variabile path e della locazione in cui esso si trova, viene chiamata la funzione <code>percorso_npc</code> alla quale occorre passare come parametri l’oggetto stesso (<code>self</code>) e la direzione verso la quale il PNG deve dirigersi. Per quanto riguarda, infine, il frigorifero: |
||
Object -> frigorifero "frigorifero" |
Object -> frigorifero "frigorifero" |
Versione delle 19:56, 3 ago 2018
Gli NPC (o PNG in italiano)
Sostanzialmente, i Non Player Characters o Personaggi Non Giocatori (da qui in poi PNG) altro non sono che tutti quei personaggi inclusi nel gioco all’infuori del giocatore stesso (il sacerdote mummificato in Ruins, tanto per fare un esempio, è uno di questi). Osserviamo ora il funzionamento del seguente esempio:
La signora Bindi
|
La signora Bindi è il nostro PNG per eccellenza, poiché reagisce ai comandi "sociali" (grazie alla proprietà life
che in un oggetto di questo tipo deve essere sempre presente). Ma non è finita:
>z
|
dopo altri cinque turni, la signora Bindi esce dal soggiorno e si dirige verso est. Proviamo allora a seguirla:
>e
|
In poche parole, dopo dieci turni dall’inizio del gioco la signora Bindi si sposta dal soggiorno in cucina, indipendentemente da quello che il giocatore sta facendo. E questo accade naturalmente anche se quest’ultimo non si trova nel soggiorno:
Soggiorno
|
Interessante, vero? Ma non è ancora finita. Guardate cosa accade se ci troviamo in cucina quando la signora Bindi arriva:
Cucina
|
Prima del suo arrivo, il frigorifero in questione è pulito e chiuso. Noi lo apriamo, e quando lei arriva in cucina, lo chiude e lo sporca. Un PNG può quindi modificare anche lo stato di uno o più oggetti che non devono, tra l’altro, trovarsi necessariamente nella stanza in cui esso si trova (grazie all’istruzione objectloop
spiegata nel paragrafo 4.10). Senza contare che, tramite l’istruzione move
, può addirittura prenderli e spostarli (si potrebbe, per assurdo, far sì che al suo arrivo in cucina, la signora Bindi prendesse - se presente - la forchetta e la mettesse nel frigorifero). A ogni modo, al ventiduesimo turno il nostro PNG esce dalla cucina ritornando nuovamente al soggiorno:
Cucina
|
Il frigorifero adesso è di nuovo pulito e sono tutti felici e contenti[1].
Diamo ora un’occhiata al codice (molto meno difficile di quello che a prima vista potrebbe forse sembrare):
[ Initialise; location = Corridoio_sud; move Bindi to Soggiorno; Startdaemon (Timerdaemon); ];
All’inizio, diamo la locazione di partenza del gioco, la posizione iniziale del nostro PNG e facciamo partire il daemon Timerdaemon
:
Object Timerdaemon with tm 0, daemon [; switch (++self.tm) { 10: Bindi.path = 1; Startdaemon(Bindi); 22: Bindi.path = 2; Startdaemon(Bindi); 38: StopDaemon(self); deadflag = 3; } ];
quest’ultimo, conta i turni ed esegue certe azioni in turni ben precisi. In particolare, al decimo turno attiva il daemon della signora Bindi sul primo percorso (alla decima mossa cioè del giocatore, la signora Bindi si dirige dal salotto alla cucina), mentre al ventiduesimo turno essa si dirige dalla cucina nuovamente al soggiorno. Al trentottesimo turno, poi, viene fermato il gioco. Per quanto riguarda invece la signora Bindi:
Object Bindi "signora Bindi" with name 'signora' 'bindi' 'Bindi', article "la", describe [; switch (location) { Soggiorno: if (self.path < 2) "^C'@`e la signora Bindi qui, seduta sul sof@`a."; "^La signora Bindi @`e qui, intenta a guardare la televisione."; Cucina: "^La signora Bindi @`e qui, intenta a fare le pulizie. Non sembra essere molto contenta."; } ], description "@`E molto bella.", life [; Attack, ThrowAt: "Non oseresti mai far del male ad una povera signora indifesa."; Kiss: "Non credi che la signora Bindi sia interessata alle tue attenzioni."; Show: "~@`E ", (a) noun, "~, dice la signora Bindi."; Give: "~No, grazie, ", (the) noun, " non mi serve.~"; Ask, Tell: switch(second) { 'forchetta': "~@`E l'unica rimasta di tutto il servito.~"; 'giornale': "~@`E il giornale di oggi.~"; 'frigo', 'frigorifero', 'sugo', 'pomodoro': if ((TimerDaemon.tm >=12) && (self.path < 2)) "~Dovrei fare pi@`u attenzione a quello che faccio. A volte sono cos@`i distratta...~"; if (self.path >= 2) "~@`E di nuovo pulito ora.~"; } "~Non ne so niente, mi spiace.~"; ], path 0, daemon [; switch (self.path) { 1: switch(parent(self)) { Soggiorno: percorso_npc(self, e_obj); rtrue; Corridoio_nord: percorso_npc(self, n_obj); rtrue; Corridoio_cucina: percorso_npc(self, n_obj); ! se il giocatore è in cucina e il frigorifero è aperto... if ((player in Cucina) && (frigorifero has open)) print "^La signora Bindi chiude il frigorifero sporcandolo con le mani imbrattate di sugo di pomodoro.^"; ! se il giocatore è in cucina e il frigorifero è chiuso... if ((player in Cucina) && (frigorifero hasnt open)) print "^La signora Bindi apre il frigorifero (sporcandolo con le mani imbrattate di sugo di pomodoro) e, dopo un attimo di esitazione, lo richiude .^"; give frigorifero ~open; StopDaemon(self); rtrue; } 2: switch(parent(self)) { Cucina: percorso_npc(self, s_obj); rtrue; Corridoio_cucina: percorso_npc(self, s_obj); rtrue; Corridoio_nord: percorso_npc(self, w_obj); StopDaemon(self); rtrue; } } ], has female animate;
la proprietà describe permette a Inform di stampare a video delle frasi personalizzate a seconda di dove il nostro PNG si trova. La proprietà life
, come abbiamo già detto, stabilisce come esso reagisce ai comandi sociali; in particolare, occorre notare le diverse risposte che esso dà quando il giocatore gli chiede delle informazioni inerenti al frigorifero: se, infatti, la signora Bindi non è ancora uscita dalla cucina viene stampato a video il messaggio ""Dovrei fare più attenzione a quello che faccio. A volte sono così distratta..."
", mentre se è invece uscita viene stampato a video il messaggio ""È di nuovo pulito ora."
". La proprietà daemon
gestisce invece il movimento del PNG dove, a seconda del valore della variabile path e della locazione in cui esso si trova, viene chiamata la funzione percorso_npc
alla quale occorre passare come parametri l’oggetto stesso (self
) e la direzione verso la quale il PNG deve dirigersi. Per quanto riguarda, infine, il frigorifero:
Object -> frigorifero "frigorifero" with name 'frigorifero' 'frigo', description [; ! Se la signora Bindi non è ancora in cucina o se ne è già ! andata... if ((TimerDaemon.tm < 12) || (Bindi.path >=2)) print "Sembra essere piuttosto robusto.^"; ! Se la signora Bindi si trova in cucina... if ((TimerDaemon.tm >=12) && (Bindi.path < 2)) print "@`E tutto sporco di sugo di pomodoro.^"; ], has static container ~open openable;
quando questo oggetto viene esaminato, Inform stampa a video messaggi diversi a seconda che la signora Bindi si trovi o meno in cucina[2].
Note
- ↑ La creazione di movimenti relativamente sofisticati per i personaggi non giocatori può essere semplificata con l’utilizzo della libreria
MoveClass.h
. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo paragrafo. - ↑ Cliccate qui per scaricare il listato di questo esercizio (il file 5.08.inf).