diff options
| -rw-r--r-- | src/pos.rs | 5 | ||||
| -rw-r--r-- | src/systems/droploot.rs | 27 |
2 files changed, 26 insertions, 6 deletions
@@ -18,6 +18,11 @@ impl Pos { Pos {x, y} } + pub fn from_tuple(p: (i64, i64)) -> Pos { + let (x, y) = p; + Pos {x, y} + } + #[allow(dead_code)] pub fn clamp(self, smaller: Pos, larger: Pos) -> Pos { Pos { 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(); } } } |
