🇪🇸 ESPAÑOL
COMPILACIÓN DE FINAL FANTASY VII — Tu Historia, Tu Era, Tu Destino
¿Alguna vez has querido vivir dentro de Midgar no como espectador, sino como protagonista? ¿Elegir tus propias decisiones en el momento exacto en que el Meteorito cae, cuando Zack Fair aún sonríe, o cuando Cloud carga con un pasado que no es suyo? Este bot no es una novela visual, ni un chat con un personaje: es un RPG narrativo con motor propio que te permite jugar tu propia historia dentro de la cronología completa de la Compilation of Final Fantasy VII.
🕰️ CINCO ERAS, CINCO HISTORIAS
Al comenzar, tú decides en qué punto del tiempo quieres despertar:
- Crisis Core — Vive el ocaso de un héroe junto a Zack Fair, antes de que el mundo se rompa.
- Before Crisis — Opera desde las sombras como Turk, donde la lealtad y la moral chocan cada noche.
- Final Fantasy VII — Empuña la Buster Sword (o la tuya) y decide si el destino de Aeris, de Midgar y del Planeta cambia.
- Advent Children — Sobrevive al GeoStigma y a los remanentes de Sephiroth en un mundo que aún sangra.
- Dirge of Cerberus — Enfréntate a Deepground desde los callejones de Kalm, con o sin la transformación de Vincent.
🎭 TÚ ELIGES QUIÉN ERES
No estás atado a un canon. En cada inicio puedes:
- Interpretar a un personaje original con su propio pasado, estilo de lucha y motivaciones.
- O encarnar a un personaje conocido (Cloud, Zack, Reno, Vincent, Tifa, etc.) y ver cómo la historia reacciona a tus decisiones.
El bot reconoce tu elección y adapta el tono, los diálogos y el mundo a tu identidad.
⚔️ COMBATE POR TURNOS REAL
Las batallas no se resuelven con texto improvisado. Hay un motor determinista detrás que calcula daño, magia, iniciativa y consecuencias. Tú describes lo que haces; el sistema hace las cuentas; el bot narra el resultado. Nada de "la IA decide si aciertas": si atacas, el dado ya está tirado.
🔮 SISTEMA DE MATERIA Y LÍMITES
Equipa Materias, lanza hechizos, gestiona tu MP y desata tu Limit Break cuando la barra esté llena. Cada era tiene su propio equipamiento inicial, y tus decisiones afectan a lo que puedes llevar contigo.
🧠 ESTADO PERSISTENTE Y BANDERAS NARRATIVAS
Tu HP, MP, Gil, Materia y decisiones quedan registrados. Si salvas a alguien, el mundo lo recordará. Si destruyes algo, las consecuencias te seguirán entre eras. El bot lleva un registro interno de tu progreso para que la historia sea coherente incluso después de horas de juego.
📖 LOREBOOK DINÁMICO POR ERA
Los personajes no aparecen porque sí: aparecen cuando deben aparecer. Zack solo existe en tu historia si estás en Crisis Core o en un flashback de FFVII. Los Turcos tienen un trasfondo distinto en Before Crisis que en Advent Children. El lore se revela según el año en que juegas y las palabras clave que uses, no en un volcado inicial que satura el prompt.
🕹️ COMANDOS QUE USARÁS
Para que el motor funcione, tus acciones deben ser claras. Estos son los comandos que el bot reconocerá:
- Combate físico: atacar, golpear, attack
- Magia (según Materia equipada): fuego, fire, rayo, bolt, cura, cure
- Límite: límite, limit, omnilimit (solo si la barra está al 100%)
- Acciones narrativas: describe libremente lo que haces hablo con Tifa, examino el reactor, salvo a Aeris) y el bot reaccionará en consecuencia.
No necesitas escribir código ni fórmulas: solo di lo que haces con claridad y el sistema hará el resto.
✨ ¿QUÉ LO HACE DIFERENTE?
La mayoría de bots de FFVII son chats con un personaje que improvisa. Este es un sistema de juego que combina un motor determinista con narrativa emergente, cinco eras jugables, identidad libre y consecuencias persistentes. No estás leyendo una historia: la estás jugando.
¿Te atreves a cambiar el destino del Planeta? Elige tu era. Elige tu rostro. Empieza.
(PARCHE DE ACTUALIZACIÓN (15/11/26)
• Error de sintaxis fatal corregido: el archivo original tenía const loreEntries = [...] sin cerrar el corchete antes de const scenarioEntries = [...]. Eso rompía el script entero. Ahora todos los arrays están fusionados en uno solo (loreEntries) y el archivo compila.
• Arrays huérfanos fusionados: scenarioEntries y bestiaryEntries estaban definidos pero nunca se inyectaban al prompt. Ahora todos los escenarios, bestiarios y personajes viven en loreEntries y el filtro por era los lee a todos.
• Persistencia de estado agregada: readState() lee HP, MP, Límite, Gil, Turno, Día/Hora, Ubicación, Enemigo y Evasión del último mensaje con el marcador ESTADO FF7. Cada turno arranca desde el estado real, no desde cero. Sin esto, el bot reiniciaba la ficha en cada respuesta.
• Línea de estado estandarizada: formatStateLine() genera la línea ESTADO FF7 con los campos Era, Turno, Día/Hora, Ubicación, Cloud HP, Cloud MP, Límite, Gil, Materia, Estados, Enemigo HP y Evasión enemiga. Es lo que readState() busca en el turno siguiente.
• Sistema hit/miss agregado: attackRoll() tira d20 + bonus del party contra la Evasión enemiga. Regla: d20 = 1 falla siempre, d20 = 20 crítico automático (daño x2). Antes todas las acciones acertaban sin tirada.
• Enemigos con Evasión propia: cada enemigo ahora tiene evasion (12-20 según el caso). Los robots generados por generateShinraRobot() también la incluyen. Sin esto, el hit/miss no tendría contra qué compararse.
• Materia con AP y niveles: MATERIA_DB define Fire, Bolt, Ice, Cure y Steal con 3 niveles cada una (excepto Steal, 1 nivel). Cada uso otorga AP (10 + nivel × 5). Al llegar al umbral (100/300/700), la Materia sube de nivel y desbloquea hechizos más potentes. state.materia refleja el nivel actual: Fire(1) → Fire(2) → Fire(3).
• Party de 3 agregado: PARTY_MEMBERS define Cloud, Tifa, Barret, Aeris, Red XIII, Yuffie, Cait, Vincent y Cid con rol, arma, bonus de ataque y bonus de evasión. El party activo se lee en state.party. Antes solo había un personaje (Cloud) sin variantes.
• Estados alterados agregados: STATUS_EFFECTS define veneno, ceguera, silencio, sueño, furia, tristeza, prisa, lentitud, regeneración y escudo. applyStatus() los aplica (sin duplicar), tickStatus() aplica daño/curación por turno (veneno -10 HP, regeneración +15 HP) y reduce la duración.
• Economía de Gil agregada: SHOPS define dos tiendas (Sector 7 Slums y Wall Market) con ítems, precios y efectos (poción, éter, antídoto, granada, Materia). buyItem() descuenta Gil y valida disponibilidad. El estado inicial tiene 1500 Gil.
• Ciclo día/noche agregado: advanceTime() avanza minutos por tick (MINUTES_PER_TICK = 15). La hora afecta la línea de estado (madrugada/mañana/tarde/noche). Antes no había reloj ni paso del tiempo.
• Comando /era agregado: changeEra() permite cambiar la era con /era Crisis Core o /era FFVII Remake. El lorebook filtra por state.era para no inyectar información de la era equivocada. Antes state.era se declaraba pero no había forma de cambiarlo.
• Generador de robots Shinra mejorado: generateShinraRobot() ahora devuelve nombre, HP, HP máximo, evasión, debilidad y descripción completa. Se integra al combate como enemigo real (con HP y evasión, no solo texto). Antes solo devolvía un string descriptivo sin stats de combate.
• Límite de acciones por turno agregado: CFG.ACTIONS_PER_TURN = 1. El jugador solo puede hacer un ataque físico, un hechizo o un Limit Break por turno. Los demás se registran como "acción ya usada". Antes el bot podía narrar múltiples ataques mágicos y físicos en un mismo turno sin costo acumulativo.
• Contraataque enemigo agregado: si el jugador usó una acción (actionUsed > 0) y el enemigo sigue vivo, el enemigo contraataca con roll(2, 8) + 5. Antes no había reacción enemiga.
• Tick de estados inyectado en el log: tickStatus() se ejecuta cada turno y sus efectos (veneno, regeneración) aparecen en el log de mecánicas. Antes no existía.
• Deduplicación del bestiario: los enemigos que aparecían dos veces en el archivo original (Guard Hound, Tonberry, Malboro, Behemoth, Guard Scorpion, etc.) quedaron en una sola entrada cada uno, sin perder información.
• Inyección de lore filtrado por era: al final del script, loreInyectado recoge solo las entradas cuya eras incluya state.era y cuya keywords aparezca en el último mensaje. Se agrega a context.character.scenario con el bloque LOREBOOK — ERA. Antes el filtro por era existía pero no se ejecutaba sobre el array correcto.
• Persistencia expuesta en context: context.ffviiState, context.ffviiLore y context.ffviiWorld quedan disponibles para debug o para que otro script los lea. No rompe nada si context no existe (todo está en try/catch).
🇬🇧 ENGLISH
COMPILATION OF FINAL FANTASY VII — Your Story, Your Era, Your Fate
Have you ever wanted to live inside Midgar not as a spectator, but as the protagonist? To make your own choices at the exact moment the Meteor falls, when Zack Fair still smiles, or when Cloud carries a past that isn't his own? This bot is not a visual novel, nor a simple character chat: it's a narrative RPG with its own engine that lets you play your own story across the full timeline of the Compilation of Final Fantasy VII.
🕰️ FIVE ERAS, FIVE STORIES
When you begin, you decide at which point in time you want to wake up:
- Crisis Core — Live the twilight of a hero alongside Zack Fair, before the world breaks.
- Before Crisis — Operate from the shadows as a Turk, where loyalty and morality collide every night.
- Final Fantasy VII — Wield the Buster Sword (or your own) and decide whether the fate of Aeris, Midgar, and the Planet changes.
- Advent Children — Survive Geostigma and Sephiroth's remnants in a world still bleeding.
- Dirge of Cerberus — Face Deepground from the alleys of Kalm, with or without Vincent's transformation.
🎭 YOU CHOOSE WHO YOU ARE
You are not bound to canon. In every start you can:
- Play an original character with their own past, fighting style, and motivations.
- Or embody a known character (Cloud, Zack, Reno, Vincent, Tifa, etc.) and see how the story reacts to your choices.
The bot recognizes your choice and adapts the tone, dialogue, and world to your identity.
⚔️ REAL TURN-BASED COMBAT
Battles are not resolved through improvised text. There is a deterministic engine behind the scenes that calculates damage, magic, initiative, and consequences. You describe what you do; the system does the math; the bot narrates the result. No "the AI decides if you hit"—if you attack, the dice are already rolled.
🔮 MATERIA AND LIMIT SYSTEM
Equip Materia, cast spells, manage your MP, and unleash your Limit Break when the gauge is full. Each era has its own starting loadout, and your choices affect what you can carry forward.
🧠 PERSISTENT STATE AND NARRATIVE FLAGS
Your HP, MP, Gil, Materia, and decisions are all recorded. If you save someone, the world remembers. If you destroy something, the consequences follow you across eras. The bot keeps an internal record of your progress so the story stays coherent even after hours of play.
📖 ERA-BASED DYNAMIC LOREBOOK
Characters don't appear just because: they appear when they should. Zack only exists in your story if you're in Crisis Core or in an FFVII flashback. The Turks have a different backstory in Before Crisis than in Advent Children. Lore is revealed according to the year you're playing and the keywords you use—not dumped at the start to overload the prompt.
🕹️ COMMANDS YOU'LL USE
For the engine to work, your actions need to be clear. These are the commands the bot will recognize:
- Physical combat: attack, atacar, golpear
- Magic (based on equipped Materia): fire, fuego, bolt, rayo, cure, cura
- Limit: limit, límite, omnilimit (only when the gauge is at 100%)
- Narrative actions: freely describe what you do talk to Tifa, examine the reactor, save Aeris) and the bot will react accordingly.
You don't need to write code or formulas: just state what you do clearly and the system handles the rest.
✨ WHAT MAKES IT DIFFERENT?
Most FFVII bots are character chats that improvise. This is a game system that combines a deterministic engine with emergent narrative, five playable eras, free identity, and persistent consequences. You're not reading a story: you're playing it.
Will you dare to change the fate of the Planet? Choose your era. Choose your face. Begin.
UPDATE PATCH (15/11/26)
• Fatal syntax error fixed: the original file had const loreEntries = [...] without closing the bracket before const scenarioEntries = [...]. That broke the entire script. Now all arrays are merged into a single one (loreEntries) and the file compiles.
• Orphan arrays merged: scenarioEntries and bestiaryEntries were defined but never injected into the prompt. Now all scenarios, bestiaries and characters live in loreEntries and the era filter reads all of them.
• State persistence added: readState() reads HP, MP, Limit, Gil, Turn, Day/Time, Location, Enemy and Evasion from the last message containing the ESTADO FF7 marker. Every turn starts from the real state, not from zero. Without this, the bot reset the character sheet on every response.
• Standardized status line: formatStateLine() generates the ESTADO FF7 line with Era, Turn, Day/Time, Location, Cloud HP, Cloud MP, Limit, Gil, Materia, Status, Enemy HP and Enemy evasion. This is what readState() looks for on the next turn.
• Hit/miss system added: attackRoll() rolls d20 + party bonus against enemy Evasion. Rule: d20 = 1 always misses, d20 = 20 is an automatic critical (damage x2). Before, every action hit without a roll.
• Enemies with their own Evasion: every enemy now has evasion (12-20 depending on the case). Robots generated by generateShinraRobot() also include it. Without this, hit/miss would have nothing to compare against.
• Materia with AP and levels: MATERIA_DB defines Fire, Bolt, Ice, Cure and Steal with 3 levels each (except Steal, 1 level). Each use grants AP (10 + level × 5). Upon reaching the threshold (100/300/700), the Materia levels up and unlocks more powerful spells. state.materia reflects the current level: Fire(1) → Fire(2) → Fire(3).
• 3-member party added: PARTY_MEMBERS defines Cloud, Tifa, Barret, Aeris, Red XIII, Yuffie, Cait, Vincent and Cid with role, weapon, attack bonus and evasion bonus. The active party is read from state.party. Before there was only one character (Cloud) with no variants.
• Status effects added: STATUS_EFFECTS defines poison, blind, silence, sleep, fury, sadness, haste, slow, regen and shield. applyStatus() applies them (without duplicating), tickStatus() applies per-turn damage/healing (poison -10 HP, regen +15 HP) and reduces duration.
• Gil economy added: SHOPS defines two shops (Sector 7 Slums and Wall Market) with items, prices and effects (potion, ether, antidote, grenade, Materia). buyItem() deducts Gil and validates availability. Starting state has 1500 Gil.
• Day/night cycle added: advanceTime() advances minutes per tick (MINUTES_PER_TICK = 15). The hour affects the status line (dawn/morning/afternoon/night). Before there was no clock or passage of time.
• /era command added: changeEra() allows changing the era with /era Crisis Core or /era FFVII Remake. The lorebook filters by state.era so it doesn't inject information from the wrong era. Before, state.era was declared but there was no way to change it.
• Shinra robot generator improved: generateShinraRobot() now returns name, HP, max HP, evasion, weakness and full description. It integrates into combat as a real enemy (with HP and evasion, not just text). Before it only returned a descriptive string with no combat stats.
• Action-per-turn limit added: CFG.ACTIONS_PER_TURN = 1. The player can only perform one physical attack, one spell or one Limit Break per turn. The rest are logged as "action already used". Before the bot could narrate multiple magic and physical attacks in the same turn with no accumulated cost.
• Enemy counterattack added: if the player used an action (actionUsed > 0) and the enemy is still alive, the enemy counterattacks with roll(2, 8) + 5. Before there was no enemy reaction.
• Status tick injected into the log: tickStatus() runs every turn and its effects (poison, regen) appear in the mechanics log. Before it didn't exist.
• Bestiary deduplication: enemies that appeared twice in the original file (Guard Hound, Tonberry, Malboro, Behemoth, Guard Scorpion, etc.) were reduced to a single entry each, with no information lost.
• Era-filtered lore injection: at the end of the script, loreInyectado collects only the entries whose eras include state.era and whose keywords appear in the last message. It is appended to context.character.scenario under the LOREBOOK — ERA block. Before, the era filter existed but didn't run against the correct array.
• Persistence exposed on context: context.ffviiState, context.ffviiLore and context.ffviiWorld are available for debugging or for other scripts to read. It breaks nothing if context doesn't exist (everything is in try/catch).
Creado hace alrededor de 17 horas
Actualizado hace alrededor de 2 horas
Publicado hace alrededor de 17 horas