lugares e obxetos na base de datos

This commit is contained in:
serxoz 2022-09-12 20:47:35 +02:00
parent 991c64c544
commit 497339ab30
16 changed files with 96 additions and 109 deletions

View File

@ -1,11 +0,0 @@
{
"tag": "0",
"descripcion": "Estás en un pasillo muy oscuro.\nEscuchas un sonido de alarma en la lejanía.\nApenas puedes ver una luz pulsante al norte.\nEn el suelo encuntras una palanca.\n\n---\nSalidas: norte",
"salidas": {
"norte": "1",
"este": "",
"sur": "",
"oeste": ""
},
"objetos": ["o0"]
}

View File

@ -1,10 +0,0 @@
{
"tag": "1",
"descripcion": "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",
"salidas": {
"norte": "",
"este": "2",
"sur": "0",
"oeste": ""
}
}

View File

@ -1,10 +0,0 @@
{
"tag": "2",
"descripcion": "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",
"salidas": {
"norte": "",
"este": "",
"sur": "",
"oeste": "1"
}
}

0
migrations/.keep Normal file
View File

View File

@ -0,0 +1 @@
DROP TABLE location

View File

@ -0,0 +1,12 @@
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

@ -0,0 +1 @@
TRUNCATE TABLE location;

View File

@ -0,0 +1,6 @@
INSERT INTO location
(tag, nombre, descripcion, salida_norte, salida_sur, salida_este, salida_oeste, salida_arriba, salida_abajo)
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.\nEn el suelo encuntras una palanca.\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);

View File

@ -0,0 +1 @@
DROP TABLE object

View File

@ -0,0 +1,7 @@
CREATE TABLE object (
tag varchar(100) NOT NULL,
nombre varchar(100),
descripcion varchar(2048) NOT NULL,
location_tag varchar(100) NOT NULL,
CONSTRAINT PK_Object PRIMARY KEY (tag)
)

View File

@ -0,0 +1 @@
-- This file should undo anything in `up.sql`

View File

@ -0,0 +1,5 @@
INSERT INTO object
(tag, nombre, descripcion, location_tag)
VALUES
('o0', 'palanca', 'Trozo de metal, servirá como palanca', '0'),
('o1', 'calmantes', 'Calmantes, sirven para el dolor', '2');

View File

@ -1,5 +0,0 @@
{
"tag": "o0",
"nombre": "palanca",
"descripcion": "Trozo de metal, servirá como palanca."
}

View File

@ -2,6 +2,9 @@ pub mod rlib;
pub mod rlocation; pub mod rlocation;
pub mod player; pub mod player;
pub mod objects; pub mod objects;
pub mod schema;
pub mod models;
pub mod database;
use crate::player::Player; use crate::player::Player;

View File

@ -1,25 +1,32 @@
use serde::Deserialize; use crate::models::*;
use std::fs::File; use diesel::prelude::*;
use std::io::Read; use crate::database::establish_connection;
#[derive(Debug, Deserialize)]
#[allow(dead_code)] // evita os warnings de que non se le o campo
pub struct Object {
pub tag: String, // tamén é o nome do arquivo, mentras non se implementa bbdd
pub nombre: String,
pub descripcion: String,
}
// get_object le o arquivo do obxeto e devolve o json
pub fn get_object(tag: String) -> Object {
let dir = "objects";
let path = format!("{}/{}.json", dir, tag);
let mut file = File::open(path).expect("Obxeto non atopado.");
let mut data = String::new();
file.read_to_string(&mut data).expect("Error durante a lectura do obxeto.");
let object: Object = serde_json::from_str(&data).expect("JSON was not well-formatted");
//get_object trae da base de datos un obxeto pola sua pegatina
pub fn get_object(pegatina: String) -> Result<RObject, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object object
.filter(tag.eq(pegatina))
.first(conn)
}
// get_objects trae da base de datos todos os obxetos de unha localización
pub fn get_objects(pegatina: String) -> Result<Vec<RObject>, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(location_tag.eq(pegatina))
.get_results(conn)
}
//get_object_here trae da base de datos o obxeto polo nome e a pegatina da sala actual
pub fn get_object_here(pegatina: String, nome: String) -> Result<RObject, diesel::result::Error> {
use crate::schema::object::dsl::*;
let conn = &mut establish_connection();
object
.filter(location_tag.eq(pegatina))
.filter(nombre.eq(nome))
.first(conn)
} }

View File

