Newsgroup: it.comp.giochi.avventure.testuali
Titolo: [Inform] each_turn

Cari amici,
mi sono accorto del fatto che la proprieta' "each_turn" non viene invocata
all'inizio dell'avventura (cioe' dopo la descrizione della stanza iniziale, che
la libreria considera come azione numero 1), ma solo dopo il primo input da
parte dell'utente. Del resto anche la proprieta' "daemon" (nel caso in cui il
demone sia fatto partire immediatamente) ha un comportamento analogo, il che mi
fa pensare che di fatto il passaggio dei turni venga fatto scattare solo dopo la
prima azione del giocatore.
Secondo me non e' un comportamento del tutto coerente, e mi chiedevo se qualcuno
aveva avuto la stessa impressione e aveva messo in atto qualche modifica alla
libreria in questo senso.
Ciao,
Paolo M.

Paolo Maroncelli ha scritto:

Parli della 6/10 o della nuova versione 6/11? Mi sembra che ci sia 
qualcosa del genere tra i bug corretti nella nuova versione della 
libreria...
Giovanni
-- 
Giovanni Riccardi - 
giov...@composizioni.net
 - 
http://www.composizioni.net

libreria...
Parlo della 6/10. Anche a me pare di aver letto qualcosa nella 6/11, ma ho avuto
l'impressione che si riferisse solo a far partire la numerazione dei turni da 0
anziche' da 1.
Paolo M.

 Anche a me pare di aver letto qualcosa nella 6/11,
Da tenere sempre presente:
http://www.inform-fiction.org/patches/library.html
f.

 
http://www.inform-fiction.org/patches/library.html
Allora, ho controllato e la cosa non è tra i problemi risolti nella 
nuove librerie 6/11. La questione è comunque se si tratti di un bug o 
semplicemente un comportamento poco coerente della libreria.
Il problema dovrebbe essere nell'oggetto InformLibrary in parserm.h, 
quando viene generata l'azione <Look> per descrivere la stanza iniziale 
(impostata in Initialise):
.....
        MoveFloatingObjects();
        lightflag=OffersLight(parent(player));
        if (lightflag==0) { real_location=location; location=thedark; }
        <Look>;
        for (i=1:i<=100:i++) j=random(i);
        #ifdef EnglishNaturalLanguage;
        old_itobj = itobj; old_himobj = himobj; old_herobj = herobj;
        #endif;
        while (~~deadflag)
        {
Il ciclo while è quello principale del gioco: si esce dal ciclo quando 
si muore o deadflag è impostata a 2. Il ciclo si preoccupa di prendere 
l'input del giocatore e farlo analizzare dal parser, di generare 
l'azione e quindi avviare tutte le cose di fine turno come timer, daemon 
e proprietà each_turn.
Comunque il problema si dovrebbe risolvere (non ho provato, ma così a 
occhio mi sembra giusto) nel seguente modo
        MoveFloatingObjects();
        lightflag=OffersLight(parent(player));
        if (lightflag==0) { real_location=location; location=thedark; }
        <Look>;
        self.end_turn_sequence();
Praticamente ho aggiunto solo l'ultima riga. Sempre a occhio però si 
creano degli effetti collaterali come l'aumento di 1 della variabile 
turns (e altri contenuti nella procedura end_turn_sequence).
Forse basterebbe aggiungere dopo il <Look> solo la parte finale della 
procedura end_turn_sequence (il forse dipende sempre dal fatto che non 
l'ho testato):
	   <Look>;
            scope_reason=EACH_TURN_REASON; verb_word=0;
            DoScopeAction(location);
            SearchScope(ScopeCeiling(player), player, 0);
            scope_reason=PARSING_REASON;
Che ne dite? Domani mattina segnalo comunque la cosa a Roger che si 
occupa delle patch di Inform.
HAPPY INFORMING



http://www.inform-fiction.org/patches/library.html
Grazie mille per il promemoria.
In effetti tra le segnalazioni di bug ne e' presente una che sembra avere a che
fare con la questione che ho sollevato, ma mi pare di aver capito che non si
tratti del comportamento di cui parlavo ("each_turn" scatta solo dopo il primo
input dell'utente), ma semplicemente del fatto che il numero iniziale di azioni
debba venire settato a 0 anziche' a 1.
Ciao,
Paolo M.

 
Oppure, meglio ancora, si potrebbe far partire la variabile turns da -1 
e usare la prima soluzione che ho dato.


occupa delle patch di Inform.
Francamente non so se la mia segnalazione possa o debba essere considerata un
bug, ma a livello puramente intuitivo mi aspetterei che la proprieta'
"each_turn" di un oggetto venga invocata anche al termine della prima
descrizione della stanza all'inizio dell'avventura, no?
Grazie,
Paolo M.

 descrizione della stanza all'inizio dell'avventura, no?
Mah, non so. In effetti il turn è una mossa e quando si apre l'avventura il
giocatore non ha fatto alcuna mossa.
f.

giocatore non ha fatto alcuna mossa.
OK, proviamo a fare qualche esempio concreto. Consideriamo un oggetto di
scenario "pioggia", con una proprieta' each_turn del tipo:
each_turn "La pioggia cade incessante.";
In questo caso il messaggio sul fatto che sta piovendo comparirebbe solo dopo la
prima azione del giocatore.
Ciao,
Paolo M.

 prima azione del giocatore.
Infatti. Secondo me, risolvendo il problema non si toglie nulle a quello 
che già c'è nella libreria (se voglio posso far partire each_turn anche 
dopo la prima azione) ma c'è comunque più libertà (soprattutto nel far 
partire timer e daemon subito).
Comunque ho mandato a Roger Firth la descrizione del problema con la 
soluzione.


 prima azione del giocatore.
ho mandato a roger anche quest'esempio (citandoti, naturalmente) per 
spiegare meglio quale è il problema.


spiegare meglio quale č il problema.
Ti ringrazio.
Paolo M.

 parte dell'utente.
In generale viene invocata dopo l'immissione del comando, e quando l'oggetto
a cui si riferisce è in scope.
Idem per i daemon, anche loro vengono chiamati dopo il comando. Non credo
quindi che la numerazione delle azioni c'entri... bisogna eventualmente
usare qualche trucco, forse sprecando un'azione: ad esempio inserire una
<Look> all'interno dell'initialise potrebbe riuscire ad attivare la
each_turn della stanza iniziale, se ne hai messa una. Non so, prova un po' a
provare! :-)
Ciao
Andrea