INFORM: La libreria sgw.h per Glulx
di Alessandro Schillaci
Per la comprensione di questo articolo sono richieste conoscenze minime di Inform. Non sono richieste, invece, conoscenze di Glulx.
INTRODUZIONE
La libreria Simple Glulx Wrapper (SGW) è una piccola e semplice libreria che estente le principali
funzioni glulx per la gestione di elementi multimediali (immagini e suoni).
È sufficiente includere la libreria ed è possibile inserire immagini, suoni o musica, sfruttando le
funzioni già predisposte per visualizzare un’immagine oppure riprodurre un suono (o una musica).
In questo modo è anche possibile prendere un’avventura scritta in Z-Code e convertirla in formato
Glulx (con immagini e suoni) semplicemente importando la libreria nel file INF principale e utilizzando
le funzioni disponibili, senza curarsi di aspetti tecnici quali ad esempio la sincronizzazione degli
elementi multimediali nel caso di un RESTORE della partita in corso o di un RESTART.
Questa libreria deriva direttamente dal codice utilizzato per Little Falls, riassemblato da poter essere utilizzato a tutti gli effetti come una libreria.
Questa libreria definisce e prevede anche 3 canali audio da utilizzare nelle vostre avventure:
- music : è il canale dedicato alla musica
- chan1 : è il canale 1 per i suoni (effetti)
- chan2 : è il canale 2 per i suoni (effetti)
Con questa libreria è possibile anche creare un’avventura testuale con suoni (senza immagini).
PRIMI PASSI
L’utilizzo della SGW è semplicissimo. Basta seguire questi punti:
Aggiungere nel vostro file INF principale, questa direttiva di inclusione
Include “sgw.h”;
Prima di includere il parser (Include “Parser”;)
Aggiungere la funzione
initializeSGW(x);
nella funzione
Initialize()del vostro gioco. Questa funzione inizializza gli oggetti della libreria e crea una finestra grafica per le vostre immagini con altezza uguale a “x” pixels. Ovviamente è possibile utilizzare un altro alore per cambiare le dimensioni delle immagini.Creare un file di risorse con l’elenco delle immagini e dei suoni che intendete utilizzare nella vostra avventura.
Ora è possibile riprodurre un suono o visualizzare un immagine in qualsiasi punto del codice Inform semplicemente utilizzando le funzioni:
- viewImageLeft(image) : visualizza l’immagine allineata a sinistra
- viewImageCenter(image, image_width) : visualizza l’immagine centrata nello schermo
- viewImageRight(image, image_width) : visualizza l’immagine allineata a destra
(dove
imageè l’identificativo indicato nel file delle risorse)Da notare che per centrare o per allineare a destra un’immagine, è necessario passare un ulteriore parametro alla funzione (
image_width). Questo parametro è la larghezza (in pixel) dell’ immagine da centrare (allineare a destra).- playSound(channel,sound,lenght,volume) : dove
channel=musicoppurechan1oppurechan2,sound=identificativodel suono nel file delle risorse,lenghtè il numero di volte che il suono verrà riprodotto [-1 = all’infinito] evolume=VOLUME_HIGHoppureVOLUME_NORMALoppureVOLUME_LOW)
Questa libreria definisce i colori dei vari tipi di font (quelli usati per Little Falls). Ma è possibile cambiarli nel caso non siano di gradimento. Basta definire queste Costanti prima di inlcudere la libreria sgw (cioè prima della direttiva
Include "sgw.h";:Esempio:
Constant SCBACK $110101; Constant SCTEXT $DDBB99; Constant SCSOFT $665544; Constant SCEMPH $FFFFDD; Constant SCHEAD $EEDDAA; Constant SCINPU $DDEEAA;Se volete utilizzare la libreria solo con il supporto audio, è possibile “inibire” l’inizializzazione grafica impostando questa costante prima di inlcudere la libreria:
Constant NOGRAPHICS;
Ecco nel dettaglio tutte le funzioni che la SGW rende disponibili
Funzioni grafiche
- clearMainWindow(): ripulisce la finestra principale
- closeAllWindows(): chiude tutte le finestre grafiche
- initializeSGW(h): imposta l’altezza della finestra grafica a h
- viewImageLeft(image): visualizza l’immagine allineata a sinistra
- viewImageCenter(image, image_width): visualizza l’immagine centrata nello schermo
- viewImageRight(image, image_width): visualizza l’immagine allineata a destra
Funzioni audio
- playSound(channel,sound,lenght,volume): riproduce un suono o musica
- silenceAll(): azzera tutti i canali audio
- silenceChannel(channel): azzera il canale audio “channel”
- setVolume(val, channel): imposta il valore “val” per il volume
ESEMPIO
Ricreiamo un esempio completo (da zero) e vedrete che è più semplice a farsi che a dirsi. L’esempio in questione è compreso nella distribuzione della sgw, ma in queste pagine vedremo come costruirlo da zero.
Si presume che il lettore abbia installato sul suo sistema un compilatore INFORM e i tool Blorb (blb.exe e bres.exe).
Il file principale
Creiamo una nuova directory C:\test\ (per esempio). Creiamo un nuovo file con questo nome: sgw_test_it.inf (e salviamolo nella directory di test). Ecco il contenuto del file:
Constant Story "Test per sgw";
Constant Headline "^Simple Glulxe Wrapper (sgw) 1.5 ^di
Alessandro Schillaci^^";
Include "sgw.h"; ! Inclusione della libreria SGW
Include "Parser";
Include "Infglk";
Object LibraryMessages
with before [;
LMODE1 : lookmode =2; print "^"; rtrue;
LMODE2 : lookmode =2; print "^"; rtrue;
LMODE3 : lookmode =2; print "^"; rtrue;
];
Include "VerbLib";
Include "Replace";
Include "sgw_test_it.bli";
Object room_1 "room 1"
with description [;
print "Una semplice stanza di esempio. Stanza 1. L'immagine è
allineata a sinistra.^";
viewImageLeft(room1);
],
cant_go "Puoi muoverti solo a nord, verso la stanza 2.",
n_to room_2,
has light;
Object room_2 "room 2"
with description [;
print "Una semplice stanza di esempio. Stanza 2. L'immagine è
centrata.^";
viewImageCenter(room2,620);
],
cant_go "Puoi muoverti a nord verso la stanza 3 oppure a sud, verso la
stanza 1.",
n_to room_3,
s_to room_1,
has light;
Object room_3 "room 3"
with description [;
print "Una semplice stanza di esempio. Stanza 3. L'immagine è
allineata a destra.^ In questa stanza puoi vedere un
esempio di utilizzo degli stili della SGW.^";
print "Testo con lo stile ", (s_emph) "Emphasized", "^";
print "Testo con lo stile ", (s_bold) "Bold", " (come in Inform)^";
print "Testo con lo stile ", (s_pref) "Preformatted", "^";
print "Testo con lo stile ", (s_fixed) "Fixed", " (come in Inform)^";
print "Testo con lo stile ", (s_head) "Header", "^";
print "Testo con lo stile ", (s_subhead) "Subheader", "^";
print "Testo con lo stile ", (s_alert) "Alert", "^";
print "Testo con lo stile ", (s_reverse) "Reverse", " (come in
Inform)^";
print "Testo con lo stile ", (s_note) "Note", "^";
print "Testo con lo stile ", (s_underline) "Underline/Italic", "
(come in Inform)^";
print "Testo con lo stile ", (s_block) "BlockQuote", "^";
print "Testo con lo stile ", (s_input) "Input", "^";
viewImageRight(room3, 620);
],
cant_go "Puoi muoverti solo a sud, verso la stanza 2.",
s_to room_2,
has light;
[ Initialise;
lookmode = 2;
initializeSGW(240); ! Imposta la finestra grafica alta 240 pixel
location = room_1;
playSound(chan1,rumble,1,VOLUME_HIGH);
playSound(chan2,heart,-1,VOLUME_NORMAL);
];
Include "ItalianG";
Come possiamo notare, è stata inclusa la libreria sgw (Include "sgw.h") prima di includere Parser. Nella funzione Initialise() ho inserito l’inizializzazione della libreria sgw (initializeSGW(240)) e impostato il lookmode a 2 (vedremo in seguito il motivo di questa operazione). In questo modo ho incluso e inizializzato la libreria SGW, possiamo riprodurre un suono e visualizzare un’immagine in qualsiasi punto del codice Inform.
Il file delle risorse
Ovviamente serve un altro file, che gestisce la “mappatura” delle risorse (i file multimediali JPF o AIFF).Creiamo dunque un nuovo file (sgw_test_it.res) sempre nella directory di “test”, con questo contenuto (questo file viene utilizzato per la creazione del file sgw_test_it.bli grazie all’utility bres.exe — in seguito vedremo come utilizzarlo a linea di comando):
CODE C:\test\sgw_test_it.ulx
PICTURE room1 C:\test\room1.jpg
PICTURE room2 C:\test\room2.jpg
PICTURE room3 C:\test\room3.jpg
SOUND rumble C:\test\rumble.aif
SOUND heart C:\test\heart.aif
In questo caso dovremo avere a disposizione tre immagini (di dimensioni 620×240 pixel) e due suoni in formato AIF (rumble.aif e heart.aif). Se non avete a disposizione tali file, non preoccupatevi. Potete scaricare il file di esempio della libreria SGW: include già un esempio da compilare con le risorse già pronte. Il link di partenza è sempre lo stesso: http://www.slade.altervista.org/?Inform:Simple_Glulx_Wrapper
In questo caso, supponiamo di avere nella directory C:\test\ i file JPG e AIF appena descritti.
Creazione del file bli e blc
Il primo passo consiste nell’esecuzione del tool bres.exe utilizzando come parametro il file di risorse sgw_test_it.res creato in precedenza. Supponendo che il percorso assoluto del tool bres.exe sia C:\Inform\Bin\tools\Blorb\, possiamo lanciare il seguente comando (in una finestra DOS):
C:\Inform\Bin\tools\Blorb\bres.exe C:\test\sgw_test_it
Se tutto è andato correttamente, dovreste vedere un messaggio simile a questo:

