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:
2025-10-10 08:58:20 +02:00
parent a1e2c03efd
commit eb3dd03579
2 changed files with 12 additions and 2 deletions

View File

@@ -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);

View File

@@ -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;