2026-08-07 — marvelousdb: modo VS Battle (dominio publico vs comercial)

Contexto: el usuario pidio “enfrentar a los de public domain vs los comerciales como un boton”. Se implemento un modo batalla entre los dos datasets.

Decisiones

  • Carga multi-dataset: DATA_DIR acepta lista separada por : (ej. data/pdsh:data). Cada dataset se distingue por wiki.universe (“Public Domain” vs “Marvel Universe”). Ambos se indexan en el mismo Map. El default en .env ahora es data/pdsh:data.
  • Heuristica de poder (/api/battle): escanea powers/abilities/bio con 20 patrones de poder (vuelo, telepatia, magia, super fuerza, invulnerabilidad, velocidad, energia, poder cosmico, viaje en el tiempo, dimensiones, deidad, inmortalidad, regeneracion, teleportacion, intangibilidad, metamorfosis, control de clima, piro/criokinesis, super inteligencia). Score = 1 + poderes
    • 30% de “suerte”. Sin sesgo por universo.
  • UI: ruta /vs con dos luchadores lado a lado (imagen grande, universo, debut, poderes como chips, power level), “VS” al centro, ganador destacado con borde rojo brillante, boton “Rematch”. Link “VS Battle” en el nav. CSS anadido al final de public/css/main.css (flexbox, coherencia con el rojo be0606 del diseno de 2014).
  • Endpoint parametrizable: ?universeA=X&universeB=Y; 404 si un universo no tiene personajes (mensaje claro).

Bugs encontrados y corregidos

  • La reescritura de carga multi-dataset perdio el subdirectorio characters//comics/ (leia el dir raiz → 0 personajes). Corregido.

Verificacion

  • 15 tests verdes (incluye battle: public domain vs marvel).
  • /vs renderiza: ejemplo Horned Hood (PD, godhood, 3) vs Excalibur (Marvel, flight+magic+dimensional travel+godhood, 5).
  • Todas las rutas 200 con DATA_DIR=data/pdsh:data.

Pendientes

  • Animar la batalla (estado “fighting” antes de revelar el ganador) — el usuario puede quererlo como siguiente paso.
  • Selectores de universo por cada lado en /vs (hoy son defaults via query).