Files
Ajedrez_Purgatorio/production/sprints/sprint-5.md
T

21 KiB

Sprint 5: Meta Systems + Polish

Sprint ID: S5
Fechas: 10 mayo - 17 mayo 2026 (7 días)
Milestone: Vertical Slice
Objetivo: Implementar Dead Kings, Save/Load, Main Menu, HUD y polish final para completar VS


📊 Sprint Goal

Completar las mecánicas meta (Dead Kings, persistencia) y sistemas de UI necesarios para el Vertical Slice. Al final de este sprint, el juego debe ser jugable de inicio a fin con todas las mecánicas core implementadas.

Definition of Done para el Sprint:

  • Dead Kings system funcional (input al perder + spawn en campañas)
  • Save/Load entre capítulos operativo
  • Main Menu con todas las opciones necesarias
  • HUD muestra información relevante durante gameplay
  • Todas las stories con tests apropiados
  • 0 bugs S1 (Critical/Blocker)
  • Build jugable de inicio a fin sin crashes

📋 Sprint Backlog

Epic: Dead Kings System

S5-001: DeadKingPool (Manager + Persistence)

Story Type: Logic
Priority: P0 (Blocker)
Estimated Effort: 5 puntos
Dependencies: Ninguna

Description:
Implementar el sistema de pool local de Reyes Muertos. Gestiona la carga, guardado y rotación de Dead Kings en un archivo JSON persistente.

Technical Requirements:

  • Clase DeadKingPool (singleton MonoBehaviour o ScriptableObject)
  • Estructura de datos DeadKingData:
    [Serializable]
    public class DeadKingData
    {
        public string id;
        public string playerName;
        public string message;
        public int chapterReached;
        public int piecesLost;
        public string date; // ISO 8601
        public CampaignStats campaignStats;
    }
    
  • Métodos:
    • AddDeadKing(DeadKingData data) — agrega al pool
    • GetRandomDeadKing() → DeadKingData — retorna DK aleatorio o null si pool vacío
    • ShouldSpawnDeadKing(int chapterIndex) → bool — calcula probabilidad de spawn
    • SavePool() — escribe a JSON en Application.persistentDataPath
    • LoadPool() — lee desde JSON
  • Rotación FIFO: máximo 100 Dead Kings; si está lleno, remover el más antiguo
  • Filtro básico de contenido: lista de palabras prohibidas → reemplazar con "***"

Acceptance Criteria:

  • Pool se carga automáticamente al iniciar el juego
  • AddDeadKing() agrega correctamente al pool y persiste
  • GetRandomDeadKing() retorna DK aleatorio o null si vacío
  • ShouldSpawnDeadKing() usa fórmula: base_chance (0.2) + (chapter_index * 0.2)
  • Rotación FIFO funciona al alcanzar 100 DKs
  • Filtro de contenido reemplaza palabras prohibidas con "***"
  • JSON se guarda en Application.persistentDataPath/dead_kings.json
  • Si JSON corrupto, crea pool nuevo vacío sin crash

Test Evidence:

  • Unit tests: Tests/Unit/Meta/DeadKingPoolTests.cs
    • Test rotación FIFO
    • Test filtro de contenido
    • Test probabilidad de spawn por capítulo

S5-002: DeadKingInputUI

Story Type: UI
Priority: P0 (Blocker)
Estimated Effort: 3 puntos
Dependencies: S5-001

Description:
Pantalla de UI que aparece al perder una campaña, permitiendo al jugador inscribir su nombre y mensaje en el Rey caído.

Technical Requirements:

  • Scene o Canvas prefab: DeadKingInputUI
  • Elementos UI:
    • Panel oscuro (background con Muerte observando)
    • Campo de texto: Nombre (máx 20 caracteres)
    • Campo de texto: Mensaje (máx 100 caracteres)
    • Botón "Inscribir" con debounce de 500ms
    • Texto de feedback ("Rey inscrito...", "Regresando al menú...")
  • Clase DeadKingInputUI (MonoBehaviour):
    • Show(CampaignState campaignState) — activa panel, extrae stats de campaña
    • OnSubmitClick() — valida campos, llama DeadKingPool.AddDeadKing(), transiciona a menú
    • Validación: nombre no vacío (default "Anónimo"), mensaje opcional
  • Transición: después de inscribir, fade to black → Main Menu

Acceptance Criteria:

  • Panel aparece al perder en campaña (jaque mate al Rey)
  • Campos de nombre y mensaje funcionan con límites de caracteres
  • Botón "Inscribir" tiene debounce de 500ms (no permite doble click)
  • Si nombre vacío, usa "Anónimo"
  • Mensaje opcional (puede estar vacío)
  • Al inscribir, se muestra feedback ("Rey inscrito...")
  • Después de 2 segundos, transiciona a Main Menu
  • Stats de campaña se extraen correctamente de CampaignState

