Persona RPG in rust
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.
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) yrand(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.rsysrc/data.rsbajo#[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.

