diff --git a/CHANGELOG.md b/CHANGELOG.md index 011b04a..3cdba8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Game store page: https://crispypin.itch.io/marble-machinations ## [unreleased] +### fixed +- broken area calculation causing crash when completing a level with a machine wider than it is tall ## v0.3.0 - 2025-04-04 ### added diff --git a/src/marble_engine/grid.rs b/src/marble_engine/grid.rs index 1e0bc8d..63f2f64 100644 --- a/src/marble_engine/grid.rs +++ b/src/marble_engine/grid.rs @@ -124,9 +124,9 @@ impl Grid { } pub fn used_bounds_area(&self) -> usize { - let row_clear = |a, max, f: fn(usize, usize) -> (usize, usize)| { - for b in 0..max { - if !self.get_unchecked(f(a, b).into()).is_blank() { + let row_clear = |y| { + for x in 0..self.width { + if !self.get_unchecked((x, y).into()).is_blank() { return false; } } @@ -134,29 +134,37 @@ impl Grid { }; let mut height = self.height; for y in 0..self.height { - if row_clear(y, self.width, |y, x| (x, y)) { + if row_clear(y) { height -= 1; } else { break; } } for y in (0..self.height).rev() { - if row_clear(y, self.width, |y, x| (x, y)) { + if row_clear(y) { height -= 1; } else { break; } } + let col_clear = |x| { + for y in 0..self.height { + if !self.get_unchecked((x, y).into()).is_blank() { + return false; + } + } + true + }; let mut width = self.width; for x in 0..self.width { - if row_clear(x, self.height, |x, y| (x, y)) { + if col_clear(x) { width -= 1; } else { break; } } for x in (0..self.width).rev() { - if row_clear(x, self.width, |x, y| (x, y)) { + if col_clear(x) { width -= 1; } else { break;