home · contact · privacy
Use self.max_map_awakeness to recude magic numbering.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 23 Dec 2019 23:23:41 +0000 (00:23 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 23 Dec 2019 23:23:41 +0000 (00:23 +0100)
new/plomrogue/game.py
new/plomrogue/mapping.py

index 0e1ff9aecc6b22acfc0eafc230a0b6d3a19f2ca8..a2421ad6417b9b195930c947d1eb44c5c0e6eb6f 100755 (executable)
@@ -94,6 +94,7 @@ class Game(GameBase):
         self.player_id = 0
         self.player_is_alive = True
         self.maps = {}
+        self.max_map_awakeness = 100
         self.rand = PRNGod(0)
 
     def get_string_options(self, string_option_type):
@@ -208,7 +209,8 @@ class Game(GameBase):
     def get_map(self, map_pos):
         if not (map_pos in self.maps and
                 self.maps[map_pos].size == self.map_size):
-            self.maps[map_pos] = Map(self.map_size)
+            self.maps[map_pos] = Map(self.map_size,
+                                     awakeness=self.max_map_awakeness)
             for pos in self.maps[map_pos]:
                 self.maps[map_pos][pos] = '.'
         return self.maps[map_pos]
@@ -248,32 +250,38 @@ class Game(GameBase):
             self.player.proceed(is_AI=False)
 
         def reality_bubble():
-            import math
+
+            def regenerate_chunk_from_map_stats(map_):
+                import math
+                max_stat = self.max_map_awakeness
+                for t_type in map_.stats:
+                    stat = map_.stats[t_type]
+                    to_create = stat['population'] // max_stat
+                    mod_created = int(self.rand.randint(0, max_stat - 1) <
+                                      (stat['population'] % max_stat))
+                    to_create = (stat['population'] // max_stat) + mod_created
+                    if to_create == 0:
+                        continue
+                    average_health = None
+                    if stat['health'] > 0:
+                        average_health = math.ceil(stat['health'] /
+                                                   stat['population'])
+                    for i in range(to_create):
+                        t = self.add_thing_at_random(map_pos, t_type)
+                        if average_health:
+                            t.health = average_health
+
             for map_pos in self.maps:
                 m = self.maps[map_pos]
                 if map_pos in self.player.close_maps:
 
                     # Newly inside chunks are regenerated from .stats.
                     if not m.awake:
-                        for t_type in m.stats:
-                            stat = m.stats[t_type]
-                            to_create = stat['population'] // 100
-                            to_create = stat['population'] // 100 +\
-                                int(self.rand.randint(0, 99) < (stat['population'] % 100))
-                            if to_create == 0:
-                                continue
-                            average_health = None
-                            if stat['health'] > 0:
-                                average_health = math.ceil(stat['health'] /
-                                                           stat['population'])
-                            for i in range(to_create):
-                                t = self.add_thing_at_random(map_pos, t_type)
-                                if average_health:
-                                    t.health = average_health
+                        regenerate_chunk_from_map_stats(m)
 
                     # Inside chunks are set to max .awake and don't collect
                     # stats.
-                    m.awake = 100
+                    m.awake = self.max_map_awakeness
                     m.stats = {}
 
                 # Outside chunks grow distant through .awake decremention.
@@ -289,7 +297,6 @@ class Game(GameBase):
                             m.stats[t.type_]['population'] += 1
                             if isinstance(t, ThingAnimate):
                                 m.stats[t.type_]['health'] += t.health
-                                if not m.awake:
                             if not m.awake:
                                 del self.things[self.things.index(t)]
 
index 3cfe022a6bf51f3fa6b46252d058f27e969df74e..9ae5444632db89a13cbccf9f88c0b041353054c2 100644 (file)
@@ -18,11 +18,12 @@ class YX(collections.namedtuple('YX', ('y', 'x'))):
 
 class Map:
 
-    def __init__(self, size=YX(0, 0), init_char = '?', start_indented=True):
+    def __init__(self, size=YX(0, 0), init_char = '?', start_indented=True,
+                 awakeness=0):
         self.size = size
-        self.terrain = init_char*self.size_i
+        self.terrain = init_char * self.size_i
         self.start_indented = start_indented
-        self.awake = 100  # asleep if zero
+        self.awake = awakeness  # asleep if zero
         self.stats = {}
 
     def __getitem__(self, yx):