From 1b251bd174527951eec220ecbcb7eca89328e5b8 Mon Sep 17 00:00:00 2001 From: hachem Date: Thu, 14 Aug 2025 00:02:01 +0200 Subject: feat: state manager --- src/core/state_manager.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/core/state_manager.cpp (limited to 'src/core/state_manager.cpp') diff --git a/src/core/state_manager.cpp b/src/core/state_manager.cpp new file mode 100644 index 0000000..5da601c --- /dev/null +++ b/src/core/state_manager.cpp @@ -0,0 +1,82 @@ +#include "state_manager.h" +#include "log.h" + +namespace Donut +{ + void StateManager::shutdown() + { + if (m_current_state) + m_current_state->on_exit(); + + destroy_states(); + DONUT_INFO("StateManager shutdown"); + } + + void StateManager::destroy_states() + { + m_states.clear(); + m_current_state = nullptr; + m_current_state_name = ""; + } + + void StateManager::register_state(const std::string& state_name, std::unique_ptr state) + { + if (m_states.find(state_name) != m_states.end()) + DONUT_WARN("State '{}' already exists, overwriting", state_name); + m_states[state_name] = std::move(state); + DONUT_INFO("Registered state: {}", state_name); + } + + void StateManager::switch_to_state(const std::string& state_name) + { + auto it = m_states.find(state_name); + if (it == m_states.end()) + { + DONUT_ERROR("Attempted to switch to unknown state: {}", state_name); + return; + } + + State* new_state = it->second.get(); + if (new_state == m_current_state) + return; + + if (m_current_state) + m_current_state->on_exit(); + + m_current_state = new_state; + m_current_state_name = state_name; + m_current_state->on_enter(); + DONUT_INFO("Switched to state: {}", state_name); + } + + State* StateManager::get_state(const std::string& state_name) + { + auto it = m_states.find(state_name); + if (it != m_states.end()) + return it->second.get(); + return nullptr; + } + + bool StateManager::has_state(const std::string& state_name) const + { + return m_states.find(state_name) != m_states.end(); + } + + void StateManager::update(float delta_time) + { + if (m_current_state) + m_current_state->on_update(delta_time); + } + + void StateManager::render() + { + if (m_current_state) + m_current_state->on_render(); + } + + void StateManager::on_event(Event& event) + { + if (m_current_state) + m_current_state->on_event(event); + } +} -- cgit v1.3