Newsgroup: it.comp.giochi.avventure.testuali
Titolo: Inform: far fare a NOUN il lavoro di TOPIC

Ciao,
poco fa sono incappato nell'ennesimo problema, dovuto credo alla mia scarsa
conoscenza del codice di Inform. Sto leggendo accuratamente il 'solito' DM
alla ricerca della soluzione, ma magari qualcuno di voi e' in grado di
anticiparmi :-) (temo che i ringraziamenti del nuovo Enigma saranno
chilometrici ^__^)
Ho tolto il verbo 'grida' da ItalianG per assegnargli una routine sua nel
file del gioco (ho provato anche Extend grida Replace, ma non ho ottenuto il
risultato sperato). Questa routine dovrebbe limitarsi a scrivere il TOPIC
immesso dal giocatore seguito da un punto esclamativo o, se il giocatore
scrive solo 'grida', a scrivere qualcosa tipo *Aaaaah!*. In un'altra parte
del gioco Grida va abbinato a una certa parola per far accadere un evento,
cioe' se il giocatore grida (?) 'Pippo' in presenza di un determinato
oggetto succede qualcosa, ma il tentativo di gestire quest'azione con If
(noun=='xizzy') "Fai questo"; non sembra funzionare.
Ricapitolando:
Verb "Grida"
 *               -> Grida
 * topic      -> Grida;
[ GridaSub; if (noun==0) "~Aaaaah!~";
         else {
           print "~", noun, "!~^";
           rtrue; }];
e poi nell'oggetto interessato:
before (o life, non funziona lo stesso)
[; Grida:  if (noun=='pippo') "Fai questo."; ],
Dove sbaglio?
Altra cosa: l'unico modo per far fare qualcosa a 'carica' che non sia
caricare una posizione e' toglierlo dai meta verb? il manuale mi sembra dica
cosi': i meta verb non possono essere influenzati dalle istruzioni del
gioco. Ma se devo caricare una pistola? anche in inglese non si dice 'load
gun'?
Ciao e grazie,
Marco

 gun'?
A proposito di "load gun":
E' proprio per comandi di questo tipo che nelle IF anglosassoni si usa 
"restore" e non "load" per caricare una situazione salvata.
Ti suggerirei, quindi, di cambiare il meta-verbo (ovviamente, avvisando 
chiaramente i giocatori del cambiamento rispetto agli standard ma questo 
sarebbe uno spoiler che potrebbe essere notevole.
Saluti,
PIergiorgio.

 grida ciao brutto pirla a pippo
(ammesso che tu abbia un oggetto con nome "pippo" e attributo animato nello 
scope)
Ed avrai in noun non "pippo", bensì l'oggetto che ha per nome pippo. Potrai
così avere...
[GridaTopicASub;
  !questo è il ciclo standard per creare una vera azione del gruppo 2
 
   if (BeforeRoutines())rtrue; ! esegue il before della stanza ed i 
                                ! react before, oltre al before di noun
   !questa sarebbe la così detta "during phase"
   if ( noun provides conversa ) oggetto.conversa();
   return AfterRoutines(); ! after di noun e react after degli altri-
];
Quindi potrai avere un oggetto
Object il_mio_amico_pippo "Pippo"
with
   name "pippo"
   before [;
      GridaTopicA: if ( consult_from == "ciao" ) 
        "Ahhh! Ciao, vecchio amico!";
   ]
   has animate;
O in alternativa puoi aggiungere un metodo "conversa". Ma ti consiglio 
sempre di chiamare le before e after routines delle azioni che crei, così 
gli oggetti intorno possono reagire.
Abbastanza ;)?
JC1
P.S., ovviamente puoi anche non avere il verbo Grida * "pippo" -> 
GridaPippo, e fare tutto con il topic parsing ( se consult_from == "pippo" 
allora...), ma se l'azione è davvero molto importante, avere un verbo in 
più (con la propria routine di gestione, e la possibilità di intercettare 
tale azione) può semplificarti il lavoro in seguito.

 ];
(altrimenti vai in loop ;)
JC1

 ha scritto nel messaggio
news:O17G9.12631$fa.4...@news1.tin.it...

Che dire? ti sei appena guadagnato un posto nei ringraziamenti di Enigma
:-))
Ciao e grazie 1000,
Marco
P. S. Ho scaricato War Mages, ma non l'ho ancora iniziata. Aspetto di avere
una mattina o un pomeriggio liberi. O una notte ^___^

 sarebbe uno spoiler che potrebbe essere notevole.
Suggerirei di usare "ripristina" anche nella libreria italiana generale. Mi 
sembra più chiaro e meno "intrusivo". Che ne pensate?

 ha scritto nel messaggio
news:fA8G9.17107$qF1.7...@news2.tin.it...

