diff --git a/rwgame/RWGame.cpp b/rwgame/RWGame.cpp index b4b9b2e6..21e09d9a 100644 --- a/rwgame/RWGame.cpp +++ b/rwgame/RWGame.cpp @@ -96,17 +96,17 @@ RWGame::RWGame(Logger& log, const std::optional &args) data.loadTXD(oss.str()); } - StateManager::get().enter(this, [=]() { + stateManager.enter(this, [=]() { if (benchFile.has_value()) { - StateManager::get().enter(this, *benchFile); + stateManager.enter(this, *benchFile); } else if (test) { - StateManager::get().enter(this, true, "test"); + stateManager.enter(this, true, "test"); } else if (newgame) { - StateManager::get().enter(this, true); + stateManager.enter(this, true); } else if (startSave.has_value()) { - StateManager::get().enter(this, true, *startSave); + stateManager.enter(this, true, *startSave); } else { - StateManager::get().enter(this); + stateManager.enter(this); } }); @@ -370,7 +370,7 @@ int RWGame::run() { // Loop until we run out of states. bool running = true; - while (StateManager::currentState() && running) { + while (stateManager.currentState() && running) { RW_PROFILE_FRAME_BOUNDARY(); RW_PROFILE_SCOPE("Main Loop"); @@ -397,12 +397,12 @@ int RWGame::run() { getWindow().swap(); // Make sure the topmost state is the correct state - StateManager::get().updateStack(); + stateManager.updateStack(); } window.close(); - StateManager::get().clear(); + stateManager.clear(); return 0; } @@ -413,7 +413,7 @@ float RWGame::tickWorld(const float deltaTime, float accumulatedTime) { deltaTime * world->state->basic.timeScale; while (accumulatedTime >= deltaTime) { - if (!StateManager::currentState()) { + if (!stateManager.currentState()) { break; } @@ -423,7 +423,7 @@ float RWGame::tickWorld(const float deltaTime, float accumulatedTime) { deltaTimeWithTimeScale, kMaxPhysicsSubSteps, deltaTime); } - StateManager::get().tick(deltaTimeWithTimeScale); + stateManager.tick(deltaTimeWithTimeScale); tick(deltaTimeWithTimeScale); @@ -466,9 +466,9 @@ bool RWGame::updateInput() { GameInput::updateGameInputState(&getState()->input[0], event); - if (StateManager::currentState()) { + if (stateManager.currentState()) { RW_PROFILE_SCOPE("State"); - StateManager::currentState()->handleEvent(event); + stateManager.currentState()->handleEvent(event); } } return true; @@ -476,7 +476,7 @@ bool RWGame::updateInput() { void RWGame::tick(float dt) { RW_PROFILE_SCOPE(__func__); - State* currState = StateManager::get().states.back().get(); + State* currState = stateManager.states.back().get(); static float clockAccumulator = 0.f; static float scriptTimerAccumulator = 0.f; @@ -593,8 +593,8 @@ void RWGame::render(float alpha, float time) { getRenderer().getRenderer().swap(); // Update the camera - if (!StateManager::get().states.empty()) { - currentCam = StateManager::get().states.back()->getCamera(alpha); + if (!stateManager.states.empty()) { + currentCam = stateManager.states.back()->getCamera(alpha); } glm::ivec2 windowSize = getWindow().getSize(); @@ -624,9 +624,9 @@ void RWGame::render(float alpha, float time) { if (!world->isPaused()) hudDrawer.drawOnScreenText(world.get(), renderer); - if (StateManager::currentState()) { + if (stateManager.currentState()) { RW_PROFILE_SCOPE("state"); - StateManager::get().draw(renderer); + stateManager.draw(renderer); } } diff --git a/rwgame/RWGame.hpp b/rwgame/RWGame.hpp index b3870c04..7dd654e0 100644 --- a/rwgame/RWGame.hpp +++ b/rwgame/RWGame.hpp @@ -5,6 +5,7 @@ #include "GameBase.hpp" #include "HUDDrawer.hpp" #include "RWConfig.hpp" +#include "StateManager.hpp" #ifdef _MSC_VER #pragma warning(disable : 4305 5033) @@ -41,6 +42,8 @@ class RWGame final : public GameBase { std::unique_ptr vm; SCMFile script; + StateManager stateManager; + bool inFocus = true; ViewCamera currentCam; @@ -68,6 +71,10 @@ public: */ void newGame(); + StateManager& getStateManager() { + return stateManager; + } + GameState* getState() { return &state; } diff --git a/rwgame/StateManager.hpp b/rwgame/StateManager.hpp index 424bd147..8fd58862 100644 --- a/rwgame/StateManager.hpp +++ b/rwgame/StateManager.hpp @@ -19,11 +19,6 @@ */ class StateManager { public: - static StateManager& get() { - static StateManager m; - return m; - } - std::deque> states; void clear() { @@ -63,11 +58,11 @@ public: states.back()->draw(r); } - static State* currentState() { - if (StateManager::get().states.empty()) { + State* currentState() { + if (states.empty()) { return nullptr; } - return StateManager::get().states.back().get(); + return states.back().get(); } private: diff --git a/rwgame/states/IngameState.cpp b/rwgame/states/IngameState.cpp index 9d5247e6..632994e2 100644 --- a/rwgame/states/IngameState.cpp +++ b/rwgame/states/IngameState.cpp @@ -297,10 +297,10 @@ void IngameState::handleEvent(const SDL_Event& event) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: - StateManager::get().enter(game); + game->getStateManager().enter(game); break; case SDLK_m: - StateManager::get().enter(game, _look.position, + game->getStateManager().enter(game, _look.position, _look.rotation); break; case SDLK_SPACE: diff --git a/rwgame/states/MenuState.cpp b/rwgame/states/MenuState.cpp index e2cbc6ba..25c97573 100644 --- a/rwgame/states/MenuState.cpp +++ b/rwgame/states/MenuState.cpp @@ -15,14 +15,14 @@ void MenuState::enterMainMenu() { Menu menu{ {{t.text(MenuDefaults::kStartGameId), - [=] { StateManager::get().enter(game); }}, + [=] { game->getStateManager().enter(game); }}, {t.text(MenuDefaults::kLoadGameId), [=] { enterLoadMenu(); }}, {t.text(MenuDefaults::kDebugId), - [=] { StateManager::get().enter(game, true, "test"); }}, + [=] { game->getStateManager().enter(game, true, "test"); }}, {t.text(MenuDefaults::kOptionsId), [] { RW_UNIMPLEMENTED("Options Menu"); }}, {t.text(MenuDefaults::kQuitGameId), - [] { StateManager::get().clear(); }}}, + [=] { game->getStateManager().clear(); }}}, glm::vec2(200.f, 200.f)}; setNextMenu(std::move(menu)); @@ -43,7 +43,7 @@ void MenuState::enterLoadMenu() { auto name = GameStringUtil::fromString(ss.str(), FONT_ARIAL); name += save.basicState.saveName; auto loadsave = [=] { - StateManager::get().enter(game, false); + game->getStateManager().enter(game, false); game->loadGame(save.savePath); }; menu.lambda(name, loadsave); diff --git a/rwgame/states/PauseState.cpp b/rwgame/states/PauseState.cpp index fa1f9bd8..48a31aaf 100644 --- a/rwgame/states/PauseState.cpp +++ b/rwgame/states/PauseState.cpp @@ -10,7 +10,7 @@ PauseState::PauseState(RWGame* game) : State(game) { {t.text(MenuDefaults::kOptionsId), [] { std::cout << "Options" << std::endl; }}, {t.text(MenuDefaults::kQuitGameId), - [] { StateManager::get().clear(); }}}, + [=] { game->getStateManager().clear(); }}}, glm::vec2(200.f, 200.f)}; setNextMenu(menu); }