Test Evidence:

  • Manual evidence: production/qa/evidence/s5-002-dead-king-input-ui.md
    • Screenshot de panel con campos llenos
    • Screenshot de feedback después de inscribir

S5-003: DeadKingSpawn (Board Integration)

Story Type: Integration
Priority: P0 (Blocker)
Estimated Effort: 4 puntos
Dependencies: S5-001

Description:
Integrar Dead Kings con el sistema de tablero. Al cargar un capítulo, decidir si el Rey enemigo es un Dead King y configurar su visual/datos apropiadamente.

Technical Requirements:

  • Modificar BoardManager o CampaignManager:
    • Al iniciar capítulo, llamar DeadKingPool.ShouldSpawnDeadKing(chapterIndex)
    • Si true, llamar GetRandomDeadKing() y guardar en estado temporal
    • Pasar flag isDeadKing al inicializar Rey negro
  • Modificar clase King:
    • Agregar campo opcional: DeadKingData deadKingData
    • Agregar visual indicator (corona rota, aura, o sprite alternativo)
    • Si es Dead King, mostrar nameplate flotante con playerName
  • Modificar GameManager.OnGameOver():
    • Si victoria y Rey enemigo era Dead King, mostrar DeadKingRevealUI

Acceptance Criteria:

  • Al iniciar capítulo, se llama ShouldSpawnDeadKing() con probabilidades correctas
  • Si spawn aprobado, Rey negro se configura como Dead King
  • Dead King tiene visual distinto (corona rota o aura)
  • Nameplate flotante muestra nombre del jugador original
  • Al hacer jaque mate a Dead King, se dispara reveal UI
  • Si pool vacío, usa Rey estándar con datos predefinidos

Test Evidence:

  • Integration test: Tests/Integration/Meta/DeadKingSpawnTests.cs
    • Mock de BoardManager y pool
    • Verificar que probabilidad se respeta
  • Manual evidence: Screenshot de Dead King en tablero con visual distintivo

S5-004: DeadKingRevealUI

Story Type: UI
Priority: P1 (High)
Estimated Effort: 2 puntos
Dependencies: S5-003

Description:
Pantalla que aparece al hacer jaque mate a un Dead King, revelando el nombre, mensaje y stats del jugador original.

Technical Requirements:

  • Scene o Canvas prefab: DeadKingRevealUI
  • Elementos UI:
    • Background con efecto de lápida/memorial
    • Texto: Nombre del jugador
    • Texto: Mensaje de despedida
    • Stats: Capítulo alcanzado, piezas perdidas
    • Botón "Continuar"
  • Clase DeadKingRevealUI:
    • Show(DeadKingData data) — popula campos con datos del DK
    • OnContinueClick() — cierra panel y continúa flujo normal (chapter outro)

Acceptance Criteria:

  • Panel aparece al hacer jaque mate a Dead King
  • Nombre, mensaje y stats se muestran correctamente
  • Botón "Continuar" cierra el panel
  • Flujo continúa normalmente (chapter outro dialogue)
  • Visual tiene atmósfera solemne/memorial

Test Evidence:

  • Manual evidence: Screenshot de reveal UI con datos de ejemplo

Epic: Save/Load System

S5-005: SaveSystem (Core)

Story Type: Logic
Priority: P0 (Blocker)
Estimated Effort: 5 puntos
Dependencies: Ninguna

Description:
Sistema de persistencia para guardar y cargar el progreso de la campaña entre sesiones. Guarda CampaignState, capítulo actual, y configuración de jugador.

Technical Requirements:

  • Clase SaveSystem (singleton)
  • Estructura de datos SaveData:
    [Serializable]
    public class SaveData
    {
        public int currentChapterIndex;
        public List<string> completedChapters;
        public List<string> alivePieces;
        public int totalPiecesLost;
        public bool lastChapterWasVictory;
        public string saveDate; // ISO 8601
        public int saveSlot; // 0-2 para 3 slots
    }
    
  • Métodos:
    • SaveGame(int slot, CampaignState state, int currentChapter) — guarda a JSON
    • LoadGame(int slot) → SaveData — carga desde JSON
    • DeleteSave(int slot) — elimina archivo de save
    • DoesSaveExist(int slot) → bool — verifica si existe save
    • GetSaveInfo(int slot) → SaveInfo — retorna metadata (fecha, capítulo) sin cargar completo
  • Guardar en Application.persistentDataPath/save_slot_{0-2}.json
  • Auto-save: después de completar cada capítulo
  • Manual save: desde menú de pausa (opcional para VS)

