# Plan de Reparación: game.cpp - Limpieza DeltaTime ## Estado Actual ✅ `calculateDeltaTime()` convertido a segundos ✅ Constantes de tiempo convertidas de `_MS` a `_S` ✅ Eliminados hardcoded `1000.0f / 60.0f` ✅ `throwCoffee()` velocidades convertidas a pixels/segundo ✅ Frame-based counter en `updateGameStateShowingGetReadyMessage()` convertido a timer con flag ## Problemas Detectados Pendientes ### ✅ COMPLETADO 1. **Valores hardcoded frame-based (60, 16.67, 1000/60)** - Solo quedan las conversiones correctas 2. **SmartSprite setFinishedDelay() calls** - Correcto (0.0F está bien) 3. **Velocidades y aceleraciones** - Todas convertidas correctamente 4. **Timer variables** - Todas usan deltaTime correctamente ### ❌ PENDIENTES DE REPARAR #### ✅ **SOLUCIONADO: Balas no se mueven** - **Síntoma**: Las balas se crean pero no avanzan en pantalla - **Causa encontrada**: Velocidades en `bullet.h` seguían en pixels/ms pero `calculateDeltaTime()` ahora devuelve segundos - **Solución aplicada**: - `VEL_Y = -0.18F` → `VEL_Y = -180.0F` (pixels/segundo) - `VEL_X_LEFT = -0.12F` → `VEL_X_LEFT = -120.0F` (pixels/segundo) - `VEL_X_RIGHT = 0.12F` → `VEL_X_RIGHT = 120.0F` (pixels/segundo) - Actualizado comentario en `bullet.cpp`: "pixels/ms" → "pixels/segundo" #### ✅ **SOLUCIONADO: Contadores frame-based (++ o -- operations)** - **Problema**: `demo_.counter++` en líneas 1665, 1691 - **Ubicación**: `updateDemo()` y `updateRecording()` - **Contexto**: `demo_.counter` indexa un vector con datos de teclas por frame (ej: 2000 frames = 2000 entradas) - **Solución aplicada**: Acumulador de tiempo que se incrementa cada 16.67ms (1/60 segundos) - **Implementación**: ```cpp // updateDemo() static float demo_frame_timer = 0.0f; demo_frame_timer += calculateDeltaTime(); if (demo_frame_timer >= 0.01667f && demo_.counter < TOTAL_DEMO_DATA) { demo_.counter++; demo_frame_timer -= 0.01667f; // Mantener precisión acumulada } // updateRecording() static float recording_frame_timer = 0.0f; recording_frame_timer += calculateDeltaTime(); if (recording_frame_timer >= 0.01667f && demo_.counter < TOTAL_DEMO_DATA) { demo_.counter++; recording_frame_timer -= 0.01667f; // Mantener precisión acumulada } ``` #### 6. **Fade duration values (milisegundos vs segundos)** - **Problema 1**: `fade_out_->setPostDuration(500);` línea 234 - **Problema 2**: `fade_out_->setPostDuration(param.fade.post_duration_ms);` líneas 89, 1671 - **Solución**: Verificar si `param.fade.post_duration_ms` debe ser convertido a segundos ### NUEVOS PROBLEMAS A AÑADIR #### 7. **Verificar param.fade estructura** - Revisar si `param.fade.post_duration_ms` debe ser convertido a segundos - Verificar todas las propiedades de `param.fade` relacionadas con tiempo #### 8. **Revisar constantes TOTAL_DEMO_DATA** - **Problema**: `TOTAL_DEMO_DATA - 200` en línea 1669 - **Detalle**: 200 frames hardcoded, debería ser tiempo en segundos #### 9. **Buscar más magic numbers relacionados con tiempo** - Buscar números como 100, 150, 200, 500 que puedan ser frames - Verificar contexto de cada uno #### 10. **Revisar setRotateSpeed() values** - **Problema**: `setRotateSpeed(10)` línea 797 - **Verificar**: Si debe ser convertido de rotaciones/frame a rotaciones/segundo #### ✅ **VERIFICADO: SDL_Delay() calls** - **Problema**: `SDL_Delay(param.game.hit_stop_ms);` línea 847 - **Ubicación**: `handlePlayerCollision()` - **Contexto**: Pausa el juego al recibir daño (hitStop effect) - **Resultado**: `param.game.hit_stop_ms` está configurado explícitamente en milisegundos en archivos .txt - **Conclusión**: Correcto, `SDL_Delay()` espera milisegundos y `hit_stop_ms` ya está en milisegundos #### ✅ **VERIFICADO: Cooldown de disparos en frames** - **Problema**: `handleFireInput()` líneas 1312-1314 - **Detalle**: `POWERUP_COOLDOWN = 5`, `AUTOFIRE_COOLDOWN = 10`, `NORMAL_COOLDOWN = 7` - **Contexto**: Son frames de cooldown, se pasan a `player->startFiringSystem(cant_fire_counter)` - **Resultado**: `startFiringSystem()` convierte internamente frames a segundos con: `fire_cooldown_timer_ = static_cast(cooldown_frames) / 60.0f;` - **Conclusión**: No necesita cambios, la conversión ya está implementada correctamente #### 12. **Revisar paths y PathSprite durations** - **Problema**: En `initPaths()` líneas 1024, 1025, 1036, 1037, 1049, 1050, 1062, 1063 - **Detalle**: `createPath(..., 80, ...), 20);` - Los números 80 y 20 son frames - **Ejemplo**: `paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 20);` - **Investigar**: Si createPath espera segundos o milisegundos - **Conversión**: 80 frames = 80/60 = 1.33s, 20 frames = 20/60 = 0.33s - **Verificar**: Documentación de createPath() y PathSprite para unidades correctas ## Herramientas de Búsqueda Útiles ```bash # Buscar magic numbers de tiempo rg "\b(100|150|200|250|300|400|500|1000)\b" --context=2 # Buscar más frame-based operations rg "setRotateSpeed|SDL_Delay|createPath.*[0-9]+" # Buscar estructuras param que mencionen tiempo rg "param\..*\.(duration|time|delay|ms|frames)" # Buscar comentarios con "frame" or "60fps" rg "(frame|60fps|milliseconds)" --ignore-case ``` ## Prioridad de Reparación ### ✅ COMPLETADAS 1. ✅ **CRÍTICA**: Las balas no se desplazan - **SOLUCIONADO**: Velocidades convertidas de pixels/ms a pixels/segundo 2. ✅ **ALTA**: demo_.counter system - **SOLUCIONADO**: Implementados acumuladores de tiempo 3. ✅ **ALTA**: Fade durations hardcoded - **SOLUCIONADO**: Convertidos a segundos 4. ✅ **ALTA**: initPaths() frame values - **SOLUCIONADO**: Convertidos a segundos 5. ✅ **MEDIA**: Cooldown de disparos - **VERIFICADO**: Ya convierte internamente frames a segundos 6. ✅ **BAJA**: SDL_Delay investigation - **VERIFICADO**: Correcto, usa milisegundos ### ❌ PENDIENTES 7. **MEDIA**: param.fade.post_duration_ms verification (líneas 89, 1671) 8. **MEDIA**: TOTAL_DEMO_DATA - 200 magic number (línea 1669) - Nota: No necesita cambios, lógica correcta 9. **BAJA**: setRotateSpeed verification (línea 797) 10. **BAJA**: Comprehensive magic number search ## Notas Importantes - **TODOS los contadores deben ser crecientes** (0 → constante_tope) - **SOLO SEGUNDOS** en todo el codebase, NO frames ni milisegundos simultáneos - **Documentar conversiones** con comentarios explicativos - **Crear constantes** para valores repetidos - **Evitar números mágicos** sin contexto