summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-13 16:45:50 +0200
committertroido <troido@protonmail.com>2020-04-13 16:45:50 +0200
commit3cb46c733597c1f825190ad45c93aa3a24158605 (patch)
tree0d6672eca80f9a51336eb851e302be3a967507eb /src
parent4b116789bef06adcdb98f2a17cbf41d5b375ecb9 (diff)
pick random adjacent positions for loot
Diffstat (limited to 'src')
-rw-r--r--src/systems/droploot.rs29
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;
+}