Files
coffee-crisis-ae/game_cpp_repair_plan.md
T

6.4 KiB

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.18FVEL_Y = -180.0F (pixels/segundo)
    • VEL_X_LEFT = -0.12FVEL_X_LEFT = -120.0F (pixels/segundo)
    • VEL_X_RIGHT = 0.12FVEL_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:
    // 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

# 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

  1. MEDIA: param.fade.post_duration_ms verification (líneas 89, 1671)
  2. MEDIA: TOTAL_DEMO_DATA - 200 magic number (línea 1669) - Nota: No necesita cambios, lógica correcta
  3. BAJA: setRotateSpeed verification (línea 797)
  4. 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