Utenti:Babaoglu Engine

Wiki

Tools

Categorie

Help

edit SideBar

Una pagina a caso

Utenti.BabaogluEngine History

Show minor edits - Show changes to output

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:
Codice sorgente: [[Attach:babaogluengine-0.1.src.zip]]
to:
Codice sorgente: [[(Attach:)babaogluengine-0.1.src.zip]]
Changed lines 273-274 from:
[[Attach:compitini.zip]]
to:
[[(Attach:)compitini.zip]]
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 -> http://fscript.sourceforge.net]], 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 -> http://fscript.sourceforge.net]], 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:
[[#c1]]
Deleted line 18:
[[#c1]]
Added line 25:
[[#c2]]
Deleted line 26:
[[#c2]]
Added line 38:
[[#c3]]
Deleted line 39:
[[#c3]]
Added line 50:
[[#c4]]
Deleted line 51:
[[#c4]]
Added line 69:
[[#c5]]
Deleted line 70:
[[#c5]]
Added line 90:
[[#c6]]
Deleted line 91:
[[#c6]]
Added line 102:
[[#c7]]
Deleted line 103:
[[#c7]]
Added line 114:
[[#c8]]
Deleted line 115:
[[#c8]]
Added line 130:
[[#c9]]
Deleted line 131:
[[#c9]]
Added line 182:
[[#c10]]
Deleted line 183:
[[#c10]]
Added line 239:
[[#c11]]
Deleted line 240:
[[#c11]]
Added line 264:
[[#c12]]
Changed line 266 from:
[[#c12]]
to:
Changed lines 3-16 from:
* [[#c1]]
* [[
#c2]]
* [[#c3]]
* [[#c4]]
* [[
#c5]]
* [[#c6]]
* [[#c7]]
* [[
#c8]]
* [[#c9]]
* [[
#c10]]
* [[#c11]]
* [[
#c12]]
to:
* [[Che cos'è -> #c1]]
* [[Com'è strutturata un'avventura -> #c2]]
* [[Il file .ini -> #c3]]
* [[I discorsi -> #c4]]
* [[Le locazioni -> #c5]]
* [[Gli oggetti -> #c6]]
* [[Le pietre miliari -> #c7]]
* [[Gli NPC -> #c8]]
* [[Comandi del giocatore -> #c9]]
* [[Gli script -> #c10]]
* [[Funzioni utilizzabili negli script -> #c11]]
* [[Download ->
#c12]]
Changed lines 2-43 from:
!!Demo!
Ho pronta una demo del Babaoglu Engine, con tanto di un'avventura di prova:)

*
[[(Attach:)demo.babaoglu.zip]]
* I sorgenti: [[(Attach:)babaoglu.zip]]. È un progetto di NetBeans.

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
* [[#c1]]
* [[#c2]]
* [[#c3]]
* [[#c4]]
* [[#c5]]
* [[#c6]]
* [[#c7]]
* [[#c8]]
* [[#c9]]
* [[#c10]]
*
[[#c11]]
* [[#c12]]
Added line 18:
[[#c1]]
Added line 26:
[[#c2]]
Added line 39:
[[#c3]]
Added line 51:
[[#c4]]
Added line 70:
[[#c5]]
Added line 91:
[[#c6]]
Added line 103:
[[#c7]]
Added line 115:
[[#c8]]
Added line 131:
[[#c9]]
Added line 183:
[[#c10]]
Added line 240:
[[#c11]]
Added lines 264-265:
!Download
[[#c12]]
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:
%titolo%''':: 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 -> http://fscript.sourceforge.net]], 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 -> http://fscript.sourceforge.net]], 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:
[[!Programmazione]]
to:
[[!Programmazione]]
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:)

* [[(Attach:)demo.babaoglu.zip]]
* I sorgenti: [[(Attach:)babaoglu.zip]]. È un progetto di NetBeans.

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
#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
#direzione idloc visibilità aperta
uscita=nord biblio02 true true
uscita=sud corridoio01 true true
uscita=est cortile01 true false
Changed lines 217-218 from:
[[Schema delle Classi]]
to:
----
[[!Programmazione]]
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 -> http://fscript.sourceforge.net]], 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:
#direzione
uscita::=nord 0
to:
#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
#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:)
%titolo%''':: 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).