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 poolGetRandomDeadKing()→ DeadKingData — retorna DK aleatorio o null si pool vacíoShouldSpawnDeadKing(int chapterIndex)→ bool — calcula probabilidad de spawnSavePool()— escribe a JSON en Application.persistentDataPathLoadPool()— 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 persisteGetRandomDeadKing()retorna DK aleatorio o null si vacíoShouldSpawnDeadKing()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ñaOnSubmitClick()— 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
BoardManageroCampaignManager:- Al iniciar capítulo, llamar
DeadKingPool.ShouldSpawnDeadKing(chapterIndex) - Si true, llamar
GetRandomDeadKing()y guardar en estado temporal - Pasar flag
isDeadKingal inicializar Rey negro
- Al iniciar capítulo, llamar
- 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
- Agregar campo opcional:
- Modificar
GameManager.OnGameOver():- Si victoria y Rey enemigo era Dead King, mostrar
DeadKingRevealUI
- Si victoria y Rey enemigo era Dead King, mostrar
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 DKOnContinueClick()— 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 JSONLoadGame(int slot)→ SaveData — carga desde JSONDeleteSave(int slot)— elimina archivo de saveDoesSaveExist(int slot)→ bool — verifica si existe saveGetSaveInfo(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 correctamenteLoadGame()lee JSON y retorna SaveData válidoDeleteSave()elimina archivoDoesSaveExist()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
- Después de
- Método
- 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 Ch1OnContinueClick()— carga save, transiciona a capítulo guardadoOnOptionsClick()— abre panel de opcionesOnQuitClick()— cierra aplicaciónOnEnable()— 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 turnoAddCapturedPiece(Piece piece)— agrega icono a panel de capturadasShowCheckIndicator(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 panelOnContinueClick()— cierra pausaOnRetryClick()— recarga capítuloOnMainMenuClick()— 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:
- Abrir juego → Main Menu
- Seleccionar "Nueva Campaña"
- Jugar 3 capítulos con diálogos, ajedrez, Purgatorio
- Si pierdes: inscribir Rey Muerto
- Si ganas: guardar progreso automáticamente
- Cerrar juego y reabrir
- Seleccionar "Continuar" → resume desde último capítulo
- En nuevo playthrough, enfrentar Dead Kings de runs anteriores
- Ver reveal de Dead King al ganar
- 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