E' stata una delle prima cose che ho cambiato nella libreria :-))
Gia' che ci sono: ho provato la routine GridaTopicSub; ma il risultato e'
uno sconsolante:
"fqd esàccft  kg   gdlglq    rwnscy   abuw      z c         c   fs    c  ce
c        hligll
???
(naturalmente non ho gridato: "fqd esàccft  kg   gdlglq    rwnscy   abuw
z c         c   fs    c  ce c        hligll   " ;-))
Ciao,
Marco

Zerouno wrote:

Just a sec, lo compilo e ti mando la versione corretta.

 consulta il manuale sul traffico abbondante in germania
avrai consult_from == 4 (almeno in teoria), che è la prima parola che il 
parser riconosce come parte del "topic", e consult_words sarà pari a 3.
Questo però non ci è di alcun aiuto per confrontare le stringhe. Ad esempio, 
se io scrivo
(linea 100)     if ( parola == "unaparola" )
quello che fa il compilatore è di creare un oggeto stringa statico che 
contiene la stringa "unaparola", dopo di che sostituisce alla mia linea 
cento il codice
        if (parola == 1342 )
Il numero è l'indirizzo logico (neanche fisico) dell'oggetto stringa. 
Quindi, dobbiamo appoggiarci a NextWord() per fare i confronti con parole a 
noi note.
NextWord() scorre l'array parallelo di numeri (che indicano gli oggetti 
stringa a noi noti e corrispondenti a quanto immesso dal giocatore), dove 
abbiamo 0 per parole che non esistono nel nostro programma, e la parola 
"giusta" per cose che abbiamo messo nelle stringhe da qualche parte.
NextWord() inizia la scansione di tale vettore a partire dall'elemento "wn" 
e modifica wn ogni volta che viene chiamato.
Tutto chiaro?
(spiacente per l'esempio precedente che non funzionava: non mi era chiaro se 
volevi quello che l'utente diceva o se volevi RICONOSCERE quello che 
l'utente diceva, ed ho fatto un poco di confusione...)
JC1

 sembra più chiaro e meno "intrusivo". Che ne pensate?
Corro a modificare Infit.
A proposito, a tutti quelli interessati (Marco, soprattutto che sta per
rilasciare Enigma), tra qualche giorno infit 2.1.
Quasi quasi aggiungo purea 'sta cosa del verbo grida...
HAPPY INFORMING
Giovanni

<inviati & spediti>
Giovanni Riccardi wrote:

VISTO CHE CI SEI!!!
Aspetta un secondo: ho quasi trovato il modo di aggiungere gli articoli 
"lo", "gli" e "l'" (e composti) alla libreria.
Credo di averlo pronto per stasera; ma ti passerò delle mie routine che poi 
dovrai integrare, se la cosa ti interessa... E se lo hai già fatto tu, 
fammi un fischio che lascio perdere.

 Giovanni
Ciao,
Marco

 fammi un fischio che lascio perdere.
OK, ho visto che infix lo fa (non c'è scritto sul manuale... ;) ma ti 
suggerirei di aggiungere questa funzione di print:
[ ArtA o i;
   print "a";
   i = indef_mode; indef_mode = false;
   if (o has proper)
   { indef_mode = NULL; print (PSN__) o; indef_mode = i; return; }
   Articolo(o); indef_mode = i;
];
Mi serve per il mix di pronomi accusativi e complementi di termine. Ad 
esempio, confronta
"Il mago lancia la sfera di fuoco a te"
"Il mago lancia la sfera di fuoco a Taldin"
"Il mago lancia la sfera di fuoco all'orco"
Nel mio sistema i png possono fare quasi tutto quello che può fare il 
giocatore, e lo possono fare ad altri PNG o al giocatore stesso.
Io ho risolto questo tipo di problemi con:
print "Il mago lancia la sfera di fuoco ", (atytpacc) target;
at = a (può essere on = su, o of = di)
yt = "you" oppure "the" (in italiano tu oppure il/lo...)
pacc = declinazione per pronome accusativo. Invece di "tu" usa "te".
La routine è:
[atytpacc x;
        if ( x == player ) print "a te";
        if ( x has propername)
                print "a ", (name) x;
        else print (arta) x;
];
(nota arta, che dovrebbe stare in infit accanto ad artda, artsu e artin).
Ho anche una comodissma (atpacc) e compagnia:
[pron x;
        if (x == player) print "tu";
        else if (x has pluralname) print "essi";
        else if (x has neuter || x hasnt animate)
                print "esso";
        else if (x has female) print "essa";
        else print "egli";
];
[pacc x;
        if (x == player) print "te";
        else if (x has pluralname) print "loro";
        else if (x has neuter || x hasnt animate)
                print "esso";
        else if (x has female) print "lei";
        else print "lui";
];
[atpacc x;
        if (x has neuter || x hasnt animate) print "ad ";
        else print "a ";
        print (pacc) x;
];
[onpacc x;
        print "su di ", (pacc) x;
];
Infine, ho dovuto aggiungere una routine per il verbo essere; quella di 
infit non prevede che l'oggetto possa essere il giocatore, mentre nelle mie 
librerie potrebbe esserlo:
[tobe x;
        if (x == player) print "sei";
        else if (x has pluralname) print "sono";
        else
                print "@`e";
];
[ctobe x;
        if (x == player) print "Sei";
        else if (x has pluralname) print "Sono";
        else
                print "@`E";
];
[tohave x;
        if (x == player) print "hai";
        else if (x has pluralname) print "hanno";
        else print "ha";
];
[ctohave x;
        if (x == player) print "Hai";
        else if (x has pluralname) print "Hanno";
        else print "Ha";
];
Dimmi se le implementi nella prossima infit, così le levo dalla mia 
libreria. Soprattutto per il verbo essere, questo non porterebbe a nessuna 
modifica dei programmi preesistenti che usano infit.
Giancarlo.

 
NP: erano i nomi che avevo dato nella mia libreria in inglese (che non ha 
queste features), ma per la versione in italiano posso fare un "find in 
files" e cambiarli tutti: preferisco avere i nomi della libreria standard.
TNX,
Giancarlo.