diff --git a/fggl/app.cpp b/fggl/app.cpp index 0d6ec0d79f6b7ace899f9748dd6da5662a5a4a5b..7d1c223d5159b8c14b7a47e05618fccf2c3195fb 100644 --- a/fggl/app.cpp +++ b/fggl/app.cpp @@ -46,7 +46,10 @@ namespace fggl { while ( m_running ) { // trigger a state change if expected if ( m_expectedScene != m_states.activeID() ) { - m_states.change(m_expectedScene); + auto result = m_states.change(m_expectedScene); + if ( !result ) { + m_expectedScene = m_states.activeID(); + } } auto& state = m_states.active(); diff --git a/fggl/scenes/game.cpp b/fggl/scenes/game.cpp index 607ef4e80d8d20c18df848d413a9875fb1da2a25..2dea4c4b8ac5239260d0156a4e3b005a489b2b1d 100644 --- a/fggl/scenes/game.cpp +++ b/fggl/scenes/game.cpp @@ -43,7 +43,7 @@ namespace fggl::scenes { } void Game::update() { - assert( m_world ); + assert( m_world && "called game update, but there was no world - was activate called?" ); if ( m_input != nullptr ) { bool escapePressed = m_input->keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_ESCAPE)); diff --git a/include/fggl/util/states.hpp b/include/fggl/util/states.hpp index 6edee1ffe56374f3ecf17206c9ec998ff4e55db3..fa2c713047e4b38e53ff43107691bceb042a8846 100644 --- a/include/fggl/util/states.hpp +++ b/include/fggl/util/states.hpp @@ -48,12 +48,16 @@ namespace fggl::util { return (T *) (m_states[name].get()); } - void change(const Identifer &name) { - assertm(m_states.find(name) != m_states.end(), "state does not exist"); + bool change(const Identifer &name) { + if ( m_states.find(name) == m_states.end() ) { + debug::error("attempted to change to non-existent state {}, ignoring you.", name); + return false; + } active().deactivate(); m_active = name; active().activate(); + return true; } StateType &active() const {