summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/maps/room.json2
-rw-r--r--src/components/mod.rs2
-rw-r--r--src/componentwrapper.rs4
-rw-r--r--src/defaultencyclopedia.rs5
-rw-r--r--src/parameter.rs18
-rw-r--r--src/systems/spawn.rs16
6 files changed, 31 insertions, 16 deletions
diff --git a/content/maps/room.json b/content/maps/room.json
index 4af1532..6806ddd 100644
--- a/content/maps/room.json
+++ b/content/maps/room.json
@@ -42,7 +42,7 @@
"o": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "stone"}, "delay": 600}}],
"%": {"type": "portal", "kwargs": {"destination": "broom", "dest_pos": "northentry"}},
"^": ["grass", "spiketrap"],
- "d": ["grass", "dummy"],
+ "d": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "dummy"}, "delay": 100}}],
"r": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "rat"}, "amount": 3, "clan": "rats", "delay": 200}}],
" ": []
}
diff --git a/src/components/mod.rs b/src/components/mod.rs
index 8777d37..96261c7 100644
--- a/src/components/mod.rs
+++ b/src/components/mod.rs
@@ -204,7 +204,7 @@ pub struct Spawner {
pub delay: i64,
pub clan: Clan,
pub template: Template,
- pub last_spawn: Timestamp
+ pub last_spawn: Option<Timestamp>
}
#[derive(Component, Debug, Clone, PartialEq, Eq, Hash)]
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index 88597bf..9b1dd7f 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -127,7 +127,7 @@ components!(
Autofight () {Autofight::default()};
MonsterAI (move_chance: Float, homesickness: Float, view_distance: Int) {MonsterAI{move_chance, homesickness, view_distance}};
Mortal () {Mortal};
- Spawner (amount: Int, delay: Int, clan: String, template: Template) {
+ Spawner (amount: Int, delay: Int, clan: String, template: Template, initial_spawn: Bool) {
Spawner{
amount: amount as usize,
delay,
@@ -139,7 +139,7 @@ components!(
}
},
template: template.unsaved(),
- last_spawn: Timestamp(0)
+ last_spawn: if initial_spawn {Some(Timestamp(-delay))} else {None}
}
};
Clan (name: String) Clan{name};
diff --git a/src/defaultencyclopedia.rs b/src/defaultencyclopedia.rs
index b6ab6cc..5e9222e 100644
--- a/src/defaultencyclopedia.rs
+++ b/src/defaultencyclopedia.rs
@@ -164,13 +164,14 @@ pub fn default_encyclopedia() -> Encyclopedia {
]
},
"spawner": {
- "arguments": [["template", "template", null], ["amount", "int", 1], ["delay", "int", 0], ["clan", "string", ""]],
+ "arguments": [["template", "template", null], ["amount", "int", 1], ["delay", "int", 0], ["clan", "string", ""], ["initial_spawn", "bool", true]],
"components": [
["Spawner", {
"template": ["arg", "template"],
"amount": ["arg", "amount"],
"delay": ["arg", "delay"],
- "clan": ["arg", "clan"]
+ "clan": ["arg", "clan"],
+ "initial_spawn": ["arg", "initial_spawn"]
}]
]
}
diff --git a/src/parameter.rs b/src/parameter.rs
index 1b9bd4f..c08eed2 100644
--- a/src/parameter.rs
+++ b/src/parameter.rs
@@ -10,7 +10,8 @@ pub enum Parameter {
// Pos(Pos),
Float(f64),
Template(Template),
- Action(ItemAction)
+ Action(ItemAction),
+ Bool(bool)
}
impl Parameter {
@@ -26,7 +27,8 @@ impl Parameter {
ParameterType::Int => Some(Self::Int(val.as_i64()?)),
ParameterType::Float => Some(Self::Float(val.as_f64()?)),
ParameterType::Template => Some(Self::Template(Template::from_json(val).ok()?)),
- ParameterType::Action => Some(Self::Action(ItemAction::from_json(val)?))
+ ParameterType::Action => Some(Self::Action(ItemAction::from_json(val)?)),
+ ParameterType::Bool => Some(Self::Bool(val.as_bool()?))
}
}
@@ -36,7 +38,8 @@ impl Parameter {
Self::Int(_) => ParameterType::Int,
Self::Float(_) => ParameterType::Float,
Self::Template(_) => ParameterType::Template,
- Self::Action(_) => ParameterType::Action
+ Self::Action(_) => ParameterType::Action,
+ Self::Bool(_) => ParameterType::Bool
}
}
@@ -48,6 +51,8 @@ impl Parameter {
ParameterType::Int
} else if val.is_f64() {
ParameterType::Float
+ } else if val.is_boolean(){
+ ParameterType::Bool
} else if val.is_object(){
ParameterType::Template
} else {
@@ -63,7 +68,8 @@ impl Parameter {
Self::Int(i) => json!(i),
Self::Float(f) => json!(f),
Self::Template(t) => t.to_json(),
- Self::Action(a) => a.to_json()
+ Self::Action(a) => a.to_json(),
+ Self::Bool(b) => json!(b)
}
}
}
@@ -74,7 +80,8 @@ pub enum ParameterType {
Int,
Float,
Template,
- Action
+ Action,
+ Bool
}
impl ParameterType {
@@ -86,6 +93,7 @@ impl ParameterType {
"float" => Some(Self::Float),
"template" => Some(Self::Template),
"action" => Some(Self::Action),
+ "bool" => Some(Self::Bool),
_ => None
}
}
diff --git a/src/systems/spawn.rs b/src/systems/spawn.rs
index 6bb4912..838899c 100644
--- a/src/systems/spawn.rs
+++ b/src/systems/spawn.rs
@@ -39,11 +39,17 @@ impl <'a> System<'a> for Spawn {
clan_nums.insert(clan, n+1);
}
for (spawner, position) in (&mut spawners, &positions).join() {
- if time.time > spawner.last_spawn + spawner.delay && *clan_nums.get(&spawner.clan).unwrap_or(&0) < spawner.amount {
- spawner.last_spawn = time.time;
- let mut preent = new.encyclopedia.construct(&spawner.template).expect("unable to spawn entity from spawner");
- preent.push(ComponentWrapper::Clan(spawner.clan.clone()));
- new.to_build.push((position.pos, preent));
+ if *clan_nums.get(&spawner.clan).unwrap_or(&0) < spawner.amount {
+ if let Some(last_spawn) = spawner.last_spawn {
+ if time.time > last_spawn + spawner.delay {
+ spawner.last_spawn = None;
+ let mut preent = new.encyclopedia.construct(&spawner.template).expect("unable to spawn entity from spawner");
+ preent.push(ComponentWrapper::Clan(spawner.clan.clone()));
+ new.to_build.push((position.pos, preent));
+ }
+ } else {
+ spawner.last_spawn = Some(time.time)
+ }
}
}
}