X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomrogue%2Fthings.py;h=a51b2b2b48083037b146cca377005ecf9994cb8b;hb=904563ed3077b2ce6cc884c8e1f66b68a0d292b5;hp=ee0d501be22258e69d287da986f8c1bf4d65e978;hpb=0a25fa6dadb1560ed64c22fe12a6c3d8de567b84;p=plomrogue2 diff --git a/plomrogue/things.py b/plomrogue/things.py index ee0d501..a51b2b2 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), 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,9 @@ class ThingBase: class Thing(ThingBase): + blocking = False + portable = False + protection = '.' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -24,9 +27,55 @@ 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' + portable = True + + + +class ThingSpawner(Thing): + symbol_hint = 'S' + + def proceed(self): + for t in [t for t in self.game.things + if t != self and t.position == self.position]: + return + t = self.game.thing_types[self.child_type](self.game, + position=self.position) + self.game.things += [t] + self.game.changed = True + + + +class Thing_ItemSpawner(ThingSpawner): + child_type = 'Item' + + + +class Thing_SpawnPointSpawner(ThingSpawner): + child_type = 'SpawnPoint' + + + +class Thing_SpawnPoint(Thing): + symbol_hint = 's' + portable = True + name = 'username' + class ThingAnimate(Thing): + blocking = True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -61,8 +110,7 @@ class ThingAnimate(Thing): self.task.check() except GameError as e: self.task = None - raise GameError - return + raise e self.task.todo -= 1 if self.task.todo <= 0: self._last_task_result = self.task.do() @@ -74,23 +122,33 @@ class ThingAnimate(Thing): 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) + self._fov = fov_map_class(self.game.maps, self.position, 12, + self.game.get_map) return self._fov - def fov_stencil_map(self, map): + def fov_test(self, big_yx, little_yx): + test_position = self.fov_stencil.target_yx(big_yx, little_yx) + if self.fov_stencil.inside(test_position): + if self.fov_stencil[test_position] == '.': + return True + return False + + def fov_stencil_map(self, map_type='normal'): visible_terrain = '' - for i in range(self.fov_stencil.size_i): - if self.fov_stencil.terrain[i] == '.': - visible_terrain += map.terrain[i] + for yx in self.fov_stencil: + if self.fov_stencil[yx] == '.': + big_yx, little_yx = self.fov_stencil.source_yxyx(yx) + map_ = self.game.get_map(big_yx, map_type) + visible_terrain += map_[little_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