Newsgroup: it.comp.giochi.avventure.testuali
Titolo: Inform

Ciao a tutti.. Sono un appassionato di avventure testuali, e da
qualche tempo, grazie al manuale di Vincenzo Scarpa, anche un
improvvisato scrittore di AT alle prima armi...
Vorrei avere un consiglio su come gestire un oggetto da inserire SOTTO
ad un altro... 
Grazie a tutti in anticipo.

 ad un altro...
Se ti basta una cosa da 'scoprire' (tipo GUARDA SOTTO IL LETTO) basta
gestire l'azione...
Se invece ti serve proprio una relazione spaziale nuova (METTI SOTTO,
descritto come 'sotto a' eccetera) allora la questione e' DECISAMENTE
piu' complessa.
Sarebbe necessario `clonare' tutta la gestione dell'attributo supporter
(il piu' simile del resto!) e tutta la grammatica collegata... non
impossibile, ma una discreta zappata alla libreria! Sconsiglio
decisamente ad un principiante...
Altrimenti,  come forma `intermedia' a seconda dell'effetto desiderato
potresti `simulare' la situazione con regole di scoping e
raggiungibilita', ma dipende da cosa intendi fare esattamente...

 ad un altro... 
non è così semplice, dal momento che non viene gestito immediatamente 
dalla libreria... bisogna anche pensare che dare la possibilità di 
mettere oggetti sotto/dietro altri oggetti oltre che sopra e dentro 
forse è un'estensione "eccessiva" al world model...
comunque potresti seguire l'approccio suggerito dal DM4 nell'esempio 103 
per mettere in scope un oggetto (attenzione l'esempio non è stato 
provato) e simulare un container/supporter.
Object Letto "letto"
!aggiungiamo allo scope un oggetto fittizio:
	with add_to_scope SottoIlLetto,
!se si guarda il letto ci dice anche cosa vi è sotto:
description [;  print "Puoi vedere un letto qui.^";
		if (children(SottoIlLetto)) <LookUnder Letto>;],
sottOggetto SottoIlLetto,
!se si guarda sotto il letto ci dice gli oggetti che vi sono sotto:
before [;
	LookUnder: if (~children(SottoIlLetto)) rfalse;
     			{ print "Sotto il letto ";
     		WriteListFrom(SottoIlLetto, ENGLISH_BIT+ISARE_BIT); ".";);
     PutUnder: <Insert second SottoIlLetto>;
     ],
has static;
Object SottoIlLetto "il sotto del letto";
Object gatto "Felix" SottoIlLetto
	with description [if (self in SottoIlLetto) "Felix sembra sentirsi al 
sicuro sotto il letto"; else "Felix, il tuo gatto!";],
	has proper;
Extend 'metti'
	* held 'sotto' noun -> PutUnder;
[PutUnderSub;
	...
	if ~~(noun provides sottOggetto) "Non puoi mettervi nulla sotto!";
	"ATTENZIONE NON HAI INTERCETTATO QUESTA AZIONE!";
     ];

Grazie mille a entrambi... 
Sono riuscito a gestire la casistica, più o meno come ha detto 
riktik.
Ora però non riesco a gestire l'evento di riprendermi l'oggetto 
messo sotto..
Potreste aiutarmi?
Grazie in anticipo.
Andrea.
--  
Postato da Virgilio Newsgroup: scopri i nuovi gruppi 
Eros, foto e video a 
http://newsgroup.eros.virgilio.it

 Potreste aiutarmi?
se non riesci a riprendere l'oggetto significa che non è alla portata
del il giocatore e questo non dovrebbe accadere (a meno sia una tua
scelta esplicita).
ecco dunque del codice testato e funzionante,
non ho messo spiegazioni per mancanza di tempo, ma se c'è qualcos che
non ti è chiaro di pure...
**********************************************************
Constant Story "Inform: cosa si nasconde sotto il letto?";
Constant Headline "^Una dimostrazione di come si può gestire un
oggetto sotto un altro oggetto...^
                    di Marco Falcinelli.^";
Include "Parser";
Object LibraryMessages
   with before [; Score: rtrue;];
Include "VerbLib";
Include "Replace";
[ Initialise;
   location = rLetto;
   move palla to player;
   print "^^^E' quasi ora di andare a dormire, hai messo il pigiama, ti
sei lavato i denti... ma non hai sonno.";
];
Object rLetto "La camera da letto"
   with description
      "^La tua camera da letto è tutta colorata e piena di poster alle
pareti.^",
   has light;
Object Letto "letto" rLetto
        with
            name 'letto' 'giaciglio' 'materasso' 'rete' 'coperte',
            add_to_scope SottoLetto,
            description [;  print "Il tuo letto, morbido e
confortevole.^";
!si vuole mostrare cosa vi è sotto se si esamina il letto?
!                if (children(SottoLetto)) <LookUnder Letto>;
            ],
            sottOggetto SottoLetto,
            before [;
                         PutUnder:
                                   if (noun==self && second==palla &&
gatto in SottoLetto) {
                                               move palla to location;
                                               "lanci la palla sotto il
letto, ma Felix prontamente te la ributta fuori... gli piace questo
gioco!";
                                               }
                                   if (noun==self) {move second to
SottoLetto; "Fatto!";}
                        LookUnder:
                                if (self hasnt general) {
                                            give self general;
                                            print"Vedi due occhi che ti
fissano... oddio UN MOSTRO.... ^^ ";
                                            "Ti fai coraggio e guardi
meglio... è solo FELIX, il tuo gatto!^";
                                }
                                !se si guarda sotto il letto ci dice
gli oggetti che vi sono sotto:
                                if (~~children(SottoLetto)) rfalse;
                                else {
                                        if (children(SottoLetto)==1)
print "Sotto il letto c'";
                                        else print "Sotto il letto ci";
WriteListFrom(child(SottoLetto), ENGLISH_BIT+ISARE_BIT); ".";
                                };
             ],
has static;
Object SottoLetto "sottoletto"
    with name 'sottoletto',has transparent;
Object gatto "Felix" SottoLetto
        with
            name 'Felix' 'gatto' 'micio',
            description [;
                   if (self in SottoLetto && palla in SottoLetto)
"Felix gioca felice con la pallina.";
                   if (self in SottoLetto) "Felix sembra sentirsi al
sicuro sotto il letto";
                   else "Felix, il tuo gatto!";
                ],
        has proper;
Object palla "palla"
    with name 'palla' 'pallina' 'palletta',
            description "Una semplice pallina di gomma!",
            before [;
                    take: if (self in SottoLetto && gatto in
SottoLetto) "Felix non sarebbe felice se gli togliessi la sua
pallina.";
            ],
    has female;
Include "ItalianG";
Extend 'metti' first
        * held 'sotto' noun -> PutUnder reverse;
[PutUnderSub;
        if (~~(noun provides sottOggetto)) "Non puoi mettervi nulla
sotto!";
        "ATTENZIONE L'AUTORE NON HA INTERCETTATO QUESTA AZIONE!";
     ]; 
***********************************************************

         * held 'sotto' noun -> PutUnder reverse;
il reverse è posto in modo che l'oggetto che ha altri oggetti sotto di
esso divenga il noun e l'oggetto posto sotto il second. Ciò permette
di intercettare l'azione metti x sotto y nella definizione di y (il
letto). Il che è assai più comodo di dover interecettare l'azione in
ogni oggetto x che può essere posto sotto a y.
ciao

Grazie mille per il grandissimo aiuto.
Leggendo il tuo codice mi sono accorto del motivo per cui non 
riuscivo più a riprendere l'oggetto. Non avevo messo 
l'attributo "transparent" al sottoOggetto!!
Ancora grazie.


 Grazie mille per il grandissimo aiuto.
niente,
ho messo su if-italia e su inform-italia il codice di esempio con un 
minimo di commento...
http://www.ifitalia.info/portale/modules/mydownloads/visit.php?cid=12&lid=202
ciao
marco