--- /dev/null
+from plomrogue.errors import GameError
+from plomrogue.mapping import YX
+
+
+
+class ThingBase:
+ type_ = '?'
+
+ def __init__(self, game, id_=None, position=(YX(0,0))):
+ self.game = game
+ if id_ is None:
+ self.id_ = self.game.new_thing_id()
+ else:
+ self.id_ = id_
+ self.position = position
+
+
+
+class Thing(ThingBase):
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ def proceed(self):
+ pass
+
+
+
+class ThingAnimate(Thing):
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.next_tasks = []
+ self.set_task('WAIT')
+
+ def set_task(self, task_name, args=()):
+ task_class = self.game.tasks[task_name]
+ self.task = task_class(self, args)
+ self.task.check() # will throw GameError if necessary
+
+ def set_next_task(self, task_name, args=()):
+ task_class = self.game.tasks[task_name]
+ self.next_tasks += [task_class(self, args)]
+
+ def get_next_task(self):
+ if len(self.next_tasks) > 0:
+ task = self.next_tasks.pop(0)
+ task.check()
+ return task
+ else:
+ return None
+
+ def proceed(self):
+ if self.task is None:
+ self.task = self.get_next_task()
+ return
+
+ try:
+ self.task.check()
+ except GameError as e:
+ self.task = None
+ raise GameError
+ return
+ self.task.todo -= 1
+ if self.task.todo <= 0:
+ self._last_task_result = self.task.do()
+ self.game.changed = True
+ self.task = self.get_next_task()
+
+
+
+class ThingPlayer(ThingAnimate):
+ type_ = 'player'
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.nickname = 'undefined'
+