Vedrete che il tool bres.exe ha creato due nuovi file: uno con estensione BLI (sgw_test.bli) e il secondo con estensione BLC (sgw_test.blc). Provando ad aprire questi file generati vedrete che si tratta di file che associano una risorsa (immagine o suono) ad un codice univoco. Questo servirà poi per assemblare il tutto in un file con estensione BLB (eseguibile direttamente da un interprete Glulx).
Compilazione
Questo passo consiste nella compilazione del file principale (quello che abbiamo chiamato sgw_test_it.inf ). Supponendo che:
- il compilatore inform abbia come percorso
C:\Inform\Bin\compiler\ - le librerie Inform (e INFIT) abbiano come percorso
C:\Inform\Lib\Base - che la libreria
sgw.habbia come percorsoC:\Inform\Lib\Contrib
il comando sarà:
C:\Inform\Bin\compiler\inform.exe +language_name=italian -G
+include_path=C:\test,C:\Inform\Lib\Base,C:\Inform\Lib\Contrib
C:\test\sgw_test_it.inf C:\test\sgw_test_it.ulx
Il messaggio di compilazione dovrebbe essere simile a questo:

Andando a controllare la directory C:\test, vedrete che è stato creato un nuovo file sgw_test_it.ulx.
Creazione del file BLB
L’obiettivo è quello di creare un file BLB, che contiene tutte le risorse (grafiche e sonore) e l’avventura testuale stessa.
Per la creazione di tale file, si utilizza il tool blc.exe. Supponendo che tale file risieda nella directory C:\Inform\Bin\tools\Blorb\, il comando allora sarà:
C:\Inform\Bin\tools\Blorb\blc.exe C:\test\sgw_test_it.blc
C:\test\sgw_test_it.blb
Se non vi sono errori, avete appena creato il vostro file sgw_test_it.blb che utilizza la libreria SGW.H

