Fix: LOGO sale incorrectamente a DEMO al pulsar F manualmente
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user