Acceptance Criteria:

  • SaveGame() escribe JSON correctamente
  • LoadGame() lee JSON y retorna SaveData válido
  • DeleteSave() elimina archivo
  • DoesSaveExist() funciona correctamente
  • Auto-save después de completar capítulo
  • Si JSON corrupto, retorna null sin crash
  • Soporta 3 slots de guardado (0, 1, 2)

Test Evidence:

  • Unit tests: Tests/Unit/Meta/SaveSystemTests.cs
    • Test save/load roundtrip
    • Test corrupción de datos
    • Test múltiples slots

S5-006: SaveSystem Integration

Story Type: Integration
Priority: P0 (Blocker)
Estimated Effort: 3 puntos
Dependencies: S5-005

Description:
Integrar SaveSystem con CampaignManager para auto-save y load al continuar campaña.

Technical Requirements:

  • Modificar CampaignManager:
    • Método SaveProgress() — llama SaveSystem.SaveGame() con currentChapterIndex
    • Método LoadProgress(int slot) — carga SaveData y restaura CampaignState
    • Auto-save triggers:
      • Después de CompleteChapter()
      • Antes de transición a siguiente capítulo
  • Modificar Main Menu:
    • Botón "Continuar" solo visible si hay saves disponibles
    • Al click, cargar slot más reciente (o mostrar selector de slots)
    • Botón "Nueva Campaña" — resetea CampaignState, inicia desde Ch1

Acceptance Criteria:

  • Auto-save después de completar capítulo
  • "Continuar" carga el save más reciente
  • "Continuar" solo visible si hay saves disponibles
  • "Nueva Campaña" resetea estado y comienza desde Ch1
  • Al cargar, CampaignState se restaura correctamente
  • Piezas vivas/muertas se restauran
  • Capítulo actual se carga correctamente

Test Evidence:

  • Integration test: Tests/Integration/Meta/SaveLoadIntegrationTests.cs
    • Completar Ch1, guardar, cargar, verificar estado
  • Manual evidence: Playtest de save/load entre sesiones

Epic: Main Menu

S5-007: MainMenu Scene

Story Type: UI
Priority: P0 (Blocker)
Estimated Effort: 3 puntos
Dependencies: S5-006

Description:
Escena de Main Menu con opciones: Nueva Campaña, Continuar, Opciones, Salir.

Technical Requirements:

  • Scene: MainMenu.unity
  • Canvas con botones:
    • "Nueva Campaña" → resetea CampaignState, carga Ch1 intro
    • "Continuar" → carga save más reciente, resume campaña (solo visible si hay save)
    • "Opciones" → abre panel de opciones (audio, gráficos - opcional para VS)
    • "Salir" → Application.Quit()
  • Clase MainMenuController:
    • OnNewCampaignClick() — resetea estado, transiciona a Ch1
    • OnContinueClick() — carga save, transiciona a capítulo guardado
    • OnOptionsClick() — abre panel de opciones
    • OnQuitClick() — cierra aplicación
    • OnEnable() — verifica si hay saves, actualiza visibilidad de "Continuar"
  • Visual: fondo temático (Purgatorio, ajedrez), título del juego

Acceptance Criteria:

  • Scene MainMenu se carga al iniciar el juego
  • Botón "Nueva Campaña" inicia Ch1 con estado reseteado
  • Botón "Continuar" visible solo si hay saves
  • Botón "Continuar" carga save y resume
  • Botón "Salir" cierra aplicación
  • Visual es presentable (no placeholder)
  • Scene transitions funcionan (fade in/out)

Test Evidence:

  • Manual evidence: Screenshots de Main Menu + flujo de navegación

Epic: HUD System

S5-008: GameHUD (Core)

Story Type: UI
Priority: P1 (High)
Estimated Effort: 4 puntos
Dependencies: Ninguna

Description:
HUD durante gameplay que muestra información relevante: turno actual, piezas capturadas, botón de pausa, indicador de jaque.

Technical Requirements:

  • Canvas prefab: GameHUD (DontDestroyOnLoad o en cada scene de gameplay)
  • Elementos UI:
    • Texto: "Turno: Blancas/Negras"
    • Panel: Piezas capturadas (iconos de piezas blancas y negras)
    • Botón: "Pausa" → abre PauseMenu
    • Indicador: "¡Jaque!" (aparece cuando hay jaque)
    • Opcional: Contador de movimientos
  • Clase GameHUD:
    • UpdateTurn(bool isWhiteTurn) — actualiza texto de turno
    • AddCapturedPiece(Piece piece) — agrega icono a panel de capturadas
    • ShowCheckIndicator(bool show) — muestra/oculta indicador de jaque
    • Suscripción a eventos de GameManager:
      • OnTurnChanged → UpdateTurn()
      • OnPieceCaptured → AddCapturedPiece()
      • OnCheck → ShowCheckIndicator(true)

