diff options
| author | troido <troido@protonmail.com> | 2020-04-13 15:58:49 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-13 15:58:49 +0200 |
| commit | 4b116789bef06adcdb98f2a17cbf41d5b375ecb9 (patch) | |
| tree | 6401689d7797d3fdd62081d37b929b927ca0d502 /src/systems/droploot.rs | |
| parent | e8088a736a48cfb650df7f7a8f69e3e91922ca57 (diff) | |
if position is blocked, loot drops in adjacent positions
Diffstat (limited to 'src/systems/droploot.rs')
| -rw-r--r-- | src/systems/droploot.rs | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/systems/droploot.rs b/src/systems/droploot.rs index 2b0281d..0442ecb 100644 --- a/src/systems/droploot.rs +++ b/src/systems/droploot.rs @@ -5,7 +5,8 @@ use specs::{ ReadStorage, System, Join, - Write + Write, + Read }; use crate::{ @@ -13,9 +14,12 @@ use crate::{ Position, Loot, Trigger, - TriggerBox + TriggerBox, + Flags, + Flag }, - resources::{NewEntities} + resources::{NewEntities, Ground}, + Pos }; @@ -25,16 +29,27 @@ impl <'a> System<'a> for DropLoot{ ReadStorage<'a, Position>, Write<'a, NewEntities>, ReadStorage<'a, TriggerBox>, - ReadStorage<'a, Loot> + ReadStorage<'a, Loot>, + Read<'a, Ground>, + ReadStorage<'a, Flags> ); - fn run(&mut self, (positions, mut new, triggerboxes, loots): Self::SystemData) { + fn run(&mut self, (positions, mut new, triggerboxes, loots, ground, flags): Self::SystemData) { for (position, triggerbox, loot) in (&positions, &triggerboxes, &loots).join(){ if triggerbox.has_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(); + let mut pos = position.pos; + for t in &[(0,0), (1,0), (-1,0), (0,1), (0,-1)] { + let p = pos + Pos::from_tuple(*t); + let ground_flags = ground.flags_on(p, &flags); + if !ground_flags.contains(&Flag::Blocking) && ground_flags.contains(&Flag::Floor) { + pos = p; + break; + } + } + new.create(pos, &template).unwrap(); } } } |
