diff --git a/source/engine.cpp b/source/engine.cpp index 11a83d0..962998b 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -950,13 +950,14 @@ void Engine::updatePhysicalWindowSize() { } // ============================================================================ -// CALLBACKS PARA STATEMANAGER - FASE 8 +// CALLBACKS PARA STATEMANAGER // ============================================================================ -// NOTA: Estos métodos son callbacks temporales para que StateManager pueda -// ejecutar acciones que requieren acceso a múltiples componentes del Engine. -// TODO FASE 9: Eliminar estos callbacks moviendo la lógica completa a StateManager +// StateManager coordina los estados y timers, Engine proporciona implementación +// Estos callbacks permiten que StateManager ejecute acciones complejas que +// requieren acceso a múltiples componentes (SceneManager, ThemeManager, etc.) +// Este enfoque es pragmático y mantiene la separación de responsabilidades -// Callback para ejecutar acciones de LOGO MODE +// Callback para ejecutar acciones de LOGO MODE (máquina de estados compleja) void Engine::performLogoAction(bool logo_waiting_for_flip) { // Verificar si algún modo demo está activo (DEMO, DEMO_LITE o LOGO) if (state_manager_->getCurrentMode() == AppMode::SANDBOX) return; @@ -1401,71 +1402,10 @@ void Engine::executeToggleGravityOnOff() { } // ============================================================================ -// SISTEMA DE MODO LOGO (Easter Egg - "Marca de Agua") +// CALLBACKS PARA STATEMANAGER - LOGO MODE // ============================================================================ -// Método antiguo mantenido para código legacy de LOGO (será eliminado en Fase 9) -void Engine::enterLogoMode(bool from_demo) { - // Verificar mínimo de pelotas - if (static_cast(scene_manager_->getBallCount()) < LOGO_MODE_MIN_BALLS) { - // Ajustar a 5000 pelotas automáticamente - scene_manager_->changeScenario(5); // Escenario 5000 pelotas (índice 5 en BALL_COUNT_SCENARIOS) - } - - // Guardar estado previo (para restaurar al salir) - logo_previous_theme_ = theme_manager_->getCurrentThemeIndex(); - logo_previous_texture_index_ = current_texture_index_; - logo_previous_shape_scale_ = shape_scale_factor_; - - // Buscar índice de textura "small" - size_t small_index = current_texture_index_; // Por defecto mantener actual - for (size_t i = 0; i < texture_names_.size(); i++) { - if (texture_names_[i] == "small") { - small_index = i; - break; - } - } - - // Aplicar configuración fija del Modo Logo - if (small_index != current_texture_index_) { - current_texture_index_ = small_index; - texture_ = textures_[current_texture_index_]; - int new_size = texture_->getWidth(); - current_ball_size_ = new_size; - scene_manager_->updateBallTexture(texture_, new_size); - } - - // Cambiar a tema aleatorio entre: MONOCHROME, LAVENDER, CRIMSON, ESMERALDA - int logo_themes[] = {5, 6, 7, 8}; // MONOCHROME, LAVENDER, CRIMSON, ESMERALDA - int random_theme = logo_themes[rand() % 4]; - theme_manager_->switchToTheme(random_theme); - - // Establecer escala a 120% - shape_scale_factor_ = LOGO_MODE_SHAPE_SCALE; - clampShapeScale(); - - // Activar PNG_SHAPE (el logo) - activateShapeInternal(ShapeType::PNG_SHAPE); - - // Configurar PNG_SHAPE en modo LOGO (flip intervals más largos) - if (active_shape_) { - PNGShape* png_shape = dynamic_cast(active_shape_.get()); - if (png_shape) { - png_shape->setLogoMode(true); - png_shape->resetFlipCount(); // Resetear contador de flips - } - } - - // Resetear variables de espera de flips - logo_waiting_for_flip_ = false; - logo_target_flip_number_ = 0; - logo_target_flip_percentage_ = 0.0f; - logo_current_flip_count_ = 0; - - // La configuración de estado se maneja en StateManager -} - -// Callbacks para StateManager - Solo configuración visual +// Callback para StateManager - Configuración visual al entrar a LOGO MODE void Engine::executeEnterLogoMode(size_t ball_count) { // Verificar mínimo de pelotas if (static_cast(ball_count) < LOGO_MODE_MIN_BALLS) { @@ -1577,13 +1517,13 @@ void Engine::switchTextureInternal(bool show_notification) { } // ============================================================================ -// Sistema de Figuras 3D - IMPLEMENTACIONES COMPLETAS TEMPORALES (hasta Fase 8) +// Sistema de Figuras 3D - IMPLEMENTACIÓN PARA CALLBACKS DEMO/LOGO // ============================================================================ -// NOTA FASE 7: Engine mantiene implementaciones completas para DEMO/LOGO -// ShapeManager tiene implementaciones paralelas que se usan para controles manuales del usuario -// TODO FASE 8: Eliminar estas implementaciones cuando migremos DEMO/LOGO a StateManager +// NOTA: Engine mantiene implementación de figuras usada por callbacks +// ShapeManager tiene implementación paralela para controles manuales del usuario +// Este enfoque permite que DEMO/LOGO manipulen figuras sin afectar el estado manual -// Sistema de Figuras 3D - Alternar entre modo física y última figura (Toggle con tecla F) +// Alternar entre modo física y última figura (usado por performLogoAction) void Engine::toggleShapeModeInternal(bool force_gravity_on_exit) { if (current_mode_ == SimulationMode::PHYSICS) { // Cambiar a modo figura (usar última figura seleccionada) diff --git a/source/engine.h b/source/engine.h index 0619707..2d0af6c 100644 --- a/source/engine.h +++ b/source/engine.h @@ -71,9 +71,10 @@ class Engine { void toggleLogoMode(); // === Métodos públicos para StateManager (callbacks) === - // NOTA FASE 8: StateManager necesita llamar a Engine para ejecutar acciones - // que requieren acceso a múltiples componentes (SceneManager, ThemeManager, etc.) - // TODO FASE 9: Mover lógica completa a StateManager eliminando estos callbacks + // NOTA: StateManager coordina estados, Engine proporciona implementación + // Estos callbacks permiten que StateManager ejecute acciones complejas que + // requieren acceso a múltiples componentes (SceneManager, ThemeManager, ShapeManager, etc.) + // Este enfoque es pragmático y mantiene la separación de responsabilidades limpia void performLogoAction(bool logo_waiting_for_flip); void executeDemoAction(bool is_lite); void executeRandomizeOnDemoStart(bool is_lite); @@ -131,9 +132,8 @@ class Engine { int theme_page_ = 0; // Página actual de temas (0 o 1) para acceso por Numpad // Sistema de Figuras 3D (polimórfico) - // NOTA FASE 7: Variables DUPLICADAS temporalmente con ShapeManager - // ShapeManager es la fuente de verdad, Engine mantiene copias para DEMO/LOGO - // TODO FASE 8: Eliminar duplicación cuando migremos DEMO/LOGO a StateManager + // NOTA: Engine mantiene implementación de figuras usada por callbacks DEMO/LOGO + // ShapeManager tiene implementación paralela para controles manuales del usuario SimulationMode current_mode_ = SimulationMode::PHYSICS; ShapeType current_shape_type_ = ShapeType::SPHERE; // Tipo de figura actual ShapeType last_shape_type_ = ShapeType::SPHERE; // Última figura para toggle F @@ -142,31 +142,32 @@ class Engine { bool depth_zoom_enabled_ = true; // Zoom por profundidad Z activado // Sistema de Modo DEMO (auto-play) y LOGO - // NOTA: Estado parcialmente duplicado con StateManager por pragmatismo - // StateManager mantiene current_app_mode_ (fuente de verdad) - // Engine mantiene variables de implementación temporalmente - AppMode previous_app_mode_ = AppMode::SANDBOX; // Modo previo antes de entrar a LOGO (temporal) + // NOTA: Engine mantiene estado de implementación para callbacks performLogoAction() + // StateManager coordina los triggers y timers, Engine ejecuta las acciones + AppMode previous_app_mode_ = AppMode::SANDBOX; // Modo previo antes de entrar a LOGO float demo_timer_ = 0.0f; // Contador de tiempo para próxima acción float demo_next_action_time_ = 0.0f; // Tiempo aleatorio hasta próxima acción (segundos) // Sistema de convergencia para LOGO MODE (escala con resolución) - // NOTA FASE 7: shape_convergence_ duplicado con ShapeManager temporalmente - // TODO FASE 8: Eliminar cuando migremos DEMO/LOGO + // Usado por performLogoAction() para detectar cuando las bolas forman el logo float shape_convergence_ = 0.0f; // % de pelotas cerca del objetivo (0.0-1.0) float logo_convergence_threshold_ = 0.90f; // Threshold aleatorio (75-100%) float logo_min_time_ = 3.0f; // Tiempo mínimo escalado con resolución float logo_max_time_ = 5.0f; // Tiempo máximo escalado (backup) // Sistema de espera de flips en LOGO MODE (camino alternativo) + // Permite que LOGO espere a que ocurran rotaciones antes de cambiar estado bool logo_waiting_for_flip_ = false; // true si eligió el camino "esperar flip" int logo_target_flip_number_ = 0; // En qué flip actuar (1, 2 o 3) float logo_target_flip_percentage_ = 0.0f; // % de flip a esperar (0.2-0.8) int logo_current_flip_count_ = 0; // Flips observados hasta ahora // Control de entrada manual vs automática a LOGO MODE + // Determina si LOGO debe salir automáticamente o esperar input del usuario bool logo_entered_manually_ = false; // true si se activó con tecla K, false si automático desde DEMO // Estado previo antes de entrar a Logo Mode (para restaurar al salir) + // Guardado por executeEnterLogoMode(), restaurado por executeExitLogoMode() int logo_previous_theme_ = 0; // Índice de tema (0-9) size_t logo_previous_texture_index_ = 0; float logo_previous_shape_scale_ = 1.0f; @@ -188,19 +189,6 @@ class Engine { // Métodos auxiliares privados (llamados por la interfaz pública) void showNotificationForAction(const std::string& text); // Mostrar notificación solo en modo MANUAL - // Sistema de gestión de estados (MANUAL/DEMO/DEMO_LITE/LOGO) - void setState(AppMode new_mode); // Cambiar modo de aplicación (mutuamente excluyente) - - // Sistema de Modo DEMO - void updateDemoMode(); - void performDemoAction(bool is_lite); - void randomizeOnDemoStart(bool is_lite); - void toggleGravityOnOff(); - - // Sistema de Modo Logo (easter egg) - Métodos privados - void enterLogoMode(bool from_demo = false); // Entrar al modo logo (manual o automático) - void exitLogoMode(bool return_to_demo = false); // Salir del modo logo - // Sistema de cambio de sprites dinámico - Métodos privados void switchTextureInternal(bool show_notification); // Implementación interna del cambio de textura