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, tag varchar(100) NOT NULL,
nombre varchar(100), nombre varchar(100),
descripcion varchar(2048) NOT NULL, 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) CONSTRAINT PK_Location PRIMARY KEY (tag)
) )

View File

@ -1,6 +1,6 @@
INSERT INTO location INSERT INTO location
(tag, nombre, descripcion, salida_norte, salida_sur, salida_este, salida_oeste, salida_arriba, salida_abajo) (tag, nombre, descripcion)
VALUES 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), ('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\n---\nSalidas: este, sur', NULL, "0", "2", 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'),
('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); ('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 ( CREATE TABLE object (
tag varchar(100) NOT NULL, tag varchar(100) NOT NULL,
tipo varchar(100) NOT NULL,
nombre varchar(100) NOT NULL, nombre varchar(100) NOT NULL,
descripcion varchar(2048) NOT NULL, descripcion varchar(2048) NOT NULL,
location varchar(100) NOT NULL, location varchar(100) NOT NULL,
peso int NOT NULL, peso int NOT NULL,
destino varchar(100),
CONSTRAINT PK_Object PRIMARY KEY (tag) CONSTRAINT PK_Object PRIMARY KEY (tag)
) )

View File

@ -1,5 +1,10 @@
INSERT INTO object INSERT INTO object
(tag, nombre, descripcion, location, peso) (tag, tipo, nombre, descripcion, location, peso, destino)
VALUES VALUES
('o0', 'palanca', 'Trozo de metal, servirá como palanca', '0', 0), ('o0', 'item', 'palanca', 'Trozo de metal, servirá como palanca', '0', 0, NULL),
('o1', 'calmantes', 'Calmantes, sirven para el dolor', '2', 0); ('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 tag: String,
pub nombre: Option<String>, pub nombre: Option<String>,
pub descripcion: 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)] #[derive(Queryable, Insertable)]
@ -21,10 +15,12 @@ pub struct RLocation {
#[diesel(primary_key(tag))] #[diesel(primary_key(tag))]
pub struct RObject { pub struct RObject {
pub tag: String, pub tag: String,
pub tipo: String,
pub nombre: String, pub nombre: String,
pub descripcion: String, pub descripcion: String,
pub location: String, pub location: String,
pub peso: i32, pub peso: i32,
pub destino: Option<String>,
} }
#[derive(Queryable, Insertable, AsChangeset)] #[derive(Queryable, Insertable, AsChangeset)]

View File

@ -1,4 +1,4 @@
use crate::models::*; use crate::models::RObject;
use diesel::prelude::*; use diesel::prelude::*;
use crate::database::establish_connection; 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::*; use crate::schema::object::dsl::*;
let conn = &mut establish_connection(); let conn = &mut establish_connection();
object object
.filter(tipo.eq("item"))
.filter(tag.eq(pegatina)) .filter(tag.eq(pegatina))
.first(conn) .first(conn)
} }
@ -17,6 +18,7 @@ pub fn get_objects(pegatina: String) -> Result<Vec<RObject>, diesel::result::Err
use crate::schema::object::dsl::*; use crate::schema::object::dsl::*;
let conn = &mut establish_connection(); let conn = &mut establish_connection();
object object
.filter(tipo.eq("item"))
.filter(location.eq(pegatina)) .filter(location.eq(pegatina))
.get_results(conn) .get_results(conn)
} }
@ -40,3 +42,24 @@ pub fn update_object_location(pegatina: String, new_location: String) -> Result<
.set(location.eq(new_location)) .set(location.eq(new_location))
.execute(conn) .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()); let objetos = get_objects(current.to_string());
if objetos.is_ok() && objetos.as_ref().unwrap().len() > 0 { 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() { for objeto in objetos.unwrap() {
let mut nombre = objeto.nombre; let mut nombre = objeto.nombre;
nombre.push_str("\n"); 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::npc::{get_npc_here, get_npcs};
use crate::models::*; use crate::models::*;
@ -15,18 +15,32 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String {
if player_location.as_str() != "" { if player_location.as_str() != "" {
output = String::from(location.unwrap().descripcion); output = String::from(location.unwrap().descripcion);
// agregar á salida os npcs que esteñan na sala // agregar á salida os obxetos que esteñan na sala
let npcs = get_npcs(player_location.to_string()); let salidas = get_salidas(player_location.to_string());
if npcs.is_ok() && npcs.as_ref().unwrap().len() > 0 { if salidas.is_ok() && salidas.as_ref().unwrap().len() > 0 {
output.push_str("\n---\nTambién ves:\n"); output.push_str("\nSalidas:\n");
for objeto in npcs.unwrap() { for salidas in salidas.unwrap() {
let mut nombre = "- ".to_string(); let mut nombre = "- ".to_string();
nombre.push_str(&objeto.nombre); nombre.push_str(&salidas.nombre);
nombre.push_str("\n"); nombre.push_str("\n");
output.push_str(&nombre); 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 { } else {
output = String::from("Navengado el ether!"); output = String::from("Navengado el ether!");
} }
@ -55,28 +69,39 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String {
let output: String; let output: String;
if coord != "" { if coord != "" {
let tag: String; let nombre: String;
let player_location = &player.location;
let current_location = get_location(player_location.to_string()).unwrap();
match coord { match coord {
"n" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap() } else { tag = String::from("")}, "n" => nombre = "salida norte".to_string(),
"e" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")}, "s" => nombre = "salida sur".to_string(),
"s" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")}, "e" => nombre = "salida este".to_string(),
"o" => if current_location.salida_oeste.is_some() { tag = current_location.salida_oeste.unwrap()} else { tag = String::from("")}, "o" => nombre = "salida oeste".to_string(),
"norte" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap()} else { tag = String::from("")}, "norte" => nombre = "salida norte".to_string(),
"este" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")}, "sur" => nombre = "salida sur".to_string(),
"sur" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")}, "este" => nombre = "salida este".to_string(),
"oeste" => if current_location.salida_oeste.is_some() { tag = current_location.salida_oeste.unwrap()} else { tag = String::from("")}, "oeste" => nombre = "salida oeste".to_string(),
_ => return String::from("No existe esa dirección.") "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() != "" { if tag.as_str() != "" {
let location = get_location(tag).unwrap(); let location = get_location(tag).unwrap();
if location.tag == player.location { if location.tag == player.location {
output = String::from("No te puedes acercar mucho más..."); output = String::from("No te puedes acercar mucho más...");
} else { } else {
player.location = location.tag; player.location = location.tag;
output = location.descripcion; // output = location.descripcion;
output = execute_look(player, "sala");
} }
} else { } else {
output = String::from("No existe esa salida."); output = String::from("No existe esa salida.");

View File

@ -5,12 +5,6 @@ diesel::table! {
tag -> Varchar, tag -> Varchar,
nombre -> Nullable<Varchar>, nombre -> Nullable<Varchar>,
descripcion -> 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! { diesel::table! {
object (tag) { object (tag) {
tag -> Varchar, tag -> Varchar,
tipo -> Varchar,
nombre -> Varchar, nombre -> Varchar,
descripcion -> Varchar, descripcion -> Varchar,
location -> Varchar, location -> Varchar,
peso -> Integer, peso -> Integer,
destino -> Nullable<Varchar>,
} }
} }