about summary refs log tree commit diff
path: root/src/types/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/types/mod.rs')
-rw-r--r--src/types/mod.rs32
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));
     }
 }