home · contact · privacy
Add basic non-player things system.
[plomrogue2] / plomrogue / things.py
index f066ae660f685a0a8ba05503b1c75e6b4eb25de4..ecddc8767483dd8599b43a373de5392127fc260e 100644 (file)
@@ -6,9 +6,9 @@ from plomrogue.mapping import YX
 class ThingBase:
     type_ = '?'
 
-    def __init__(self, game, id_=None, position=(YX(0,0))):
+    def __init__(self, game, id_=0, position=(YX(0,0))):
         self.game = game
-        if id_ is None:
+        if id_ == 0:
             self.id_ = self.game.new_thing_id()
         else:
             self.id_ = id_
@@ -24,6 +24,18 @@ class Thing(ThingBase):
     def proceed(self):
         pass
 
+    @property
+    def type_(self):
+        return self.__class__.get_type()
+
+    @classmethod
+    def get_type(cls):
+        return cls.__name__[len('Thing_'):]
+
+
+
+class Thing_Stone(Thing):
+    symbol_hint = 'o'
 
 
 class ThingAnimate(Thing):
@@ -32,6 +44,7 @@ class ThingAnimate(Thing):
         super().__init__(*args, **kwargs)
         self.next_tasks = []
         self.set_task('WAIT')
+        self._fov = None
 
     def set_task(self, task_name, args=()):
         task_class = self.game.tasks[task_name]
@@ -51,6 +64,7 @@ class ThingAnimate(Thing):
             return None
 
     def proceed(self):
+        self._fov = None
         if self.task is None:
             self.task = self.get_next_task()
             return
@@ -67,12 +81,28 @@ class ThingAnimate(Thing):
             self.game.changed = True
             self.task = self.get_next_task()
 
+    @property
+    def fov_stencil(self):
+        if self._fov:
+            return self._fov
+        fov_map_class = self.game.map_geometry.fov_map_class
+        self._fov = fov_map_class(self.game.map, self.position)
+        return self._fov
 
+    def fov_stencil_map(self, map):
+        visible_terrain = ''
+        for i in range(self.fov_stencil.size_i):
+            if self.fov_stencil.terrain[i] == '.':
+                visible_terrain += map.terrain[i]
+            else:
+                visible_terrain += ' '
+        return visible_terrain
 
-class ThingPlayer(ThingAnimate):
-    type_ = 'player'
+
+
+class Thing_Player(ThingAnimate):
+    symbol_hint = '@'
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.nickname = 'undefined'
-