From 4b53b59e05d54deae975ca082f17d206c64f102e Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Wed, 9 Nov 2016 00:40:13 +0100 Subject: [PATCH] proper gamestate freezing on suspending android activity --- src/gamestate.c | 1 + src/gamestate.h | 1 + src/internal.c | 22 ++++++++++++++++++++++ src/internal.h | 2 ++ src/libsuperderpy.c | 4 ++-- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/gamestate.c b/src/gamestate.c index c1d29be..90c6eb5 100644 --- a/src/gamestate.c +++ b/src/gamestate.c @@ -39,6 +39,7 @@ SYMBOL_INTERNAL struct Gamestate* AddNewGamestate(struct Game *game, const char* tmp->handle = NULL; tmp->loaded = false; tmp->paused = false; + tmp->frozen = false; tmp->started = false; tmp->pending_load = false; tmp->pending_start = false; diff --git a/src/gamestate.h b/src/gamestate.h index bcba85b..fc33940 100644 --- a/src/gamestate.h +++ b/src/gamestate.h @@ -47,6 +47,7 @@ struct Gamestate { void* handle; bool loaded, pending_load, pending_unload; bool started, pending_start, pending_stop; + bool frozen; bool showLoading; bool paused; struct Gamestate *next; diff --git a/src/internal.c b/src/internal.c index 02b89b9..2af1a83 100644 --- a/src/internal.c +++ b/src/internal.c @@ -58,6 +58,28 @@ SYMBOL_INTERNAL void EventGamestates(struct Game *game, ALLEGRO_EVENT *ev) { } } +SYMBOL_INTERNAL void FreezeGamestates(struct Game *game) { + struct Gamestate *tmp = game->_priv.gamestates; + while (tmp) { + if (tmp->started || !tmp->paused) { + PauseGamestate(game, tmp->name); + tmp->frozen = true; + } + tmp = tmp->next; + } +} + +SYMBOL_INTERNAL void UnfreezeGamestates(struct Game *game) { + struct Gamestate *tmp = game->_priv.gamestates; + while (tmp) { + if (tmp->frozen) { + ResumeGamestate(game, tmp->name); + tmp->frozen = false; + } + tmp = tmp->next; + } +} + SYMBOL_INTERNAL void DrawConsole(struct Game *game) { if (game->_priv.showconsole) { al_set_target_backbuffer(game->display); diff --git a/src/internal.h b/src/internal.h index 036dd79..7c6c409 100644 --- a/src/internal.h +++ b/src/internal.h @@ -46,6 +46,8 @@ struct libsuperderpy_list { void DrawGamestates(struct Game *game); void LogicGamestates(struct Game *game); void EventGamestates(struct Game *game, ALLEGRO_EVENT *ev); +void FreezeGamestates(struct Game *game); +void UnfreezeGamestates(struct Game *game); void DrawConsole(struct Game *game); void Console_Load(struct Game *game); void Console_Unload(struct Game *game); diff --git a/src/libsuperderpy.c b/src/libsuperderpy.c index 0039267..b9e5b8b 100644 --- a/src/libsuperderpy.c +++ b/src/libsuperderpy.c @@ -419,7 +419,7 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game *game) { game->_priv.draw = false; al_stop_timer(game->_priv.timer); al_detach_voice(game->audio.v); - PauseAllGamestates(game); // TODO: store not paused gamestates + FreezeGamestates(game); al_acknowledge_drawing_halt(game->display); } else if(ev.type == ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING) { @@ -427,7 +427,7 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game *game) { PrintConsole(game, "resume drawing"); game->_priv.draw = true; SetupViewport(game, game->viewport_config); - ResumeAllGamestates(game); // FIXME: resumes even those that were paused earlier! + UnfreezeGamestates(game); al_attach_mixer_to_voice(game->audio.mixer, game->audio.v); al_resume_timer(game->_priv.timer); }