From eb3dd0357996de5cffbbd8ac30b8650ec1f0af75 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 10 Oct 2025 08:58:20 +0200 Subject: [PATCH] Fix: LOGO sale incorrectamente a DEMO al pulsar F manualmente MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige bug donde pulsar F en modo LOGO (llegando desde DEMO) causaba salida automática a DEMO debido a uso incorrecto de previous_app_mode_ como flag de "¿puede salir automáticamente?". ## Problema **Flujo con bug:** 1. SANDBOX → D → DEMO 2. DEMO → K → LOGO (guarda previous_app_mode_ = DEMO) 3. LOGO (SHAPE) → F → LOGO (PHYSICS) ← Acción MANUAL 4. updateDemoMode() ejecuta lógica de LOGO 5. Línea 1628: `if (previous_app_mode_ != SANDBOX && rand() < 60%)` 6. Como previous_app_mode_ == DEMO → Sale a DEMO ❌ **Causa raíz:** La variable previous_app_mode_ se usaba para dos propósitos: - Guardar a dónde volver (correcto) - Decidir si puede salir automáticamente (incorrecto) Esto causaba que acciones manuales del usuario (como F) activaran la probabilidad de salida automática. ## Solución Implementada **Nueva variable explícita:** ```cpp bool logo_entered_manually_; // true si tecla K, false si desde DEMO ``` **Asignación en enterLogoMode():** ```cpp logo_entered_manually_ = !from_demo; ``` **Condición corregida en updateDemoMode():** ```cpp // ANTES (incorrecto): if (previous_app_mode_ != AppMode::SANDBOX && rand() % 100 < 60) // AHORA (correcto): if (!logo_entered_manually_ && rand() % 100 < 60) ``` ## Ventajas ✅ **Separación de responsabilidades:** - previous_app_mode_: Solo para saber a dónde volver - logo_entered_manually_: Solo para control de salida automática ✅ **Semántica clara:** - Código más legible y expresivo ✅ **Más robusto:** - No depende de comparaciones indirectas ## Flujos Verificados **Flujo 1 (Manual desde SANDBOX):** - SANDBOX → K → LOGO (logo_entered_manually_ = true) - LOGO → F → PHYSICS - No sale automáticamente ✅ **Flujo 2 (Manual desde DEMO):** - SANDBOX → D → DEMO → K → LOGO (logo_entered_manually_ = true) - LOGO → F → PHYSICS - No sale automáticamente ✅ **Flujo 3 (Automático desde DEMO):** - SANDBOX → D → DEMO → auto → LOGO (logo_entered_manually_ = false) - LOGO ejecuta acciones automáticas - Sale a DEMO con 60% probabilidad ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- source/engine.cpp | 11 +++++++++-- source/engine.h | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/source/engine.cpp b/source/engine.cpp index 1e84109..e07156a 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -1623,9 +1623,10 @@ void Engine::updateDemoMode() { demo_next_action_time_ = logo_min_time_ + (rand() % 1000) / 1000.0f * interval_range; } - // Solo salir automáticamente si NO llegamos desde MANUAL + // Solo salir automáticamente si la entrada a LOGO fue automática (desde DEMO) + // No salir si el usuario entró manualmente con tecla K // Probabilidad de salir: 60% en cada acción → sale rápido (relación DEMO:LOGO = 6:1) - if (previous_app_mode_ != AppMode::SANDBOX && rand() % 100 < 60) { + if (!logo_entered_manually_ && rand() % 100 < 60) { exitLogoMode(true); // Volver a DEMO/DEMO_LITE } } @@ -1992,6 +1993,9 @@ void Engine::enterLogoMode(bool from_demo) { logo_target_flip_percentage_ = 0.0f; logo_current_flip_count_ = 0; + // Guardar si entrada fue manual (tecla K) o automática (desde DEMO) + logo_entered_manually_ = !from_demo; + // Cambiar a modo LOGO (guarda previous_app_mode_ automáticamente) setState(AppMode::LOGO); } @@ -2029,6 +2033,9 @@ void Engine::exitLogoMode(bool return_to_demo) { } } + // Resetear flag de entrada manual + logo_entered_manually_ = false; + if (!return_to_demo) { // Salida manual (tecla K): volver a MANUAL setState(AppMode::SANDBOX); diff --git a/source/engine.h b/source/engine.h index b998123..d399a54 100644 --- a/source/engine.h +++ b/source/engine.h @@ -120,6 +120,9 @@ class Engine { 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 + 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) int logo_previous_theme_ = 0; // Índice de tema (0-9) size_t logo_previous_texture_index_ = 0;