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-tag WINNER (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.”