<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Persona RPG in Rust]]></title><description><![CDATA[Persona RPG in Rust]]></description><link>https://blog-persona.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a70edc6769bad55c2e43b66/87c7434f-3ae6-4124-a025-07330c615e29.gif</url><title>Persona RPG in Rust</title><link>https://blog-persona.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 05:09:40 GMT</lastBuildDate><atom:link href="https://blog-persona.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Persona RPG in rust ]]></title><description><![CDATA[Construí un RPG inspirado en Persona 3 en la terminal — solo Rust, crossterm y rand
¿Un Persona 3 en tu terminal? Sí. Pelea contra sombras en Tartarus, colecciona Personas, fúndelas en la Velvet Room ]]></description><link>https://blog-persona.hashnode.dev/persona-rpg-in-rust</link><guid isPermaLink="true">https://blog-persona.hashnode.dev/persona-rpg-in-rust</guid><category><![CDATA[rust lang]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[dev]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[MF coder]]></dc:creator><pubDate>Mon, 03 Aug 2026 20:15:15 GMT</pubDate><content:encoded><![CDATA[<h1>Construí un RPG inspirado en Persona 3 en la terminal — solo Rust, crossterm y rand</h1>
<p>¿Un <a href="https://es.wikipedia.org/wiki/Persona_3"><em>Persona 3</em></a> en tu terminal? Sí. Pelea contra sombras en Tartarus, colecciona Personas, fúndelas en la Velvet Room y sobrevive a la Dark Hour. Todo en una ventana de 60 columnas, con sprites de texto y colores. Sin game engine, sin GUI: <strong>Rust,</strong> <a href="https://docs.rs/crossterm"><strong>crossterm</strong></a> <strong>y</strong> <a href="https://docs.rs/rand"><strong>rand</strong></a>.</p>
<img src="https://raw.githubusercontent.com/Johannuel/persona-rpg/main/videos/demo.gif" alt="Demo de persona-rpg" style="display:block;margin:0 auto" />

