xenerador de Astronaves

This commit is contained in:
serxoz 2023-01-20 20:59:12 +01:00
parent 820632e147
commit 3309624821
5 changed files with 168 additions and 2 deletions

View File

@ -1,6 +1,7 @@
pub mod views; pub mod views;
use crate::views::personajes::genera_pj; use crate::views::personajes::genera_pj;
use crate::views::astronaves::genera_astronave;
use axum::{routing::get, Router}; use axum::{routing::get, Router};
use std::net::SocketAddr; use std::net::SocketAddr;
@ -12,7 +13,8 @@ async fn main() {
// routing // routing
let app = Router::new() let app = Router::new()
.route("/", get(root)) .route("/", get(root))
.route("/pjs", get(genera_pj)); .route("/pjs", get(genera_pj))
.route("/astronaves", get(genera_astronave));
// executase con hyper a través de axum::Server // executase con hyper a través de axum::Server
let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

91
src/views/astronaves.rs Normal file
View File

@ -0,0 +1,91 @@
use axum::response::Html;
use serde::Serialize;
use rand::Rng;
use minijinja::render;
use std::fs;
#[derive(Serialize, Debug)]
struct Astronave {
nombre: String,
cas: i32,
mot: i32,
sis: i32,
escudos: i32,
combustible: i32,
armamento: String,
armadura: i32,
soporte_vital: i32,
peculiaridades: Vec<String>
}
pub async fn genera_astronave() -> Html<String> {
let sis_val = rand::thread_rng().gen_range(3..19);
let esc_dado1 = rand::thread_rng().gen_range(1..7);
let esc_dado2 = rand::thread_rng().gen_range(1..7);
let esc_dado3 = rand::thread_rng().gen_range(1..7);
let ast_name= format!("{}{}{}{}{}-{}-{}-{}",
LIST_RUS[rand::thread_rng().gen_range(0..33)],
LIST_RUS[rand::thread_rng().gen_range(0..33)],
LIST_RUS[rand::thread_rng().gen_range(0..33)],
LIST_RUS[rand::thread_rng().gen_range(0..33)],
LIST_RUS[rand::thread_rng().gen_range(0..33)],
rand::thread_rng().gen_range(0..999),
LIST_RUS[rand::thread_rng().gen_range(0..33)],
rand::thread_rng().gen_range(0..999),
);
let ast = Astronave {
nombre: ast_name,
cas: rand::thread_rng().gen_range(3..19),
mot: rand::thread_rng().gen_range(3..19),
sis: sis_val,
escudos: esc_dado1 + esc_dado2 + esc_dado3,
combustible: 4,
armamento: "d6".to_string(),
armadura: 0,
soporte_vital: sis_val+2,
peculiaridades: vec![
LIST_PEC_1[(esc_dado1-1) as usize].to_string(),
LIST_PEC_2[(esc_dado2-1) as usize].to_string(),
LIST_PEC_3[(esc_dado3-1) as usize].to_string(),
],
};
let template = fs::read_to_string("templates/astronave.html").unwrap();
let r = render!(&template, astronave => ast);
Html(r)
}
const LIST_PEC_1: [&str; 6] = [
"Sin Armamento: la nave comienza sin armas instaladas.",
"Escudos parpadeantes: si un ataque contra esta nave inflige daño máximo, ignora los escudos y daña directamente el CAS.",
"Casco agrietado: -1 CAS Máximo. Hay una grieta enorme en el casco de la nave.",
"Casco grueso: +1 CAS Máximo, -1 MOT Max.",
"Blindaje: +1 Armadura.",
"Vigas reforzadas: +2 CAS Máx. Las puertas son difíciles de forzar.",
];
const LIST_PEC_2: [&str; 6] = [
"Motor de salto defectuoso: desactivado d6 turnos después de saltar.",
"Tanques de combustible perdidos: - 2 al Combustible Máximo.",
"Latencia en Gravitador: La nave tarda unos instantes en moverse desde que recibe la órden.",
"Motores grandes: +1 MOT Max, -1 SIS Max. Los motores de salto y gravedad están sobredimensionados.",
"Revestimiento antigravitatorio: Le cuesta 1 de Combustible menos despegar del pozo de gravitacional de un planeta.",
"Dispositivo de ocultación: Si se activa apaga todos los sistemas pero hace que la nave sea indetectable a todos los escáneres, escepto a los más fuertes.",
];
const LIST_PEC_3: [&str; 6] = [
"Foco de Adware: La nave emite constantemente a todo volumen anuncios publicitarios.",
"Sistemas inusuales: El coste de las mejoras se incrementa en un 10%.",
"Errores informáticos: -1 SIS Max. Siempre tiene alguna avería ligera.",
"Sistemas redundantes: +1 SIS Max, -1 CAS Max. Subsistemas duplicados.",
"Astronave inteligente: Posee una IA. Tiene 9+d6 de MEN y puede hacer una tarea por asalto como un personaje.",
"Error de pago: La deuda o coste de la nave se reduce en 25G. Si robas o rescatas una nave esta peculiaridad no tiene sentido.",
];
const LIST_RUS: [&str; 33] = [
"А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т",
"У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Яk",
];

View File

@ -1 +1,2 @@
pub mod personajes; pub mod personajes;
pub mod astronaves;

72
templates/astronave.html Normal file
View File

@ -0,0 +1,72 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Into the Kosmos - Astronaves</title>
<meta name="description" content="Generador de Astronaves 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;
}
.row {
display: flex;
}
.column {
flex: 50%;
}
.nota_pie {
font-size: 0.75rem;
font-style: italic;
}
</style>
</head>
<body>
<main id="app">
<div>Nombre: {{ astronave.nombre }}</div>
<hr>
<div class="row">
<div class="column" style="flex:20% !important">
<div>CAS: {{ astronave.cas }}</div>
<div>MOT: {{ astronave.mot }}</div>
<div>SIS: {{ astronave.sis }}</div>
</div>
<div class="column">
<div>Escudos: {{ astronave.escudos }}</div>
<div>Armadura: {{ astronave.armadura }}</div>
<div>Armamento: {{ astronave.armamento }}</div>
</div>
</div>
<div class="row" style="margin-top: 15px">
<div class="column" style="flex:20% !important">
<div>Combustible: {{ astronave.combustible }}</div>
</div>
<div class="column">
<div>Soporte Vital para {{ astronave.soporte_vital }} personas.</div>
</div>
</div>
<hr>
<div>Peculiaridades:
<ul>
{% for item in astronave.peculiaridades %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<div class="nota_pie">
* Ten en cuenta que las modificaciones de las peculiaridades no están aplicadas.
</div>
</div>
</main>
</body>
</html>

View File

@ -5,7 +5,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Into the Kosmos</title> <title>Into the Kosmos - Personajes</title>
<meta name="description" content="Generador de PJ para Into the Kosmos"> <meta name="description" content="Generador de PJ para Into the Kosmos">
<meta name="author" content="serxoz"> <meta name="author" content="serxoz">