diff options
| -rw-r--r-- | content/maps/room.json | 2 | ||||
| -rw-r--r-- | src/components/mod.rs | 2 | ||||
| -rw-r--r-- | src/componentwrapper.rs | 4 | ||||
| -rw-r--r-- | src/defaultencyclopedia.rs | 5 | ||||
| -rw-r--r-- | src/parameter.rs | 18 | ||||
| -rw-r--r-- | src/systems/spawn.rs | 16 |
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) + } } } } |
