diff options
| -rw-r--r-- | src/components.rs | 16 | ||||
| -rw-r--r-- | src/componentwrapper.rs | 7 | ||||
| -rw-r--r-- | src/controls.rs | 8 | ||||
| -rw-r--r-- | src/main.rs | 25 | ||||
| -rw-r--r-- | src/parameter.rs | 16 | ||||
| -rw-r--r-- | src/room.rs | 8 | ||||
| -rw-r--r-- | src/systems/controlinput.rs | 2 | ||||
| -rw-r--r-- | src/systems/mod.rs | 2 | ||||
| -rw-r--r-- | src/systems/take.rs | 65 | ||||
| -rw-r--r-- | src/template.rs | 2 |
10 files changed, 128 insertions, 23 deletions
diff --git a/src/components.rs b/src/components.rs index 277dd01..8be8364 100644 --- a/src/components.rs +++ b/src/components.rs @@ -9,6 +9,7 @@ use specs::{ use super::controls::Control; use super::pos::Pos; +use crate::template::Template; #[derive(Debug, Clone)] @@ -65,3 +66,18 @@ impl Player { } } +#[derive(Debug, Clone, Default)] +pub struct Inventory { + pub items: Vec<Item>, + pub capacity: u64 +} +impl Component for Inventory { + type Storage = FlaggedStorage<Self, HashMapStorage<Self>>; +} + + +#[derive(Component, Debug, Clone)] +pub struct Item { + pub ent: Template +} + diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs index 43c8353..c60c23f 100644 --- a/src/componentwrapper.rs +++ b/src/componentwrapper.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use specs::{Builder, world::LazyBuilder}; -use crate::components::{Visible, Blocking, Player, Floor}; +use crate::components::{Visible, Blocking, Player, Floor, Item, Inventory}; use crate::parameter::{Parameter, ParameterType}; @@ -91,7 +91,10 @@ components!( }; Blocking () {Blocking}; Floor () {Floor}; - Player (name: String) {Player::new(name.to_string())} + Player (name: String) {Player::new(name.to_string())}; + Item (ent: Template) {Item{ent}}; + Inventory () {Inventory::default()} + ); diff --git a/src/controls.rs b/src/controls.rs index 1f96180..d9432a5 100644 --- a/src/controls.rs +++ b/src/controls.rs @@ -42,7 +42,8 @@ impl Direction { #[derive(Debug, Clone)] pub enum Control { Move(Direction), - Take(u64) + Take(u64), + Drop(u64) } @@ -54,10 +55,11 @@ impl Control { Some(dir) => Some(Control::Move(dir)), None => None }, - "take" => match val[1].as_u64() { + "take" => Some(Control::Take(0)), /*match val[1].as_u64() { Some(rank) => Some(Control::Take(rank)), _ => None - } + }*/ + "drop" => Some(Control::Drop(0)), _ => None } } else {None} diff --git a/src/main.rs b/src/main.rs index d2cfd13..0b055c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -90,12 +90,12 @@ fn gen_room<'a, 'b>() -> Room<'a, 'b> { "X,,,,,,,,,,,,,,,,,,~~~,,,,,T,,,,######,,,X", "X,,,,,,,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", "X,,,,,.............bbb...........++++#,,,X", - "X,,,,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", - "X,,,,,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X", - "X,,,,,.,,,, ,,,,,~~~,,,,,,,,,,######,,,X", - "X,,,,,.,,,, ,,,,~~~~,,,,,,,,,,f,,,,f,,,X", - "X,,,,,.,,,, ,,,,~~~''''''''''''''''f'''X", - "X,,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X", + "X,**,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", + "X,*,*,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X", + "X,,*,,.,,,, ,,,,,~~~,,,,,,,,,,######,,,X", + "X,**,,.,,,, ,,,,~~~~,,,,,,,,,,f,,,,f,,,X", + "X,,*,,.,,,, ,,,,~~~''''''''''''''''f'''X", + "X*,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X", "X,,,,,.,,,,,,,,,,,~~~'''''''''''ffffff'''X", "X,,,,,.,,,,,,,,,,,~~~''''''''''''''''''''X", "XXXXX,.,XXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXX" @@ -111,6 +111,7 @@ fn gen_room<'a, 'b>() -> Room<'a, 'b> { "T": ["grass", "tree"], "f": ["grass", "fence"], "X": "rock", + "*": ["grass", "pebble"], " ": [] } })).unwrap(); @@ -221,6 +222,15 @@ fn default_assemblages() -> Encyclopedia { }] ] }, + "pebble": { + "components": [ + ["Visible", { + "sprite": ["string", "pebble"], + "height": ["float", 0.4] + }], + ["Item", {"ent": ["template", "pebble"]}] + ] + }, "player": { "arguments": [["name", "string", null]], "components": [ @@ -230,7 +240,8 @@ fn default_assemblages() -> Encyclopedia { }], ["Player", { "name": ["arg", "name"] - }] + }], + ["Inventory", {}] ] } })).unwrap() diff --git a/src/parameter.rs b/src/parameter.rs index 33eee25..56f1cbf 100644 --- a/src/parameter.rs +++ b/src/parameter.rs @@ -1,12 +1,14 @@ use serde_json::Value; +use crate::template::Template; #[derive(Debug, PartialEq, Clone)] pub enum Parameter { String(String), Int(i64), // Pos(Pos), - Float(f64) + Float(f64), + Template(Template) } impl Parameter { @@ -20,7 +22,8 @@ impl Parameter { match typ { ParameterType::String => Some(Self::String(val.as_str()?.to_string())), ParameterType::Int => Some(Self::Int(val.as_i64()?)), - ParameterType::Float => Some(Self::Float(val.as_f64()?)) + ParameterType::Float => Some(Self::Float(val.as_f64()?)), + ParameterType::Template => Some(Self::Template(Template::from_json(val)?)) } } @@ -28,7 +31,8 @@ impl Parameter { match self { Self::String(_) => ParameterType::String, Self::Int(_) => ParameterType::Int, - Self::Float(_) => ParameterType::Float + Self::Float(_) => ParameterType::Float, + Self::Template(_) => ParameterType::Template } } @@ -40,6 +44,8 @@ impl Parameter { ParameterType::Int } else if val.is_f64() { ParameterType::Float + } else if val.is_object(){ + ParameterType::Template } else { println!("{:?}", val); return None @@ -52,7 +58,8 @@ impl Parameter { pub enum ParameterType { String, Int, - Float + Float, + Template } impl ParameterType { @@ -62,6 +69,7 @@ impl ParameterType { "string" => Some(Self::String), "int" => Some(Self::Int), "float" => Some(Self::Float), + "template" => Some(Self::Template), _ => None } } diff --git a/src/room.rs b/src/room.rs index 9d3f1ed..6af2c95 100644 --- a/src/room.rs +++ b/src/room.rs @@ -24,7 +24,8 @@ use super::systems::{ controlinput::ControlInput, view::View, remove::Remove, - create::Create + create::Create, + take::Take }; use crate::encyclopedia::Encyclopedia; use crate::roomtemplate::RoomTemplate; @@ -46,9 +47,10 @@ impl <'a, 'b>Room<'a, 'b> { }); let mut dispatcher = DispatcherBuilder::new() + .with(RegisterNew::default(), "registernew", &[]) .with(ControlInput, "controlinput", &[]) - .with(RegisterNew::default(), "makefloor", &[]) - .with(Move, "move", &["makefloor", "controlinput"]) + .with(Take, "take", &["controlinput"]) + .with(Move, "move", &["registernew", "controlinput"]) .with(View::default(), "view", &["move"]) .with(Create, "create", &["view", "controlinput"]) .with(Remove, "remove", &["view", "move"]) diff --git a/src/systems/controlinput.rs b/src/systems/controlinput.rs index 0771b1e..608de06 100644 --- a/src/systems/controlinput.rs +++ b/src/systems/controlinput.rs @@ -18,8 +18,6 @@ use crate::hashmap; use crate::template::Template; use crate::parameter::Parameter; -// use crate::assemblages::Player; - pub struct ControlInput; impl <'a> System<'a> for ControlInput { diff --git a/src/systems/mod.rs b/src/systems/mod.rs index 904e833..6989e95 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -5,5 +5,5 @@ pub mod moving; pub mod view; pub mod remove; pub mod create; - +pub mod take; diff --git a/src/systems/take.rs b/src/systems/take.rs new file mode 100644 index 0000000..95bec1b --- /dev/null +++ b/src/systems/take.rs @@ -0,0 +1,65 @@ + +use std::collections::HashSet; + +use specs::{ + Entities, + ReadStorage, + WriteStorage, + System, + Join, + Write +}; + +use super::super::pos::Pos; + +use super::super::components::{ + Controller, + Position, + Removed, + Inventory, + Item +}; + +use super::super::controls::{Control}; +use super::super::resources::{Ground, NewEntities}; + + + +pub struct Take; +impl <'a> System<'a> for Take { + type SystemData = ( + Entities<'a>, + ReadStorage<'a, Controller>, + WriteStorage<'a, Position>, + Write<'a, Ground>, + WriteStorage<'a, Removed>, + ReadStorage<'a, Item>, + WriteStorage<'a, Inventory>, + Write<'a, NewEntities> + ); + + fn run(&mut self, (entities, controllers, positions, ground, mut removed, items, mut inventories, mut new): Self::SystemData) { + for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ + match &controller.0 { + Control::Take(_rank) => { + let mut ents = ground.cells.get(&position.pos).unwrap_or(&HashSet::new()).clone(); + ents.remove(&ent); + for ent in ents { + if let Some(item) = items.get(ent) { + inventory.items.push(item.clone()); + if let Err(msg) = removed.insert(ent, Removed) { + println!("{:?}", msg); + } + } + } + } + Control::Drop(_rank) => { + if let Some(item) = inventory.items.pop() { + new.templates.push((position.pos, item.ent)); + } + } + _ => {} + } + } + } +} diff --git a/src/template.rs b/src/template.rs index 4de02f6..0f846fd 100644 --- a/src/template.rs +++ b/src/template.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use serde_json::{json, Value}; use crate::parameter::Parameter; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Template { pub name: String, pub args: Vec<Parameter>, |
