xenerador de PJs
This commit is contained in:
commit
0618427849
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
1260
Cargo.lock
generated
Normal file
1260
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
Cargo.toml
Normal file
17
Cargo.toml
Normal 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
3
README.md
Normal 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
29
src/main.rs
Normal 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
1
src/views/mod.rs
Normal file
@ -0,0 +1 @@
|
||||
pub mod personajes;
|
206
src/views/personajes.rs
Normal file
206
src/views/personajes.rs
Normal 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
44
templates/personaje.html
Normal 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>
|
Loading…
Reference in New Issue
Block a user