From df85e5c47b99ef0117bc036abd0bbff2d689b671 Mon Sep 17 00:00:00 2001 From: Daniel 0xdbeef Zalega Date: Sun, 17 Dec 2023 23:02:14 +0100 Subject: [PATCH] Added a helper function for getting GameLoopBaseState ptr --- .../include/prefabs/ui/CheatConsole.hpp | 10 ++++-- .../interface/game-loop/GameLoop.hpp | 2 ++ src/game-loop/src/game-loop/GameLoop.cpp | 20 ++++++++++++ .../src/game-loop/GameLoopMainMenuState.cpp | 32 +++---------------- .../src/game-loop/GameLoopPlayingState.cpp | 20 ++---------- .../src/game-loop/GameLoopSandboxState.cpp | 21 ++---------- .../src/game-loop/GameLoopScoresState.cpp | 21 ++---------- src/game-loop/src/prefabs/ui/CheatConsole.cpp | 8 ++--- 8 files changed, 45 insertions(+), 89 deletions(-) diff --git a/src/game-loop/include/prefabs/ui/CheatConsole.hpp b/src/game-loop/include/prefabs/ui/CheatConsole.hpp index 1551b7f9..c85f92b1 100644 --- a/src/game-loop/include/prefabs/ui/CheatConsole.hpp +++ b/src/game-loop/include/prefabs/ui/CheatConsole.hpp @@ -6,9 +6,15 @@ namespace prefabs { - struct CheatConsoleComponent + class CheatConsoleComponent { - GameLoop::State state{GameLoop::State::CURRENT}; + public: + bool is_state_change_requested() const { return _state_change_requested; } + void request_state_change(GameLoop::State requested_state) { _requested_state = requested_state; _state_change_requested = true; } + GameLoop::State get_requested_state() const { return _requested_state;} + private: + bool _state_change_requested = false; + GameLoop::State _requested_state{GameLoop::State::CURRENT}; }; struct CheatConsole diff --git a/src/game-loop/interface/game-loop/GameLoop.hpp b/src/game-loop/interface/game-loop/GameLoop.hpp index 0c8f9e1c..d5a94f68 100644 --- a/src/game-loop/interface/game-loop/GameLoop.hpp +++ b/src/game-loop/interface/game-loop/GameLoop.hpp @@ -48,6 +48,8 @@ class GameLoop GameLoop(const std::shared_ptr&); std::function& get(); + GameLoopBaseState* get_game_loop_state_ptr(State); + private: friend class GameLoopBaseState; diff --git a/src/game-loop/src/game-loop/GameLoop.cpp b/src/game-loop/src/game-loop/GameLoop.cpp index 53693ae8..2ae4cc49 100644 --- a/src/game-loop/src/game-loop/GameLoop.cpp +++ b/src/game-loop/src/game-loop/GameLoop.cpp @@ -57,3 +57,23 @@ GameLoop::GameLoop(const std::shared_ptr& viewport) return _exit; }; } + +GameLoopBaseState *GameLoop::get_game_loop_state_ptr(GameLoop::State state) { + switch (state) { + case State::MAIN_MENU: + return &_states.main_menu; + case State::PLAYING: + return &_states.playing; + case State::STARTED: + return &_states.started; + case State::LEVEL_SUMMARY: + return &_states.level_summary; + case State::SCORES: + return &_states.scores; + case State::SANDBOX: + return &_states.sandbox; + case State::CURRENT: + return _states.current; + default: assert(false); + } +} diff --git a/src/game-loop/src/game-loop/GameLoopMainMenuState.cpp b/src/game-loop/src/game-loop/GameLoopMainMenuState.cpp index 9b376870..d1e07d0d 100644 --- a/src/game-loop/src/game-loop/GameLoopMainMenuState.cpp +++ b/src/game-loop/src/game-loop/GameLoopMainMenuState.cpp @@ -105,39 +105,17 @@ GameLoopBaseState *GameLoopMainMenuState::update(GameLoop& game_loop, uint32_t d } } - - auto& cheat_console = registry.get(_cheat_console); - switch (cheat_console.state) - { - case GameLoop::State::SCORES: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.scores; - } - case GameLoop::State::MAIN_MENU: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.main_menu; - } - case GameLoop::State::PLAYING: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.playing; - } - case GameLoop::State::SANDBOX: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.sandbox; - } - default: {} - } - if (position.y_center <= EXIT_LEVEL_Y) { log_info("Quitting using rope."); game_loop._exit = true; } + auto& cheat_console = registry.get(_cheat_console); + if (cheat_console.is_state_change_requested()) { + return game_loop.get_game_loop_state_ptr(cheat_console.get_requested_state()); + } + return this; } diff --git a/src/game-loop/src/game-loop/GameLoopPlayingState.cpp b/src/game-loop/src/game-loop/GameLoopPlayingState.cpp index ddd8d148..82552f56 100644 --- a/src/game-loop/src/game-loop/GameLoopPlayingState.cpp +++ b/src/game-loop/src/game-loop/GameLoopPlayingState.cpp @@ -114,24 +114,8 @@ GameLoopBaseState *GameLoopPlayingState::update(GameLoop& game_loop, uint32_t de game_loop._level_summary_tracker->update(delta_time_ms); auto& cheat_console = registry.get(_cheat_console); - switch (cheat_console.state) - { - case GameLoop::State::SCORES: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.scores; - } - case GameLoop::State::MAIN_MENU: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.main_menu; - } - case GameLoop::State::PLAYING: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.playing; - } - default: {} + if (cheat_console.is_state_change_requested()) { + return game_loop.get_game_loop_state_ptr(cheat_console.get_requested_state()); } return this; diff --git a/src/game-loop/src/game-loop/GameLoopSandboxState.cpp b/src/game-loop/src/game-loop/GameLoopSandboxState.cpp index 5d85f3b4..2e101cc5 100644 --- a/src/game-loop/src/game-loop/GameLoopSandboxState.cpp +++ b/src/game-loop/src/game-loop/GameLoopSandboxState.cpp @@ -83,26 +83,9 @@ GameLoopBaseState *GameLoopSandboxState::update(GameLoop& game_loop, uint32_t de return &game_loop._states.main_menu; } - auto& cheat_console = registry.get(_cheat_console); - switch (cheat_console.state) - { - case GameLoop::State::SCORES: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.scores; - } - case GameLoop::State::MAIN_MENU: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.main_menu; - } - case GameLoop::State::PLAYING: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.playing; - } - default: {} + if (cheat_console.is_state_change_requested()) { + return game_loop.get_game_loop_state_ptr(cheat_console.get_requested_state()); } return this; diff --git a/src/game-loop/src/game-loop/GameLoopScoresState.cpp b/src/game-loop/src/game-loop/GameLoopScoresState.cpp index 937aeac0..2df52311 100644 --- a/src/game-loop/src/game-loop/GameLoopScoresState.cpp +++ b/src/game-loop/src/game-loop/GameLoopScoresState.cpp @@ -75,26 +75,9 @@ GameLoopBaseState *GameLoopScoresState::update(GameLoop& game_loop, uint32_t del return &game_loop._states.main_menu; } - auto& cheat_console = registry.get(_cheat_console); - switch (cheat_console.state) - { - case GameLoop::State::SCORES: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.scores; - } - case GameLoop::State::MAIN_MENU: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.main_menu; - } - case GameLoop::State::PLAYING: - { - cheat_console.state = GameLoop::State::CURRENT; - return &game_loop._states.playing; - } - default: {} + if (cheat_console.is_state_change_requested()) { + return game_loop.get_game_loop_state_ptr(cheat_console.get_requested_state()); } return this; diff --git a/src/game-loop/src/prefabs/ui/CheatConsole.cpp b/src/game-loop/src/prefabs/ui/CheatConsole.cpp index da5cfe59..eb16e9db 100644 --- a/src/game-loop/src/prefabs/ui/CheatConsole.cpp +++ b/src/game-loop/src/prefabs/ui/CheatConsole.cpp @@ -237,22 +237,22 @@ namespace { if (upper_cased == "ENTER SCORES") { auto& registry = EntityRegistry::instance().get_registry(); auto& cheat_console_component = registry.get(_self); - cheat_console_component.state = GameLoop::State::SCORES; + cheat_console_component.request_state_change(GameLoop::State::SCORES); return std::make_pair(true, "entering scores"); } else if (upper_cased == "ENTER MAIN_MENU") { auto& registry = EntityRegistry::instance().get_registry(); auto& cheat_console_component = registry.get(_self); - cheat_console_component.state = GameLoop::State::MAIN_MENU; + cheat_console_component.request_state_change(GameLoop::State::MAIN_MENU); return std::make_pair(true, "entering main_menu"); } else if (upper_cased == "ENTER SANDBOX") { auto& registry = EntityRegistry::instance().get_registry(); auto& cheat_console_component = registry.get(_self); - cheat_console_component.state = GameLoop::State::SANDBOX; + cheat_console_component.request_state_change(GameLoop::State::SANDBOX); return std::make_pair(true, "entering sanbox"); } else if (upper_cased == "ENTER PLAYING") { auto& registry = EntityRegistry::instance().get_registry(); auto& cheat_console_component = registry.get(_self); - cheat_console_component.state = GameLoop::State::PLAYING; + cheat_console_component.request_state_change(GameLoop::State::PLAYING); return std::make_pair(true, "entering playing"); } else { return std::make_pair(false, "");