diff --git a/src/graphics/filters.c b/src/graphics/filters.c index 106041e..63335df 100644 --- a/src/graphics/filters.c +++ b/src/graphics/filters.c @@ -256,8 +256,13 @@ int s_filter_rgba8(s_bank_t *b, unsigned first, unsigned frames, s_sprite_t *s = s_get_sprite_b(b, first+i); if(!s) continue; +#ifdef __EMSCRIPTEN__ + tmp = SDL_ConvertSurfaceFormat(s->surface, + SDL_PIXELFORMAT_RGBA32, 0); +#else tmp = SDL_ConvertSurface(s->surface, &fmt, SDL_SWSURFACE); +#endif if(!tmp) return -1; diff --git a/src/graphics/sprite.c b/src/graphics/sprite.c index bb3c582..454afd5 100644 --- a/src/graphics/sprite.c +++ b/src/graphics/sprite.c @@ -387,12 +387,20 @@ static int extract_sprite(s_bank_t *bank, unsigned frame, src->format->palette->ncolors); /* Copy alpha and colorkey */ +#ifdef __EMSCRIPTEN__ + SDL_SetAlpha(tmp, SDL12_SurfaceFlags(src) & SDL_SRCALPHA, + SDL12_SurfaceAlpha(src)); + if(SDL12_SurfaceFlags(src) & SDL_SRCCOLORKEY) + SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, + SDL12_SurfaceColorKey(src)); +#else if(src->flags & SDL_SRCALPHA) SDL_SetAlpha(tmp, src->flags & (SDL_SRCALPHA | SDL_RLEACCEL), src->format->alpha); if(src->flags & SDL_SRCCOLORKEY) SDL_SetColorKey(tmp, src->flags & (SDL_SRCCOLORKEY | SDL_RLEACCEL), src->format->colorkey); +#endif bank->sprites[frame]->surface = tmp; diff --git a/src/kobo.cpp b/src/kobo.cpp index eea591d..92ab622 100644 --- a/src/kobo.cpp +++ b/src/kobo.cpp @@ -37,6 +37,9 @@ #include #include #include +#ifdef __EMSCRIPTEN__ +#include +#endif #ifdef DEBUG #include "audio.h" @@ -156,7 +159,14 @@ static void setup_dirs(char *xpath) /* * Score files (user and global) */ -#ifdef KOBO_USERDIR +#if defined(__EMSCRIPTEN__) && defined(KOBO_SCOREDIR) + /* + * Not the folder of the config file: the game reads every file in + * the score folder as a player profile, and the config file would + * show up as a bogus high score. + */ + fmap->addpath("SCORES", KOBO_SCOREDIR); +#elif defined(KOBO_USERDIR) fmap->addpath("SCORES", KOBO_USERDIR); #endif @@ -439,9 +449,16 @@ int KOBO_main::quit_requested() case SDL_QUIT: exit_game_fast = 1; break; +#ifdef __EMSCRIPTEN__ + case SDL_WINDOWEVENT: + if(e.window.event == SDL_WINDOWEVENT_EXPOSED) + gengine->invalidate(); + break; +#else case SDL_VIDEOEXPOSE: gengine->invalidate(); break; +#endif case SDL_KEYUP: switch(e.key.keysym.sym) { @@ -1324,6 +1341,22 @@ void KOBO_main::save_config(prefs_t *p) } +#ifdef __EMSCRIPTEN__ +/* + * The browser never runs the code after km.run() in main(): the page calls + * this when it is hidden or closed, so changed options are not lost. + */ +extern "C" EMSCRIPTEN_KEEPALIVE void fredygames_save(void) +{ + if(prefs && prefs->changed) + { + KOBO_main::save_config(prefs); + prefs->changed = 0; + } +} +#endif + + void KOBO_main::brutal_quit() { if(exit_game_fast) @@ -1630,18 +1663,24 @@ void kobo_gfxengine_t::frame() OS_RESTART_VIDEO; stop(); return; +#ifndef __EMSCRIPTEN__ case SDLK_PRINT: case SDLK_SYSREQ: // FIXME: Doesn't this trigger when entering names and stuff...? case SDLK_s: gengine->screenshot(); break; +#endif default: break; } k = gamecontrol.map(ev.key.keysym.sym); gamecontrol.press(k); + #ifdef __EMSCRIPTEN__ + gsm.press(k, SDL12_KeyUnicode(&ev.key.keysym)); +#else gsm.press(k, ev.key.keysym.unicode); +#endif break; case SDL_KEYUP: if((ev.key.keysym.sym == SDLK_ESCAPE) && km.escape_hammering()) @@ -1679,6 +1718,16 @@ void kobo_gfxengine_t::frame() gsm.release(k); } break; +#ifdef __EMSCRIPTEN__ + case SDL_WINDOWEVENT: + if(ev.window.event == SDL_WINDOWEVENT_EXPOSED) + gengine->invalidate(); + // Any type of focus loss should activate pause mode! + else if(ev.window.event == SDL_WINDOWEVENT_FOCUS_LOST || + ev.window.event == SDL_WINDOWEVENT_HIDDEN) + km.pause_game(); + break; +#else case SDL_VIDEOEXPOSE: gengine->invalidate(); break; @@ -1687,6 +1736,7 @@ void kobo_gfxengine_t::frame() if(!ev.active.gain && ev.active.state != SDL_APPINPUTFOCUS) km.pause_game(); break; +#endif case SDL_QUIT: /*gsm.press(BTN_CLOSE);*/ km.brutal_quit();