home · contact · privacy
Refactor and optimize FOV algorithm.
[plomrogue2-experiments] / server_ / map_.py
index 35d29c6b56da95fd2f25c4e35f4e85a3ff419da8..dd47be5dcce61f976160e92480ad0d02efbde70d 100644 (file)
@@ -50,6 +50,21 @@ class Map(game_common.Map):
                 directions += [name[5:]]
         return directions
 
+    def get_neighbors(self, pos):
+        neighbors = {}
+        if not hasattr(self, 'neighbors_to'):
+            self.neighbors_to = {}
+        if pos in self.neighbors_to:
+            return self.neighbors_to[pos]
+        for direction in self.get_directions():
+            neighbors[direction] = None
+            try:
+                neighbors[direction] = self.move(pos, direction)
+            except server_.game.GameError:
+                pass
+        self.neighbors_to[pos] = neighbors
+        return neighbors
+
     def new_from_shape(self, init_char):
         import copy
         new_map = copy.deepcopy(self)
@@ -110,34 +125,6 @@ class MapHex(Map):
         else:
             return [start_pos[0] + 1, start_pos[1] + 1]
 
-    def get_neighbors(self, pos):
-        # DOWNLEFT, DOWNRIGHT, LEFT, RIGHT, UPLEFT, UPRIGHT (alphabetically)
-        neighbors = [None, None, None, None, None, None]  # e, d, c, x, s, w
-        if pos[1] > 0:
-            neighbors[2] = [pos[0], pos[1] - 1]
-        if pos[1] < self.size[1] - 1:
-            neighbors[3] = [pos[0], pos[1] + 1]
-        # x, c, s, d, w, e  # 3->0, 2->1, 5->4, 0->5
-        if pos[0] % 2 == 1:
-            if pos[0] > 0 and pos[1] > 0:
-                neighbors[4] = [pos[0] - 1, pos[1] - 1]
-            if pos[0] < self.size[0] - 1 and pos[1] > 0:
-                neighbors[0] = [pos[0] + 1, pos[1] - 1]
-            if pos[0] > 0:
-                neighbors[5] = [pos[0] - 1, pos[1]]
-            if pos[0] < self.size[0] - 1:
-                neighbors[1] = [pos[0] + 1, pos[1]]
-        else:
-            if pos[0] > 0 and pos[1] < self.size[1] - 1:
-                neighbors[5] = [pos[0] - 1, pos[1] + 1]
-            if pos[0] < self.size[0] - 1 and pos[1] < self.size[1] - 1:
-                neighbors[1] = [pos[0] + 1, pos[1] + 1]
-            if pos[0] > 0:
-                neighbors[4] = [pos[0] - 1, pos[1]]
-            if pos[0] < self.size[0] - 1:
-                neighbors[0] = [pos[0] + 1, pos[1]]
-        return neighbors
-
 
 class MapSquare(Map):
 
@@ -151,19 +138,6 @@ class MapSquare(Map):
     def move_DOWN(self, start_pos):
         return [start_pos[0] + 1, start_pos[1]]
 
-    def get_neighbors(self, pos):
-        # DOWN, LEFT, RIGHT, UP  (alphabetically)
-        neighbors = [None, None, None, None]
-        if pos[0] > 0:
-            neighbors[3] = [pos[0] - 1, pos[1]]
-        if pos[1] > 0:
-            neighbors[1] = [pos[0], pos[1] - 1]
-        if pos[0] < self.size[0] - 1:
-            neighbors[0] = [pos[0] + 1, pos[1]]
-        if pos[1] < self.size[1] - 1:
-            neighbors[2] = [pos[0], pos[1] + 1]
-        return neighbors
-
 
 class FovMap: