#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, Scope 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); } }