Utenti:Babaoglu Engine

Wiki

Tools

Categorie

Help

edit SideBar

Una pagina a caso

Utenti.BabaogluEngine History

Show minor edits - Show changes to markup

Changed lines 27-28 from:

Un'avventura è composta da un'insieme di locazioni, oggetti, pietre miliari e NPC, più un giocatore che gira tra di essi. L'interazione tra le varie componenti del gioco è affidata principalmente agli script scritti in FScript'.

to:

Un'avventura è composta da un'insieme di locazioni, oggetti, pietre miliari e NPC, più un giocatore che gira tra di essi. L'interazione tra le varie componenti del gioco è affidata principalmente agli script scritti in FScript.

Changed lines 266-267 from:
to:

Codice sorgente: babaogluengine-0.1.src.zip

Changed lines 273-274 from:
to:
Changed lines 19-20 from:

Il Babaoglu Engine è un semplice motore per psuedo giochi di ruolo che si giocano da linea di comando. Ricorda un po' le IF (Interactive Fiction) e i MUD (Multi-User Dungeon) nel tipo di interazione col gioco, solo che non c'è opportunità di multiplayer.

to:

Il Babaoglu Engine è un semplice motore per psuedo giochi di ruolo che si giocano da linea di comando, scritto in Java e rilasciato con licenza GPL. Ricorda un po' le IF (Interactive Fiction) e i MUD (Multi-User Dungeon) nel tipo di interazione col gioco, solo che non c'è opportunità di multiplayer.

Changed lines 23-24 from:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più appariscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

to:

Il motore del gioco è scritto in Java, ma i giochi stessi no. Si utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più appariscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

Changed lines 266-274 from:
to:

Codice sorgente: Attach:babaogluengine-0.1.src.zip

Che fine han fatto i compitini?

Che fine han fatto i compitini? è un avventura per il Babaoglu Engine.

Nel file leggimi.txt ci sono le istruzioni per giocare.

Attach:compitini.zip

Added line 17:

Deleted line 18:

Added line 25:

Deleted line 26:

Added line 38:

Deleted line 39:

Added line 50:

Deleted line 51:

Added line 69:

Deleted line 70:

Added line 90:

Deleted line 91:

Added line 102:

Deleted line 103:

Added line 114:

Deleted line 115:

Added line 130:

Deleted line 131:

Added line 182:

Deleted line 183:

Added line 239:

Deleted line 240:

Added line 264:

Changed line 266 from:

to:
Changed lines 2-43 from:

Demo!

Ho pronta una demo del Babaoglu Engine, con tanto di un'avventura di prova:)

C'è un file .bat che dovrebbe funzionare sotto winzozz, cmq la sintassi è:

 java -jar babaoglu.jar demo

demo è la cartella che contiene i files del gioco. Sono files di testo, quindi guardandoli potrete capire la dinamica della piccola avventura che ho scritto: vi conviene aspettare a farlo, prima giocatela e datemi le vostre impressioni!

Faccio un riassunto dei comandi:

[vai] nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa. Esempio: vai est, nord.

apri nord|sud|est|ovest|su|giu: apre la porta corrispondente alla direzione selezionata. Attenzione: non sempre è possibile aprire tutte le porte, a volte occorrono chiavi, oppure sono semplicemente porte chiuse del tutto! Inoltre, quando si apre una porta NON si va automaticamente in quella direzione: la sequenza di comandi corretta è, per esempio:

 apri nord
 vai nord

uscite: vi dà una lista delle uscite VISIBILI della locazione in cui vi trovate.

guarda: vi dà una descrizione del posto in cui vi trovate, completa di lista di oggetti, personaggi ed uscite. Attenzione: NON tutte le uscite sono visibili, quindi, può darsi che ci siano uscite che il comando guarda inizialmente non rileva!:) Le direzioni sono sempre le solite: nord, sud, est, ovest, su, giu.

guarda <checosa>: posso guardare oggetti o personaggi. Il gioco rispetta le maiuscole, quindi rispettatele anche voi. Inoltre, i nomi degli oggetti e dei personaggi NON contengono spazi, nei comandi. Esempio: guarda Ceravolo, guarda salame.

parla <personaggio>: parla con un personaggio. Per esempio, parla Ceravolo parlerà con Ceravolo. È anche possibile indicare un argomento di conversazione, ma non tutti i PNG lo possono fare. Di solito, ma non sempre, quando un PNG dice qualcosa in MAIUSCOLO, provate a chiedergli quella cosa. Esempio: se Dario dice una frase come "mi piacciono i GATTI", potete provare a usare il comando "parla Dario gatti". Un po' rozzo, ma per ora è così:) Inoltre, se un personaggio ora non dice niente di interessante, può darsi invece che più in là abbia qualche cosa da dirvi...

prendi <nomeoggetto>: cerca di prendere l'oggetto presente. Non tutti gli oggetti sono trasportabili.

inventario oppure inv: vi dà una lista di ciò che vi portate appresso.

lascia <nomeoggetto>: lascia un oggetto del vostro inventario nel posto in cui vi trovate.

usa <oggetto>: è il comando per interagire con un oggetto. È un po' generico, quindi per ora usa può voler dire fruga o accendi e così via. Più in là vedo di fare qualcosa di più carino.

usa <oggetto> <oggettopassivo>: è un modo per utilizzare un certo oggetto SU di un altro oggetto, detto passivo. Ad esempio, usa martello chiodo cercherà di usare l'oggetto martello con l'oggetto chiodo. Un po' grezzo, ma al solito, siamo agli inizi:)

to:

Indice

Added line 18:

Added line 26:

Added line 39:

Added line 51:

Added line 70:

Added line 91:

Added line 103:

Added line 115:

Added line 131:

Added line 183:

Added line 240:

Added lines 264-265:

Download

Changed lines 15-16 from:

vai nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa. Esempio: vai est.

to:

[vai] nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa. Esempio: vai est, nord.

Changed lines 75-76 from:

... TODO ...

to:

Per evitare di salvare tutte le cose che i giocatori dicono assieme agli script, esistono i files .blabla che contengono i discorsi.

