Newsgroup: it.comp.giochi.avventure.testuali
Titolo: JVenture (Modulo Base in Java): si parte...

Ciao a tutti.
Visto che un po' di gente si è fatta avanti, vediamo di trovare un punto di
partenza. Attualmente non ho un sito (o megli, ce l'avrei ma è vecchio e ha
bisogno di una sistemata) su cui pubblicare il materiale. Inoltre ha bisogno
di una ripulita e di qualche sistemazione perchè possiate cominciare ad
usarlo in tutta sicurezza.
Appena pronto, tempo qualche giorno, posso spedirlo in mail a chiunque
risponda a questo post. Intanto i requisiti: JDK o JRE 1.2 (forse anche 1.1,
non l'ho provato) per farlo girare e un buon text editor per comporre
l'avventura. Tutto il materiale su Java si può trovare sul sito della Sun:
 
http://java.sun.com/
Dimenticavo, non guasta anche un po' di pazienza per i problemi che possono
saltar fuori... :-)
Vorrei distribuirlo con l'avventura di prova finita, ma non so se farò in
tempo. In ogni caso qualcosa c'è ed è un esempio discreto per capire come
funziona. Altra cosa utile, per chi ce l'ha, è la conoscienza del
funzionamento del Modulo Base di Enrico Colombini, a cui il JVenture si
ispira in moltissime cose (GRAZIE ENRICO!).
La distribuzione prevederà una GPL, quindi è completamente free per chiunque
non lo usi a fine di lucro. I sorgenti saranno, ovviamente, inclusi, anche
se non è necessario modificarli in alcun modo per creare le avventure,
indipendentemente da quanto sono complesse (anche se richiedono codice Java
specifico).
Di seguito vi riporto un testo che ho estratto da un messaggio inviato in
mail a uno di voi. Da questo testo prenderà forma (con il dovuto tempo...)
la documentazione d'uso. Dategli un'occhiata, probabilmente ci sarà già
parecchio su cui discutere, prima ancora di vedere il programma. Inutile
dire che tutta la struttura dell'avventura, e in particolare lo scripting,
cambia in continuazione. Le linee di base rimarranno quello illustrate, ma
verrà aggiunto ancora parecchio. Quello che c'è adesso è sufficiente solo
per una avventura banale, quando sarà finito spero proprio di no. Non fatevi
scrupoli su critiche, suggerimenti, insulti... tutto fa brodo.
Grazie a tutti per aver risposto. Spero che questo sia l'inizio di un
progetto che dia soddisfazione a tutti. Se non altro, potremo dire che è
nato e cresciuto tra le mura di questo NG.
   Gianlu
INTRODUZIONE ALLO SVILUPPO DI AVVENTURE CON JVENTURE
Un'avventura e' composta da un'insieme di file di configurazione,
strutturati tutti come coppie nome-valore, del tipo:
  [SEZIONE] // Commento
  VARIABILE1= "Valore" // Oppure...
  VARIABILE2= "Valore su " \
              "piu' righe"
Magari l'impostazione non sara' delle piu' leggibili, ma a me garantisce un
buon livello di uniformita', con la quale semplifico notevolmente tutta la
parte di caricamento della definizione. L'uso degli apici, in particolare,
garantisce la possibilita' (che attualmente non c'e', ma puo' essere
facilmente aggiunta) di preformattare il contenuto, ad esempio per mostrare
una mappa, un diagramma o qualsiasi altra cosa di "semigrafico".
I file attualmente sono 5: venture (il principale), map, dictionary,
inventory e actionset. Vediamoli uno per uno.
VENTURE. Ha una sola sezione, in cui si specifica il punto di partenza
dell'avventura e poco altro (un eventuale messaggio di introduzione).
Opzionalmente, e' possibile impostare una serie di variabili di gestione del
JVenture come la directory di log, la porta d'ascolto per le connessioni
remote, ecc. Esempio:
  [BEGINNING]
  LOCATION= "PIAZZA"
  INTRO="Benvenuto nel magico mondo di KROZ, la nuova avventura in stile
