Newsgroup: it.comp.giochi.avventure.testuali
Titolo: problema con inform

APRI LA PORTA CON LA CHIAVE
(prima prendi la chiave)
Sembra essere parte dal mazzo di chiavi.
E dunque non mi apre la porta!
Io voglio che la porta venga aperta dalla chiave anche se l'oggetto chiave
sta all'interno dell'oggetto mazzo. In pratica devo evitare che il parser
vada alla routine di PRENDI CHIAVE nel momento in cui digito APRI LA PORTA
CON LA CHIAVE.
Come faccio?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Come faccio?
Premetto che è solo da una settimana che "giochiccio"
con inform, ma credo che nell'oggetto "porta", devi
aggiungere un before-open, scrivendo qualcosa del tipo:
if (mazzo_di_chiavi in player) &&
   (chiave in mazzo_di_chiavi) &&
   (second == chiave)
! ...
! ...
! gestione apertura porta
! ...
! ...
 return true;
In pratica questa subroutine serve per sostituire il
comportamento di default di Inform per l'azione
"apri la porta con la chiave", per cui il return true al
termine serve per impedire che inform gestisca lui
questa azione.
Spero di non essermi dimenticato qualcosa! Prova e fammi sapere!
Alex

 Alex
Niente da fare. Nonostante il before cerca sempre, come prima cosa, di
prendere la chiave. Ecco la situazione attuale nel dettaglio
Object    Stanza "Una stanza"
  with  description
		"Una piccola stanza quadrata con una porta.";
Object    porta "porta" Stanza
  with  description "Una comune porta.",
  		name 'porta' 
  		before [;
  			Unlock: if ((mazzo in player) && (chiave in mazzo) &&
(second==chiave)) {print "Aperta!";! ecc ecc
  				 }
			Open: if ((mazzo in player) && (chiave in mazzo) && (second==chiave))
{print "Aperta!"; !ecc ecc
  				 }
			],
	aperta false,
  	with_key chiave,
  has   door locked openable static female;
Object 	mazzo "mazzo di chiavi" Stanza
  with  description "Un pesante mazzo di chiavi multicolori.
  		Spicca, in particolare, una chiave nera.",
  	name 'mazzo' 'chiavi',
  has	transparent;
Object  chiave "chiave nera" mazzo
  with 	description "Una grossa chiave nera.",
  		name 'nera' 'chiave',
  has	female;



Il problema è che stai usando una feature di inform
(door/with key...) per cui ti consiglio o di gestire tutto tu
(lock/unlock, open/close) o di provare questo artificio
(sperando di non averti detto una stupidaggine!):
nell'oggetto "porta", al posto di:
with_key chiave
prova a mettere:
with_key [;
    if (mazzo in player && chiave in mazzo)
     second = mazzo;
      return mazzo;
   else
     return chiave;
   ];
Ciao.
Alex


Errata corrige! Meglio ancora:
 with_key [;
     if (mazzo in player && chiave in mazzo)
       if (second == chiave)


     ];
quesa sì che è bella! Se funziona sono ammirato.
Certo, il problema nasce dalla modellizzazione del mondo, in 
particolare: se il mazzo è statico, come sembra dall'esempio, perché la 
chiave e il mazzo non sono semplicemente sinonimi? In altre parole, 
perché rendersi difficile la vita se il mazzo non viene usato per nulla 
in particolare? A proposito, se non erro qualcuno aveva proprio scritto 
una libreria per gestire "mazzi di chiavi" a cui venivano aggiunte 
automaticamente tutte le chiavi che si trovavano durante l'avventura... 
carino. Forse l'autrice era Emily Short?
ciao
S

 in particolare? 
Per il semplice fatto che all'interno del mazzo dovevano trovare posto piů
chiavi che aprono porte diverse, altrimenti che razza di mazzo di chiavi
sarebbe?
Comunque o semi-deciso di eliminare il mazzo...
Ma quella libreria di cui parlavi č senz'altro interessante...


 sarebbe?
aaah, allora era l'esempio che era incompleto. Sembrava che ci fosse 
(per bellezza) un mazzo intero, ma che servisse solo una della molte 
chiavi. Nel qual caso si poteva usare direttamente come "chiave" il 
mazzo intero.
Tra l'altro mi è venuta in mente sempre un modo di gestire bene la cosa 
sempre con un mazzo dinamico: basta aggiungere un array di bit 
nell'oggetto mazzo (o comunque memorizzare una serie di variabili) 
corrispondenti alle varie chiavi (*), poi usare with_key .
Questo si implementa bene anche associando ogni chiave a un numero 
primo, assegnare al mazzo un campo di valore 1, moltiplicandogli poi il 
valore della chiave quando la si acquisisce e testando la divisibilità 
quando si vuole aprire la porta. Una cosa tipo:
with_key[;
       if (mazzo in player && <divisibile per il numero giusto>)
         return mazzo;
      else
        return <altra roba acconcia>;
      ];
insomma, apri sempre col mazzo che agisce da chiave universale, però 
solo se è "flaggato" giusto... e il test lo fa la stessa porta...
naturalmente devi cambiare anche la procedura che esamina il mazzo, con 
gli stessi criteri
ciao
S


Io in genere uso questa tecnica semplice,
vale a dire modifico l'array dei sinonimi.
Definisci il mazzo di chiavi
Object oMazzo "mazzo di chiavi" with
    name 'mazzo' 'di' 'chiavi' 'blank.',
    description "bla bla",
    etc...
Noti che l'oggetto ha 4 sinonimi, ma il quarto è indefinito.
Se in un particolare istante tu trovi la chiave, fai:
!il mazzo ora contiene la mia chiave
give oMazzo general;
!aggiungo il sinonimo chiave (ricorda che l'array è zero-based)
oMazzo.&name-->3 = 'chiave';
Nel before (Open/Unlock...) dell'oggetto oMazzo devi gestirti
le opportune risposte se tenti di aprire la porta
a seconda dell'attributo general dello stesso, questo
perché avrai un unico oggetto e quindi with_key sarà oMazzo.
bai
t