salidas como objetos, preparando para as condiciós aberto/pechado

This commit is contained in:
serxoz 2022-09-19 21:52:41 +02:00
parent ca73d8aecd
commit 2223a47167
9 changed files with 89 additions and 48 deletions

View File

@ -2,11 +2,5 @@ CREATE TABLE location (
tag varchar(100) NOT NULL,
nombre varchar(100),
descripcion varchar(2048) NOT NULL,
salida_norte varchar(100),
salida_sur varchar(100),
salida_este varchar(100),
salida_oeste varchar(100),
salida_arriba varchar(100),
salida_abajo varchar(100),
CONSTRAINT PK_Location PRIMARY KEY (tag)
)

View File

@ -1,6 +1,6 @@
INSERT INTO location
(tag, nombre, descripcion, salida_norte, salida_sur, salida_este, salida_oeste, salida_arriba, salida_abajo)
(tag, nombre, descripcion)
VALUES
('0', 'Pasillo', 'Estás en un pasillo muy oscuro.\nEscuchas un sonido de alarma en la lejanía.\nApenas puedes ver una luz pulsante al norte.\n\n---\nSalidas: norte', "1", NULL, NULL, NULL, NULL, NULL),
('1', 'Puente', 'La única iluminación de esta sala es una pequeña luz pulsante en un panel. Parece el puente de mando. Un humo denso llena la sala irritando tus pulmones. Entre el humo ves una puerta al este tras la cual parece que suena una alarma.\n\n---\nSalidas: este, sur', NULL, "0", "2", NULL, NULL, NULL),
('2', 'Vainas', 'De aquí surje el fuerte sonido de alarma que taladra tus tímpanos. Alrededor de la sala ves las vainas criogénicas en las que has estado durmiendo durante el viaje. Todas están vacías!\n\n---\nSalidas: oeste', NULL, NULL, NULL, "1", NULL, NULL);
('0', 'Pasillo', 'Estás en un pasillo muy oscuro.\nEscuchas un sonido de alarma en la lejanía.\nApenas puedes ver una luz pulsante al norte.\n'),
('1', 'Puente', 'La única iluminación de esta sala es una pequeña luz pulsante en un panel. Parece el puente de mando. Un humo denso llena la sala irritando tus pulmones. Entre el humo ves una puerta al este tras la cual parece que suena una alarma.\n'),
('2', 'Vainas', 'De aquí surje el fuerte sonido de alarma que taladra tus tímpanos. Alrededor de la sala ves las vainas criogénicas en las que has estado durmiendo durante el viaje. Todas están vacías!\n');

View File

@ -1,8 +1,10 @@
CREATE TABLE object (
tag varchar(100) NOT NULL,
tipo varchar(100) NOT NULL,
nombre varchar(100) NOT NULL,
descripcion varchar(2048) NOT NULL,
location varchar(100) NOT NULL,
peso int NOT NULL,
destino varchar(100),
CONSTRAINT PK_Object PRIMARY KEY (tag)
)

View File

@ -1,5 +1,10 @@
INSERT INTO object
(tag, nombre, descripcion, location, peso)
(tag, tipo, nombre, descripcion, location, peso, destino)
VALUES
('o0', 'palanca', 'Trozo de metal, servirá como palanca', '0', 0),
('o1', 'calmantes', 'Calmantes, sirven para el dolor', '2', 0);
('o0', 'item', 'palanca', 'Trozo de metal, servirá como palanca', '0', 0, NULL),
('o1', 'item', 'calmantes', 'Calmantes, sirven para el dolor', '2', 0, NULL),
('s0sn', 'salida', 'salida norte', 'Puerta automática.', '0', 0, '1'),
('s1ss', 'salida', 'salida sur', 'Puerta automática.', '1', 0, '0'),
('s1se', 'salida', 'salida este', 'Pasillo.', '1', 0, '2'),
('s2so', 'salida', 'salida oeste', 'Pasillo.', '2', 0, '1');

View File

@ -8,12 +8,6 @@ pub struct RLocation {
pub tag: String,
pub nombre: Option<String>,
pub descripcion: String,
pub salida_norte: Option<String>,
pub salida_sur: Option<String>,
pub salida_este: Option<String>,
pub salida_oeste: Option<String>,
pub salida_arriba: Option<String>,
pub salida_abajo: Option<String>,
}
#[derive(Queryable, Insertable)]
@ -21,10 +15,12 @@ pub struct RLocation {
#[diesel(primary_key(tag))]
pub struct RObject {
pub tag: String,
pub tipo: String,
pub nombre: String,
pub descripcion: String,
pub location: String,
pub peso: i32,
pub destino: Option<String>,
}
#[derive(Queryable, Insertable, AsChangeset)]

View File

@ -1,4 +1,4 @@
use crate::models::*;
use crate::models::RObject;
use diesel::prelude::*;
use crate::database::establish_connection;
@ -8,6 +8,7 @@ pub fn get_object(pegatina: String) -> Result<RObject, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(tipo.eq("item"))
.filter(tag.eq(pegatina))
.first(conn)
}
@ -17,6 +18,7 @@ pub fn get_objects(pegatina: String) -> Result<Vec<RObject>, diesel::result::Err
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(tipo.eq("item"))
.filter(location.eq(pegatina))
.get_results(conn)
}
@ -40,3 +42,24 @@ pub fn update_object_location(pegatina: String, new_location: String) -> Result<
.set(location.eq(new_location))
.execute(conn)
}
// get_salidas trae da base de datos todos os obxetos salida de unha localización
pub fn get_salidas(pegatina: String) -> Result<Vec<RObject>, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(tipo.eq("salida"))
.filter(location.eq(pegatina))
.get_results(conn)
}
//get_salidas_here trae da base de datos a salida polo nome e a pegatina da sala actual
pub fn get_salidas_here(pegatina: String, nome: String) -> Result<RObject, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(tipo.eq("salida"))
.filter(location.eq(pegatina))
.filter(nombre.eq(nome))
.first(conn)
}