Fantasy di Mario Rossi.\n"
MAP. Ogni sezione e' una locazione. Per ogni locazione definisci una
descrizione breve ed una lunga (mostrata solo la prima volta), le locazioni
adiacenti per le sei direzioni possibili (cardinali piu' alto e basso) e i
nomi degli oggetti presenti. Esempio:
  [PIAZZA]
  DESCR= "in una piazza gremita di gente" // Si considera preceduto da 'Sei
' e seguito da '.'
  LONG-DESCR= "Stai camminando nella piazza principale del borgo. Ci sono
molte persone, radunate in gruppi, " \
              "che attendono l'arrivo del podesta'."
  NORTH= "VICOLO-BUIO"
  EAST= "INGR-MANISCALCO"
  ITEMS= "SOLDO"
DICTIONARY. Il dizionario prevede la definizione delle parole da ignorare
(articoli, ecc.) e dei sinonimi per verbi e oggetti. Ci sono tre sezioni,
per ciascuna ogni variabile indica una parola principale e il suo contenuto
i suoi possibili sinonimi. Esempio:
  [IGNORE]
  IL= "LO, LA, I, GLI, LE"
  [VERBS]
  PRENDI= "RACCOGLI, ACCHIAPPA"
  SCAPPA= "CORRI, FUGGI"
  [ITEMS]
  SOLDO= "MONETA, SCUDO"
INVENTORY. L'inventario descrive gli oggetti. Ogni sezione e' un oggetto a
parte, di cui si specificano vari attributi: nome simbolico, descrizione
breve, descrizione in risposta a "guarda", descrizione di primo incontro
(cioe' mostrata la prima volta che l'oggetto viene incontrato), se e'
visibile, se e' trasportabile. Esempio:
  [SOLDO]
  DESCR= "un soldo di rame" // Si considera preceduto da 'Vedo ' e seguito
da '.'
  LOOK-DESCR= "E' un comune scudo in rame. C'e' stampata sopra l'effige del
podesta'."
  FIRST-DESCR= "Mentre cammini urti qualcosa con il piede. Fa un rumore
metallico... lo guardi e ti accorgi " \
               "che e' una moneta."
  VISIBLE= "TRUE" // Visibile, se fosse FALSE sarebbe un possibile soggetto
ma non sarebbe elencato
  CARRIABLE= "TRUE" // Trasportabile, se fosse FALSE sarebbe elencato ma non
sarebbe possibile prenderlo
ACTIONSET. La tavola delle azioni prevede due sezioni, una per le azioni
vere e proprie e una per i messaggi. Questi ultimi sono sostanzialmente dei
testi che vengono dati in risposta a qualche condizione. Un'azione e' gia'
di per se un messaggio, solo che e' collegata ad una terna LUOGO + VERBO +
OGGETTO (l'oggetto e' opzionale), mentre il messaggio no. Questo sistema
implementa la logica dell'avventura, qui entra in gioco lo scripting.
Esempio:
  [ACTIONS]
  PIAZZA:PRENDI:MONETA= "Ti allunghi per prendere la moneta e
istantanetamente una guardia ti raggiunge " \
                        "e ti arresta, con l'accusa di furto. Dopo un
processo sommario vieni sbattuto direttamente in gattabuia." \
                        "{ MORTO-DI-FAME.print }" // Stampa di un messaggio,
comando di scripting
  PIAZZA:SCAPPA= "Cominci a correre... le guardie si girano di scatto e ti
notano, pensando che tu stia fuggendo " \
                 "per qualche tipo di reato ti inseguono... e ti
raggiungono. Non avendo prove di alcun reato, ti sbattono in gattabuia " \
                 "per precauzione." \
                 "{ MORTO-DI-FAME.print }"
  [MESSAGES]
  MORTO-DI-FAME= "Dopo diversi giorni di totale isolamento, muori di fame e
di sete. Triste fine per un " \
                 "temuto mercenario come te." \
                 "{ die }" // Fine del gioco, comando di scripting
In questo caso vedi due azioni, entrambe legate ad una locazione (la stesa)
e ad un verbo. La prima e' legata anche ad un oggetto. La definizione
dell'azione e' principalmente un testo (mostrato come risposta al comando
relativo), eventualmente seguito da comandi di scripting. Le due azioni
nell'esempio rimandano alla stampa di uno stesso messaggio, in quanto la
situazione in cui il giocatore viene a trovarsi e' la medesima.
I comandi vanno racchiusi tra parentesi graffe, in modo che l'interprete
possa correttamente epurarli dal testo nel momento in cui viene
visualizzato. Inoltre, se si volessero inserire piu' comandi da eseguire in
sequenza, basta separarli con il punto e virgola.
I comandi di scripting attualmente supportati sono:
  [OGGETTO.]goto LOCAZIONE    (sposta il giocatore o un oggetto alla
locazione specificata)
  OGGETTO.hide                (nasconde un oggetto, cioe' lo rende
invisibile e imprendibile)
  OGGETTO.unhide              (ripristina un oggetto al suo stato naturale)
  VARIABILE= COSTANTE         (setta una variabile locale)
  VARIABILE++                 (incrementa una variabile locale)
  VARIABILE--                 (decrementa una variabile locale)
  MESSAGGIO.print             (mostra un messaggio e ne esegue gli eventuali
comandi di scripting)
  if (ESPRESSIONE) AZIONE     (esegue l'azione specificata, a sua volta un
comando di scripting, se l'espressione e' vera)
  die                         (termine del gioco)
  PACKAGE.CLASSE              (classe Java esterna, deve implementare
l'interfaccia Action, per i casi in cui lo scripting non e' sufficiente)
In particolare il comando "if" si presta a valutare situazioni
particolarmente complesse. I dati su cui puo' valutare l'espressione vengono
presi da un "contesto" che contiene, in forma strutturata, praticamente
tutte le informazioni run-time dell'avventura, come la posizione degli
oggetti, il loro stato, l'inventario del giocatore, lo stato dei timer,
tutte le variabili locali, ecc.

ci sto...

Pare assai interessante anzichenò.
Beh, se non sarà troppo difficile sono volentieri della partita.
Sauron5

Beh, se non sarà troppo difficile sono volentieri della partita.
Facciamo così: quando ti sei addentrato per bene nella materia mi spieghi
con calma ;-)
ciao ciao
Glorfindel
E per Glorfindel l'amato molte furono le canzoni
che si intonarono sotto i salici della Nan-tathren
mentre l'anno smoriva.

con calma ;-)
Immaginavo...
ed è pure in italiano, nemmeno in inglese, quindi dovrebbe (forse) essere ad
un livello accettabile per il tuo comprendonio (con le debite proporzioni
che esistono tra -una persona normale e te- ed -un Cray9999 e uno Spectrum
QL-)
Ok, quando avrò capito com'è ti farò sapere.
Sauron5