Nel file, un discorso è definito così

 [nome]
 testo, con <b>eventuali</b> tag html

I discorsi possono essere richiamati in due modi:

  • con la funzione scriviDiscorso(nome) da uno script
  • nelle descrizioni, con il loro nome preceduto da un $

Ad esempio, se ho un oggetto così

 [salame]
 tipo = oggetto
 descrizione = $salame

il Babaoglu Engine, al comando guarda salame andrà a ripescare il discorso chiamato salame.

Added lines 195-199:

salva & carica

Il comando salva serve per salvare l'evoluzione della computazione del gioco. Vi chiederà di fornire un nome di file.

Il comando carica inopinatamente serve per caricare un gioco salvato.

Deleted lines 1-2:
 :: Babaoglu Engine ::
Changed line 44 from:

Che cos'è

to:

Che cos'è

Changed line 51 from:

Come è strutturata un'avventura

to:

Come è strutturata un'avventura

Changed line 63 from:

Il file .ini

to:

Il file .ini

Changed line 74 from:

I discorsi

to:

I discorsi

Changed line 77 from:

Le locazioni

to:

Le locazioni

Changed line 97 from:

Gli oggetti

to:

Gli oggetti

Changed line 108 from:

Le pietre miliari

to:

Le pietre miliari

Changed line 119 from:

Gli NPC

to:

Gli NPC

Changed line 134 from:

Comandi del giocatore

to:

Comandi del giocatore

Changed line 163 from:

uscite

to:

uscite

Changed line 168 from:

guarda

to:

guarda

Changed line 180 from:

Gli script

to:

Gli script

Changed line 236 from:

Funzioni utilizzabili negli script

to:

Funzioni utilizzabili negli script

Changed lines 51-52 from:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più apapriscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

to:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più appariscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

Come è strutturata un'avventura

Un'avventura è composta da un'insieme di locazioni, oggetti, pietre miliari e NPC, più un giocatore che gira tra di essi. L'interazione tra le varie componenti del gioco è affidata principalmente agli script scritti in FScript'.

Fisicamente le avventure risiedono in diversi files, i quali servono a descrivere le varie componenti dell'avventura.
I files .baba servono per le gli oggetti, gli NPC e le pietre miliari.
I files .loc servono per le locazioni.
I files .script contengono gli script.
I files .blabla contengono i discorsi.
Il file .ini contiene le informazioni necessarie all'avvio del gioco.

Tutti questi files vanno messi in una cartella, e l'indirizzo di quella cartella va passato come parametro al costruttore della classe Gioco. Nella mia implementazione del Babaoglu Engine, si passa l'indirizzo della cartella da linea di comando, e questo verrà successivamente passato al costruttore di Gioco.

Il file .ini

 [inizio]
 nomeGiocatore = Dario
 descrizioneGiocatore = Studente
 locazioneIniziale = biblio001
 titoloFinestra = Gioco di prova per il Babaoglu Engine

Un file .ini deve avere la struttura qui riportata, obbligatoriamente. Tutto il resto viene ignorato.

Il formato dei files .ini viene usato anche per i .baba e i .loc, con un diverso utilizzo dei campi.

I discorsi

... TODO ...

Added lines 86-98:

Le locazioni vengono salvate in files con l'estensione .loc, il cui formato è il seguente:

 [id_della_locazione]
 nome = nome della locazione
 descrizione = descrizione della locazione
 #uscita dir = id_destinazione aperta visibile
 uscita nord = id_destinazione true true
 uscita sud = id_destinazione false false

Le righe che iniziano con # sono considerate commenti.

Per essere valida, una locazione in un file .loc deve avere i campi nome e descrizione.

Changed lines 100-101 from:

