xenerador de PJs

main
serxoz 2023-01-20 17:12:25 +01:00
commit 0618427849
8 changed files with 1561 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

1260
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

17
Cargo.toml Normal file
View File

@ -0,0 +1,17 @@
[package]
name = "into-the-kosmos-generador"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tokio = { version = "1", features = ["full"] }
axum = "0.6.2"
tracing = "0.1"
tracing-subscriber = "0.2.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0" }
serde_with = "2.0"
rand = "0.8.5"
minijinja = "0.30.0"

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Generadores para Into the Kosmos
La idea es tener en una web los generadores de personajes, naves, monstruos, etc...

29
src/main.rs Normal file
View File

@ -0,0 +1,29 @@
pub mod views;
use crate::views::personajes::genera_pj;
use axum::{routing::get, Router};
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
// inicio do tracing
tracing_subscriber::fmt::init();
// routing
let app = Router::new()
.route("/", get(root))
.route("/pjs", get(genera_pj));
// executase con hyper a través de axum::Server
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
// vista básica para a raíz
async fn root() -> &'static str {
"Generadores para el juego de rol Into the Kosmos."
}

1
src/views/mod.rs Normal file
View File

@ -0,0 +1 @@
pub mod personajes;

206
src/views/personajes.rs Normal file
View File

