summaryrefslogtreecommitdiff
path: root/src/systems
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems')
-rw-r--r--src/systems/attacking.rs9
-rw-r--r--src/systems/die.rs28
-rw-r--r--src/systems/droploot.rs24
-rw-r--r--src/systems/interact.rs9
4 files changed, 44 insertions, 26 deletions
diff --git a/src/systems/attacking.rs b/src/systems/attacking.rs
index 804fac1..a202878 100644
--- a/src/systems/attacking.rs
+++ b/src/systems/attacking.rs
@@ -15,7 +15,8 @@ use crate::{
Health,
AttackInbox,
AttackType,
- Dead,
+ Trigger,
+ TriggerBox,
Position,
Autofight,
Ear,
@@ -34,14 +35,14 @@ impl <'a> System<'a> for Attacking {
Entities<'a>,
WriteStorage<'a, AttackInbox>,
WriteStorage<'a, Health>,
- WriteStorage<'a, Dead>,
+ WriteStorage<'a, TriggerBox>,
ReadStorage<'a, Position>,
Write<'a, NewEntities>,
WriteStorage<'a, Autofight>,
WriteStorage<'a, Ear>,
ReadStorage<'a, Visible>
);
- fn run(&mut self, (entities, mut attackeds, mut healths, mut deads, positions, mut new, mut autofighters, mut ears, visibles): Self::SystemData) {
+ fn run(&mut self, (entities, mut attackeds, mut healths, mut triggerboxes, positions, mut new, mut autofighters, mut ears, visibles): Self::SystemData) {
for (entity, attacked, autofighter) in (&entities, &attackeds, &mut autofighters).join() {
for attack in &attacked.messages {
@@ -83,7 +84,7 @@ impl <'a> System<'a> for Attacking {
}
health.health = util::clamp(health.health, 0, health.maxhealth);
if health.health == 0 {
- deads.insert(target, Dead).unwrap();
+ TriggerBox::add_message(&mut triggerboxes, target, Trigger::Die);
let killers = attacker_names.join(" and ");
say(&mut ears, target, Notification::Die{actor: killers.clone(), target: target_name.clone()});
for actor in attackers {
diff --git a/src/systems/die.rs b/src/systems/die.rs
index e9fb127..c6fd646 100644
--- a/src/systems/die.rs
+++ b/src/systems/die.rs
@@ -9,7 +9,7 @@ use specs::{
};
use crate::{
- components::{Dead, Removed, Player},
+ components::{Trigger, TriggerBox, Removed, Player},
resources::Emigration,
purgatory,
playerstate::RoomPos
@@ -20,19 +20,27 @@ pub struct Die;
impl <'a> System<'a> for Die {
type SystemData = (
Entities<'a>,
- ReadStorage<'a, Dead>,
+ ReadStorage<'a, TriggerBox>,
WriteStorage<'a, Removed>,
Write<'a, Emigration>,
ReadStorage<'a, Player>
);
- fn run(&mut self, (entities, deads, mut removeds, mut emigration, players): Self::SystemData) {
- // npcs etc get removed when dead
- for (entity, _, _) in (&entities, &deads, !&players).join() {
- removeds.insert(entity, Removed).unwrap();
- }
- // players move to purgatory when dead
- for (player, _) in (&players, &deads).join() {
- emigration.emigrants.push((player.id.clone(), purgatory::purgatory_id(), RoomPos::Unknown));
+ fn run(&mut self, (entities, triggerboxes, mut removeds, mut emigration, players): Self::SystemData) {
+ for (entity, triggerbox) in (&entities, &triggerboxes).join() {
+ for trigger in triggerbox.messages.iter() {
+ match trigger {
+ Trigger::Die | Trigger::Remove => {
+ if let Some(player) = players.get(entity) {
+ // players move to purgatory when dead
+ emigration.emigrants.push((player.id.clone(), purgatory::purgatory_id(), RoomPos::Unknown));
+ } else {
+ // npcs etc get removed when dead
+ removeds.insert(entity, Removed).unwrap();
+ }
+ }
+ _ => {}
+ }
+ }
}
}
}
diff --git a/src/systems/droploot.rs b/src/systems/droploot.rs
index 5eff7f7..33e71c0 100644
--- a/src/systems/droploot.rs
+++ b/src/systems/droploot.rs
@@ -12,7 +12,8 @@ use crate::{
components::{
Position,
Loot,
- Dead
+ Trigger,
+ TriggerBox
},
resources::{NewEntities}
};
@@ -23,16 +24,23 @@ impl <'a> System<'a> for DropLoot{
type SystemData = (
ReadStorage<'a, Position>,
Write<'a, NewEntities>,
- ReadStorage<'a, Dead>,
+ ReadStorage<'a, TriggerBox>,
ReadStorage<'a, Loot>
);
- fn run(&mut self, (positions, mut new, deads, loots): Self::SystemData) {
- for (position, _, loot) in (&positions, &deads, &loots).join(){
- for (template, chance) in &loot.loot {
- if *chance > rand::thread_rng().gen_range(0.0, 1.0) {
- // todo: better error handling
- new.create(position.pos, &template).unwrap();
+ fn run(&mut self, (positions, mut new, triggerboxes, loots): Self::SystemData) {
+ for (position, triggerbox, loot) in (&positions, &triggerboxes, &loots).join(){
+ for message in triggerbox.messages.iter() {
+ match message {
+ Trigger::Die | Trigger::Loot => {
+ for (template, chance) in &loot.loot {
+ if *chance > rand::thread_rng().gen_range(0.0, 1.0) {
+ // todo: better error handling
+ new.create(position.pos, &template).unwrap();
+ }
+ }
+ }
+ _ => {}
}
}
}
diff --git a/src/systems/interact.rs b/src/systems/interact.rs
index 73f9023..2c6ee91 100644
--- a/src/systems/interact.rs
+++ b/src/systems/interact.rs
@@ -16,7 +16,8 @@ use crate::{
Position,
ControlCooldown,
Interactable,
- Dead,
+ Trigger,
+ TriggerBox,
Notification,
Ear,
Inventory,
@@ -35,14 +36,14 @@ impl <'a> System<'a> for Interact {
Read<'a, Ground>,
WriteStorage<'a, ControlCooldown>,
ReadStorage<'a, Interactable>,
- WriteStorage<'a, Dead>,
+ WriteStorage<'a, TriggerBox>,
Write<'a, NewEntities>,
WriteStorage<'a, Ear>,
WriteStorage<'a, Inventory>,
ReadStorage<'a, Visible>
);
- fn run(&mut self, (entities, controllers, positions, ground, mut cooldowns, interactables, mut deads, new, mut ears, mut inventories, visibles): Self::SystemData) {
+ fn run(&mut self, (entities, controllers, positions, ground, mut cooldowns, interactables, mut triggerbox, new, mut ears, mut inventories, visibles): Self::SystemData) {
for (entity, controller, position) in (&entities, &controllers, &positions).join(){
let mut target = None;
let ear = ears.get_mut(entity);
@@ -66,7 +67,7 @@ impl <'a> System<'a> for Interact {
let name = visibles.get(ent).map(|v| v.name.as_str());
match interactable {
Interactable::Harvest => {
- deads.insert(ent, Dead).unwrap();
+ TriggerBox::add_message(&mut triggerbox, ent, Trigger::Die);
}
Interactable::Say(text) => {
say(ear, text.clone(), name);