2026-08-07 — marvelousdb: narrativa arcade de batalla (sin IA) + UI WINNER/LOSER
Contexto: el usuario pidio un lore para la batalla que integre lo que se encuentre de cada personaje (incluidos trocitos de texto de las bios), almacenado para los enfrentamientos; sin IA, con vibra de juego de consola (pokemon) + onomatopeyas de comic (“pow!”, “wam!“) + perdedor debilitado + etiquetas arcade “WINNER”/“LOSER”.
Implementacion (todo determinista por par de ids, sin IA)
extractQuotes(c): trocitos de texto de la bio — oraciones de 25-220 chars, prefiriendo dialogo (comillas); 2 quotes elegidas por strHash(id) (estables, “almacenadas” derivadas de la bio, sin rebuild). Limpia markup wiki (y → y).battleNarrative(a, b, fa, fb, winner, seed):- opening: “CTHULHU (Supernatural) faces U.S. AGENT (Superhuman) in the arena.”
- exchange con poderes detectados: “CTHULHU used CULT FOLLOWING! SLAM!” + contraataque “retaliates — BAM! — but it is not enough!”.
- quote del perdedor como “last words as the dust clears”.
- cierre: “BOOM! CTHULHU stands victorious.” (draw: ambos colapsan).
- ONO[]: POW/WHAM/BAM/CRACK/ZAP/BOOM/KRAK/SLAM.
- Response battle:
narrative: {lines, onomatopoeias, quotes: {A, B}}. - Vista battle:
.arcade-tagWINNER (dorado neon) / LOSER (gris) / DRAW sobre cada fighter; perdedor con.defeated(grayscale + opacity .38 + tilt -1.6deg, transicion .6s — vibra pokemon faint)..battle-report: caja monospace “consola” con las lineas + onomatopeyas animadas (pop-in secuencial con keyframes onoPop, amarillo con borde rojo).
Bugs
- web.js no pasaba narrative al render (report vacio) — corregido.
- quotes con markup wiki … — limpiadas en extractQuotes.
Verificacion
- 27/27 tests (nuevo: narrative presente, quotes arrays, determinismo deepStrictEqual entre llamadas).
- /vs/cthulhu-vs-u-s-agent renderiza: winner-tag + loser-tag + .defeated + BATTLE REPORT con “used CULT FOLLOWING! SLAM!” + onomatopeyas SLAM/BAM/BOOM.
- Quote limpia: “…trained with Freedom Force’s Blob, Pyro, and Avalanche.”