Files
coffee-crisis-ae/game_cpp_repair_plan.md
T

136 lines
6.4 KiB
Markdown

# 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<float>(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