| 790 | y: y as isize, |
| 791 | }; |
| 792 | let up = pos + dir; |
| 793 | let dir_right = Vec2 { |
| 794 | x: -dir.y, |
| 795 | y: dir.x, |
| 796 | }; |
| 797 | self.step_collapse(pos, up, dir_right); |
| 798 | self.step_fall(pos, up); |
| 799 | } |
| 800 | // everything that might slide, should slide |
| 801 | // for y in 0..self.height { |
| 802 | // let pos = Vec2 { x: x as isize, y: y as isize }; |
| 803 | // let up = pos + dir; |
| 804 | // let dir_right = Vec2 { |
| 805 | // x: -dir.y, |
| 806 | // y: dir.x, |
| 807 | // }; |
| 808 | // self.step_slide(pos, up, dir_right); |
| 809 | // } |
| 810 | } |
| 811 | } |
| 812 | } |
| 813 | |
| 814 | fn step_fall(&mut self, pos: Vec2, up: Vec2) { |
| 815 | let Some(current) = self.get(pos) else { return }; |
| 816 | let Some(cell_up) = self.get(up) else { return }; |
| 817 | if !self.is_sand(cell_up) { |
| 818 | return; |
| 819 | } |
| 820 | if current.is_empty() && !self.is_static(cell_up) { |
| 821 | self.swap(pos, up); |
| 822 | } |
| 823 | } |
| 824 | |
| 825 | fn step_collapse(&mut self, pos: Vec2, up: Vec2, dir_right: Vec2) { |
| 826 | let Some(current) = self.get(pos) else { return }; |
| 827 | let Some(up_cell) = self.get(up) else { return }; |
| 828 | if !current.is_empty() { |
| 829 | return; |
| 830 | } |
| 831 | let rand_choice = rand::random::<f32>(); |
| 832 | |
| 833 | let cell_left = self.get(pos - dir_right); |
| 834 | let cell_right = self.get(pos + dir_right); |