diff options
| author | troido <troido@protonmail.com> | 2020-04-13 16:45:50 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-13 16:45:50 +0200 |
| commit | 3cb46c733597c1f825190ad45c93aa3a24158605 (patch) | |
| tree | 0d6672eca80f9a51336eb851e302be3a967507eb /src/systems | |
| parent | 4b116789bef06adcdb98f2a17cbf41d5b375ecb9 (diff) | |
pick random adjacent positions for loot
Diffstat (limited to 'src/systems')
| -rw-r--r-- | src/systems/droploot.rs | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/systems/droploot.rs b/src/systems/droploot.rs index 0442ecb..fcd104b 100644 --- a/src/systems/droploot.rs +++ b/src/systems/droploot.rs @@ -1,5 +1,5 @@ -use rand::Rng; +use rand::{Rng, seq::SliceRandom}; use specs::{ ReadStorage, @@ -40,15 +40,7 @@ impl <'a> System<'a> for DropLoot{ for (template, chance) in &loot.loot { if *chance > rand::thread_rng().gen_range(0.0, 1.0) { // todo: better error handling - 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; - } - } + let pos = pick_position(position.pos, &ground, &flags); new.create(pos, &template).unwrap(); } } @@ -56,3 +48,20 @@ impl <'a> System<'a> for DropLoot{ } } } + +fn pick_position<'a>(pos: Pos, ground: &Read<'a, Ground>, flags: &ReadStorage<'a, Flags>) -> Pos { + let ground_flags = ground.flags_on(pos, &flags); + if !ground_flags.contains(&Flag::Blocking) && ground_flags.contains(&Flag::Floor) { + return pos + } + let mut neighbours = vec![(1,0), (-1,0), (0,1), (0,-1)]; + neighbours.shuffle(&mut rand::thread_rng()); + for t in neighbours { + 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) { + return p + } + } + return pos; +} |