View File

@ -42,7 +42,7 @@ pub fn execute_search(player: &mut Player) -> String {
let objetos = get_objects(current.to_string());
if objetos.is_ok() && objetos.as_ref().unwrap().len() > 0 {
output = String::from("En esta sala encuentras los siguientes objetos:\n");
output = String::from("En esta sala encuentras:\n");
for objeto in objetos.unwrap() {
let mut nombre = objeto.nombre;
nombre.push_str("\n");

View File

@ -1,4 +1,4 @@
use crate::objects::get_object_here;
use crate::objects::{get_salidas, get_object_here, get_salidas_here};
use crate::npc::{get_npc_here, get_npcs};
use crate::models::*;
@ -15,18 +15,32 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String {
if player_location.as_str() != "" {
output = String::from(location.unwrap().descripcion);
// agregar á salida os npcs que esteñan na sala
let npcs = get_npcs(player_location.to_string());
// agregar á salida os obxetos que esteñan na sala
let salidas = get_salidas(player_location.to_string());
if npcs.is_ok() && npcs.as_ref().unwrap().len() > 0 {
output.push_str("\n---\nTambién ves:\n");
for objeto in npcs.unwrap() {
if salidas.is_ok() && salidas.as_ref().unwrap().len() > 0 {
output.push_str("\nSalidas:\n");
for salidas in salidas.unwrap() {
let mut nombre = "- ".to_string();
nombre.push_str(&objeto.nombre);
nombre.push_str(&salidas.nombre);
nombre.push_str("\n");
output.push_str(&nombre);
}
}
// agregar á salida os npcs que esteñan na sala
let npcs = get_npcs(player_location.to_string());
if npcs.is_ok() && npcs.as_ref().unwrap().len() > 0 {
output.push_str("\nTambién ves:\n");
for npc in npcs.as_ref().unwrap() {
let mut nombre = "- ".to_string();
nombre.push_str(&npc.nombre);
nombre.push_str("\n");
output.push_str(&nombre);
}
}
} else {
output = String::from("Navengado el ether!");
}
@ -55,28 +69,39 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String {
let output: String;
if coord != "" {
let tag: String;
let player_location = &player.location;
let current_location = get_location(player_location.to_string()).unwrap();
let nombre: String;
match coord {
"n" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap() } else { tag = String::from("")},
"e" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")},
"s" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")},
"o" => if current_location.salida_oeste.is_some() { tag = current_location.salida_oeste.unwrap()} else { tag = String::from("")},
"norte" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap()} else { tag = String::from("")},
"este" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")},
"sur" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")},
"oeste" => if current_location.salida_oeste.is_some() { tag = current_location.salida_oeste.unwrap()} else { tag = String::from("")},
_ => return String::from("No existe esa dirección.")
};
"n" => nombre = "salida norte".to_string(),
"s" => nombre = "salida sur".to_string(),
"e" => nombre = "salida este".to_string(),
"o" => nombre = "salida oeste".to_string(),
"norte" => nombre = "salida norte".to_string(),
"sur" => nombre = "salida sur".to_string(),
"este" => nombre = "salida este".to_string(),
"oeste" => nombre = "salida oeste".to_string(),
"arriba" => nombre = "salida arriba".to_string(),
"abajo" => nombre = "salida abajo".to_string(),
_ => nombre = "".to_string(),
}
let tag: String;
let player_location = &player.location;
let salida = get_salidas_here(player_location.to_string(), nombre);
if salida.is_ok() {
tag = salida.unwrap().destino.unwrap();
} else {
tag = String::from("");
}
if tag.as_str() != "" {
let location = get_location(tag).unwrap();
if location.tag == player.location {
output = String::from("No te puedes acercar mucho más...");
} else {
player.location = location.tag;
output = location.descripcion;
// output = location.descripcion;
output = execute_look(player, "sala");
}
} else {
output = String::from("No existe esa salida.");

View File

@ -5,12 +5,6 @@ diesel::table! {
tag -> Varchar,
nombre -> Nullable<Varchar>,
descripcion -> Varchar,
salida_norte -> Nullable<Varchar>,
salida_sur -> Nullable<Varchar>,
salida_este -> Nullable<Varchar>,
salida_oeste -> Nullable<Varchar>,
salida_arriba -> Nullable<Varchar>,
salida_abajo -> Nullable<Varchar>,
}
}
@ -29,10 +23,12 @@ diesel::table! {
diesel::table! {
object (tag) {
tag -> Varchar,
tipo -> Varchar,
nombre -> Varchar,
descripcion -> Varchar,
location -> Varchar,
peso -> Integer,
destino -> Nullable<Varchar>,
}
}