summaryrefslogtreecommitdiff
path: root/src/componentwrapper.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
committertroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
commit4f9932074a8f0390d5cb6072b4e419c7ab08ffed (patch)
treed83da5cd8b35af25aa6e0b2c9105182920c49bd0 /src/componentwrapper.rs
parentec007f34c4cd984640a235660803b81a739742b3 (diff)
added flags component, and conditions for building
Diffstat (limited to 'src/componentwrapper.rs')
-rw-r--r--src/componentwrapper.rs32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index 42eccff..c4b70a5 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -1,5 +1,5 @@
-use std::collections::HashMap;
+use std::collections::{HashMap, HashSet};
use specs::Builder;
use rand::Rng;
@@ -10,10 +10,13 @@ use crate::{
playerstate::RoomPos,
components::{
AttackType,
- Clan
+ Clan,
+ Flag
},
parameter::{Parameter, ParameterType},
- Timestamp
+ Timestamp,
+ Result,
+ aerr
};
@@ -33,16 +36,17 @@ macro_rules! components {
)*
}
}
- pub fn load_component(comptype: ComponentType, mut parameters: HashMap<&str, Parameter>) -> Option<Self> {
+ pub fn load_component(comptype: ComponentType, mut parameters: HashMap<&str, Parameter>) -> Result<Self> {
#[allow(unused_imports, unreachable_code)]
match comptype {
$(
- ComponentType::$comp => Some(Self::$comp({
+ ComponentType::$comp => Ok(Self::$comp({
use crate::components::$comp;
$(
- let $paramname = match parameters.remove(stringify!($paramname))? {
+ let $paramname = match parameters.remove(stringify!($paramname))
+ .ok_or(aerr!(&format!("required parameter '{}'not found", stringify!($paramname))))? {
Parameter::$paramtype(p) => p,
- _ => {return None}
+ x => Err(aerr!(&format!("parameter type mismatch for parameter {}: {} {:?}", stringify!($paramname), stringify!($paramtype), x)))?
};
)*
$creation
@@ -137,8 +141,6 @@ components!(
}
};
Movable (cooldown: Int);
- Blocking;
- Floor;
Player (name: String) {Player::new(PlayerId{name})};
Item (ent: Template, name: String, action: Action);
Inventory () {panic!("inventory from parameters not implemented")};
@@ -178,8 +180,8 @@ components!(
};
Clan (name: String);
Home (home: Pos);
- Faction (faction: String) {Faction::from_str(faction.as_str())?};
- Interactable (action: String) {Interactable::from_str(action.as_str())?};
+ Faction (faction: String) {Faction::from_str(faction.as_str()).ok_or(aerr!("invalid faction name"))?};
+ Interactable (action: String) {Interactable::from_str(action.as_str()).ok_or(aerr!("invalid interactable name"))?};
Loot (loot: LootList);
Grow (
into: Template (Grow.into.clone()),
@@ -200,6 +202,14 @@ components!(
};
Equipment () {panic!("equipment from parameters not implemented")};
CreationTime (time: Int) {CreationTime{time: Timestamp(time)}};
+ Flags (flags: Strings) {
+ Flags(
+ flags
+ .iter()
+ .map(|f| Flag::from_str(f))
+ .collect::<Option<HashSet<Flag>>>().ok_or(aerr!("invalid flag name"))?
+ )
+ };
);