Newsgroup: it.comp.giochi.avventure.testuali
Titolo: chiedere oggetti a png

Ciao a tutti,
ho litigato tutta la sera con i miei png (e con i manuali, 
tranne il DM4 perchè non mi sento ancora pronto ^_^) ma non 
riesco a farmi dare un oggetto da loro se glielo chiedo.
(Con il png transparent e l'oggetto nel suo inventario)
Ho utilizzato
 orders[;
  Give:if(second~=player or nothing)"^Rispostina scema.";
       else switch(noun)
               {nome_interno _oggetto:
                   if(oggetto in self)move -oggetto- to player;
                 etc...
Ora, stando a quanto nel GIP (Capitan Fato --> Benny) ciò 
dovrebbe gestire sia 'personaggio, dammi l'oggetto' (e lo fa)
sia 'chiedi oggetto a personaggio' ma in questo caso mi ignora 
se il png ha l'oggetto (png ha altro da fare), se invece non 
l'ha mi risponde giustamente 'non vedi nulla del genere'.
Ho provato anche una condizione in cui il png non ha l'oggetto 
che gli chiedo e con 'png, dammi l'oggetto' ho la risposta che 
voglio anche se mi riferisco a qualcosa che non è InScope.
Ciò non accade però con 'chiedi oggetto a png'.
Da solo non ne vengo a capo, dove sbaglio?
Ho provato ad utilizzare AskFor senza ottenere risultati, perchè 
non so' come implementarlo correttamente (before, orders, 
life... ?) non conoscendolo molto bene.
Ho dato anche un'occhiata al sorgente di VM (chiedi l'anello a 
Valeria) ma anche così non riesco a capire dove sbaglio.
C'è qualche volenteroso che mi possa aiutare?
Grazie in anticipo a tutti.
-- 
Postato da Alice Newsgroup: lo usi da web ma con le funzioni del newsreader 
http://newsgroup.alice.it
Gerarchie it, italia, it-alt, tin, it.binari. Unico!

                  etc...
Mancano una risposta tipo 'Tizio di consegna l'oggetto' e un return (che 
possono essere condensate in un print_ret o in una stringa tra "").
Questo frammento funziona, ad esempio:
   Orders [;
     Give: if (second ~= player or nothing) "^Rispostina scema.";
           else switch(noun) {
                chiave:
                    if (chiave in self) {
                         move chiave to player;
                         "La chiave viene consegnata nelle tue mani."
                    }
             }
   ],
Per l'oggetto non in scope ne riparliamo poi.
bye
-- 
Paolo Lucchesi - pluc...@NOSPAMtin.it

 Paolo Lucchesi - pluc...@NOSPAMtin.it
