!===============================================================================!
! SGW - a Simple Glulxe Wrapper
!===============================================================================!
! (by Alessandro Schillaci)
! WeB :
http://slade.altervista.org
! @mail :
[email protected]
!
! Version 1.1 2005-07-04
!===============================================================================!
! WHAT IS THIS FOR ?
! ==================
! "sgw.h" (this file) is a simple and small glulxe wrapper, created for a novice
! inform programming level.
! With this library it's possible to visualize an image or simply to play a sound
! (or a music) by using a small set of functions that wrap the glulx functions.
!
! It's possible to convert a z-code adventure to a glulx adventure with
! multimedia support.
!
! You can use 3 audio channles:
! - music : for the music channel
! - chan1 : channel 1 for audio (sound effects)
! - chan2 : channel 2 for audio (sound effects)
!
!===============================================================================!
! HOW TO USE
! ==========
!
! Just follow these points:
!
! 1) Put in your main file the directive
! include "sgw.h";
! before the Include "Parser"; directive
!
! 2) Use the initializeWrap() function in your initialize standard function.
!
! Example:
!
! initializeWrap(240);
!
! This will set the main graphic window to have an height=240 pixels but
! you can change this resolution as you like.
!
! 3) Now you can play a sound or visualize an image simply using
! these two functions: viewImage and playSound
!
! 4) You can customize colors settings, by create these Globals
! before you include the "sgw.h" library, to override them
!
! Constant SCBACK $110101;
! Constant SCTEXT $DDBB99;
! Constant SCSOFT $665544;
! Constant SCEMPH $FFFFDD;
! Constant SCHEAD $EEDDAA;
! Constant SCINPU $DDEEAA;
!
! You can use these new simple functions in your game, also :
!
! GRAPHIC FUNCTIONS
! =================
! clearMainWindow() = clears the main window
! closeAllWindows () = closes all graphic windows
! initializeWrap(w,h) = graphic window dimension is set to w=width h=height
! viewImage(image) = shows the "image" in the graphic window
!
!
! AUDIO FUNCTIONS
! ===============
! playSound(channel,sound,lenght,volume) = plays a sound/music
! silenceAll() = silences all audio channels
! silenceChannel(channel) = silences the audio "channel"
! setVolume(val, channel) = set "val" for volume of the channel
!
!===============================================================================!
! LICENSE
! =======
!
! This file is free software, it can be freely used, copied, distribuited and
! modified. Any modified or unmodified copy of this file distribuited as source
! code must acknoledge the original author and must be freely usable, copyable,
! distributable and modifiable.
! There's absolutely no condition or binding on the distribution as compiled
! binary file.
! This software is distribuited as-is, with NO WARRANTY. The author cannot be
! held as responsable for any damage due directly or indirectly to this file.
!
!===============================================================================!
message "Using the SGW 1.1 (Simple Glulxe Wrapper) library by Alessandro Schillaci";
Global music = 0; ! Music Channel
Global chan1 = 0; ! Channel 1 sound effects
Global chan2 = 0; ! Channel 2 sound effects
Constant VOLUME_HIGH 5;
Constant VOLUME_NORMAL 3;
Constant VOLUME_LOW 2;
#IfDef TARGET_GLULX;
Global current_music = 0;
Global gg_VolumeSupport = false; ! Change Volume supported?
Global gg_statuswin;
Global gg_mainwin; ! Text window
Global gg_bigwin ; ! Image Location window
Global curr_pic;
Constant GG_MUSICCHAN_ROCK 410;
Constant GG_MUSICCHANSOUND1_ROCK 411;
Constant GG_MUSICCHANSOUND2_ROCK 412;
Constant GG_BIGWIN_ROCK 210; ! Image Location window
#Ifndef SCBACK;
Constant SCBACK $110101; ! Colors settings
#Endif;
#Ifndef SCTEXT;
Constant SCTEXT $DDBB99;
#Endif;
#Ifndef SCSOFT;
Constant SCSOFT $665544;
#Endif;
#Ifndef SCEMPH;
Constant SCEMPH $FFFFDD;
#Endif;
#Ifndef SCHEAD;
Constant SCHEAD $EEDDAA;
#Endif;
#Ifndef SCINPU;
Constant SCINPU $DDEEAA;
#Endif;
#Endif;
[ initializeSGW h;
#Ifdef TARGET_GLULX;
if (music == 0) {music = glk_schannel_create(GG_MUSICCHAN_ROCK); }
if (chan1 == 0) {chan1 = glk_schannel_create(GG_MUSICCHANSOUND1_ROCK); }
if (chan2 == 0) {chan2 = glk_schannel_create(GG_MUSICCHANSOUND2_ROCK); }
testGlulx(); ! Test about Interpreter's performances
closeAllWindows(); ! Closing all window
silenceAll(); ! Silence all audio channels
inizializeGlulx(h); ! Inizialize the glulx system
#Endif;
];
! --- Graphics functions -------------------------------------------------------------
! View an image on main graphic window
[ viewImage image;
#Ifdef TARGET_GLULX;
curr_pic = image;
if (gg_bigwin && glk_gestalt(gestalt_Graphics, 0)) {
glk_image_draw(gg_bigwin, curr_pic, 0, 0);
}
#Endif; ! TARGET_
];
! Clean the main window
[ clearMainWindow;
#Ifdef TARGET_GLULX;
glk_window_set_background_color(gg_mainwin,$00000000);
glk_window_clear(gg_mainwin);
glk_window_set_background_color(gg_bigwin,$00000000);
glk_window_clear(gg_bigwin);
#endif;
];
! Close all windows
[ closeAllWindows;
#Ifdef TARGET_GLULX;
if (gg_bigwin) {
glk_window_close(gg_bigwin,0);
gg_bigwin = 0;
}
#endif;
];
! Redraws an image
[ MyRedrawGraphicsWindows;
#Ifdef TARGET_GLULX;
if (gg_bigwin && glk_gestalt(gestalt_Graphics, 0)) {
glk_image_draw(gg_bigwin, curr_pic, 0, 0);
}
#endif;
];
! --- Audio functions -------------------------------------------------------------
! Plays the sound "sound" for the channel "channel" , with "lenght" and "volume"
[ playSound channel sound lenght volume;
#Ifdef TARGET_GLULX;
if (channel) {
current_music = sound;
glk_schannel_stop(channel);
SetVolume(volume,channel);
glk_schannel_play_ext(channel, sound, lenght, 0);
}
#endif;
];
! Sileces all the audio channels
[ silenceAll;
#Ifdef TARGET_GLULX;
if (chan1) { glk_schannel_stop(chan1); }
if (chan2) { glk_schannel_stop(chan2); }
if (music) { glk_schannel_stop(music); }
#Endif;
];
! Silences the channel "channel"
[ silenceChannel channel;
#Ifdef TARGET_GLULX;
if (channel) {
glk_schannel_stop(channel);
}
#endif;
];
! Reset all audio channels
[ resetMusicChannel;
#Ifdef TARGET_GLULX;
glk_schannel_stop(music);
glk_schannel_stop(chan1);
glk_schannel_stop(chan2);
#endif;
];
! Set a volume for the channel
[ setVolume val chan;
#Ifdef TARGET_GLULX;
if (~~gg_VolumeSupport) return;
if (val > 0) glk_schannel_set_volume(chan, val * 16384);
#endif;
];
! --- GLULX functions ------------------------------------------------------------- !
#Ifdef TARGET_GLULX;
[ HandleGlkEvent event ;
switch (event-->0) {
evtype_Redraw, evtype_Arrange : MyRedrawGraphicsWindows();
evtype_SoundNotify: glk_schannel_play_ext(music, current_music, 1, 1);
evtype_SoundNotify: glk_schannel_play_ext(music, , 1, 1);
4: ! mouse
1: ! timer
5, 6: ! arrange/redraw
}
];
! Glk window initialization entry point.
[ InitGlkWindow winrock;
switch (winrock) {
GG_MAINWIN_ROCK:
glk_stylehint_set(wintype_AllTypes, style_Normal, stylehint_TextColor, SCTEXT);
glk_stylehint_set(wintype_AllTypes, style_Normal, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Normal, stylehint_Justification, stylehint_just_LeftRight);
glk_stylehint_set(wintype_AllTypes, style_Emphasized, stylehint_TextColor, SCEMPH);
glk_stylehint_set(wintype_AllTypes, style_Emphasized, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Header, stylehint_TextColor, SCEMPH);
glk_stylehint_set(wintype_AllTypes, style_Header, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Subheader, stylehint_TextColor, SCHEAD);
glk_stylehint_set(wintype_AllTypes, style_Subheader, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Alert, stylehint_TextColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Alert, stylehint_BackColor, SCTEXT);
glk_stylehint_set(wintype_AllTypes, style_Note, stylehint_TextColor, SCINPU);
glk_stylehint_set(wintype_AllTypes, style_Note, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Blockquote, stylehint_TextColor, SCINPU);
glk_stylehint_set(wintype_AllTypes, style_Blockquote, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Input, stylehint_TextColor, SCINPU);
glk_stylehint_set(wintype_AllTypes, style_Input, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_Preformatted, stylehint_TextColor, SCINPU);
glk_stylehint_set(wintype_AllTypes, style_Preformatted, stylehint_BackColor, SCBACK);
glk_stylehint_set(wintype_AllTypes, style_User1, stylehint_TextColor, SCSOFT);
glk_stylehint_set(wintype_AllTypes, style_User1, stylehint_BackColor, SCBACK);
}
rfalse;
];
! Glk object identification entry point.
[ IdentifyGlkObject phase type ref rock id;
switch (phase) {
0: ! start
gg_bigwin = 0;
gg_statuswin = 0;
music = 0;
chan1 = 0;
chan2 = 0;
return;
1: ! pass ref
switch (type) {
0: ! window ref
switch (rock) {
GG_BIGWIN_ROCK : gg_bigwin = ref;
}
}
return;
2: ! Update objects
id = glk_schannel_iterate(0, gg_arguments);
while (id) {
switch (gg_arguments-->0) {
GG_MUSICCHAN_ROCK : music = id;
GG_MUSICCHANSOUND1_ROCK : chan1 = id;
GG_MUSICCHANSOUND2_ROCK : chan2 = id;
}
id = glk_schannel_iterate(id, gg_arguments);
}
ResetMusicChannel();
MyRedrawGraphicsWindows();
return;
}
return;
];
! Test the Glulx Interpreter's performances
[ testGlulx;
if (~~glk_gestalt(gestalt_Graphics, 0)) {
print "^[This Interpreter doesn't support graphics.]^";
}
if (~~glk_gestalt(gestalt_Sound, 0)){
print "^[This Interpreter doesn't support audio files.]^^";
}
if (~~glk_gestalt(gestalt_SoundVolume, 0)){
print "^[This Interpreter doesn't support audio volume.]^";
}
];
! Glulx Inizialize function
[ inizializeGlulx h;
! Graphics
if (gg_statuswin == 0) {
gg_statuswin = glk_window_open(gg_mainwin,(winmethod_Above+winmethod_Fixed), 2, wintype_TextGrid, GG_BIGWIN_ROCK);
}
if (gg_bigwin == 0) {
gg_bigwin = glk_window_open(gg_mainwin,(winmethod_Above+winmethod_Fixed), h , wintype_Graphics, GG_BIGWIN_ROCK);
}
! Set black as background colour for all windows
glk_window_set_background_color(gg_bigwin,$00000000);
glk_window_clear(gg_bigwin);
glk_window_set_background_color(gg_mainwin,$00000000);
glk_window_clear(gg_mainwin);
];
#Endif;