<p>El juego está en GitHub: <a href="https://github.com/Johannuel/persona-rpg"><strong>github.com/Johannuel/persona-rpg</strong></a> ⭐</p>
<h2>🎯 La idea: un juego completo con una restricción brutal</h2>
<p>Quería un reto con restricciones duras, porque las restricciones fuerzan diseños simples:</p>
<ul>
<li><p><strong>Solo 2 dependencias</strong>: <code>crossterm</code> (entrada y renderizado de terminal) y <code>rand</code> (azares).</p>
</li>
<li><p><strong>Sin engine, sin assets</strong>: cada sprite es un dibujo ASCII hecho a mano.</p>
</li>
<li><p><strong>4 archivos</strong>: un proyecto que se entienda entero en una tarde.</p>
</li>
</ul>
<p>El resultado es un juego que cabe en la cabeza: la estructura es una máquina de estados (<code>main.rs</code>), los datos de mundo (<code>data.rs</code>), la lógica de combate (<code>combat.rs</code>) y el renderizado (<code>ui.rs</code>).</p>
<h2>⚡ Combate por turnos: 5 elementos, debilidades y críticos</h2>
<p>Como en <a href="https://es.wikipedia.org/wiki/Persona_3#Persona_3_Portable">Persona 3 Portable</a>, el combate gira alrededor de los elementos: Fuego (Agi), Hielo (Bufu), Eléctrico (Zio), Viento (Garu) y Físico.</p>
<ul>
<li><p>Golpeas una <strong>debilidad</strong> → crítico.</p>
</li>
<li><p>El enemigo <strong>resiste</strong> tu elemento → daño a la mitad.</p>
</li>
<li><p>Cada sombra escala a tu nivel, con debilidades y resistencias propias.</p>
</li>
</ul>
<pre><code class="language-rust">let multiplicador = if enemigo.debil(ataque.elemento) {
    1.5
} else if enemigo.resiste(ataque.elemento) {
    0.5
} else {
    1.0
};
</code></pre>
<p>Esa tabla de debilidades convierte cada encuentro en un mini-puzzle: ¿elijo la habilidad que da crítico, o guardo MP para el siguiente piso?</p>
<h2>💠 La Velvet Room: fusión con arcanums de verdad</h2>
<p>La fusión no tira los dados al azar. Replica el <a href="https://es.wikipedia.org/wiki/Arcanum">chart de arcanums de Persona 3</a>: dos Personas de arcanums conocidos producen la Persona del arcanum resultante, con un nivel objetivo y herencia de habilidades de ambos padres.</p>
<pre><code class="language-rust">pub fn fusionar(a: &amp;Personaje, b: &amp;Personaje) -&gt; Personaje {
    let arcanum  = arcana_resultado(a.arcana, b.arcana);
    let objetivo = (a.nivel + b.nivel).div_ceil(2);

    let elegida = if arcana_a == arcana_b {
        candidatas.iter()
            .filter(|p| p.nivel &lt; maximo)
            .max_by_key(|p| p.nivel)
    } else {
        candidatas.iter()
            .filter(|p| p.nivel &gt;= objetivo)
            .min_by_key(|p| p.nivel)
    };
    // ... + heredar_habilidades(&amp;mut resultado, a, b)
}
</code></pre>
<p>Fusiona a <strong>Jack Frost</strong> (hielo) con <strong>Pyro Jack</strong> (fuego) y el arcanum Magician decide el resultado. Los 21 arcanums están modelados: Fool, Magician, Priestess, Empress, Lovers, Chariot, Death...</p>
<h2>🃏 Shuffle Time: la ruleta post-victoria</h2>
<p>Tras cada victoria, como en el original, aparece una mesa de 3 cartas y eliges una:</p>
<table>
<thead>
<tr>
<th>Carta</th>
<th>Efecto</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Persona</strong></td>
<td>Una Persona nueva</td>
</tr>
<tr>
<td><strong>Copa</strong></td>
<td>40% HP · +15 MP</td>
</tr>
<tr>
<td><strong>Vara</strong></td>
<td>+25 EXP</td>
</tr>
<tr>
<td><strong>Vacía</strong></td>
<td>Nada (el gacha es gacha)</td>
</tr>
</tbody></table>
<p>El azar premia arriesgar: ¿agarro el EXP o espero la Persona?</p>
<h2>👾 El contenido: 17 Personas, 16+ sombras, 5 personajes</h2>
<ul>
<li><p><strong>5 personajes jugables</strong>: Makoto, Yukari, Junpei, Akihiko y Mitsuru, cada uno con su Persona de firma.</p>
</li>
<li><p><strong>17 Personas coleccionables</strong> con sus arcanums: Orpheus, Pixie, Jack Frost, Pyro Jack, Hua Po...</p>
</li>
<li><p><strong>16+ sombras de Tartarus</strong> escaladas a tu nivel.</p>
</li>
<li><p>Subida de nivel hasta el <strong>nivel 20</strong>, con EXP y estadísticas crecientes.</p>
</li>
</ul>
<p>Y todo se ve así — sprites dibujados a mano, barras de HP/MP con bloques de colores y un log de combate a todo color:</p>
<pre><code class="language-text">│   Pyro Jack Lv.1  (Lv.1)  —  Shadow
│       /\
│      /--\               HP [████████░░░░░░]  34/60
│     |o o o|             Weak: Ice  Resists: Fire
│     |_^^^_|
│      /|||\
├────────────────────────────────────────────────────────────
│   Makoto  (Lv.1)  —  Orpheus
│     .---.
│    | o  o |             HP [███████████░░░]  80/100
│    | ==== |             MP [██████████████]  50/50
</code></pre>
<h2>🔬 Detalles de ingeniería</h2>
<ul>
<li><p><strong>22 tests unitarios</strong> cubren combate, daño elemental, nivelación, fusión y cartas — en <code>src/combat.rs</code> y <code>src/data.rs</code> bajo <code>#[cfg(test)]</code>.</p>
</li>
<li><p><strong>Raw mode</strong> de crossterm para detectar flechas sin pulsar Enter.</p>
</li>
<li><p><strong>Estado en memoria</strong> con tipos simples: <code>Personaje</code>, <code>Enemigo</code>, <code>Skill</code>, <code>EstadoJuego</code>, <code>EstadoCombate</code>.</p>
</li>
<li><p><strong>MIT licensed</strong> — puedes clonarlo, forkearlo y hacer lo que quieras.</p>
</li>
</ul>
<h2>🗺️ Roadmap</h2>
<ul>
<li><p>[x] Combate por turnos con debilidades elementales</p>
</li>
<li><p>[x] Fusión de Personas (Velvet Room) y Shuffle Time</p>
</li>
<li><p>[ ] Pisos de Tartarus con jefe final</p>
</li>
<li><p>[ ] Eventos de luna llena</p>
</li>
<li><p>[ ] Guardar partida</p>
</li>
</ul>
<h2>🚀 Pruébalo en 10 segundos</h2>
<pre><code class="language-bash">git clone https://github.com/Johannuel/persona-rpg.git
cd persona-rpg
cargo run
</code></pre>
<p>Solo necesitas una terminal con <strong>soporte UTF-8</strong> (cualquier Linux moderno). Controles: flechas + Enter para menús, <code>1</code> avanzar, <code>2</code> descansar, <code>3</code> cambiar Persona, <code>4</code> fusionar.</p>
<p>El proyecto nació como un reto personal y terminó siendo mi juego favorito de este año. Si te gustan los TUIs, Rust o Persona, pasa por el <a href="https://github.com/Johannuel/persona-rpg">repo</a>, deja una ⭐ y cuéntame qué feature agregarías. La próxima vez que lo veas, quizá tenga jefe final.</p>
<hr />
<p><em>Escrito con ❤️ (y crossterm) por Johannuel. Este post también está disponible en el</em> <a href="https://github.com/Johannuel/persona-rpg/blob/main/README.md"><em>README del proyecto</em></a><em>.</em></p>
]]></content:encoded></item></channel></rss>