X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomrogue%2Fthings.py;h=dfb536c27f8e6f9acb49b8e5ad2d60d16c66e27e;hb=f0f0c01c001fef0bdc6bf8d60da329e4c7b55223;hp=0e4af344e5cc9bcfc6af4e0e6fb88cbd07054e96;hpb=540aec0e9bf55d0452cffda4b34e1995d3724abf;p=plomrogue2 diff --git a/plomrogue/things.py b/plomrogue/things.py index 0e4af34..dfb536c 100644 --- a/plomrogue/things.py +++ b/plomrogue/things.py @@ -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_ @@ -17,6 +17,7 @@ class ThingBase: class Thing(ThingBase): + blocking = False def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -24,14 +25,34 @@ 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_Item(Thing): + symbol_hint = 'i' + + + +class Thing_Furniture(Thing): + symbol_hint = 'h' + class ThingAnimate(Thing): + blocking = True def __init__(self, *args, **kwargs): 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 +72,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 +89,35 @@ 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, 12) + return self._fov + + def fov_test(self, yx): + test_position = self.fov_stencil.target_yx(yx) + if self.fov_stencil.inside(test_position): + if self.fov_stencil[test_position] == '.': + return True + return False + def fov_stencil_map(self, map): + visible_terrain = '' + for yx in self.fov_stencil: + if self.fov_stencil[yx] == '.': + visible_terrain += map[self.fov_stencil.source_yx(yx)] + 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' - + self.carrying = None