diff --git a/src/sdl-instead/game.c b/src/sdl-instead/game.c index 79e7d6b..c7581cd 100644 --- a/src/sdl-instead/game.c +++ b/src/sdl-instead/game.c @@ -67,7 +67,6 @@ int game_select(const char *name) chdir(game_cwd); for (i = 0; i%s", title); txt_layout_set(el_layout(el_title), buf); @@ -1215,7 +1210,8 @@ int game_cmd(char *cmd) txt_layout_size(el_layout(el_title), NULL, &title_h); title_h += game_theme.font_size / 2; // todo? - pict = instead_eval("return get_picture();"); + instead_eval("return get_picture();"); + pict = instead_retval(1); unix_path(pict); new_pict = check_new_pict(pict); @@ -1665,7 +1661,7 @@ int game_click(int x, int y, int action, int filter) if (mouse_filter(filter)) return 0; if (opt_click) - snd_play(game_theme.click, -1, 0); + snd_play(game_theme.click, 0, 0); game_cmd(buf); return 1; @@ -1688,7 +1684,7 @@ int game_click(int x, int y, int action, int filter) disable_use(); if (opt_click) - snd_play(game_theme.click, -1, 0); + snd_play(game_theme.click, 0, 0); game_cmd(buf); return 1; diff --git a/src/sdl-instead/instead.c b/src/sdl-instead/instead.c index 6e56134..ed476b4 100644 --- a/src/sdl-instead/instead.c +++ b/src/sdl-instead/instead.c @@ -86,11 +86,22 @@ char *getstring(char *cmd) } -char *instead_eval(char *s) +int instead_eval(char *s) { - char *p; - p = getstring(s); - return p; + if (!L) + return -1; + if (dostring(L, s)) + return -1; + return 0; +} + +char *instead_retval(int n) +{ + char *s; + s = (char*)lua_tostring(L, -n); + if (s) + s = fromgame(s); + return s; } char *instead_cmd(char *s) @@ -308,9 +319,22 @@ static int luaB_print (lua_State *L) { return 0; } +static int luaB_is_sound(lua_State *L) { + const char *chan = luaL_optstring(L, 1, NULL); + int c, r; + if (!chan) + c = -1; + else + c = atoi(chan); + r = snd_playing(c); + lua_pushboolean(L, (r != 0)); /* else not a number */ + return 1; +} + static const luaL_Reg base_funcs[] = { {"doencfile", luaB_doencfile}, {"print", luaB_print}, /* for some mystic, it is needed in win version (with -debug) */ + {"is_sound", luaB_is_sound}, {NULL, NULL} }; diff --git a/src/sdl-instead/instead.h b/src/sdl-instead/instead.h index 3d3e3ba..c56a0f2 100644 --- a/src/sdl-instead/instead.h +++ b/src/sdl-instead/instead.h @@ -5,7 +5,8 @@ extern int instead_init(void); extern int instead_load(char *game); extern void instead_done(void); extern char *instead_cmd(char *s); -extern char *instead_eval(char *s); +extern int instead_eval(char *s); +extern char *instead_retval(int n); char *fromgame(const char *s); extern int instead_encode(const char *s, const char *d); #endif diff --git a/src/sdl-instead/menu.c b/src/sdl-instead/menu.c index 31d179e..4f257c8 100644 --- a/src/sdl-instead/menu.c +++ b/src/sdl-instead/menu.c @@ -356,9 +356,7 @@ int game_menu_act(const char *a) // free_last(); game_select(curgame_dir); game_menu_box(0, NULL); - s = instead_eval("game:ini()"); - if (s) - free(s); + instead_eval("game:ini()"); game_cmd("look"); s = game_save_path(0, 0); if (s && !access(s, R_OK) && opt_autosave) diff --git a/src/sdl-instead/sound.c b/src/sdl-instead/sound.c index 22ef394..2012fc7 100644 --- a/src/sdl-instead/sound.c +++ b/src/sdl-instead/sound.c @@ -94,11 +94,15 @@ int snd_volume_mus(int vol) wav_t snd_load_wav(const char *fname) { + wav_t r; if (!sound_on) return NULL; if (!fname) return NULL; - return (wav_t)Mix_LoadWAV(fname); + r = (wav_t)Mix_LoadWAV(fname); + if (!r) + fprintf(stderr,"Can't load '%s'.\n", fname); + return r; } void snd_free_wav(wav_t w) @@ -109,9 +113,12 @@ void snd_free_wav(wav_t w) Mix_FreeChunk((Mix_Chunk*)w); } -void snd_halt_chan(int han) +void snd_halt_chan(int han, int ms) { - Mix_HaltChannel(han); + if (ms) + Mix_FadeOutChannel(han, ms); + else + Mix_HaltChannel(han); } Mix_Music *snd_load_mus(const char *fname) @@ -180,6 +187,15 @@ int snd_playing_mus(void) return 0; } +int snd_playing(int channel) +{ + if (channel >= MIX_CHANNELS) + channel %= MIX_CHANNELS; + if (channel < 0) + channel = -1; + return Mix_Playing(channel); +} + void snd_free_mus(mus_t mus) { if (!sound_on) diff --git a/src/sdl-instead/sound.h b/src/sdl-instead/sound.h index 5ceb8f2..936e6fc 100644 --- a/src/sdl-instead/sound.h +++ b/src/sdl-instead/sound.h @@ -17,7 +17,7 @@ extern void snd_free_mus(mus_t mus); extern int snd_init(int hz); extern int snd_hz(void); extern void snd_play(wav_t chunk, int channel, int loop); -extern void snd_halt_chan(int han); +extern void snd_halt_chan(int han, int ms); extern void snd_free_wav(wav_t chunk); extern wav_t snd_load_wav(const char *fname); @@ -28,5 +28,6 @@ extern int snd_volume_mus(int vol); extern void snd_done(void); extern int snd_vol_from_pcn(int v); extern int snd_vol_to_pcn(int v); +extern int snd_playing(int channel); #endif diff --git a/stead/stead.lua b/stead/stead.lua index 88a8f9f..ea8b2a0 100644 --- a/stead/stead.lua +++ b/stead/stead.lua @@ -2015,7 +2015,7 @@ function get_title() end function get_music() - return game._music; + return game._music, game._music_loop; end function get_music_loop() @@ -2059,8 +2059,14 @@ function is_music() return game._music ~= nil and game._music_loop ~= -1 end +if is_sound == nil then + function is_sound() + return false -- sdl-instead export own function + end +end + function get_sound() - return game._sound; + return game._sound, game._sound_channel, game._sound_loop; end function get_sound_chan()