Un oggetto ha un nome e una descrizione. Il giocatore ha un inventario, che contiene un numero infinito di oggetti (ma sì! chi se ne frega:), e può avere più di una copia di uno stesso oggetto. Oggetti come le chiavi possono essere usate per aprire porte. In generale, il giocatore può usare un oggetto da solo (per esempio, usare una cornamusa per suonare un po') oppure usare un oggetto con un altro oggetto (per esempio, usare una chiave con una porta).

to:

Un oggetto ha un nome e una descrizione. Il giocatore ha un inventario, che contiene un numero infinito di oggetti, e può avere più di una copia di uno stesso oggetto. Oggetti come le chiavi possono essere usate per aprire porte. In generale, il giocatore può usare un oggetto da solo (per esempio, usare una cornamusa per suonare un po') oppure usare un oggetto con un altro oggetto (per esempio, usare una chiave con una porta).

Gli oggetti sono salvati in files con l'estensione .baba. Il formato è simile a quello delle locazioni:

 [nome oggetto]
 tipo = oggetto
 descrizione = descrizione dell'oggetto

Per essere valido, occorre indicare il campo tipo = oggetto e la descrizione. La riga tipo = oggetto serve per distinguere gli oggetti dagli NPC e dalle Pietre Miliari. Gli altri campi sono ignorati.

Added lines 113-120:

Anche le Pietre Miliari sono salvate in files .baba.

 [nome pietra miliare]
 tipo = pietra
 descrizione = descrizione della pietra miliare

La riga tipo = pietra ed il campo descrizione sono obbligatori. Altri campi saranno ignorati.

Changed lines 126-176 from:

Dati tecnici

In questa sezione sono raccolte le note relative all'implementazione del gioco e degli script.

Locazioni

La Locazione è un oggetto con i seguenti campi:

  • String nome
  • String id
  • String descrizione
  • ArrayList<Uscita> uscite
  • ArrayList<Oggetto> oggetti

Lo script di default associato ad una locazione è una funzione FScript dal nome composto così: <id>_func(). Per esempio, se la locazione Biblioteca ha id biblio, la sua funzione di default sarà chiamata biblio_func. Il motore cercherà questa funzione: se esiste, sarà eseguita.

Uscita:

  • String direzione (nord, sud, etc...)
  • Boolean visibile
  • Boolean aperta

Quando si tenta di aprire una porta con un oggetto, occorre specificarlo nel comando apri. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func(String cheCosa).

Oggetti

  • String nome
  • String descrizione
  • Boolean mobile

Un oggetto ha una funzione di default associata, di nome <nome_oggetto>_func(String cheCosa). Se l'argomento cheCosa è "niente", si attiva l'azione associata all'oggetto, per esempio suonarlo se è uno strumento musicale. Altrimenti, cheCosa può essere il nome di un altro oggetto presente nell inventario oppure un'uscita della locazione attuale. In questi casi, avverranno le azioni stabilite dallo script.

Solo gli oggetti contrassegnati con mobile possono essere messi in inventario.

Da notare che nella riga di comando il primo argomento è l'oggetto attivo, mentre il secondo è l'oggetto passivo. Ciò vuol dire che una riga di comando come usa accendino carta chiamerà la funzione carta_funz("accendino") e lo script di carta reagirà di conseguenza.

Pietra Miliare

  • String nome
  • String evento

Una pietra miliare è del tutto simile ad un Oggetto, ed è possibile associarvi una String contenente il testo che verrà comunicato al giocatore in occasione del conseguimento di tale Pietra Miliare.

Anche alle pietre miliari è associata una funzione di default, chiamata <nomepietra>_func. Quando una pietra miliare viene data al player, viene chiamata la funzione <nomepietra>_func con parametro "dai"; quando viene tolta il parametro è "togli".

NPC

  • String nome
  • String descrizione
  • String idLocAttuale

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_func(string azione, string argomento). L'azione è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio. L'argomento può essere richiesto, ad esempio, per parlare con l'NPC di uno specifico argomento.

Giocatore

  • String nome
  • inventario => ArrayList di Oggetti
  • pietreMiliari => arrayList di Pietre Miliari
to:

Anche gli NPC sono salvati nei files .baba.

 [nome NPC]
 tipo = NPC
 descrizione = descrizione dell'NPC
 proprietà 1 = valore
 proprietà 2 = valore

La riga tipo = NPC e il campo descrizione sono obbligatori. Gli altri campi sono facoltativi, e possono servire per gestire alcuni aspetti di un'avventura, in quanto sono accessibili via script.

Changed line 137 from:

Vai

to:

vai

Changed lines 142-147 from:

Apri

apri <dove> [<oggetto>]

<dove> deve essere un'uscita valida. Se presente l'argomento <oggetto>, si chiamerà lo script dell'uscita con <oggetto> come argomento, e l'oggetto deve essere presente nell'inventario.

Prendi

to:

apri

apri <dove>

<dove> deve essere un'uscita valida.

chiudi

chiudi <dove>

prendi

Changed lines 153-155 from:

<oggetto> deve essere un oggetto presente nella lista di oggetti della locazione attuale.

Lascia

to:

<oggetto> deve essere un oggetto presente nella locazione attuale.

lascia

Changed lines 158-160 from:

<oggetto> deve essere un oggetto presente nell'inventario. Se ci sono più copie dell'oggetto, ne viene lasciata 1. L'oggetto lasciato si aggiunge alla lista degli oggetti della locazione corrente.

Inventario

to:

<oggetto> deve essere un oggetto presente nell'inventario. Se ci sono più copie dell'oggetto, ne viene lasciata 1. L'oggetto lasciato rimane nella locazione corrente.

inventario

Changed line 165 from:

Uscite

to:

uscite

Changed line 170 from:

Guarda

to:

guarda

Changed line 177 from:

Usa

to:

usa

Changed lines 182-239 from:

Funzioni usabili negli script

to:

Gli script

Gli script sono scritti in FScript, che è un linguaggio piuttosto semplice (forse fin troppo, ma va beh). Si possono associare script a oggetti, locazioni ed uscite di locazione.

Sono letti dai files con estensione .script.

Script associati ad oggetti

 func nomeoggetto_func(String azione, String param)
   ...
   ...
 end func

L'azione è l'azione che si vuol compiere con l'oggetto. È possibile anche passare un parametro, che rappresenta l'oggetto passivo nell'azione. Ecco un esempio:

 func coltello_func(string param, string obj)
	if (param == "usa")
		if (obj=="")
			scrivi("Usi il coltello con che cosa? Vuoi farti male?")
		elsif (obj=="salame")
			if (inInventario("salame") == 0)
				scrivi("Mangi il salame... mmm delizioso:)")
				togliOggetto("salame")
			endif
		endif
	endif
 endfunc

Script associati a locazione

 func idlocazione_func(String param)
 ...
 ...
 endfunc

Vengono eseguiti ogni volta che il giocatore capita in una locazione.

Script associati ad uscite

 func idlocazione_nomeuscita_func(String param)
 ...
 ...
 endfunc

Vengono chiamati quando si esegue un comando apri o chiudi su di un'uscita. Ecco un esempio:

 func biblio001_giu_func(string param)
	if (inInventario("chiave") == 0)
		if (param == "apri")
			apri("biblio001", "giu")
			scrivi("La botola si apre lentamente...")
		elsif (param == "chiudi")
			chiudi("biblio001" , "giu")
		endif
	else
		scrivi("Non hai la chiave...")
	endif
 endfunc

Funzioni utilizzabili negli script

Ci sono un po' di chiamate di funzione disponibili all'interno degli script. Servono per recuperare ed impostare i parametri del gioco.

Changed lines 250-251 from:
  • int aperta(int uscita) = 1 sì, 0 no. NOTA: uscita qui corrisponde al numero di sequenza dell'uscita così come restituito dalla funzione quanteUscite(String idloc)
  • String dammiIdLoc(int uscita) = restituisce la stringa contenente l'id della locazione indicata, che corrisponde al numero di sequenza delle uscite restituito da quanteUscite
to:
  • int aperta(String locazione, String uscita) = 1 sì, 0 no.
  • String dammiIdLoc(String locazione, String uscita) = restituisce la stringa contenente l'id dell'uscita della locazione indicata
Changed line 253 from:
  • int domanda(String testo, String domande) = pone la domande contenuta nella String testo all' NPC o al player, e restituisce quale di queste ha scelto. Le domande sono separate da una | (pipe), eg: "Come ti chiami?|Sei gay?|Ma tu sei il famoso Cthulhu?"
to:
  • scriviDiscorso(String idDiscorso) = scrive il discorso segnato con id
Changed lines 259-338 from:

Formato dei files

Il gioco è salvato in una cartella, la quale viene passata come argomento al motore del gioco all'avvio. La cartella può contenere un qualsiasi numero di files.

Si assume che i files con estensione .baba contengano la descrizione di locazioni e oggetti, i files .script devono contenere gli script, le locazioni siano contenute nei files .loc.

In questi files, le informazioni vengono codificate secondo un certo schema che presento qui sotto.

Divisione in blocchi

Un blocco è composto da un certo numero di righe contenenti definizioni, separate da righe contenenti 4 trattini. Le definizioni sono del tipo:

<nome>=<definizione>

La prima riga del blocco deve contenere il tipo del blocco stesso. Le righe che iniziano per # sono considerate commenti.

Locazioni

tipo=locazione
nome=Biblioteca
id=biblio01
descrizione=È una sala ampia, dal pavimento di linoleum blu. 
 Le finestre sono grandi, rivolte verso sud. 
 Ci sono diversi tavoli bianchi, e il silenzio regna sovrano
#direzione idloc visibilità aperta
uscita=nord biblio02 true true
uscita=sud corridoio01 true true
uscita=est cortile01 true false

Oggetti

tipo=oggetto
nome=martello
descrizione=Un martello da muratore, col manico lungo e sporco di cemento.

PNG

tipo=png
nome=Danio
descrizione=Un uomo di mezza età, un po' calvo, dal viso tranquillo.
idloc=biblio01

Gli script

Gli script, come spiegato sopra, sono contenuti in funzioni con un nome standard, così da poter essere facilmente rintracciabili.

func biblio01_func(string param)
...
...
endfunc

func martello_func(string param, string obj)
...
...
endfunc

func biblio01_nord_func(string param)
...
...
endfunc

func danio_func(string param, string argomento)
...
...
endfunc

Avvio del gioco

In ogni avventura realizzata per il Babaoglu Engine, occorre che sia definita la pietra miliare di nome inizio, e che la sua relativa func presenti almeno queste funzionalità:

 func inizio_func(string param)
	if (param=="getNomePlayer")
		return "Studente"
	elsif (param=="getDescrPlayer")
		return "Un bel bambino"
	elsif (param=="getLocIniziale")
		return "biblio001"
	else
		scrivi("Benvenuto nella demo del Babaoglu Engine!")
	endif
 endfunc

Infatti, inizio_func viene chiamata per inizializzare il gioco.

to:
  • String leggiProprieta(String NPC, String nomeProprieta) = ritorna il valore della Proprietà di quell'NPC
  • int haProprieta(String NPC, String nomeProprieta) : 1 = si, 0 = no
Changed line 263 from:
to:
Changed lines 29-30 from:
to:

Esempio: guarda Ceravolo, guarda salame.

Changed lines 32-33 from:
to:

Inoltre, se un personaggio ora non dice niente di interessante, può darsi invece che più in là abbia qualche cosa da dirvi...

Changed lines 17-18 from:

vai nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa.

to:

vai nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa. Esempio: vai est.

Changed line 30 from:

parla <personaggio: parla con un personaggio. Per esempio, parla Ceravolo parlerà con Ceravolo.

to:

parla <personaggio>: parla con un personaggio. Per esempio, parla Ceravolo parlerà con Ceravolo.

Added line 16:
Added lines 4-42:

Demo!

Ho pronta una demo del Babaoglu Engine, con tanto di un'avventura di prova:)

C'è un file .bat che dovrebbe funzionare sotto winzozz, cmq la sintassi è:

 java -jar babaoglu.jar demo

demo è la cartella che contiene i files del gioco. Sono files di testo, quindi guardandoli potrete capire la dinamica della piccola avventura che ho scritto: vi conviene aspettare a farlo, prima giocatela e datemi le vostre impressioni!

Faccio un riassunto dei comandi: vai nord|sud|est|ovest|su|giu: va nella direzione specificata, se possibile. Se esce il messaggio "Tu non puoi passare!" vuol dire semplicemente che quella porta è chiusa.

apri nord|sud|est|ovest|su|giu: apre la porta corrispondente alla direzione selezionata. Attenzione: non sempre è possibile aprire tutte le porte, a volte occorrono chiavi, oppure sono semplicemente porte chiuse del tutto! Inoltre, quando si apre una porta NON si va automaticamente in quella direzione: la sequenza di comandi corretta è, per esempio:

 apri nord
 vai nord

uscite: vi dà una lista delle uscite VISIBILI della locazione in cui vi trovate.

guarda: vi dà una descrizione del posto in cui vi trovate, completa di lista di oggetti, personaggi ed uscite. Attenzione: NON tutte le uscite sono visibili, quindi, può darsi che ci siano uscite che il comando guarda inizialmente non rileva!:) Le direzioni sono sempre le solite: nord, sud, est, ovest, su, giu.

guarda <checosa>: posso guardare oggetti o personaggi. Il gioco rispetta le maiuscole, quindi rispettatele anche voi. Inoltre, i nomi degli oggetti e dei personaggi NON contengono spazi, nei comandi.

parla <personaggio: parla con un personaggio. Per esempio, parla Ceravolo parlerà con Ceravolo. È anche possibile indicare un argomento di conversazione, ma non tutti i PNG lo possono fare. Di solito, ma non sempre, quando un PNG dice qualcosa in MAIUSCOLO, provate a chiedergli quella cosa. Esempio: se Dario dice una frase come "mi piacciono i GATTI", potete provare a usare il comando "parla Dario gatti". Un po' rozzo, ma per ora è così:)

prendi <nomeoggetto>: cerca di prendere l'oggetto presente. Non tutti gli oggetti sono trasportabili.

inventario oppure inv: vi dà una lista di ciò che vi portate appresso.

lascia <nomeoggetto>: lascia un oggetto del vostro inventario nel posto in cui vi trovate.

usa <oggetto>: è il comando per interagire con un oggetto. È un po' generico, quindi per ora usa può voler dire fruga o accendi e così via. Più in là vedo di fare qualcosa di più carino.

usa <oggetto> <oggettopassivo>: è un modo per utilizzare un certo oggetto SU di un altro oggetto, detto passivo. Ad esempio, usa martello chiodo cercherà di usare l'oggetto martello con l'oggetto chiodo. Un po' grezzo, ma al solito, siamo agli inizi:)

Changed lines 186-188 from:

[@func biblio01_func(string param)
...
...\\

to:

[@func biblio01_func(string param) ... ...

Changed lines 191-193 from:

func martello_func(string param, string obj)
...
...\\

to:

func martello_func(string param, string obj) ... ...

Changed lines 196-198 from:

func biblio01_nord_func(string param)
...
...\\

to:

func biblio01_nord_func(string param) ... ...

Changed lines 201-203 from:

func danio_func(string param, string argomento)
...
...\\

to:

func danio_func(string param, string argomento) ... ...

Changed line 186 from:

[@func biblio01_func()\\

to:

[@func biblio01_func(string param)\\

Changed line 191 from:

func martello_func(String cheCosa)\\

to:

func martello_func(string param, string obj)\\

Changed line 196 from:

func biblio01_nord_func(String cheCosa)\\

to:

func biblio01_nord_func(string param)\\

Changed line 201 from:

func danio_func(String argomento)\\

to:

func danio_func(string param, string argomento)\\

Changed lines 204-205 from:

endfunc

to:

endfunc@]

Changed lines 24-26 from:

I PNG

I Personaggi Non Giocanti hanno un nome e una descrizione. L'interazione di un personaggio con un PNG avviene principalmente tramite la parola, attraverso anche il saggio utilizzo delle Pietre Miliari descritte qui sopra. Tramite opportuni script, è possibile far muovere un PNG in giro per la mappa, passando solo per le uscite aperte della locazione in cui si trova, per esempio, oppure semplicemente teletrasportandosi. Possono dare oggetti o toglierli al personaggio, ed elargire Pietre Miliari.

to:

Gli NPC

Gli NPC (non-playing characters), o PNG (Personaggi Non Giocanti), hanno un nome e una descrizione. L'interazione di un personaggio con un PNG avviene principalmente tramite la parola, attraverso anche il saggio utilizzo delle Pietre Miliari descritte qui sopra. Tramite opportuni script, è possibile far muovere un PNG in giro per la mappa, passando solo per le uscite aperte della locazione in cui si trova, per esempio, oppure semplicemente teletrasportandosi. Possono dare oggetti o toglierli al personaggio, ed elargire Pietre Miliari.

Changed lines 104-105 from:

Scrive la lista degli oggetti in inventario.

to:

Scrive la lista degli oggetti in inventario. Abbreviata con inv.

Uscite

uscite

Scrive la lista delle uscite visibili di quella locazione.

Changed lines 162-167 from:

descrizione=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud . Ci sono diversi tavoli bianchi, e il silenzio regna sovrano

  1. direzione visibilità aperta

uscita=nord 1 1 uscita=sud 1 1 uscita=est 0 1

to:

descrizione=È una sala ampia, dal pavimento di linoleum blu.

 Le finestre sono grandi, rivolte verso sud. 
 Ci sono diversi tavoli bianchi, e il silenzio regna sovrano
  1. direzione idloc visibilità aperta

uscita=nord biblio02 true true uscita=sud corridoio01 true true uscita=est cortile01 true false

Changed lines 217-218 from:
to:
Changed lines 200-217 from:

Schema delle classi

to:

Avvio del gioco

In ogni avventura realizzata per il Babaoglu Engine, occorre che sia definita la pietra miliare di nome inizio, e che la sua relativa func presenti almeno queste funzionalità:

 func inizio_func(string param)
	if (param=="getNomePlayer")
		return "Studente"
	elsif (param=="getDescrPlayer")
		return "Un bel bambino"
	elsif (param=="getLocIniziale")
		return "biblio001"
	else
		scrivi("Benvenuto nella demo del Babaoglu Engine!")
	endif
 endfunc

Infatti, inizio_func viene chiamata per inizializzare il gioco.

Changed lines 9-10 from:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più apapriscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

to:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più apapriscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

Changed line 68 from:

PNG

to:

NPC

Changed lines 73-74 from:

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_func(String argomento). L'argomento è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio.

to:

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_func(string azione, string argomento). L'azione è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio. L'argomento può essere richiesto, ad esempio, per parlare con l'NPC di uno specifico argomento.

Changed lines 9-10 from:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora è a linea di comando, ma non occorre cambiare nulla per portare il tutto dentro a una semplice GUI. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

to:

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora c'è una semplice GUI, ma non ci vuole molto a scrivere qualcosa di diverso e più apapriscente. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).

Changed lines 120-121 from:
  • int inInventario(String oggetto) = 1 sì, 0 no
  • int inPM(String PietraMiliare) = 1 sì, 0 no
to:
  • int inInventario(String oggetto) = 0 sì, 1 no
  • int inPM(String PietraMiliare) = 0 sì, 1 no
Changed line 136 from:
  • apri|chiudi(String uscita) = apre|chiude l'uscita, indicata nella forma idloc_uscita
to:
  • apri|chiudi(String idloc, String uscita) = apre|chiude l'uscita
Changed lines 66-67 from:

Anche alle pietre miliari è associata una funzione di default, chiamata <nomepietra>_func.

to:

Anche alle pietre miliari è associata una funzione di default, chiamata <nomepietra>_func. Quando una pietra miliare viene data al player, viene chiamata la funzione <nomepietra>_func con parametro "dai"; quando viene tolta il parametro è "togli".

Changed line 119 from:
  • String doveMiTrovo() = restituisce l'idloc della locazione attuale di un PNG
to:
  • String doveNPC() = restituisce l'idloc della locazione attuale di un PNG
Changed lines 132-133 from:
  • int domanda(String domande) = pone le domande contenute nella String domande al player, e restituisce quale di queste ha scelto. Le domande sono separate da una | (pipe), eg: "Come ti chiami?|Sei gay?|Ma tu sei il famoso Cthulhu?"
  • vai(String idloc) = sposta il PNG nella locazione indicata da idloc
to:
  • int domanda(String testo, String domande) = pone la domande contenuta nella String testo all' NPC o al player, e restituisce quale di queste ha scelto. Le domande sono separate da una | (pipe), eg: "Come ti chiami?|Sei gay?|Ma tu sei il famoso Cthulhu?"
  • spostaNPC(String chi, String idloc) = sposta il PNG nella locazione indicata da idloc
  • spostaPlayer(String idloc) = sposta il Player nella locazione indicata da idloc
Changed lines 142-143 from:

Si assume che i files con estensione .oglu contengano la descrizione di locazioni e oggetti, mentre i files .script devono contenere gli script.

to:

Si assume che i files con estensione .baba contengano la descrizione di locazioni e oggetti, i files .script devono contenere gli script, le locazioni siano contenute nei files .loc.

Changed lines 149-150 from:

<nome>::=<definizione>

to:

<nome>=<definizione>

Changed lines 154-157 from:

[@tipo::=locazione nome::=Biblioteca id::=biblio01 descrizione::=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud

to:

[@tipo=locazione nome=Biblioteca id=biblio01 descrizione=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud

Changed lines 160-162 from:

uscita::=nord 1 1 uscita::=sud 1 1 uscita::=est 0 1

to:

uscita=nord 1 1 uscita=sud 1 1 uscita=est 0 1

Changed lines 166-168 from:

[@tipo::=oggetto nome::=martello descrizione::=Un martello da muratore, col manico lungo e sporco di cemento.

to:

[@tipo=oggetto nome=martello descrizione=Un martello da muratore, col manico lungo e sporco di cemento.

Changed lines 172-176 from:
tipo::=png
nome::=Danio
descrizione::=Un uomo di mezza età, un po' calvo, dal viso tranquillo.
idloc::=biblio01
to:
tipo=png
nome=Danio
descrizione=Un uomo di mezza età, un po' calvo, dal viso tranquillo.
idloc=biblio01
Changed line 60 from:

PNG

to:

Pietra Miliare

Added lines 62-69:
  • String evento

Una pietra miliare è del tutto simile ad un Oggetto, ed è possibile associarvi una String contenente il testo che verrà comunicato al giocatore in occasione del conseguimento di tale Pietra Miliare.

Anche alle pietre miliari è associata una funzione di default, chiamata <nomepietra>_func.

PNG

  • String nome
Changed lines 77-78 from:
  • inventario => struttura dati da definire, presumibilmente una Map
  • pietreMiliari => struttura dati da definire, presumibilmente una Map
to:
  • inventario => ArrayList di Oggetti
  • pietreMiliari => arrayList di Pietre Miliari
Changed lines 189-192 from:

endfunc

to:

endfunc

Schema delle classi

Schema delle Classi?

Changed lines 171-173 from:

[@func biblio01_func() ... ...

to:

[@func biblio01_func()
...
...\\

Changed lines 176-178 from:

func martello_func(String cheCosa) ... ...

to:

func martello_func(String cheCosa)
...
...\\

Changed lines 181-183 from:

func biblio01_nord_func(String cheCosa) ... ...

to:

func biblio01_nord_func(String cheCosa)
...
...\\

Changed lines 186-188 from:

func danio_func(String argomento) ... ...

to:

func danio_func(String argomento)
...
...\\

Changed lines 65-66 from:

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_funz(String argomento). L'argomento è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio.

to:

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_func(String argomento). L'argomento è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio.

Added lines 162-167:

PNG

tipo::=png
nome::=Danio
descrizione::=Un uomo di mezza età, un po' calvo, dal viso tranquillo.
idloc::=biblio01
Changed line 176 from:

func martello_func(String oggetto)

to:

func martello_func(String cheCosa)

Changed lines 181-186 from:

func biblio01_nord(String oggetto)

to:

func biblio01_nord_func(String cheCosa) ... ... endfunc

func danio_func(String argomento)

Changed lines 47-48 from:

Quando si tenta di aprire una porta con un oggetto, occorre specificarlo nel comando apri. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func().

to:

Quando si tenta di aprire una porta con un oggetto, occorre specificarlo nel comando apri. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func(String cheCosa).

Changed lines 54-55 from:

Un oggetto ha una funzione di default associata, di nome <nome_oggetto>_funz(String cheCosa). Se l'argomento cheCosa è "niente", si attiva l'azione associata all'oggetto, per esempio suonarlo se è uno strumento musicale. Altrimenti, cheCosa può essere il nome di un altro oggetto presente nell inventario oppure un'uscita della locazione attuale. In questi casi, avverranno le azioni stabilite dallo script.

to:

Un oggetto ha una funzione di default associata, di nome <nome_oggetto>_func(String cheCosa). Se l'argomento cheCosa è "niente", si attiva l'azione associata all'oggetto, per esempio suonarlo se è uno strumento musicale. Altrimenti, cheCosa può essere il nome di un altro oggetto presente nell inventario oppure un'uscita della locazione attuale. In questi casi, avverranno le azioni stabilite dallo script.

Changed lines 148-149 from:

descrizione::=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud. Ci sono diversi tavoli bianchi, e il silenzio regna sovrano

to:

descrizione::=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud . Ci sono diversi tavoli bianchi, e il silenzio regna sovrano

Changed lines 163-178 from:

Gli script, come spiegato sopra, sono contenuti in funzioni con un nome standard, così da poter essere facilmente rintracciabili.

to:

Gli script, come spiegato sopra, sono contenuti in funzioni con un nome standard, così da poter essere facilmente rintracciabili.

[@func biblio01_func() ... ... endfunc

func martello_func(String oggetto) ... ... endfunc

func biblio01_nord(String oggetto) ... ... endfunc

Added line 159:

@]

Changed line 145 from:

tipo::=locazione

to:

[@tipo::=locazione

Changed lines 149-150 from:
  1. direzione

uscita::=nord 0

to:
  1. direzione visibilità aperta

uscita::=nord 1 1 uscita::=sud 1 1 uscita::=est 0 1 @]

Oggetti

[@tipo::=oggetto nome::=martello descrizione::=Un martello da muratore, col manico lungo e sporco di cemento.

Gli script

Gli script, come spiegato sopra, sono contenuti in funzioni con un nome standard, così da poter essere facilmente rintracciabili.

Added lines 129-150:

Formato dei files

Il gioco è salvato in una cartella, la quale viene passata come argomento al motore del gioco all'avvio. La cartella può contenere un qualsiasi numero di files.

Si assume che i files con estensione .oglu contengano la descrizione di locazioni e oggetti, mentre i files .script devono contenere gli script.

In questi files, le informazioni vengono codificate secondo un certo schema che presento qui sotto.

Divisione in blocchi

Un blocco è composto da un certo numero di righe contenenti definizioni, separate da righe contenenti 4 trattini. Le definizioni sono del tipo:

<nome>::=<definizione>

La prima riga del blocco deve contenere il tipo del blocco stesso. Le righe che iniziano per # sono considerate commenti.

Locazioni

tipo::=locazione nome::=Biblioteca id::=biblio01 descrizione::=È una sala ampia, dal pavimento di linoleum blu. Le finestre sono grandi, rivolte verso sud. Ci sono diversi tavoli bianchi, e il silenzio regna sovrano

  1. direzione

uscita::=nord 0

Changed lines 46-49 from:
  • String chiave

La chiave è l'oggetto per aprirla. Quando si tenta di aprire una porta con un oggetto, occorre specificarlo. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func().

to:

Quando si tenta di aprire una porta con un oggetto, occorre specificarlo nel comando apri. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func().

Changed lines 52-53 from:
to:
  • Boolean mobile
Added lines 56-57:

Solo gli oggetti contrassegnati con mobile possono essere messi in inventario.

Changed lines 81-82 from:

<dove> deve essere un'uscita valida. Se presente l'argomento <oggetto>, si chiamerà lo script dell'uscita con <oggetto> come argomento.

to:

<dove> deve essere un'uscita valida. Se presente l'argomento <oggetto>, si chiamerà lo script dell'uscita con <oggetto> come argomento, e l'oggetto deve essere presente nell'inventario.

Changed lines 108-111 from:

Usa

usa <oggetto_attivo> <oggetto_passivo>

L'oggetto attivo

to:

L'<oggetto_attivo> può essere nell'inventario oppure presente nella lista degli oggetti della locazione attuale. L'<oggetto_passivo> può essere nell'inventario o nella locazione.

Funzioni usabili negli script

  • String doveMiTrovo() = restituisce l'idloc della locazione attuale di un PNG
  • int inInventario(String oggetto) = 1 sì, 0 no
  • int inPM(String PietraMiliare) = 1 sì, 0 no
  • String dovePlayer() = restituisce l'idloc della locazione attuale del player
  • daiOggetto(String oggetto) = dà l'oggetto al player
  • daiPM(String PM) = dà PM al player
  • togliOggetto(String oggetto) = toglie l'oggetto al player
  • togliPM(String OM) = toglie la PM al player
  • int random(int limite) = restituisce un valore random compreso tra 0 incluso e limite escluso
  • int quanteUscite(String idloc) = restituisce il numero di uscite complessivo della idloc specificata
  • int aperta(int uscita) = 1 sì, 0 no. NOTA: uscita qui corrisponde al numero di sequenza dell'uscita così come restituito dalla funzione quanteUscite(String idloc)
  • String dammiIdLoc(int uscita) = restituisce la stringa contenente l'id della locazione indicata, che corrisponde al numero di sequenza delle uscite restituito da quanteUscite
  • scrivi(String cheCosa) = scrive la stringa cheCosa
  • int domanda(String domande) = pone le domande contenute nella String domande al player, e restituisce quale di queste ha scelto. Le domande sono separate da una | (pipe), eg: "Come ti chiami?|Sei gay?|Ma tu sei il famoso Cthulhu?"
  • vai(String idloc) = sposta il PNG nella locazione indicata da idloc
  • svuotaInventario() = svuota l'inventario del player...
  • apri|chiudi(String uscita) = apre|chiude l'uscita, indicata nella forma idloc_uscita
  • visibile|invisibile(String uscita) = imposta visibile o invisibile l'uscita, indicata nella forma idloc_uscita
Added lines 11-109:

Le locazioni

Le locazioni sono i vari punti della mappa del gioco in cui il giocatore, gli oggetti e i PNG o NPC (personaggi non giocanti) si possono trovare.

Una locazione fondamentalmente ha un nome e un id (per essere trovata in modo univoco dagli script) e delle uscite. Le uscite possono essere in una delle direzioni note (nord, est, sud, ovest, su, giu, e magari anche quelle intermedie come nordest e così via). Ogni uscita può essere visibile o invisibile. Inoltre, una particolare uscita può essere aperta o chiusa, e la sua apertura può dipendere dall'interazione di un oggetto con essa. Ciò vuol dire che il player può dover trovare una chiave per poter andare in cantina, per esempio.

Ad ogni locazione è possibile associare uno script. Quello script verrà eseguito ogniqualvolta il giocatore finirà in una locazione. Per esempio, se entro in cantina la prima volta, posso sbattere la testa. La seconda volta starò attento e non lo farò più. Oppure, se entro in un tempio con un amuleto cthulhesco, potrei causare un crollo e restarci secco.

Gli oggetti

Un oggetto ha un nome e una descrizione. Il giocatore ha un inventario, che contiene un numero infinito di oggetti (ma sì! chi se ne frega:), e può avere più di una copia di uno stesso oggetto. Oggetti come le chiavi possono essere usate per aprire porte. In generale, il giocatore può usare un oggetto da solo (per esempio, usare una cornamusa per suonare un po') oppure usare un oggetto con un altro oggetto (per esempio, usare una chiave con una porta).

Le pietre miliari

Sono come oggetti, ma non rappresentano entità fisiche, bensì dei punti di svolta che il giocatore ha raggiunto nella trama del gioco. Per esempio, se salvo una principessa, avrò una pietra miliare "Salvata la principessa" e quando parlerò al re suo padre, egli lo saprà e mi darà dei soldi, assieme ad una pietra miliare chiamata "Ricevuta ricompensa". Se parlo al re un'altra volta ancora, egli mi ringrazierà ma non mi darà più dei soldi, perché la pietra miliare "Ricevuta ricompensa" attesterà che l'ho già fatto. Qui si intravede bene la potenza degli script...

I PNG

I Personaggi Non Giocanti hanno un nome e una descrizione. L'interazione di un personaggio con un PNG avviene principalmente tramite la parola, attraverso anche il saggio utilizzo delle Pietre Miliari descritte qui sopra. Tramite opportuni script, è possibile far muovere un PNG in giro per la mappa, passando solo per le uscite aperte della locazione in cui si trova, per esempio, oppure semplicemente teletrasportandosi. Possono dare oggetti o toglierli al personaggio, ed elargire Pietre Miliari.

Parlare con un PNG significa anche porgli delle domande. Lo script associato al PNG mi dirà quali domande posso fargli, e in base a ciò che gli chiederò otterrò le opportune risposte.

Dati tecnici

In questa sezione sono raccolte le note relative all'implementazione del gioco e degli script.

Locazioni

La Locazione è un oggetto con i seguenti campi:

  • String nome
  • String id
  • String descrizione
  • ArrayList<Uscita> uscite
  • ArrayList<Oggetto> oggetti

Lo script di default associato ad una locazione è una funzione FScript dal nome composto così: <id>_func(). Per esempio, se la locazione Biblioteca ha id biblio, la sua funzione di default sarà chiamata biblio_func. Il motore cercherà questa funzione: se esiste, sarà eseguita.

Uscita:

  • String direzione (nord, sud, etc...)
  • Boolean visibile
  • Boolean aperta
  • String chiave

La chiave è l'oggetto per aprirla. Quando si tenta di aprire una porta con un oggetto, occorre specificarlo. Un'uscita ha una funzione di default associata, di nome <idloc>_<direzione>_func => biblio_nord_func().

Oggetti

  • String nome
  • String descrizione

Un oggetto ha una funzione di default associata, di nome <nome_oggetto>_funz(String cheCosa). Se l'argomento cheCosa è "niente", si attiva l'azione associata all'oggetto, per esempio suonarlo se è uno strumento musicale. Altrimenti, cheCosa può essere il nome di un altro oggetto presente nell inventario oppure un'uscita della locazione attuale. In questi casi, avverranno le azioni stabilite dallo script.

Da notare che nella riga di comando il primo argomento è l'oggetto attivo, mentre il secondo è l'oggetto passivo. Ciò vuol dire che una riga di comando come usa accendino carta chiamerà la funzione carta_funz("accendino") e lo script di carta reagirà di conseguenza.

PNG

  • String nome
  • String descrizione
  • String idLocAttuale

idLocAttuale è la posizione in cui si trova in un preciso istante. La funzione di default di un PNG si chiama <nome>_funz(String argomento). L'argomento è "niente" se si vuole attivare la sequenza normale, oppure può essere "parla" per interagire con il personaggio.

Giocatore

  • String nome
  • inventario => struttura dati da definire, presumibilmente una Map
  • pietreMiliari => struttura dati da definire, presumibilmente una Map

Comandi del giocatore

Vai

vai <dove>

<dove> deve essere un'uscita valida. Il comando è eseguito solo se la porta è aperta e non ci sono controindicazioni al passaggio (indicate dallo script associato alla porta). Un'uscita invisibile diventa visibile dopo che la si è trovata.

Apri

apri <dove> [<oggetto>]

<dove> deve essere un'uscita valida. Se presente l'argomento <oggetto>, si chiamerà lo script dell'uscita con <oggetto> come argomento.

Prendi

prendi <oggetto>

<oggetto> deve essere un oggetto presente nella lista di oggetti della locazione attuale.

Lascia

lascia <oggetto>

<oggetto> deve essere un oggetto presente nell'inventario. Se ci sono più copie dell'oggetto, ne viene lasciata 1. L'oggetto lasciato si aggiunge alla lista degli oggetti della locazione corrente.

Inventario

inventario

Scrive la lista degli oggetti in inventario.

Guarda

guarda <oggetto>|<personaggio>

L'ordine di analisi è il seguente: se <oggetto> è un oggetto valido, lo si cerca prima nell'inventario, e se non c'è tra gli oggetti presenti nella locazione. Altrimenti, si controlla se si tratta di un nome valido di personaggio, e se quel personaggio si trova attualmente nella locazione in cui si trova il player.

Quando si trova un caso positivo, viene visualizzata la descrizione dell'oggetto o del personaggio.

Usa

usa <oggetto_attivo> [<oggetto_passivo>]

Usa

usa <oggetto_attivo> <oggetto_passivo>

L'oggetto attivo

Added lines 1-10:

(:title Babaoglu Engine:)

 :: Babaoglu Engine ::

Che cos'è

Il Babaoglu Engine è un semplice motore per psuedo giochi di ruolo che si giocano da linea di comando. Ricorda un po' le IF (Interactive Fiction) e i MUD (Multi-User Dungeon) nel tipo di interazione col gioco, solo che non c'è opportunità di multiplayer.

Serve per poter scrivere delle avventure in cui il giocatore si muove qua e là per una mappa, incontrando persone, raccogliendo e utilizzando oggetti. Non è previsto (per ora) il combattimento.

Il motore del gioco è scritto in Java, ma il gioco stesso no. Utilizza un linguaggio di script chiamato FScript, che è molto semplice da imparare. Le azioni e le interazioni tra gli oggetti, le locazioni della mappa ed il personaggio avvengono tramite gli script scritti in FScript. Il bello di un sistema del genere è che il motore rimane identico, ma si può cambiare la realtà del gioco intervenendo su questi script, senza bisogno di ricompilare alcunché. Inoltre, la semplicità del linguaggio di script permette la creazione di avventure anche a chi non è programmatore. Un altro vantaggio è che si può separare il gioco dalla sua interfaccia: per ora è a linea di comando, ma non occorre cambiare nulla per portare il tutto dentro a una semplice GUI. La grafica non è prevista (niente giochi tipo Monkey Island, per intenderci).