Acceptance Criteria:

  • Turno actual se muestra y actualiza correctamente
  • Piezas capturadas aparecen en panel con iconos
  • Indicador de jaque aparece cuando hay jaque
  • Botón de pausa abre PauseMenu
  • HUD no interfiere con gameplay (input, visibilidad)
  • HUD se actualiza en tiempo real

Test Evidence:

  • Manual evidence: Screenshots de HUD durante gameplay con diferentes estados

S5-009: PauseMenu

Story Type: UI
Priority: P2 (Medium)
Estimated Effort: 2 puntos
Dependencies: S5-008

Description:
Menú de pausa durante gameplay con opciones: Continuar, Reintentar Capítulo, Menú Principal.

Technical Requirements:

  • Canvas prefab: PauseMenu (overlay sobre GameHUD)
  • Botones:
    • "Continuar" → cierra pausa, resume gameplay
    • "Reintentar Capítulo" → recarga capítulo actual desde el inicio
    • "Menú Principal" → guarda progreso, transiciona a Main Menu
  • Clase PauseMenuController:
    • Show() / Hide() — muestra/oculta panel
    • OnContinueClick() — cierra pausa
    • OnRetryClick() — recarga capítulo
    • OnMainMenuClick() — guarda y transiciona
  • Input: ESC o Start (gamepad) para abrir/cerrar pausa
  • Time.timeScale = 0 cuando pausa está activa

Acceptance Criteria:

  • Pausa se abre con ESC o Start (gamepad)
  • Gameplay se congela (Time.timeScale = 0)
  • "Continuar" cierra pausa y resume
  • "Reintentar" recarga capítulo desde inicio
  • "Menú Principal" guarda y transiciona
  • Pausa funciona en todos los estados de gameplay

Test Evidence:

  • Manual evidence: Verificar pausa durante partida, diálogo, Purgatorio

Epic: Polish & Balance

S5-010: Polish Pass (Visual & Audio)

Story Type: Polish
Priority: P2 (Medium)
Estimated Effort: 3 puntos
Dependencies: Todas las anteriores

Description:
Pase de polish para mejorar feel, visual y audio. Incluye transiciones, feedback, y ajustes menores para pulir la experiencia.

Technical Requirements:

  • Scene transitions con fade in/out consistente
  • Feedback visual al seleccionar pieza (highlight, outline)
  • Feedback audio:
    • Sonido al mover pieza
    • Sonido al capturar
    • Sonido de jaque
    • Sonido de jaque mate
    • Música ambiente (opcional, puede ser placeholder)
  • Typewriter effect ajuste de velocidad (si muy lento/rápido)
  • Continue indicator en diálogos más visible
  • Dead King visual polish (aura, corona rota más clara)

Acceptance Criteria:

  • Todas las transiciones de escena usan fade
  • Piezas tienen feedback visual al seleccionar
  • Sonidos de movimiento y captura funcionan
  • Typewriter effect a velocidad apropiada
  • Continue indicator es visible
  • Dead King visual es distintivo
  • No hay elementos UI placeholder visibles

Test Evidence:

  • Manual evidence: Playtest completo anotando polish issues

S5-011: Balance & Tuning

Story Type: Data
Priority: P2 (Medium)
Estimated Effort: 2 puntos
Dependencies: S5-010

Description:
Ajuste de balanceo basado en playtests: probabilidades de Dead King, dificultad de IA, velocidad de typewriter, etc.

Technical Requirements:

  • Ajustar tuning knobs en archivos de configuración:
    • Dead King spawn probabilities (base_chance, chapter_multiplier)
    • AI difficulty por capítulo (minimax depth, think time)
    • Typewriter speed (caracteres por segundo)
    • Dice roll modifiers (si necesario)
  • Crear archivo de configuración: Assets/Game/Data/balance_config.json
  • Método BalanceConfig.LoadFromJSON() para cargar valores

Acceptance Criteria:

  • Dead King spawn probabilities ajustadas según playtests
  • Dificultad de IA balanceada (Ch1 fácil, Ch3 difícil pero no imposible)
  • Typewriter speed ajustada (ni muy lento ni muy rápido)
  • Todas las tuning knobs centralizadas en config file
  • Config file es fácil de editar sin recompilar

