summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-09 18:53:27 +0100
committertroido <troido@protonmail.com>2020-02-09 18:53:27 +0100
commit105c5ab0c0e969f3fda2cd43ae5195cbdb4da016 (patch)
tree46b65b3e96d9b180bf6658cb968a149eb3cfde0f
parentb1da31499de4145b1f77296cbea0c637e6f866bf (diff)
Revert "no templates in the world; only pre-entities"
This reverts commit b56add981c2f520789b97d1ee6f71dae41e8c900.
-rw-r--r--src/assemblage.rs4
-rw-r--r--src/componentwrapper.rs1
-rw-r--r--src/encyclopedia.rs4
-rw-r--r--src/main.rs13
-rw-r--r--src/player.rs13
-rw-r--r--src/resources.rs7
-rw-r--r--src/room.rs21
-rw-r--r--src/systems/controlinput.rs8
-rw-r--r--src/systems/create.rs15
9 files changed, 44 insertions, 42 deletions
diff --git a/src/assemblage.rs b/src/assemblage.rs
index a4179dd..879cd3e 100644
--- a/src/assemblage.rs
+++ b/src/assemblage.rs
@@ -3,7 +3,7 @@ use std::collections::HashMap;
use serde_json::{Value, json};
use super::componentparameter::ComponentParameter;
use super::parameter::{Parameter, ParameterType};
-use super::componentwrapper::{ComponentWrapper, ComponentType, PreEntity};
+use super::componentwrapper::{ComponentWrapper, ComponentType};
#[derive(Debug, PartialEq, Clone)]
pub struct Assemblage {
@@ -92,7 +92,7 @@ impl Assemblage {
Ok(arguments)
}
- pub fn instantiate(&self, args: &Vec<Parameter>, kwargs: &HashMap<String, Parameter>) -> Result<PreEntity, &'static str>{
+ pub fn instantiate(&self, args: &Vec<Parameter>, kwargs: &HashMap<String, Parameter>) -> Result<Vec<ComponentWrapper>, &'static str>{
let mut components: Vec<ComponentWrapper> = Vec::new();
let arguments = self.prepare_arguments(args, kwargs)?;
for (comptype, compparams) in &self.components {
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index f89f44f..43c8353 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -94,7 +94,6 @@ components!(
Player (name: String) {Player::new(name.to_string())}
);
-pub type PreEntity = Vec<ComponentWrapper>;
diff --git a/src/encyclopedia.rs b/src/encyclopedia.rs
index 6851a06..5cdf90c 100644
--- a/src/encyclopedia.rs
+++ b/src/encyclopedia.rs
@@ -2,7 +2,7 @@
use std::collections::HashMap;
use serde_json::Value;
use crate::assemblage::Assemblage;
-use crate::componentwrapper::PreEntity;
+use crate::componentwrapper::ComponentWrapper;
use crate::template::Template;
#[derive(Default, Clone)]
@@ -20,7 +20,7 @@ impl Encyclopedia {
Ok(Encyclopedia{items})
}
- pub fn construct(&self, template: &Template) -> Result<PreEntity, &'static str> {
+ pub fn construct(&self, template: &Template) -> Result<Vec<ComponentWrapper>, &'static str> {
let assemblage = self.items.get(&template.name).ok_or("unknown assemblage name")?;
assemblage.instantiate(&template.args, &template.kwargs)
}
diff --git a/src/main.rs b/src/main.rs
index 322a13b..d2cfd13 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -23,7 +23,6 @@ mod componentparameter;
mod encyclopedia;
mod template;
mod roomtemplate;
-mod player;
pub use self::pos::Pos;
use self::gameserver::GameServer;
@@ -221,6 +220,18 @@ fn default_assemblages() -> Encyclopedia {
"height": ["float", 0.1]
}]
]
+ },
+ "player": {
+ "arguments": [["name", "string", null]],
+ "components": [
+ ["Visible", {
+ "sprite": ["string", "player"],
+ "height": ["float", 1.0]
+ }],
+ ["Player", {
+ "name": ["arg", "name"]
+ }]
+ ]
}
})).unwrap()
}
diff --git a/src/player.rs b/src/player.rs
deleted file mode 100644
index 142a6fe..0000000
--- a/src/player.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-
-use crate::components::{Player, Visible};
-use crate::componentwrapper::{ComponentWrapper, PreEntity};
-
-pub fn make_player(name: &str) -> PreEntity {
- vec![
- ComponentWrapper::Visible(Visible {
- sprite: "player".to_string(),
- height: 1.0
- }),
- ComponentWrapper::Player(Player::new(name.to_string()))
- ]
-}
diff --git a/src/resources.rs b/src/resources.rs
index 82c7787..15d93c4 100644
--- a/src/resources.rs
+++ b/src/resources.rs
@@ -4,8 +4,10 @@ use specs::Entity;
use super::pos::Pos;
use super::controls::Action;
+// use super::oldassemblage::Assemblage;
use super::worldmessages::WorldMessage;
-use crate::componentwrapper::PreEntity;
+use super::template::Template;
+use crate::encyclopedia::Encyclopedia;
#[derive(Default)]
@@ -36,5 +38,6 @@ pub struct Ground {
#[derive(Default)]
pub struct NewEntities {
- pub ents: Vec<(Pos, PreEntity)>
+ pub templates: Vec<(Pos, Template)>,
+ pub encyclopedia: Encyclopedia
}
diff --git a/src/room.rs b/src/room.rs
index 30c420a..9d3f1ed 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -28,20 +28,22 @@ use super::systems::{
};
use crate::encyclopedia::Encyclopedia;
use crate::roomtemplate::RoomTemplate;
-use crate::template::Template;
pub struct Room<'a, 'b> {
world: World,
- dispatcher: Dispatcher<'a, 'b>,
- encyclopedia: Encyclopedia
+ dispatcher: Dispatcher<'a, 'b>
}
impl <'a, 'b>Room<'a, 'b> {
pub fn new(encyclopedia: Encyclopedia) -> Room<'a, 'b> {
let mut world = World::new();
+ world.insert(NewEntities{
+ templates: Vec::new(),
+ encyclopedia
+ });
let mut dispatcher = DispatcherBuilder::new()
.with(ControlInput, "controlinput", &[])
@@ -57,8 +59,7 @@ impl <'a, 'b>Room<'a, 'b> {
Room {
world,
- dispatcher,
- encyclopedia
+ dispatcher
}
}
@@ -75,19 +76,11 @@ impl <'a, 'b>Room<'a, 'b> {
let y = (idx as i64) / width;
for template in templates {
- if let Err(msg) = self.add_entity(Pos{x, y}, template) {
- println!("{}", msg);
- }
+ self.world.fetch_mut::<NewEntities>().templates.push((Pos{x, y}, template.clone()));
}
}
}
- pub fn add_entity(&mut self, pos: Pos, template: &Template) -> Result<(), &'static str>{
- let pre_entity = self.encyclopedia.construct(template)?;
- self.world.fetch_mut::<NewEntities>().ents.push((pos, pre_entity));
- Ok(())
- }
-
pub fn view(&self) -> HashMap<String, WorldMessage> {
self.world.fetch::<Output>().output.clone()
}
diff --git a/src/systems/controlinput.rs b/src/systems/controlinput.rs
index 712c98b..0771b1e 100644
--- a/src/systems/controlinput.rs
+++ b/src/systems/controlinput.rs
@@ -14,7 +14,11 @@ use specs::{
use crate::components::{Controller, Player, Removed};
use crate::controls::{Control, Action};
use crate::resources::{Input, NewEntities, Spawn};
+use crate::hashmap;
+use crate::template::Template;
+use crate::parameter::Parameter;
+// use crate::assemblages::Player;
pub struct ControlInput;
@@ -44,9 +48,9 @@ impl <'a> System<'a> for ControlInput {
for action in &input.actions {
match action {
Action::Join(name) => {
- new.ents.push((
+ new.templates.push((
spawn.pos,
- crate::player::make_player(name)
+ Template::new("player", hashmap!("name".to_string() => Parameter::String(name.to_string())))
));
}
Action::Leave(name) => {leaving.insert(name);}
diff --git a/src/systems/create.rs b/src/systems/create.rs
index 054dc1f..35ef747 100644
--- a/src/systems/create.rs
+++ b/src/systems/create.rs
@@ -34,13 +34,18 @@ impl <'a> System<'a> for Create {
new.remove(ent);
}
}
- for (pos, comps) in &new_entities.ents {
+ for (pos, template) in &new_entities.templates {
let mut builder = updater.create_entity(&entities);
- for comp in comps {
- builder = comp.build(builder);
+ match new_entities.encyclopedia.construct(template) {
+ Ok(comps) => {
+ for comp in comps {
+ builder = comp.build(builder);
+ }
+ builder.with(Position::new(*pos)).with(New).build();
+ },
+ Err(msg) => {println!("{}", msg);}
}
- builder.with(Position::new(*pos)).with(New).build();
}
- new_entities.ents.clear();
+ new_entities.templates.clear();
}
}