diff options
Diffstat (limited to 'src/types/mod.rs')
-rw-r--r-- | src/types/mod.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/types/mod.rs b/src/types/mod.rs index c0375a382fe2..67c773fdb107 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,3 +1,4 @@ +use std::cmp::max; use std::cmp::Ordering; use std::ops; use std::rc::Rc; @@ -136,6 +137,13 @@ impl Position { // + 1 because Goto is 1-based, but position is 0-based cursor::Goto(self.x as u16 + 1, self.y as u16 + 1) } + + /// Converts this position to the number of `Tiles` away from the origin it + /// represents. Usually done after subtracting two positions. Gives distance + /// as the crow flies + pub fn as_tiles(&self) -> Tiles { + Tiles(max(self.x.abs(), self.y.abs()).into()) + } } impl PartialOrd for Position { @@ -340,9 +348,17 @@ pub struct Tiles(pub f32); pub struct Speed(pub u32); impl Speed { + /// Returns the number of tiles that would be moved in the given number of + /// ticks at this speed pub fn ticks_to_tiles(self, ticks: Ticks) -> Tiles { Tiles(ticks.0 as f32 / self.0 as f32) } + + /// Returns the number of ticks required to move the given number of tiles + /// at this speed + pub fn tiles_to_ticks(self, tiles: Tiles) -> Ticks { + Ticks(tiles.0 as u16 * self.0 as u16) + } } #[cfg(test)] @@ -392,5 +408,21 @@ mod tests { assert!(!(a < b)) } } + + #[test] + fn test_position_plus_dimension_as_tiles_monoid_action( + pos: Position, + dir: Direction, + ) { + prop_assume!(pos.y > 0 && pos.x > 0); + assert_eq!(((pos + dir) - pos).as_tiles(), Tiles(1.0)); + } + } + + #[test] + fn test_position_as_tiles() { + assert_eq!(pos(0, 0).as_tiles(), Tiles(0.0)); + assert_eq!(pos(1, 1).as_tiles(), Tiles(1.0)); + assert_eq!(pos(1, 2).as_tiles(), Tiles(2.0)); } } |