Newsgroup: it.comp.giochi.avventure.testuali
Titolo: if (location.noun==0) rfalse; giustiziato da Glulx!

Ciao a tutti, sto tentando di passare il codice della mia nuova 
avventura (quasi pronta) da Inform a Inform-Glulx con l'aiuto della 
mitica sgw.h. Purtroppo sono inciampato in un errore mortale che non 
riesco a sistemare.
Nella solita routine before [; Go: della classe Room che consente a un 
PNG di seguire il player attraverso le locazioni del gioco (es. il 
ragazzo di Enigma) utilizzavo di solito la riga:
if (location.noun==0) rfalse;
per dire al programma di abbandonare la routine di spostamento del PNG 
se il player digitava una direzione in cui non si puo' andare. Questo 
non funziona in Glulx, immagino sia un problema di sintassi ma 
spulciando la GIG e la sezione del manuale di Vincenzo Scarpa dedicata a 
Glulx non ho trovato niente di risolutivo. Qualcuno di voi conosce il 
codice omologo per far funzionare questa routine?
Il resto sembra corrispondere perfettamente, nel senso che funziona e 
non da' errori (uso nomi inventati per non spoilerare):
Class Room
   with
   before [;
     Go:
       if (pippo hasnt general) rfalse; ! cioe' se il mostro pippo non 
e' stato ancora trovato
       if (location.noun==0) rfalse;
       if (noun==s_obj && porta1 in location && porta1 hasnt open) rfalse;
       if (noun==e_obj && player in sala1) rfalse;
       if (noun==e_obj && player in corridoio) rfalse;
       print "Pippo ti segue.^";
     rfalse; ],
  after [;
   Go: if (pippo has general && pippo notin location) move pippo to 
location;
   ];
Una soluzione (drastica) in realta' ci sarebbe, ma e' alquanto 
fantozziana ^__^
Grazie!
Marco

 se il player digitava una direzione in cui non si puo' andare.
Risposta breve:
   if (location.(noun.door_dir)==0) rfalse;
Risposta lunga, tecnica, pedante e barbosa:
Perï¿œ questo metodo (anche con la sintassi precedente) riesce a 
riconoscere solo se la direzione in cui ci si muove proprio non ï¿œ 
definita. Il problema ï¿œ che a una direzione puï¿œ corrispondere una 
stanza, una porta (aperta o chiusa), una stringa o - peggio ancora - una 
routine che fa un sacco di considerazioni e poi decide dove porta quella 
direzione. E quindi ti costringe a considerare un sacco di casi particolari.
Puoi gestire stringhe e porte aggiungendo un paio di condizioni:
   if (location.(noun.door_dir) ofclass string) rfalse;
   if (location.(noun.door_dir) hasnt open) rfalse;
Ho fatto solo prove veloci, ma dovrebbero andare (ma le porte le 
proverei bene, prima di fidarmi).
Un commento generico: non mi piace granchï¿œ che sia la stanza a occuparsi 
del png. Sarebbe meglio IMHO che il png si gestisse da solo.
Lo puoi fare con una ReactBefore per il messaggio (copia esattamente 
quello che faceva la before della stanza) e con un Daemon per il 
movimento (o al limite nell'entry point NewRoom che pare fatto apposta).
Inutile nota tecnica: La forma location.noun ï¿œ proprio sbagliata, e 
funziona in z-code solo per puro caso: noun ï¿œ un oggetto, ad esempio 
n_obj, mentre noun.door_dir ï¿œ la property corrispondente, n_to.
BTW, l'avevi trovata da solo, o l'hai letta da qualche parte?
Ah, ci dici la soluzione fantozziana?
bye
-- 
Paolo Lucchesi - p...@NOSPAMpaololucchesi.it


Ciao! scusa se scrivo qua in fondo ma non saprei proprio dove cuttare. 
La soluzione fantozziana (che utilizzo attualmente) e' di scrivere una 
riga di codice per stanza (una decina) escludendo le direzioni possibili:
if (player in Stanza1 && noun~=n_obj && noun~=s_obj) rfalse;
Facendo copia e incolla ovviamente si fa abbastanza in fretta :-)
La mitica if (location.noun==0) rfalse; l'avevo trovata proprio 
considerando che n_obj, s_obj, eccetera potevano essere trattati con 
noun. Se non l'avevo proprio 'inventata' (non ricordo), l'avevo trovata 
sulla BIG, che usavo all'epoca. Con Enigma funzionava benissimo. Invece 
i discorsi relativi a porte, messaggi e routine li avevi presi casi per 
caso (e quindi riga per riga) trattandosi solo di due porte e tre altri 
ostacoli (e quindi soltanto cinque righe di codice). Fantozzi rules! :-D
Approfitto per chiederti ancora una cosa per un gioco che mi piacerebbe 
scrivere piu' avanti. C'e' qualche guida/sito/manuale dedicato in 
particolare ai cambi di personaggi? (tipo il facocero di Ruins)
Dopo ti dico se son riuscito a arrangiarmi con i tuoi suggerimenti.
Grazie e alla prossima!
Marco

 Dopo ti dico se son riuscito a arrangiarmi con i tuoi suggerimenti.
Ti ripeto, se cambi location.noun con location.(noun.door_dir) sei
esattamente nella stessa situazione di prima (ma compila anche in glulx).
