From cfd462a26b3ed4c5f23760a77ae87ce61dc9bbe2 Mon Sep 17 00:00:00 2001 From: troido Date: Sun, 12 Apr 2020 23:10:10 +0200 Subject: replaced Dead component with trigger messages --- src/systems/attacking.rs | 9 +++++---- src/systems/die.rs | 28 ++++++++++++++++++---------- src/systems/droploot.rs | 24 ++++++++++++++++-------- src/systems/interact.rs | 9 +++++---- 4 files changed, 44 insertions(+), 26 deletions(-) (limited to 'src/systems') 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); -- cgit