Skip to main content

Command Palette

Search for a command to run...

Persona RPG in rust

Updated
5 min readView as Markdown
M
Linux enthusiast, becoming a DevOps engineer. I like Rust 🦀 and Python 🐍 ( I use Omarchy btw )

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 y sobrevive a la Dark Hour. Todo en una ventana de 60 columnas, con sprites de texto y colores. Sin game engine, sin GUI: Rust, crossterm y rand.

Demo de persona-rpg

El juego está en GitHub: github.com/Johannuel/persona-rpg

🎯 La idea: un juego completo con una restricción brutal

Quería un reto con restricciones duras, porque las restricciones fuerzan diseños simples:

  • Solo 2 dependencias: crossterm (entrada y renderizado de terminal) y rand (azares).

  • Sin engine, sin assets: cada sprite es un dibujo ASCII hecho a mano.

  • 4 archivos: un proyecto que se entienda entero en una tarde.

El resultado es un juego que cabe en la cabeza: la estructura es una máquina de estados (main.rs), los datos de mundo (data.rs), la lógica de combate (combat.rs) y el renderizado (ui.rs).

⚡ Combate por turnos: 5 elementos, debilidades y críticos

Como en Persona 3 Portable, el combate gira alrededor de los elementos: Fuego (Agi), Hielo (Bufu), Eléctrico (Zio), Viento (Garu) y Físico.

  • Golpeas una debilidad → crítico.

  • El enemigo resiste tu elemento → daño a la mitad.

  • Cada sombra escala a tu nivel, con debilidades y resistencias propias.

let multiplicador = if enemigo.debil(ataque.elemento) {
    1.5
} else if enemigo.resiste(ataque.elemento) {
    0.5
} else {
    1.0
};

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?

💠 La Velvet Room: fusión con arcanums de verdad

La fusión no tira los dados al azar. Replica el chart de arcanums de Persona 3: dos Personas de arcanums conocidos producen la Persona del arcanum resultante, con un nivel objetivo y herencia de habilidades de ambos padres.

pub fn fusionar(a: &Personaje, b: &Personaje) -> 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 < maximo)
            .max_by_key(|p| p.nivel)
    } else {
        candidatas.iter()
            .filter(|p| p.nivel >= objetivo)
            .min_by_key(|p| p.nivel)
    };
    // ... + heredar_habilidades(&mut resultado, a, b)
}

Fusiona a Jack Frost (hielo) con Pyro Jack (fuego) y el arcanum Magician decide el resultado. Los 21 arcanums están modelados: Fool, Magician, Priestess, Empress, Lovers, Chariot, Death...

🃏 Shuffle Time: la ruleta post-victoria

Tras cada victoria, como en el original, aparece una mesa de 3 cartas y eliges una:

Carta Efecto
Persona Una Persona nueva
Copa 40% HP · +15 MP
Vara +25 EXP
Vacía Nada (el gacha es gacha)

El azar premia arriesgar: ¿agarro el EXP o espero la Persona?

👾 El contenido: 17 Personas, 16+ sombras, 5 personajes

  • 5 personajes jugables: Makoto, Yukari, Junpei, Akihiko y Mitsuru, cada uno con su Persona de firma.

  • 17 Personas coleccionables con sus arcanums: Orpheus, Pixie, Jack Frost, Pyro Jack, Hua Po...

  • 16+ sombras de Tartarus escaladas a tu nivel.

  • Subida de nivel hasta el nivel 20, con EXP y estadísticas crecientes.

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:

│   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

🔬 Detalles de ingeniería

  • 22 tests unitarios cubren combate, daño elemental, nivelación, fusión y cartas — en src/combat.rs y src/data.rs bajo #[cfg(test)].

  • Raw mode de crossterm para detectar flechas sin pulsar Enter.

  • Estado en memoria con tipos simples: Personaje, Enemigo, Skill, EstadoJuego, EstadoCombate.

  • MIT licensed — puedes clonarlo, forkearlo y hacer lo que quieras.

🗺️ Roadmap

  • [x] Combate por turnos con debilidades elementales

  • [x] Fusión de Personas (Velvet Room) y Shuffle Time

  • [ ] Pisos de Tartarus con jefe final

  • [ ] Eventos de luna llena

  • [ ] Guardar partida

🚀 Pruébalo en 10 segundos

git clone https://github.com/Johannuel/persona-rpg.git
cd persona-rpg
cargo run

Solo necesitas una terminal con soporte UTF-8 (cualquier Linux moderno). Controles: flechas + Enter para menús, 1 avanzar, 2 descansar, 3 cambiar Persona, 4 fusionar.

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 repo, deja una ⭐ y cuéntame qué feature agregarías. La próxima vez que lo veas, quizá tenga jefe final.


Escrito con ❤️ (y crossterm) por Johannuel. Este post también está disponible en el README del proyecto.

D

Very great