Beh, l'ho omesso nell'esempio, però nel codice sorgente la 
stringa c'è (anche perchè la trovo molto utile per verificare se 
il parser esegue effettivamente le istruzioni che gli ho dato, 
facendogli stampare anche il valore di eventuali variabili 
locali o globali, se dovessero subire dei cambiamenti a seguito 
di quelle istruzioni)
messa così (ponendo oggetto==chiave):
...
   chiave:if(chiave in self){print"^",(name)self," ti ha dato ",
             (the)noun,".^";move chiave to player;rtrue;}
          else{print"^",(name)self," non ha ",(the)noun" da 
                poterti dare.^";rtrue;}
..
Eppure con 'chiedi la chiave a Tizio' o 'chiedi chiave a Tizio' 
il parser mi risponde: 
'Tizio ha altro da fare' 
e/o 
'Non vedi nulla del genere'
(ho cambiato più volte la riga di codice e non ricordo l'esatta 
risposta nel caso sopra, so che è importante perché si può già 
avere qualche indizio sapendo quale risposta di libreria viene 
stampata, ma ora mi sfugge...)
Ma se invece digito: 
'Tizio, dammi la chiave' 
tutto ok, e se Tizio non ha la chiave in self mi risponde cmq 
'Tizio non ha la chiave da poterti dare'.


 'Non vedi nulla del genere'
Mi mandi un frammento di codice un po' piu' consistente?


 Paolo Lucchesi - pluc...@NOSPAMtin.it
Certamente, appena arrivo at home, posto.
Grazie.


Ciao a tutti.
Vediamo se riesco a farcelo stare in un modo un po' ordinato:
orders[;
Give: 
if(second ofclass(Personaggio))
 switch(noun)
 {
 ane_f:
  if(parent(ane_f)~=self)
   {style underline;print"^",(name)self," non ha ",(the) 
noun,".^";style roman;rtrue;}
  else{if(ane_aq in second)
   {if(second==player){style underline;print"^Meglio di no, hai 
già ",(the)ane_aq,".^";style roman;rtrue;}
    if(second~=player){style underline;print"^Meglio di no, ",
(the)second," ha già ",(the)ane_aq,".^";style roman;rtrue;}
   }
  else{self.totale--;second.totale++;
       if(second.totale<3)
        {style underline;print"^",(name)self;
     if(second==player){print" ti ha dato ",(name)ane_f,".^";
                        move ane_f to player;rtrue;}
     if(second~=player){print" ha dato a ",(the) second," ",
                       (name)ane_f,".^";
                        move ane_f to second;rtrue;}
        }
       else{style underline;print"^Meglio di no, ";
            if(second==player){print"poi ne avresti troppi.^";
                               style roman;rtrue;}
            if(second~=player){print"poi ne avrebbe troppi.^";
                               style roman;rtrue;}
           }
          }
         }
        }
 else{style underline;print"^Ha senso secondo te?^";
      style roman;rtrue;}
        ],
Precisazioni
- ane_f e ane_aq sono oggetti ofclass(Anello)
- totale è una proprietà della classe Personaggio (dichiarata 
nella classe e non nei figli) che serve per 'contare' gli anelli
trasportati da ogni personaggio.
- ho usato second per estendere il comando anche a situazioni 
del tipo: ''Tizio, dai anello a Caio (e non a me)''
Tutto quanto fino a qui precisato funziona correttamente 
(testato).
Problemi
- Fintanto che ane_f è InScope (in location or in player) 
con 'Tizio, dammi l'anello' funziona come ho indicato in tutti i 
casi, compreso ''Tizio, dai anello a Caio'' ed anche ''chiedi 
l'anello a Tizio''.
- Se l'anello è in png allora 'Tizio, dammi l'anello' funziona, 
ma 'chiedi anello a Tizio' ottiene lm: Non vedi nulla del genere 
Ma class(Personaggio) has transparent animate talkable proper 
concealed!!!
- Poi ho buttato via l'anello (abstract anello to 
altra_locazione), 'chiedi anello a Tizio' lm: Non vedi nulla del 
genere'
Tizio, dammi l'anello', lm: Nessuna risposta.
Dubbio
- transparent e concealed non entreranno mica in conflitto (!?)



[cut]
Ho lottato ancora tutto ieri sera ed ho trovato una soluzione che
apparentemente funziona bene:
Per iniziare ho messo InScope tutto ciò che mi interessa solo nel
momento in cui mi interessa averlo InScope, per l'esempio
userò chiave Tizio Caio e player (ma il player può essere anche Tizio
oppure Caio)
[ Inscope temp;
       if((temp==player && parent(player)==parent(Tizio) &&
player~=Tizio) ||
         (temp==player && parent(player)==parent(Caio) &&
player~=Caio))
         {PlaceInScope(chiave);}
  ],
Così se sono nella stessa stanza di Tizio o di Caio posso comunque
fare riferimento alla chiave.
Fatto questo ho dichiarato quanto sopra nella proprietà orders della
classe personaggio.
Siccome anche il player potrebbe fare parte della classe in alcuni
casi (ovvero potrebbe essere diverso dal solito selfobj)
al comando 'Tizio, dai chiave a Caio' (quando player==Sempronio e
Sempronio ofclass Personaggio) il parser rispondeva
come se avessi digitato 'Dai la chiave a me stesso' o 'Chiedi la
chiave a me stesso'.
Dopo essermi crivellato il cervello ho provato a risolvere in questo
modo:
...
orders[;
   Give: if(self==player)rfalse;
           if(second ofclass(Personaggio))
               switch(noun)
                    {eccetera...(come da post precedente)
....
Ora tutto sembra funzionare correttamente (grazie Paolo per esserti
sbattuto, anche se ho risolto da solo apprezzo molto la tua
disponibilità, se ti è già venuto in mente un sistema più 'pulito' o
più preciso del mio sono sempre aperto ai consigli di chi ne sa un
botto e mezzo più di me... ^_^)