Move the player.
[naja.git] / naja / player.py
index acae919c0c46c0b2d14338ca11d0c87289ab7df4..fa6e1e9f3b3edd39a7a20a109135c39ee1f9cd36 100644 (file)
@@ -1,3 +1,4 @@
+from naja.constants import BITS
 
 
 class PlayerBits(object):
@@ -20,31 +21,31 @@ class PlayerBits(object):
     # Operate on individual bits
 
     def check_bit(self, bit):
-        return bool(self.bits & (1 << bit))
+        return bool(self.bits & bit)
 
     def set_bit(self, bit):
-        self.bits |= (1 << bit)
+        self.bits |= bit
 
     def clear_bit(self, bit):
-        self.bits &= (0xff ^ (1 << bit))
+        self.bits &= (0xff ^ bit)
 
     def toggle_bit(self, bit):
-        self.bits ^= (1 << bit)
+        self.bits ^= bit
 
     # Operate on sets of bits
 
-    def check_bits(self, *bits):
+    def check_bits(self, bits):
         return all(self.check_bit(bit) for bit in bits)
 
-    def set_bits(self, *bits):
+    def set_bits(self, bits):
         for bit in bits:
             self.set_bit(bit)
 
-    def clear_bits(self, *bits):
+    def clear_bits(self, bits):
         for bit in bits:
             self.clear_bit(bit)
 
-    def toggle_bits(self, *bits):
+    def toggle_bits(self, bits):
         for bit in bits:
             self.toggle_bit(bit)
 
@@ -57,3 +58,37 @@ class Player(object):
     def __init__(self, bits, position):
         self.bits = PlayerBits(bits)
         self.position = position
+
+    @classmethod
+    def import_player(cls, definition):
+        return cls(definition['bits'], tuple(definition['position']))
+
+    def export(self):
+        return {
+            'bits': self.bits.bits,
+            'position': list(self.position),
+        }
+
+    def move(self, direction):
+        if not self.bits.check_bit(direction):
+            return False
+        # TODO: Something cleaner than this.
+        x, y = self.position
+        if direction == BITS.NORTH:
+            if y > 0:
+                self.position = (x, y - 1)
+                return True
+        elif direction == BITS.SOUTH:
+            if y < 4:
+                self.position = (x, y + 1)
+                return True
+        elif direction == BITS.EAST:
+            if x < 4:
+                self.position = (x + 1, y)
+                return True
+        elif direction == BITS.WEST:
+            if x > 0:
+                self.position = (x - 1, y)
+                return True
+
+        return False