summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/messages.rs10
-rw-r--r--src/components/mod.rs8
-rw-r--r--src/componentwrapper.rs1
-rw-r--r--src/room.rs6
-rw-r--r--src/systems/building.rs42
-rw-r--r--src/systems/die.rs2
-rw-r--r--src/systems/mod.rs4
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
};