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