Inform e Glulx/Inform e ancora Inform/Gli NPC (o PNG in italiano): differenze tra le versioni
Nuova pagina: ==Gli NPC (o PNG in italiano)== Abbiamo già detto nel paragrafo precedente che '''i ''Non Player Characters'' o ''Personaggi Non Giocatori'' (da qui in poi PNG) altro non sono che tut... |
(Nessuna differenza)
|
Versione delle 08:17, 12 ott 2009
Gli NPC (o PNG in italiano)
Abbiamo già detto nel paragrafo precedente che 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 di Vincenzo Scarpa e Paolo Lucchesi |
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 Il tempo passa. |
dopo altri cinque turni, la signora Bindi esce dal soggiorno e si dirige verso est. Proviamo allora a seguirla:
>e Corridoio |
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 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. |
Interessante, vero? Ma non è ancora finita. Guardate cosa accade se ci troviamo in cucina quando la signora Bindi arriva:
Cucina Questa è la cucina della signora Bindi, piuttosto stretta ma completa. |
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 verso la fine del capitolo precedente). 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 Questa è la cucina della signora Bindi, piuttosto stretta ma completa. |
Il frigorifero adesso è di nuovo pulito e sono tutti felici e contenti.
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[1].
Note