@ -1,26 +1,10 @@
use crate::player::Player; use crate::player::Player;
use crate::objects::get_object; use crate::objects::get_object_here;
use serde::Deserialize;
use std::fs::File;
use std::io::Read;
#[derive(Debug, Deserialize)] use crate::models::*;
#[allow(dead_code)] // evita os warnings de que non se le o campo use diesel::prelude::*;
pub struct Location { use crate::database::establish_connection;
tag: String, // tamén é o nome do arquivo, mentras non se implementa bbdd
descripcion: String,
salidas: Salidas,
objetos: Vec<String>,
}
#[derive(Debug, Deserialize)]
#[allow(dead_code)] // evita os warnings de que non se le o campo
pub struct Salidas {
norte: String,
este: String,
sur: String,
oeste: String,
}
pub fn execute_look(player: &mut Player, nombre: &str) -> String { pub fn execute_look(player: &mut Player, nombre: &str) -> String {
let output: String; let output: String;
@ -29,21 +13,20 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String {
if nombre == "sala" { if nombre == "sala" {
if player_location.as_str() != "" { if player_location.as_str() != "" {
output = String::from(location.descripcion); output = String::from(location.unwrap().descripcion);
} else { } else {
output = String::from("Navengado el ether!"); output = String::from("Navengado el ether!");
} }
} else { } else if nombre != "" {
// Recorre os obxetos da sala // Mira o obxeto que ven en nombre
for o in location.objetos { let objeto = get_object_here(player_location.to_string(), nombre.to_string());
let objeto = get_object(o); if objeto.is_ok() {
if nombre == objeto.nombre { output = String::from(objeto.unwrap().descripcion);
output = String::from(objeto.descripcion); } else {
return output; output = String::from("No encuentro lo que quieres mirar.");
}
} }
} else {
output = String::from("Qué quieres mirar?") output = String::from("Qué quieres mirar?");
} }
return output return output
@ -55,21 +38,21 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String {
if coord != "" { if coord != "" {
let tag: String; let tag: String;
let player_location = &player.location; let player_location = &player.location;
let current_location = get_location(player_location.to_string()); let current_location = get_location(player_location.to_string()).unwrap();
match coord { match coord {
"n" => tag = current_location.salidas.norte, "n" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap() } else { tag = String::from("")},
"e" => tag = current_location.salidas.este, "e" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")},
"s" => tag = current_location.salidas.sur, "s" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")},
"o" => tag = current_location.salidas.oeste, "o" => if current_location.salida_oeste.is_some() { tag = current_location.salida_oeste.unwrap()} else { tag = String::from("")},
"norte" => tag = current_location.salidas.norte, "norte" => if current_location.salida_norte.is_some() { tag = current_location.salida_norte.unwrap()} else { tag = String::from("")},
"este" => tag = current_location.salidas.este, "este" => if current_location.salida_este.is_some() { tag = current_location.salida_este.unwrap()} else { tag = String::from("")},
"sur" => tag = current_location.salidas.sur, "sur" => if current_location.salida_sur.is_some() { tag = current_location.salida_sur.unwrap()} else { tag = String::from("")},
"oeste" => tag = current_location.salidas.oeste, "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.") _ => return String::from("No existe esa dirección.")
}; };
if tag.as_str() != "" { if tag.as_str() != "" {
let location = get_location(tag); 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 {
@ -79,6 +62,7 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String {
} else { } else {
output = String::from("No existe esa salida."); output = String::from("No existe esa salida.");
} }
} else { } else {
output = String::from("No entiendo a donde quieres ir. Debes elegir una coordenada correspondiente a las salidas de esta sala."); output = String::from("No entiendo a donde quieres ir. Debes elegir una coordenada correspondiente a las salidas de esta sala.");
} }
@ -86,16 +70,11 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String {
return output.to_string(); return output.to_string();
} }
// get_location le o arquivo de localización e devolve o json // get_location busca na base de datos a localización polo seu tag
fn get_location(tag: String) -> Location { pub fn get_location(pegatina: String) -> Result<RLocation, diesel::result::Error> {
let dir = "locations"; use crate::schema::location::dsl::*;
let path = format!("{}/{}.json", dir, tag); let conn = &mut establish_connection();
let mut file = File::open(path).expect("Localización non atopada.");
let mut data = String::new();
file.read_to_string(&mut data).expect("Error durante a lectura da localización.");
let location: Location = serde_json::from_str(&data).expect("JSON was not well-formatted");
location location
.filter(tag.eq(pegatina))
.first(conn)
} }