Newsgroup: it.comp.giochi.avventure.testuali
Titolo: Inform 6: oggetti che non sono oggetti nell'inventario

Ciao a tutti! C'e' un modo per creare un inventario speciale per oggetti 
particolari come 'poesie imparate a memoria' o 'benedizioni ricevute', 
senza che ovviamente vadano a aggiungersi al peso trasportato? (e 
conteggiato da max_carried)
In particolare mi interesserebbe una disposizione del tipo
 >inventario
Stai portando:
  una pietra
  un libro
Stai indossando:
  una camicia
  una giacca
Inoltre hai con te:
  una poesia imparata a memoria
  la benedizione che ti ha dato don Peppino
(magari utilizzando un apposito attributo)
Sui manuali pero' non se ne parla e sbirciando il codice ho solo una 
funziona Inv alquanto esoterica... Ovviamente l'importante e' che poesia 
e benedizione non facciano cumulo (come gli oggetti indossati) con gli 
oggetti trasportati. Sarebbe un po' ridicolo non poter prendere una 
spada o un secchio perche' si hanno gia' una poesia e una benedizione ^__^
Grazie!
Marco

 conteggiato da max_carried)
Risponderò poi alla tua domanda (devo fare un po' di prove, ma non credo 
sia niente di impossibile).
Intanto ti consiglio anzitutto di togliere MAX_CARRIED (a meno che non 
sia strutturale a qualche puzzle); il poco realismo aggiunto non vale le 
maledizioni che ti verranno scagliate dai giocatori.
bye
-- 
Paolo Lucchesi - p...@NOSPAMpaololucchesi.it

 bye
Ciao! /m

 spada o un secchio perche' si hanno gia' una poesia e una benedizione ^__^
Io farei così:
Anzitutto definirei una classe per questi oggetti-non-oggetti, in modo 
anche da bloccare tutte le azioni (non puoi certo lasciare per strada 
una poesia... o sì?)
Class Unitem
   with
     before [;
       Examine: rfalse;
       default: "Questo non ha senso.";
     ]
   has worn;
Definiti come worn per non farli contare come cose trasportate. Se hai 
deciso di non porre limiti all'inventario (e io continuo a suggerirtelo) 
non ne hai bisogno.
Poi ridefinisci InvSub in modo che faccia l'inventario in tre fasi 
distinte. Al solito metti un 'Replace InvSub' prima degli include.
La nuova InvSub, fatta partendo da quella di verblibm.h e scopiazzando 
l'esercizio 66 del DM4, è la seguente:
[ InvSub x num;
     if (child(player) == 0) return L__M(##Inv, 1);
     if (inventory_style == 0) return InvTallSub();
     num=0;
     objectloop (x in player) {
         if ((x has worn) || (x ofclass Unitem)) { give x ~workflag; }
          else {	give x workflag; num++; }
     }
     if (num) {
         print "Stai portando";
         if (inventory_style & NEWLINE_BIT ~= 0) L__M(##Inv, 3);
	 else print " ";
         WriteListFrom(child(player), inventory_style | WORKFLAG_BIT);
         if (inventory_style & ENGLISH_BIT ~= 0) L__M(##Inv, 4);
     }
     if (inventory_style & ENGLISH_BIT ~= 0) ; else print "^";
     num=0;
     objectloop (x in player) {
         if ((x hasnt worn) || (x ofclass Unitem)) { give x ~workflag; }
          else { give x workflag; num++; give x ~worn; }
     }
     if (num) {
         print "Stai indossando";
         if (inventory_style & NEWLINE_BIT ~= 0) L__M(##Inv, 3);
          else print " ";
         WriteListFrom(child(player), inventory_style | WORKFLAG_BIT);
         if (inventory_style & ENGLISH_BIT ~= 0) L__M(##Inv, 4);
     }
     objectloop (x in player) if (x has workflag) give x worn;
     if (inventory_style & ENGLISH_BIT ~= 0) ; else print "^";
     num=0;
     objectloop (x in player) {
         if (x ofclass Unitem) { give x workflag; num++; give x ~worn; }
          else { give x ~workflag; }
     }
     if (num) {
         print "Hai con te";
         if (inventory_style & NEWLINE_BIT ~= 0) L__M(##Inv, 3);
	 else print " ";
         WriteListFrom(child(player), inventory_style | WORKFLAG_BIT);
         if (inventory_style & ENGLISH_BIT ~= 0) L__M(##Inv, 4);
     }
     objectloop (x in player) if (x has workflag) give x worn;
     #Ifndef MANUAL_PRONOUNS;
     objectloop (x in player) PronounNotice(x);
     #Endif;
     x = 0; ! To prevent a "not used" error
     AfterRoutines();
];
Piccola spiegazione: per tre volte scorro l'elenco degli oggetti 
portati, contando quelli adatti e marcandoli con l'attributo workflag 
(se necessario, tolgo temporaneamente l'attributo worn, per non far 
stampare (indossato) ), e poi lascio che se la sbrighi WriteListFrom.
Nota: nel terzo loop assumo che gli oggetti Unitem siano worn; se così 
non fosse, bisogna togliere, nel suddetto terzo loop, il comando 'give x 
~worn;' e soprattutto l'intera riga
   objectloop (x in player) if (x has workflag) give x worn;


 Ah ah! molto bene! ero proprio contrario a metterlo.
L'alternativa è quella di aggiungere un sacco, funzione già definita 
nella libreria. A me non piace molto (ho il sospetto che l'abbia usata 
solo Graham), ma YMMV.


 l'esercizio 66 del DM4, è la seguente:
[cut]
E 'sti cazzi! ^__^
1. Sono veramente ignorante di Inform 6
2. Come si puo' pensare che chi non e' un programmatore professionista 
riesca a mettere le mani in un simile maelstrom di codice?
3. Grazieeeeeeeeeeeeee :-)
Marco

 riesca a mettere le mani in un simile maelstrom di codice?
Beh, uno può rimanere sul livello base, quello da IBG o poco più, per 
intendersi; si riescono a fare cose egregie, anche se è difficile 
allontanarsi più di tanto dai comportamenti standard di Inform.
Oppure uno può chiedere aiuto per le cose più complicate; uno dei motivi 
principali per cui Inform è sempre stato più usato di Tads era la 
"comunità" più vasta.
bye
