diff --git a/migrations/2022-09-12-114033_create_locations/up.sql b/migrations/2022-09-12-114033_create_locations/up.sql index bebeb04..9565c09 100644 --- a/migrations/2022-09-12-114033_create_locations/up.sql +++ b/migrations/2022-09-12-114033_create_locations/up.sql @@ -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) ) diff --git a/migrations/2022-09-12-114839_populate_locations/up.sql b/migrations/2022-09-12-114839_populate_locations/up.sql index 684842b..1839a6b 100644 --- a/migrations/2022-09-12-114839_populate_locations/up.sql +++ b/migrations/2022-09-12-114839_populate_locations/up.sql @@ -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'); diff --git a/migrations/2022-09-12-174911_create_objects/up.sql b/migrations/2022-09-12-174911_create_objects/up.sql index 3936198..5d28c50 100644 --- a/migrations/2022-09-12-174911_create_objects/up.sql +++ b/migrations/2022-09-12-174911_create_objects/up.sql @@ -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) ) diff --git a/migrations/2022-09-12-175351_populate_object/up.sql b/migrations/2022-09-12-175351_populate_object/up.sql index 9ff476c..f8c0ac2 100644 --- a/migrations/2022-09-12-175351_populate_object/up.sql +++ b/migrations/2022-09-12-175351_populate_object/up.sql @@ -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'); + diff --git a/src/models.rs b/src/models.rs index 6bce165..c217521 100644 --- a/src/models.rs +++ b/src/models.rs @@ -8,12 +8,6 @@ pub struct RLocation { pub tag: String, pub nombre: Option, pub descripcion: String, - pub salida_norte: Option, - pub salida_sur: Option, - pub salida_este: Option, - pub salida_oeste: Option, - pub salida_arriba: Option, - pub salida_abajo: Option, } #[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, } #[derive(Queryable, Insertable, AsChangeset)] diff --git a/src/objects.rs b/src/objects.rs index 59f4dd0..ec48940 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -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 { 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, 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, 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 { + 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) +} diff --git a/src/player.rs b/src/player.rs index 08076fd..be812c8 100644 --- a/src/player.rs +++ b/src/player.rs @@ -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"); diff --git a/src/rlocation.rs b/src/rlocation.rs index 2a1e506..ec7df26 100644 --- a/src/rlocation.rs +++ b/src/rlocation.rs @@ -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."); diff --git a/src/schema.rs b/src/schema.rs index 6e3ddfe..c12ce37 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -5,12 +5,6 @@ diesel::table! { tag -> Varchar, nombre -> Nullable, descripcion -> Varchar, - salida_norte -> Nullable, - salida_sur -> Nullable, - salida_este -> Nullable, - salida_oeste -> Nullable, - salida_arriba -> Nullable, - salida_abajo -> Nullable, } } @@ -29,10 +23,12 @@ diesel::table! { diesel::table! { object (tag) { tag -> Varchar, + tipo -> Varchar, nombre -> Varchar, descripcion -> Varchar, location -> Varchar, peso -> Integer, + destino -> Nullable, } }