================================================================================ __ _____________ ____ ________ __________ _ _______ ____ / |/ / ____/ | / __ \/ ____/ / / / ____/ / | | / / __ \/ __ \ / /|_/ / __/ / /| | / /_/ / __/ / /_/ / __/ / / | | /| / / / / / /_/ / / / / / /___/ ___ |/ _, _/ /___/ __ / /___/ /___ | |/ |/ / /_/ / _, _/ /_/ /_/_____/_/ |_/_/ |_/_____/_/ /_/_____/_____/ |__/|__/\____/_/ |_| M O R E L V 5 . 4 Q W ════════════════════════ "El Tejedor Borges despierta en Chrome" SUPPLiER..: SCHE CRACKER...: doo25 PACKAGER..: mookieBlaylok PROTECTiON: GO>zen Protocol v33.7 CIPHER....: PYLNDP-14k DATASETS..: rock_argentino.csv / 239 entidades DATE......: 1999—2026 ================================================================================ ::. MANIFIESTO .:: El Director de Escena lee tu mente. Pensás en un músico argentino. Morel hace 15 preguntas. Adivina. O muere intentando. No hay framework. No hay build step. Solo HTML, CSS, JS y un CSV que pesa menos que tu playlist. Cada respuesta guarda un checkpoint. Cada "NO SÉ" consecutivo activa el modo forzado. Cada partida se registra en localStorage — el Sector 918 recuerda. 14k ventanas. Chrome como CROMO. Y una sola regla: NO hardcodear nada. ================================================================================ ::. ESTRUCTURA .:: morel_version_5_4qw/ ├── index.html # UI — 3 secciones: inicio / juego / resultado ├── morel.css # Fondo #0a0a0f, acento #c9a227, partículas canvas ├── morel-core.js # Estado, checkpoints, undo, Formspree, analytics ├── morel-questions.js # Entropía Shannon, preguntas adaptativas, modo forzado ├── morel-csv-loader.js # Fetch + normalización de data/rock_argentino.csv ├── morel-analytics.js # localStorage: gamesPlayed, stats por pregunta ├── serve.bat # Servidor local (Python http.server 8000) │ └── data/ └── rock_argentino.csv # Fuente única — 239 músicos, 30+ columnas ================================================================================ ::. ARRANCAR .:: ⚠️ IMPORTANTE: NO abras index.html con doble clic. fetch() no funciona en protocolo file:// por CORS. ——— OPCIÓN 1: serve.bat (más simple) ——— 1. Doble clic en serve.bat 2. Se abre http://localhost:8000 automáticamente 3. Jugás. ——— OPCIÓN 2: VS Code Debug (recomendada) ——— 1. Abrí la carpeta raíz de MOREL en VS Code 2. F5 → selecciona "MOREL — Server + Chrome" 3. VS Code levanta el servidor + Chrome con DevTools 4. Poné breakpoints en morel-core.js, step over, etc. Config en .vscode/launch.json + tasks.json (ya incluidos). Requiere Python 3 en PATH. ——— OPCIÓN 3: Otros ——— → npx serve . --port 8000 (Node.js) → VS Code → Live Server → http-server -p 8000 (Node.js, global) Si igual abrís el archivo directo → aparece fallback para seleccionar rock_argentino.csv manualmente. ================================================================================ ::. FLUJO .:: 1. Usuario abre index.html → ve "Abrir el telón" 2. Click → fetch(data/rock_argentino.csv) → normaliza → 239 candidatos 3. Motor de entropía elige la pregunta que más divide 4. Usuario responde SÍ / NO / NO SÉ 5. Checkpoint guardado ANTES de filtrar 6. Tras 2× "NO SÉ" → modo forzado: preguntas de máxima división 7. Corte: 1 candidato | 15 pasos | sin preguntas útiles 8. Resultado: principal + 3 alternativas + justificación visual 9. Analytics grabados en localStorage 10. Feedback opcional → Formspree ================================================================================ ::. FORMSPREE — SETUP .:: El formulario de corrección envía datos a Formspree. Para activarlo: 1. Crear cuenta en https://formspree.io 2. Crear nuevo form → copiar endpoint ID 3. En index.html, reemplazar: action="https://formspree.io/f/TU_ENDPOINT" por: action="https://formspree.io/f/xABCDEFGH" 4. Deploy. Done. Campos que llegan al endpoint: - nombre_artista → El artista que el usuario tenía en mente - nota → Comentarios libres - historial_partida → JSON con estado completo: {paso, preguntas respondidas, candidatos_finales, veredicto} - _subject → "MOREL — Sugerencia de corrección" (asunto del email) - _next → URL de redirección post-envío (vuelve al juego) Si Formspree falla → el juego NO se rompe. Mensaje de error en el form, punto. ================================================================================ ::. API PÚBLICA .:: morel.iniciar() → Carga CSV, inicia partida morel.responder(bool) → true/false/null (SÍ/NO/NO SÉ) morel.deshacer() → Restaura checkpoint anterior morel.reiniciar() → Vuelve a inicio, limpia estado morel.mostrarFormulario() → Abre form de feedback morel.debug() → Dump de estado + analytics en consola MorelAnalytics.reporte() → Stats por pregunta en consola MorelAnalytics.resetear() → Limpia localStorage ================================================================================ ::. ARCHIVO POR ARCHIVO .:: ┌─ morel-csv-loader.js │ Fetch → parse → normaliza → elimina duplicados │ Campos: pesado→heavy, decada→decada_80/90/00/10/20 │ Expone: await MorelCSVLoader.cargarTodos() │ ├─ morel-questions.js │ 15 preguntas universales (sin IDs repetidos) │ 9 subescenas: metal, punk, indie, pop, barrial, blues, folk, trap, prog │ 10 preguntas forzadas para modo NO SÉ×2 │ Entropía de Shannon: -(p·log₂p + (1-p)·log₂(1-p)) │ Score = entropía × peso │ ├─ morel-analytics.js │ localStorage key: "morel_v54_stats" │ Guarda: gamesPlayed, totalQuestions, preguntas[id].{veces,nose,aciertos} │ No bloquea el juego — try/catch en cada op │ ├─ morel-core.js │ Estado inmutable donde aplica │ Checkpoints: máx 3, FIFO, incluyen noSeConsecutivos │ deshacer() restaura pregunta exacta — NO llama siguientePregunta() │ Justificación visual: top 3 atributos SÍ coincidentes │ Formspree: submit nativo (sin fetch, sin preventDefault) │ prepararHistorialFormspree() → llena hidden field al submit │ └─ morel.css Partículas canvas, transiciones, responsive 480px Botón undo con opacity controlada por clase .visible ================================================================================ ::. PYLNDP CIPHER NOTE .:: Las ventanas no mienten. 14k frames de memoria. CROMO es el contenedor — Chrome la ilusión. Quien entienda el patrón, ya sabe qué pregunta viene. GO>zen lo vigila. SCHE lo escribe. Morel lo ejecuta. ================================================================================ ::. ROADMAP — POST 5.4 .:: [ ] Modo 2 jugadores: uno piensa, otro adivina las respuestas [ ] CSV editable en browser → sheet API opcional [ ] Pesos adaptativos: si una pregunta tiene >70% NO SÉ, baja su peso [ ] Exportar analytics a CSV para análisis externo [ ] Temas visuales: Neon 80s / Períodico 1920 / Terminal 90s [ ] Audio: síntesis de voz para las preguntas (Web Speech API) [ ] PWA: service worker, installable, offline (con datos embebidos) ░░░ No tocado: lazy loading. El dataset cabe en un suspiro. ░░░ ================================================================================ ::. FIX FORMSPREE — V5.4 QW .:: PROBLEMA DETECTADO: El formulario de feedback no enviaba datos a Formspree correctamente. Causas raíz: 1. onsubmit="return morel.enviarFormulario(event)" interceptaba el submit y llamaba a e.preventDefault(), bloqueando el POST nativo a Formspree. 2. target="formspree-iframe" + iframe oculto causaba comportamientos impredecibles: Formspree redirige tras el POST, el iframe recargaba múltiples veces y el onload se disparaba en momentos inesperados. 3. 3 campos ocultos con IDs inconsistentes (fb-historial, fb-candidatos, fb-principal) — nombre de field no alineado con el HTML. SOLUCIÓN APLICADA: - Eliminado onsubmit interceptor (enviarFormulario, _onFormSubmit). - Eliminado el iframe oculto y el atributo target del form. - Formspree ahora recibe el submit nativo directamente — sin preventDefault, sin fetch, sin CORS compleja. - Agregados campos Formspree oficiales: _subject → "MOREL — Sugerencia de corrección" _next → URL actual (redirige de vuelta al juego tras el envío) - Nuevo campo historial_partida → JSON con el estado completo de la partida (paso, preguntas respondidas, candidatos restantes, veredicto). - Se pobla dos veces: al mostrar el form (mostrarFormulario) y como listener del submit (prepararHistorialFormspree) para garantizar datos frescos. - CSS intacto: los estilos dorados Cormorant Garamond se mantienen sin cambio. ESTRUCTURA FINAL DEL FORM:
FLUJO ACTUAL: 1. User hace click en "↺ No era este / Sugerir artista" → mostrarFormulario() muestra el form + llena _next + historial_partida 2. User completa nombre → submit nativo → prepararHistorialFormspree() refresca historial_partida (listener) 3. Browser POST → https://formspree.io/f/mnjokeon 4. Formspree procesa → redirige a _next (misma página) 5. Game state preservado — no se pierde la partida. ================================================================================ ::. CREDITS .:: Universo: Nexus Merovian Prime Inspira: Adolfo Bioy Casares — "La invención de Morel" Datos: Escena rock argentina 1960–2025 Greets: doo25 · XxX_el10delMilan_XxX · pibe leton Al que cargó 239 entidades en un cyber de dial-up sin romper el UTF-8. °o.O "El Sector 918 vigila" O.o° ================================================================================