diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/messages.rs | 10 | ||||
| -rw-r--r-- | src/components/mod.rs | 8 | ||||
| -rw-r--r-- | src/componentwrapper.rs | 1 | ||||
| -rw-r--r-- | src/room.rs | 6 | ||||
| -rw-r--r-- | src/systems/building.rs | 42 | ||||
| -rw-r--r-- | src/systems/die.rs | 2 | ||||
| -rw-r--r-- | src/systems/mod.rs | 4 |
7 files changed, 67 insertions, 6 deletions
diff --git a/src/components/messages.rs b/src/components/messages.rs index ac21ea1..aa928f0 100644 --- a/src/components/messages.rs +++ b/src/components/messages.rs @@ -75,9 +75,13 @@ pub type AttackInbox = Inbox<AttackMessage>; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Trigger { + // basic triggers Loot, - Die, - Remove + Remove, + Build, + // combination triggers + Die, // Remove + Loot + Change // Remove + Build } impl Trigger { @@ -86,6 +90,8 @@ impl Trigger { "loot" => Self::Loot, "die" => Self::Die, "remove" => Self::Remove, + "build" => Self::Build, + "change" => Self::Change, _ => {return None} }) } diff --git a/src/components/mod.rs b/src/components/mod.rs index 530cda3..347bb40 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -227,4 +227,12 @@ pub struct CreationTime { pub struct Item(pub ItemId); +#[derive(Component, Debug, Clone)] +#[storage(HashMapStorage)] +pub struct Build { + pub obj: Template +} + + + diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs index 2d3c102..4615d53 100644 --- a/src/componentwrapper.rs +++ b/src/componentwrapper.rs @@ -236,6 +236,7 @@ components!( ) }; Ear () {Ear::default()}; + Build (obj: Template); ); diff --git a/src/room.rs b/src/room.rs index c2edaf6..8e847cf 100644 --- a/src/room.rs +++ b/src/room.rs @@ -66,7 +66,8 @@ use crate::{ Interact, DropLoot, Growth, - Clear + Clear, + Building } }; @@ -88,6 +89,7 @@ pub fn default_dispatcher<'a, 'b>() -> Dispatcher<'a, 'b> { .with(Attacking, "attacking", &["use", "trapping", "fight", "heal", "interact"]) .with(Die, "die", &["attacking"]) .with(DropLoot, "droploot", &["attacking"]) + .with(Building, "building", &["attacking"]) .with(Migrate, "migrate", &["move", "attacking", "volate", "die"]) .build() } @@ -118,7 +120,7 @@ impl <'a, 'b>Room<'a, 'b> { world.insert(NewEntities::new(encyclopedia)); register_insert!( world, - (Position, Visible, Controller, Movable, New, Removed, Moved, Player, Inventory, Health, Serialise, RoomExit, Entered, TriggerBox, Trap, Fighter, Healing, Volatile, ControlCooldown, Autofight, MonsterAI, Home, AttackInbox, Item, Spawner, Clan, Faction, Interactable, Loot, Grow, Equipment, CreationTime, Flags, Ear), + (Position, Visible, Controller, Movable, New, Removed, Moved, Player, Inventory, Health, Serialise, RoomExit, Entered, TriggerBox, Trap, Fighter, Healing, Volatile, ControlCooldown, Autofight, MonsterAI, Home, AttackInbox, Item, Spawner, Clan, Faction, Interactable, Loot, Grow, Equipment, CreationTime, Flags, Ear, Build), (Ground, Input, Output, Size, Spawn, Players, Emigration, Time) ); diff --git a/src/systems/building.rs b/src/systems/building.rs new file mode 100644 index 0000000..876554e --- /dev/null +++ b/src/systems/building.rs @@ -0,0 +1,42 @@ + +use specs::{ + ReadStorage, + System, + Join, + Write +}; + +use crate::{ + components::{ + Position, + Build, + Trigger, + TriggerBox + }, + resources::{NewEntities} +}; + + +pub struct Building; +impl <'a> System<'a> for Building{ + type SystemData = ( + ReadStorage<'a, Position>, + Write<'a, NewEntities>, + ReadStorage<'a, TriggerBox>, + ReadStorage<'a, Build> + ); + + fn run(&mut self, (positions, mut new, triggerboxes, builds): Self::SystemData) { + for (position, triggerbox, build) in (&positions, &triggerboxes, &builds).join(){ + for message in triggerbox.messages.iter() { + match message { + Trigger::Build | Trigger::Change => { + // todo: better error handling + new.create(position.pos, &build.obj).unwrap(); + } + _ => {} + } + } + } + } +} diff --git a/src/systems/die.rs b/src/systems/die.rs index c6fd646..021448e 100644 --- a/src/systems/die.rs +++ b/src/systems/die.rs @@ -29,7 +29,7 @@ impl <'a> System<'a> for Die { for (entity, triggerbox) in (&entities, &triggerboxes).join() { for trigger in triggerbox.messages.iter() { match trigger { - Trigger::Die | Trigger::Remove => { + Trigger::Die | Trigger::Remove | Trigger::Change => { if let Some(player) = players.get(entity) { // players move to purgatory when dead emigration.emigrants.push((player.id.clone(), purgatory::purgatory_id(), RoomPos::Unknown)); diff --git a/src/systems/mod.rs b/src/systems/mod.rs index 3f990a7..72a6845 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -21,6 +21,7 @@ mod interact; mod droploot; mod growth; mod clear; +mod building; pub use self::{ controlinput::ControlInput, @@ -44,5 +45,6 @@ pub use self::{ interact::Interact, droploot::DropLoot, growth::Growth, - clear::Clear + clear::Clear, + building::Building }; |
