Newsgroup: it.comp.giochi.avventure.testuali
Titolo: [Inform] Bug nella libreria?

Cari amici,
a pag. 93 del DM4 si afferma che la fase del "Before" si articola in cinque
passaggi nel seguente ordine:
1. invocazione di GamePreRoutine()
2. chiamata dell'eventuale proprieta' "orders" del giocatore
3. chiamata delle proprieta' "react_before" di tutti gli oggetti in scope
4. chiamata della proprieta' "before" della stanza corrente
5. chiamata della proprieta' "before" dell'oggetto eventualmente specificato
Nello sviluppo della mia avventura ho riscontrato una strana anomalia che mi ha
fatto pensare ad un'inversione nell'ordine dei passi 3 e 4; in sostanza, la
proprieta' "before" della stanza veniva erroneamente invocata prima dei
"react_before" degli oggetti in scope.
La routine che realizza la funzionalita' di libreria e' la "BeforeRoutines",
presente nel file "parserm.h":
[ BeforeRoutines;
  if (GamePreRoutine()~=0) rtrue;
  if (RunRoutines(player,orders)~=0) rtrue;
  if (location~=0 && RunRoutines(location,before)~=0) rtrue;
  scope_reason=REACT_BEFORE_REASON; parser_one=0;
  SearchScope(ScopeCeiling(player),player,0); scope_reason=PARSING_REASON;
  if (parser_one~=0) rtrue;
  if (inp1>1 && RunRoutines(inp1,before)~=0) rtrue;
  rfalse;
];
In effetti, esaminando la routine e' facile notare che il "before" della stanza
viene invocato prima dei "react_before" degli oggetti in scope.
A questo punto mi chiedo se si tratti di un'errata del DM4 o di un bug nelle
librerie 6/10.
Personalmente credo che l'ordine di esecuzione specificato nel DM4 sia molto
piu' corretto di quello implementato nelle librerie: la stanza deve definire un
comportamento di base, che puo' eventualmente venire "coperto" da quello di un
oggetto in essa presente; ne consegue che la valutazione dei "react_before"
degli oggetti in scope deve avvenire prima.
Ho quindi provveduto ad effettuare un 'replace' della routine con una mia
versione conforme alle specifiche del DM4:
[BeforeRoutines;
  if (GamePreRoutine()~=0) rtrue;
  if (RunRoutines(player,orders)~=0) rtrue;
  scope_reason=REACT_BEFORE_REASON; parser_one=0;
  SearchScope(ScopeCeiling(player),player,0); scope_reason=PARSING_REASON;
  if (parser_one~=0) rtrue;
  if (location~=0 && RunRoutines(location,before)~=0) rtrue;
  if (inp1>1 && RunRoutines(inp1,before)~=0) rtrue;
  rfalse;
];
Ciao,
Paolo M.

 degli oggetti in scope deve avvenire prima.
Oddio, l'ambiguità tra le due situazioni descritte c'è effettivamente, però
riflettendoci non sono poi tanto sicuro che quello descritto nel DM4 sia più
corretto della routine implementata e neanche con quello che dici tu, cioè
che la stanza definisce un comportamento base che deve essere coperto da
quello degli oggetti. Non è che stiamo parlando di classi e oggetti derivati
che ereditano il comportamento di base ma possono sovrascriverlo. In questo
caso la stanza è, nell'object tree, semplicemente il padre di tutti gli
oggetti (compreso il player). Da un punto di vista di logica di
programmazione a me viene più naturale agire sul padre e poi sui figli e non
viceversa. Comunque le due situazioni sono senz'altro intercambiambili.
BAsta sapere l'ordine effettivo in cui le routine vengono chiamate.
Giovanni

BAsta sapere l'ordine effettivo in cui le routine vengono chiamate.
Si', sono due differenti modi di agire; l'importante e' che sia chiaro e
definito il comportamento della libreria.
Per quanto riguarda la logica di programmazione, trovo piu' opportuna la
valutazione dei "react_before" degli oggetti in scope per riuscire ad ottenere
una modellazione che, come hai notato nel tuo intervento, mutui i principi della
programmazione a oggetti.
Un esempio: definisco una classe di n stanze maleodoranti, che reagiscono con un
'before' all'azione Smell; ottengo che tutte le stanze rispondono in maniera
coerente ad un "annusa", producendo un messaggio del tipo "Un pessimo odore
permea dalle pareti."
A questo punto potrei decidere di piazzare un oggetto profumato in una sola di
queste stanze, che reagisca con un react_before all'azione Smell (senza noun),
ottenendo un coerente: "Stranamente, l'odore in questa stanza e' gradevole e
delicato".
Chiaro che si possono trovare controesempi in cui l'ordine attuale della
libreria sia utile per altri versi, pero' penso che in generale sia piu'
coerente la valutazione dei 'react_before' degli oggetti in scope.
Parere personale, ovviamente. :-)
Ciao,
Paolo M.