Newsgroup: it.comp.giochi.avventure.testuali
Titolo: programmazione da neofita, aiuto daemon

Salve a tutti!
Finalmente sono alle prese con la programmazione della mia prima avventura 
testuale.
Con un po' di fatica ho macinato buona parte del manuale di Inform6 e ora 
riesco a muovere i primi passi, tuttavia ho qualche difficoltà con un daemon 
(la struttura è corretta visto che nella compilazione non trova errori, solo 
non mi stampa correttamente i messaggi che ho impostato).
Qualche buona anima può aiutarmi? (sono in contatto con Marco Vallarino, ma 
mi spiace disturbare sempre lui...)
(Già che ci sono recluto volontari per il betatesting, che credo potrà 
iniziare al massimo tra un mese, visto che reputo l'avventura completa 
all'80%)
 
Grazie 

il daemon è il seguente, creato all'interno di un oggetto appositamente pensato, e viene attivato dopo che su un oggetto viene eseguita una determinata azione (ho omesso i punti 2 e 3 essendo uguali al primo):
 
Object Oggetto
 with
  daemon [;
   if (self.var1 == 0) {
    self.turns_active = 0;
    StopDaemon(self);
    rtrue;
    }
   switch (++(self.turns_active)) {
    1: if (action ~= ##Azione1) 
          {
           if (xxx in player)
            {
             self.var2++;
             "Testo1";
             }
           else print "Testo2";
           }
       else
        {
         if (yyy in player)
          {
           self.var1--;
           "Testo 3";
           }
         else print "Testo4";
         };
    4: if (self.var1 == 1) print "Testo5";
       else deadflag = true; "Testo6";
    }
   ],
 var2 0,
 var1 3,
 turns_active 0;
 
Come ho detto la compilazione non dà errori, tuttavia a me servirebbe che, dopo aver attivato il daemon, per ogni azione possibile venissero stampati solo i messaggi previsti all'interno del daemon stesso.
Quello che invece accade è che i messaggi vengono stampati correttamente, ma preceduti dal messaggio di default impostato per quella determinata azione digitata dal giocatore.
(spero di essere stato chiaro)
Qualcuno mi può aiutare?

 Quello che invece accade è che i messaggi vengono stampati correttamente, ma preceduti dal messaggio di default impostato per quella determinata azione digitata dal giocatore.
 
Se ho ben capito quello che intendi ottenere è che dopo una certa azione su di un certo oggetto, scatta un contatore e se non si compie una particolare azione in un determinato numero di turni, il giocatore muore. In più nel frattempo vuoi intercettare qualsiasi azione rendendola inefficace... 
ad esempio "apri la porta" (laddove è possibile aprire una porta) ha come risposta "non perdere tempo devi disattivare la bomba" se la bomba è stata attivata.
 
Ci sarà sicuramente un modo pulito per farlo, ma a memoria (che latita purtroppo) credo che il solo uso del Daemon non sia sufficiente, esso  viene richiamato alla fine del turno quando l'azione si è già compiuta ed ha stampato le risposte (se non ricordo male). A seconda di ciò che tu voglia permettere o non permettere credo tu debba ricorrere a seconda dei casi ad una delle seguenti routine (copioincollo dal DM4):
 
▲ The ‘Before’ stage consults your code in five ways, and occasionally it's useful to know in what order:
(1a)   The GamePreRoutine is called, if you have written one. If it returns true, nothing else happens and the action is stopped.
(1b)   The orders property of the player is called on the same terms. For more details, see §18.
(1c)   And the react_before of every object in scope, which roughly means ‘in the vicinity’. For more details, see §32.
(1d)   And the before of the current room.
(1e)   If the action has a first noun, its before is called on the same terms.
 
probabilmente per il tuo caso basta creare un'opportuna routine react_before che nel caso in cui il daemon sia attivo intercetti ogni azione ad eccezione di quella voluta.
 
dai un'occhiata anche a questo esempio per le azioni "sileziose":
http://inform-fiction.org/manual/html/sa6.html#ans3
 
 
ciao
 
marco

marcof hai colto in pieno la mia intenzione.
Avevo pensato anch'io di ricorrere al react_before, ma non sapevo dove (e come) piazzarlo.
Fino ad ora ho consultato prioritariamente il DM4 tradotto da Vincenzo Scarpa, che non riporta la casistica che mi interessa: ora darò senz'altro un'occhiata all'originale.
 
grazie.

 Avevo pensato anch'io di ricorrere al react_before, ma non sapevo dove (e come) piazzarlo.
 
non dovrebbe essere difficile ad esempio:
 
!!!LA BOMBA NELLA CANTINA
 
Object bomba "bomba" cantina
  with name 'bomba',
    description [;
          if(self.stato==1) "La bomba è innescata.";
          else "La bomba non è attiva.";
    ],
    stato 0, !il daemon attiva la bomba quando necessario
    react_before [;
          if(self.stato==1){
               if(action==##examine && noun==self)"Devi fare in fretta a disinnescare la bomba.";
               if(action==##SwitchOff){
                  self.stato=0;
                  "Bravo, hai disinnescato la bomba!";
               }
               "Non c'è tempo per altro, pensa alla bomba!!!";
          } 
    ],
  has female;
 
 
poi aggiungi un daemon che attivi la bomba ed il timer per lo scoppio.
 
ciao
 
marco
 

Non so come (è brutto a dirsi, ma purtroppo è così), ma sono riuscito a risolvere il problema del daemon (con la struttura suggeritami da marcof).
 
Ora l'avventura è praticamente pronta, mancano solo alcuni ritocchi qua e là.
Per maggiori informazioni sul tipo di avventura si può vedere qui: 
http://www.oldgamesitalia.net/forum/index.php?showtopic=20678
 
 
sono sempre alla ricerca di betatester, se siete interessati battete un colpo!