Compilare l’esempio con JIF
È possibile scaricare la libreria SGW con un esempio (che è molto simile a quello appena effettuato), solo che tutti i file sono pronti per la compilazione.
Infatti, l’esempio contiene anche il file blb già compilato per vedere come funziona senza dover ricompilarlo. Ad ogni modo, è ovviamente possibile ricompilare il codice usando JIF. (È possibile ricompilarlo anche con altri tool, ma in questa pagina vedremo come compilarlo con JIF)
Sistemi win32
- Scaricare e scompattare l’esempio nella directory
C:\sgw_it - Aprire JIF (utilizzare se possibile la versione 2.0)
- Aprire un progetto: Aprire il file
C:\sgw_it\sgw_test_it.jpf - Aprire il file
sgw_test_it.inf(sceglierlo dalla finestra di progetto, in basso a sinistra) con un doppio click sul nome del file - Compilare il progetto
- Eseguire il progetto (l’icona del “razzo”)
- È possibile anche ricreare il file di risorse e il file blb da zero. In questo caso cancellare i file *.bli *.blc *.blb ed eseguire i menu:
- Glulx -> Crea File di risorse
- Glulx -> Compila il file inf
- Glulx -> Crea Blb
*nix systems
- Scaricare e scompattare l’esempio in una directory
XXX - Aprire il file
XXX\sgw_test_it.jpfcon un editor di testo e modificare i path dei file, cambiandoli in e facendoli puntare alla directoryXXX - Chiudere il file
XXX\sgw_test_it.jpf - Aprire il file
XXX\sgw_test_it.rescon un editor di testo e modificare mettendo i path giusti (riferiti aXXX) - Chiudere il file
XXX\sgw_test_it.res - Aprire JIF (utilizzare se possibile la versione 2.0)
- Aprire un progetto: Aprire il file
XXX\sgw_test_it.jpf - Aprire il file
sgw_test_it.inf(sceglierlo dalla finestra di progetto, in basso a sinistra) con un doppio click sul nome del file - Compilare il progetto
- Eseguire il progetto (l’icona del “razzo”)
- È possibile anche ricreare il file di risorse e il file blb da zero. In questo caso cancellare i file *.bli *.blc *.blb ed eseguire i menu:
- Glulx -> Crea File di risorse
- Glulx -> Compila il file inf
- Glulx -> Crea Blb
