Swappa : Utenti / Babaoglu Engine
Creative Commons License

Indice

Che cos'è

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.

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 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).

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

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:

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.

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.

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.

Gli oggetti

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.

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...

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.

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.

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.

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.

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>

<dove> deve essere un'uscita valida.

chiudi

chiudi <dove>

prendi

prendi <oggetto>

<oggetto> deve essere un oggetto presente nella 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 rimane nella locazione corrente.

inventario

inventario

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

uscite

uscite

Scrive la lista delle uscite visibili di quella locazione.

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>]

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.

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.

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.

Download

Codice sorgente: 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.

compitini.zip


Programmazione

(Printable View of http://www.swappa.it/wiki/Utenti/BabaogluEngine)