Test Evidence:

  • Manual evidence: Playtest notes con feedback de balance

📊 Sprint Metrics

Métrica Valor
Stories totales 11
Puntos totales 36 puntos
Duración 7 días
Velocidad estimada ~5 puntos/día
P0 (Blocker) 6 stories
P1 (High) 2 stories
P2 (Medium) 3 stories

Story Distribution

Epic Stories Puntos
Dead Kings System 4 14
Save/Load System 2 8
Main Menu 1 3
HUD System 2 6
Polish & Balance 2 5

🎯 Sprint Success Criteria

Al final del sprint, debe ser posible:

Flujo completo de Vertical Slice:

  1. Abrir juego → Main Menu
  2. Seleccionar "Nueva Campaña"
  3. Jugar 3 capítulos con diálogos, ajedrez, Purgatorio
  4. Si pierdes: inscribir Rey Muerto
  5. Si ganas: guardar progreso automáticamente
  6. Cerrar juego y reabrir
  7. Seleccionar "Continuar" → resume desde último capítulo
  8. En nuevo playthrough, enfrentar Dead Kings de runs anteriores
  9. Ver reveal de Dead King al ganar
  10. Completar campaña con victoria final

Calidad mínima:

  • 0 crashes en playthrough completo
  • HUD muestra información correcta
  • Save/load funciona sin pérdida de datos
  • Dead Kings spawn y se revelan correctamente
  • Todas las transiciones son suaves

🚧 Risks & Mitigations

Riesgo Probabilidad Impacto Mitigación
Save corruption pierde progreso Media Alto Backup automático + validación de JSON
Dead Kings no se sienten especiales Alta Medio Priorizar visual distintivo y reveal emocional
HUD interfiere con gameplay Baja Medio Posicionar cuidadosamente, no bloquear tablero
Polish insuficiente para VS Alta Medio Priorizar feedback crítico (movimiento, captura)
Scope creep en opciones de menú Media Bajo Limitar a opciones esenciales (audio puede esperar)

📝 Notes

  • Este es el sprint final para el Vertical Slice
  • Después de S5, hacer playtest completo con usuarios externos
  • Si todo pasa QA, el VS está completo y listo para presentar
  • Próximos sprints (post-VS) serán para features extendidas: Memorial, Cloud Sync, etc.

Definition of Done (Sprint Level)

  • Todas las 11 stories tienen estado "Done" (11/11)
  • DeadKingPool con tests automatizados (17 tests)
  • Tests automatizados de SaveSystem (pendiente)
  • Manual test evidence para todas las UI stories (pendiente — requiere escenas)
  • Build funcional genera sin errores (0 errores de compilación)
  • Playtest completo de inicio a fin documentado (bloqueado — no hay MainMenu/Chapter scenes)
  • 0 bugs S1 (Critical) abiertos
  • <3 bugs S2 (High) abiertos y documentados
  • Sprint review presentado con demo funcional

Nota post-sprint (16 Ago 2026): El código está 100% implementado, pero el DoD completo no se cumple hasta ensamblar las escenas (MainMenu, Chapter1/2/3), asignar prefabs en Inspector y conectar los TODOs de integración. Ver PROJECT_STATUS.md.


📈 Story Progress Tracking

Epic: Dead Kings System

  • S5-001: DeadKingPool (Completo: 10 mayo 2026)
  • S5-002: DeadKingInputUI (Completo: 11 mayo 2026)
  • S5-003: DeadKingSpawn (Completo: 11 mayo 2026)
  • S5-004: DeadKingRevealUI (Completo: 11 mayo 2026)

Epic: Save/Load System

  • S5-005: SaveSystem (Completo: 11 mayo 2026)
  • S5-006: SaveSystem Integration (Completo: 11 mayo 2026)

Epic: Main Menu

  • S5-007: MainMenu Scene (Código MainMenuController; escena .unity pendiente de crear)

Epic: HUD System

  • S5-008: GameHUD (Código; requiere escena + eventos GameManager)
  • S5-009: PauseMenu (Código; requiere escena)

Epic: Polish & Balance

  • S5-010: Polish Pass (Completo: 11 mayo 2026)
  • S5-011: Balance & Tuning (Completo: 11 mayo 2026)

Progress: 11/11 stories (36/36 points) — 100% (nivel código)


Sprint 5 completado: 12 de mayo de 2026
Milestone objetivo: Vertical Slice — código / integración de escenas
Estado actual (16 Ago 2026): Sprint cerrado; pendientes de ensamblado documentados en PROJECT_STATUS.md