home · contact · privacy
Implement doors.
[plomrogue2] / plomrogue / mapping.py
index 5822dada4371170542923c1c63e894e95bc3e1df..b4fadd7d30f1150b717d1ef9f5116ad21d668aed 100644 (file)
@@ -209,7 +209,7 @@ class Map():
 
 class SourcedMap(Map):
 
-    def __init__(self, source_maps, source_center, radius, get_map):
+    def __init__(self, things, source_maps, source_center, radius, get_map):
         self.source_maps = source_maps
         self.radius = radius
         example_map = get_map(YX(0, 0))
@@ -220,6 +220,20 @@ class SourcedMap(Map):
         for yx in self:
             big_yx, _ = self.source_yxyx(yx)
             get_map(big_yx)
+        self.source_map_segment = ''
+        obstacles = {}
+        for yxyx in [t.position for t in things if t.blocking]:
+            if yxyx == source_center:
+                continue
+            if yxyx[0] not in obstacles:
+                obstacles[yxyx[0]] = []
+            obstacles[yxyx[0]] += [yxyx[1]]
+        for yx in self:
+            big_yx, little_yx = self.source_yxyx(yx)
+            if big_yx in obstacles and little_yx in obstacles[big_yx]:
+                self.source_map_segment += 'X'
+            else:
+                self.source_map_segment += self.source_maps[big_yx][little_yx]
 
     def source_yxyx(self, yx):
         absolute_yx = yx + self.offset
@@ -247,14 +261,10 @@ class DijkstraMap(SourcedMap):
         self.terrain = [255] * self.size_i
         self[self.center] = 0
         shrunk = True
-        source_map_segment = ''
-        for yx in self:
-            big_yx, little_yx = self.source_yxyx(yx)
-            source_map_segment += self.source_maps[big_yx][little_yx]
         while shrunk:
             shrunk = False
             for i in range(self.size_i):
-                if source_map_segment[i] == 'X':
+                if self.source_map_segment[i] == 'X':
                     continue
                 neighbors = self.geometry.get_neighbors_i(i)
                 for direction in [d for d in neighbors if neighbors[d]]:
@@ -286,10 +296,10 @@ class FovMap(SourcedMap):
         self.shadow_cones = []
         self.circle_out(self.center, self.shadow_process)
 
-    def throws_shadow(self, big_yx, little_yx):
-        return self.source_maps[big_yx][little_yx] == 'X'
+    def throws_shadow(self, yx):
+        return self.source_map_segment[self.get_position_index(yx)] == 'X'
 
-    def shadow_process(self, yx, source_yxyx, distance_to_center, dir_i, dir_progress):
+    def shadow_process(self, yx, distance_to_center, dir_i, dir_progress):
         # Possible optimization: If no shadow_cones yet and self[yx] == '.',
         # skip all.
         CIRCLE = 360  # Since we'll float anyways, number is actually arbitrary.
@@ -329,7 +339,7 @@ class FovMap(SourcedMap):
             if in_shadow_cone(cone):
                 return
             self[yx] = '.'
-            if self.throws_shadow(*source_yxyx):
+            if self.throws_shadow(yx):
                 unmerged = True
                 while merge_cone(cone):
                     unmerged = False
@@ -368,12 +378,12 @@ class FovMap(SourcedMap):
                 for dir_progress in range(distance):
                     direction = self.circle_out_directions[dir_i]
                     yx = self.circle_out_move(yx, direction)
-                    source_yxyx = self.source_yxyx(yx)
-                    f(yx, source_yxyx, distance, dir_i, dir_progress)
+                    f(yx, distance, dir_i, dir_progress)
             distance += 1
 
 
 
+
 class FovMapHex(FovMap):
     circle_out_directions = ('DOWNLEFT', 'LEFT', 'UPLEFT',
                              'UPRIGHT', 'RIGHT', 'DOWNRIGHT')