13 KiB
Roadmap — Ajedrez Purgatorio
Last Updated: 2026-08-24 Current Stage: Vertical Slice — completo en código y escenas; pendiente playtest manual Current Milestone: Vertical Slice (5 sprints implementados, 200/200 tests, todo commiteado)
Timeline
Apr 2026 Jun 2026
│ Sprint 1 │ Sprint 2 │ Sprint 3 │Sprint 4│Sprint 5│
│ Foundation│ Chess+AI │ Purgatorio│Narrative│Meta+UI │
│ 23Mar-4Abr│ 07-25 Abr │ 10-23 May │26May-6J │10-12May│
│ │ │ │ │ │
│ Scenes │ En Passant│ DiceSystem│Campaign│DeadKing│
│ States │ Draws │ DiceUI │Dialogue│Save │
│ PieceID │ Promotion │ Muerte │Content │Menu │
│ Campaign │ AI x3 │ Purgatory │Flow │HUD │
│ State │ │ Flow │ │Polish │
│ │ │ │ │ ◆ VS │
Nota: El deadline del Vertical Slice (2026-06-07) fue superado pero el hito está completo: los 5 sprints implementados, 4 escenas en Build Settings, IA/Dead Kings/HUD cableados y EditMode 206/206. Pendiente: playtest manual y planificar Alpha/Beta/Release.
Milestones
| Milestone | Target | Sprints | Status |
|---|---|---|---|
| Vertical Slice | 2026-06-07 (superado) | 5 | ✅ Completo (código + escenas + tests) |
| Alpha | TBD | TBD | Not Planned |
| Beta | TBD | TBD | Not Planned |
| Release | TBD | TBD | Not Planned |
Vertical Slice Feature Checklist
Leyenda: ✅ implementado · ⏳ código listo, falta integración en escena · ❌ pendiente
Ajedrez Core
- Tablero 8x8 con casillas clickeables
- 6 tipos de piezas con movimiento correcto
- Selección y movimiento por click
- Turnos alternados blancas/negras
- Detección de jaque y jaque mate
- Enroque (corto y largo)
- Promoción de peón (auto-queen)
- En Passant
- Detección de tablas (ahogado, material insuficiente, 50 movs, repetición triple)
- Promoción con elección de pieza
Mecánicas Purgatorio
- Piece Identity System (16 piezas con nombre)
- Dice System (2d6 + modificadores vs Muerte)
- Purgatory flow (oferta → dados → resultado) — cableado en Chapter1
- La Muerte como personaje con diálogos — retrato + arte del Jefe (
088d70d); habla en los finales de acto g8/g16/g24 y cierra el juego en g30 (0f0b3dd)
Campaña y Narrativa
- Campaign System (3 capítulos) — CampaignManager + CampaignState cableados
- Dialogue System (typewriter, branching básico) — cableado en Chapter1
- Contenido narrativo (6 JSON, ch1/2/3 intro+outro)
- IA escalada (Easy → Medium → Hard) — AIController presente y habilitado en Ch1/2/3; dificultad aplicada por CampaignManager en runtime (auditoría 2026-08-22)
Meta / Social
- Dead Kings (input al perder → pool local → spawn) — UIs cableadas (CampaignManager las localiza con FindObjectOfType(true))
- Save/Load (entre capítulos) — suite EditMode incluida
UI
- Main Menu — MainMenuController + MainMenu.unity cableados y commiteados
- HUD (turno, capturadas) — GameHUD suscripto a OnPieceCaptured/OnCheckResolved con CapturedPieceIcon.prefab en las 3 escenas
- Dialogue UI — portrait/speakerDatabase asignados; SpeakerDatabaseSetup batch mantiene Ch2/3 sincronizadas
- Dice UI (oferta, tirada, resultado) — cableada
- Dead King Input UI — cableada en flujo de campaña
- Scene transitions (fade) — ⚠️ duplicado Core/UI; Chapter1 usa versión sin fade
Infraestructura
- Scene Management (5 escenas) — MainMenu + Ch1/2/3 en Build Settings
- Game State Manager — instanciado en escenas
- Campaign State persistence (ScriptableObject + SaveSystem JSON)
Pendientes actuales (post-auditorías 2026-08-22/24)
| Ítem | Tipo | Detalle |
|---|---|---|
| Playtest manual completo | QA | Campaña 30 niveles → duelo → Dead Kings, solo validable jugando |
| Alpha/Beta/Release | Proceso | Milestones TBD |
Barks de La Muerte (✅ ver sesión III), música BGM por acto (✅ sesión III) y dedup de paneles Purgatory UI (✅ verificado: 0 duplicados en Ch1/2/3) ya resueltos.
Actualización 2026-08-22 — Auditoría de bloqueantes
Verificación de los 7 bloqueantes listados arriba:
| # | Bloqueante | Estado |
|---|---|---|
| 1 | Commit del trabajo sin commitear | RESUELTO — commit 9fdafe8 (+ TestResults*.xml a .gitignore) |
| 2 | Chapter2/3 en Build Settings | RESUELTO — 4 escenas habilitadas, GUIDs verificados |
| 3 | Instanciar GameStateManager y AIController | YA ESTABA — presente y habilitado en Ch1/2/3; dificultad aplicada por CampaignManager en runtime |
| 4 | Cablear DeadKingInputUI/RevealUI | CABLEADO OK (CampaignManager usa FindObjectOfType(true)) — PENDIENTE usuario: correr Tools > Purgatory UI para dedup (8-9 copias por escena) y copiar Victory/Defeat/MemorialPanel a Ch1/2 |
| 5 | Eventos OnPieceCaptured/OnCheckResolved + HUD | RESUELTO — eventos declarados e invocados; GameHUD suscripto con CapturedPieceIcon.prefab asignado en las 3 escenas |
| 6 | Tests pendientes | RESUELTO — suites migradas de ests/ (invisible para Unity) a Assets/Tests/EditMode/: CampaignState, DiceSystem, DeadKingPool, SaveSystem, DialogueBranching + 3 chess actualizadas a versiones más completas. Nuevas: TypewriterTests (8 tests), CampaignManagerConfigTests (11 tests) |
| 7 | Duplicación BoardManager/ClassicBoardManager | CERRADO POR DISEÑO — nombres ya normalizados (sin colisión); la duplicación de lógica es consecuencia aceptada de ADR-0001 (arquitectura por modo) |
Pendiente tras esta auditoría: correr los menús Tools > Purgatory UI en Unity (Ch1, Ch2, Ch3), guardar escenas, verificar consola sin errores de compilación, y commitear.
Actualización 2026-08-24 — Duelo del Purgatorio + La Muerte como personaje
Commit base: f7d5606 (Duelo del Purgatorio completo + SFX cableados + menú de opciones + migración
de tests). Sobre esa base:
| Ítem | Estado |
|---|---|
| Commit del trabajo pendiente | RESUELTO — f7d5606 |
| La Muerte como speaker | RESUELTO — retrato Portraits/muerte.png (256×256, flat) cableado en SpeakerDatabase.asset con GUID/fileID deterministas; PortraitRegistry ahora rellena portraits null de speakers existentes; frases data-driven en Dialogues/muerte_quotes.json con fallback embebido |
| Arte del Jefe (La Muerte) | RESUELTO — sprite propio Resources/Pieces/la_muerte.png (1024×1024, PPU 100); SpawnBoss lo intercambia con fallback al Rey tintado |
| Limpieza menor | RESUELTO — TODO obsoleto en CampaignState.StartChapter eliminado (SyncFromBoard ya cubre), /TestResults/ a .gitignore, duplicado Assets/Game/Audio/ (metas YAML corruptos, sin referencias) eliminado |
Verificación: Unity 6000.3.13f1 batch mode — assets importados, SpeakerDatabaseSetup OK
(12 speakers, DialogueUIs actualizados en Ch2/Ch3), EditMode 200/200 pasados.
Actualización 2026-08-24 (II) — Ricardo + La Muerte en campaña
Commits 088d70d y 0f0b3dd:
| Ítem | Estado |
|---|---|
| Retrato de Ricardo | RESUELTO — Portraits/ricardo.png (corona flat sobre dorado oscuro) cableado con GUID/fileID deterministas; ya no queda ningún speaker sin arte |
| La Muerte habla en campaña | RESUELTO — nodo encadenado en los finales de acto (g8/g16/g24_outro) y apertura/cierre del Final (g30_intro/outro, esta última da agencia al jugador: levantarse del trono vacío); su retrato renderiza gracias al fix de PortraitRegistry |
Verificación: import limpio, cadenas next validadas, EditMode 200/200 pasados.
Actualización 2026-08-24 (III) — La Muerte presente en partida + BGM
| Ítem | Estado |
|---|---|
| Barks runtime de La Muerte | RESUELTO — DeathPresenceController (nuevo, Mono/Core/): con deathPresent spawnea el sprite observador (bob suave); con deathCommentary inyecta triggers runtime (on_piece_lost, on_check_received, on_first_capture) que disparan 6 barks nuevos (muerte_bark_{lost,check,capture}_{a,b}.json, variante por hash del chapterId, sin pisar diálogos manuales). Flags deathPresent/deathCommentary activados en jefes (n8/n16/n24/n30) y aperturas de acto (n9/n17/n25) |
| Música BGM por acto | RESUELTO — 4 loops seamless de 24s generados (22050Hz mono 16-bit: Dm drone / Am tritono / viento + campanas / Em oscuro) en Resources/Music/bgm_acto{1..4}.wav; AudioManager.PlayTheme() resuelve prefijo de chapter.theme (acto2_ira → bgm_acto2), no reinicia si ya suena; CampaignManager lo invoca tras aplicar la paleta |
| Dedup paneles Purgatory UI | VERIFICADO — BatchProcessChapterScenes headless: 0 duplicados, 0 copias necesarias en Ch1/2/3 (ya estaban limpias) |
| Test flaky SaveSystem | CORREGIDO — SaveSystemTests.SetUp limpia save_slot_*.json huérfanos en persistentDataPath (contaminación entre sesiones/tests hacía fallar DeleteSave_NonexistentSave) |
Verificación: import limpio (0 warnings GUID — metas WAV regenerados por Unity),
0 errores de compilación, EditMode 206/206 (6 tests nuevos en
DeathPresenceTriggerTests: inyección completa, skip de eventos manuales,
determinismo de variantes, ids únicos).
Actualizaci�n 2026-08-25 (IV) - Cadena derrota���Memorial jugable, di�logos y pausa
Sesi�n de bugfixing guiada por Editor.log tras playtesting del usuario.
Commits 97677fb (fixes), cc590f (features), 43f15eb (escenas).
| �tem | Estado |
|---|---|
| Derrota no abr�a inscripci�n | RESUELTO - carrera en DefeatUI: el fade-out hac�a SetActive(false) antes de que la coroutina invocara el callback del bot�n Continuar (la mataba en silencio). Ahora el callback se invoca s�ncronamente en OnContinueClick; logs incondicionales en Show/clicks |
| Di�logos vac�os en primera partida | RESUELTO - DialogueUI solo se suscrib�a si DialogueSystem.Instance ya exist�a en su OnEnable (perd�a la carrera de Awakes) y nunca reintentaba. Fix: [DefaultExecutionOrder(-100)] en DialogueSystem + suscripci�n resiliente diferida que sincroniza el nodo activo |
| No se pod�a escribir en el Memorial | RESUELTO doble: (1) los 18 TMP_InputField de las escenas est�n huecos (m_TextViewport/m_TextComponent = {fileID: 0}); (2) el EventSystem usa InputSystemUIInputModule, que no alimenta el pipeline legacy Input.inputString que usa TMP para tipear. Fix: validaci�n profunda + panel fallback runtime + swap temporal a StandaloneInputModule mientras el panel est� abierto (restaurado en OnDestroy) |
| Bot�n Inscribir muerto | RESUELTO - WaitForSeconds escalado con imeScale=0 congelaba la coroutina para siempre; ahora WaitForSecondsRealtime. Adem�s Show() activa el GO del componente si qued� inactivo (error "Coroutine couldn't be started... 'DeadKingInputPanel' is inactive") |
| Panel de inscripci�n gigante / corrido | RESUELTO - CanvasScaler a referencia 1920��1080 (convenci�n de todos los canvases del proyecto) + layout centrado: t�tulo arriba, nombre, mensaje, bot�n sin solapes |
| Pausa in-game muerta | RESUELTO - hab�a 2 PauseMenuController por escena (uno sobre canvas desactivado), panel de escena sin servir y bot�n HUD PauseButton con onClick: []. Ahora Show() construye panel runtime (orden 420): Continuar / Reiniciar cap�tulo / Opciones (OptionsMenuController.Toggle()) / Salir al men� principal; cablea el bot�n HUD en Awake y limpia overlays hu�rfanos acumulados |
| Texto encimado con retrato en di�logos | RESUELTO - re-layout runtime en DialogueUI.OnEnable: retrato 240��300 anclado a la izquierda, texto estirado ocupando el resto (TopLeft), nombre alineado con el inicio del texto. Idempotente, aplica en las 3 escenas |
| Error ruido "[CampaignConfig] No se asign� archivo JSON" | RESUELTO - CreateInstance() dispara OnEnable antes de que CampaignManager llame SetJsonSource(); OnEnable ahora es silencioso sin fuente (el LogError se mantiene en LoadFromJson() expl�cito) |
| Feature: Mi Memorial | NUEVO - bot�n "Mi Memorial" en men� principal: lista scrolleable newest-first de partidas perdidas desde DeadKingPool (persistente dead_kings.json) con mensaje en dorado + autor/cap�tulo; estado vac�o si no hay registros; toggle por segundo clic |
| Campa�as default vs Gambito de Sombras | DOC - "Nueva Campa�a" = config del Inspector en el CampaignManager de escena (campa�a default, L�nea I, 3 cap�tulos); "Gambito de Sombras" = Resources/Campaigns/gambito_campaign.json (30 cap�tulos, 4 actos). Mismo motor, escenas y reglas |
Verificaci�n: juego manual del usuario (Editor.log como fuente de diagn�stico): cadena completa derrota���memorial���men� post-env�o, pausa con ESC y bot�n HUD, los 4 botones de pausa, di�logos con texto desde primera partida, Mi Memorial funcional.
Pendientes menores conocidos: VictoryUI.OnContinueClick tiene la misma carrera latente que DefeatUI (fix ofrecido, no aplicado a�n); limpieza opcional de paneles duplicados/huecos en escenas (9 DeadKingInputPanel por escena, 2 PauseMenuController, 18 input fields vac�os) hoy mitigada por los fallbacks runtime.