@ -0,0 +1,206 @@
use axum::response::Html;
use serde::Serialize;
use rand::Rng;
use minijinja::render;
use std::fs;
#[derive(Serialize, Debug)]
struct PJ {
nombre: String,
fue: i32,
agi: i32,
men: i32,
pg: i32,
trasfondo: String,
equipo: Vec<String>
}
#[derive(Serialize, Debug)]
struct Trasfondo {
nombre: String,
equipo: Vec<String>
}
pub async fn genera_pj() -> Html<String> {
let trasf = trasfondo_random().await;
let n =LIST_NOMBRES[rand::thread_rng().gen_range(0..72)].to_string();
let a =LIST_APELLIDOS[rand::thread_rng().gen_range(0..36)].to_string();
let pj = PJ {
nombre: format!("{} {}", n, a),
fue: rand::thread_rng().gen_range(3..19),
agi: rand::thread_rng().gen_range(3..19),
men: rand::thread_rng().gen_range(3..19),
pg: rand::thread_rng().gen_range(1..7),
trasfondo: trasf.nombre,
equipo: trasf.equipo,
};
let template = fs::read_to_string("templates/personaje.html").unwrap();
let r = render!(&template, personaje => pj);
Html(r)
}
async fn trasfondo_random() -> Trasfondo {
let seleccionado = LIST_TRAS[rand::thread_rng().gen_range(0..20)];
let partes: Vec<&str> = seleccionado.split(":").collect();
let nome: String;
let mut equip_strings = Vec::new();
if partes.len() > 1 {
// nome
nome = partes[0].to_string();
// equipo
let equip: Vec<&str> = partes[1].split(".").collect();
for e in equip {
equip_strings.push(e.to_string()); // considerer borrar espacios iniciales e finales
}
} else {
nome = "".to_string();
equip_strings.push("".to_string());
}
Trasfondo {
nombre: String::from(nome),
equipo: equip_strings,
}
}
//formato -> nombre: equipo.equipo.equipo
const LIST_TRAS: [&str; 20] = [
"Aristócrata: Pistola láser (d6). Dermo. Símbolo del cargo",
"Soldado: Rifle blaster (d10, Voluminoso). Armadura ligera (1A). Sensor de explosivos",
"Policía: Blaster (d8). Grilletes. Cigarros",
"Cazarrecompensas: Blaster (d8). Armadura ligera (1A) y escudo (+1A). Rastreador y baliza",
"Piloto: Pistola láser (d6). Granada(d8). Respirador",
"Tecnólogo / Hacker: Pistola láser (d6). MiniPC. Dermo",
"Mecánico / Ingeniero: Hacha de plasma (d8). Escudo (+1A). Bluebox. Gallo",
"Explorador / Cazador: Arco de energía (d8). Trampa portátil",
"Académico - Arqueólogo/Historiador: Daga (d4). Generador de hologramas. Piedra",
"Académico - Científico: Dardos (d4). Toxina. Antitoxina",
"Médico: Pistola láser (d6). Dermo. Kit médico",
"Consejero / Psicólogo: Punzón plasma (d6). Holo-rorschach. Dermo",
"Clérigo / Religioso / Monje: Espada de plasma (d8). Altavoz implantado",
"Intérprete / Animador: Daga (d6). Click metamorfoseador. Pañuelo de seda",
"Criminal (¡dinos de qué tipo!): Blaster (d8). Bluebox. Pata de cabra",
"Mensajero en deslizador: Porra de energía (d6). Deslizador personal",
"Funcionario: Daga (d4). Dermo. Pase gubernamental a punto de caducar",
"Atleta (¡dinos de qué tipo!): Bate de vacío (d10, Voluminoso). Click acelerador",
"Jugador / Tahur: Pistola láser (d6). Armadura ligera (1A). Baraja/dados/tabas",
"Comerciante: Blaster de antebrazo (d6). 3 bombas. Botella de Ron",
];
const LIST_NOMBRES: [&str; 72] = [
"Adrian",
"Arashi",
"Asano",
"Branden",
"Charlie",
"Demenok",
"Ebinuma",
"Ferran",
"Henry",
"Hugo",
"Jamie",
"Josep",
"Kamari",
"Koshikawa",
"Marc",
"Michael",
"Nikulin",
"Pol",
"Polotentsev",
"Rabinovich",
"Salko",
"Samuel",
"Sazama",
"Silas",
"Smetanin",
"Suguro",
"Tony",
"Tristian",
"Uglichinin",
"Umeda",
"Unkovsky",
"Xabier",
"Yagi",
"Yamanami",
"Yoshimi",
"Zakai",
"Adara",
"Amira",
"Brantova",
"Chihoko",
"Chinatsu",
"Durchenka",
"Eiko",
"Elizabeth",
"Emma",
"Garina",
"Hisako",
"Inaho",
"Isabella",
"Kaho",
"Kalski",
"Kikyo",
"Kylie",
"Lilly",
"Lucille",
"Maleah",
"Martina",
"Nadeshiko",
"Nao",
"Nicole",
"Paola",
"Penkina",
"Ruth",
"Siyanova",
"Soraya",
"Suzume",
"Tashka",
"Taylor",
"Utzuki",
"Vanesa",
"Yulinka",
"Yureneva"
];
const LIST_APELLIDOS: [&str; 36] = [
"Albacete",
"Anderson",
"Arroyo",
"Bowen",
"Burks",
"Caballero",
"Carbonero",
"Chistau",
"Dmitrievich",
"Filippovich",
"Foster",
"Furutani",
"Hall",
"Huff",
"Ishikawa",
"Kelly",
"Lagos",
"Lowe",
"Martin",
"Maximovich",
"Mihara",
"Nagatsuka",
"Nakamura",
"Olegovich",
"Romanovich",
"Sáenz",
"Sakane",
"Sakuma",
"Semyonovich",
"Short",
"Sonoda",
"Stepanovich",
"Tejedor",
"Uchida",
"Verdugo",
"Vsevolodovich"
];

44
templates/personaje.html Normal file
View File

@ -0,0 +1,44 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Into the Kosmos</title>
<meta name="description" content="Generador de PJ para Into the Kosmos">
<meta name="author" content="serxoz">
<style>
main {
font-family: monospace, monospace;
max-width: 38rem;
padding: 2rem;
margin: auto;
}
ul {
margin-top: 0;
}
</style>
</head>
<body>
<main id="app">
<div>Nombre: {{ personaje.nombre }}</div>
<hr>
<div>FUE: {{ personaje.fue }}</div>
<div>AGI: {{ personaje.agi }}</div>
<div>MEN: {{ personaje.men }}</div>
<div>PG: {{ personaje.pg }}</div>
<div>Trasfondo: {{ personaje.trasfondo }}</div>
<hr>
<div>Equipo:
<ul>
{% for item in personaje.equipo %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</div>
</main>
</body>
</html>