home · contact · privacy
Move re-positioning of things in inventory to Thing code.
[plomrogue2-experiments] / new / plomrogue / things.py
index b64584182f31e3b322a3cd2b1c0e7f6c5a144fde..13384fc76935d14e328287a34a0716805b75fe6d 100644 (file)
@@ -13,6 +13,26 @@ class ThingBase:
         else:
             self.id_ = id_
 
+    @property
+    def position(self):
+        return self._position
+
+    def _position_set(self, pos):
+        """Set self._position to pos.
+
+        We use this setter as core to the @position.setter property
+        method due to property setter subclassing not yet working
+        properly, see <https://bugs.python.org/issue14965>. We will
+        therefore super() _position_set instead of @position.setter in
+        subclasses.
+
+        """
+        self._position = pos
+
+    @position.setter
+    def position(self, pos):
+        self._position_set(pos)
+
 
 
 class Thing(ThingBase):
@@ -20,12 +40,18 @@ class Thing(ThingBase):
     in_inventory = False
 
     def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
         self.inventory = []
+        super().__init__(*args, **kwargs)
 
     def proceed(self):
         pass
 
+    def _position_set(self, pos):
+        super()._position_set(pos)
+        for t_id in self.inventory:
+            t = self.world.get_thing(t_id)
+            t.position = self.position
+
 
 
 class ThingItem(Thing):
@@ -80,7 +106,8 @@ class ThingAnimate(Thing):
         return target_direction
 
     def hunt_player(self):
-        visible_things, offset = self.get_visible_things()
+        visible_things = self.get_visible_things()
+        offset = self.get_surroundings_offset()
         target = None
         for t in visible_things:
             if t.type_ == 'human':
@@ -111,7 +138,8 @@ class ThingAnimate(Thing):
             if t.type_ == 'food':
                 self.set_task('PICKUP', (id_,))
                 return True
-        visible_things, offset = self.get_visible_things()
+        visible_things = self.get_visible_things()
+        offset = self.get_surroundings_offset()
         food_targets = []
         for t in visible_things:
             if t.type_ == 'food':
@@ -218,7 +246,7 @@ class ThingAnimate(Thing):
         self._surrounding_map = self.world.game.\
                                 map_type(size=(self._radius*2+1+int(add_line),
                                                self._radius*2+1))
-        size = self.world.maps[(0,0)].size
+        size = self.world.map_size
         offset = self.get_surroundings_offset()
         for pos in self._surrounding_map:
             big_y, small_y = pan_and_scan(size[0], pos[0], offset[0])
@@ -263,22 +291,23 @@ class ThingAnimate(Thing):
         stencil = self.get_stencil()
         offset = self.get_surroundings_offset()
         visible_things = []
-        size = self.world.maps[(0,0)].size
+        size = self.world.map_size
         fov_size = self.get_surrounding_map().size
         for thing in self.world.things:
             big_pos = thing.position[0]
             small_pos = thing.position[1]
             pos_y = calc_pos_in_fov(big_pos[0], small_pos[0], offset[0], size[0])
             pos_x = calc_pos_in_fov(big_pos[1], small_pos[1], offset[1], size[1])
-            if pos_y < 0 or pos_x < 0 or pos_y >= fov_size[0] or pos_x >= fov_size[1]:
+            if pos_y < 0 or pos_x < 0 or\
+               pos_y >= fov_size[0] or pos_x >= fov_size[1]:
                 continue
             if (not thing.in_inventory) and stencil[(pos_y, pos_x)] == '.':
                 visible_things += [thing]
-        return visible_things, offset
+        return visible_things
 
     def get_pickable_items(self):
         pickable_ids = []
-        visible_things, _ = self.get_visible_things()
+        visible_things = self.get_visible_things()
         for t in [t for t in visible_things if
                   isinstance(t, ThingItem) and
                   (t.position == self.position or