X-Git-Url: https://plomlompom.com/repos/?p=plomrogue2-experiments;a=blobdiff_plain;f=new%2Fplomrogue%2Fthings.py;h=112a1ce9449399700afe28e33b4f4c1a52990c8e;hp=2decc6709f747113e888edc9327f406c8e43739c;hb=6c37a16df7e55754ca89a9de0aaf49c3c778155e;hpb=faf90001efa004054b41df5e2638b6c7c4c1fd98 diff --git a/new/plomrogue/things.py b/new/plomrogue/things.py index 2decc67..112a1ce 100644 --- a/new/plomrogue/things.py +++ b/new/plomrogue/things.py @@ -5,14 +5,36 @@ from plomrogue.errors import GameError class ThingBase: type_ = '?' - def __init__(self, world, id_, position=[0,0]): + def __init__(self, world, id_=None, position=(0,0)): self.world = world - self.id_ = id_ self.position = position + if id_ is None: + self.id_ = self.world.new_thing_id() + else: + self.id_ = id_ class Thing(ThingBase): + blocking = False + in_inventory = False + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.inventory = [] + + def proceed(self): + pass + + + +class ThingItem(Thing): + type_ = 'item' + + + +class ThingAnimate(Thing): + blocking = True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -41,7 +63,7 @@ class Thing(ThingBase): neighbors = dijkstra_map.get_neighbors(tuple(self.position)) n = n_max target_direction = None - for direction in neighbors: + for direction in sorted(neighbors.keys()): yx = neighbors[direction] if yx is not None: n_new = dijkstra_map[yx] @@ -72,18 +94,27 @@ class Thing(ThingBase): self.task.check() # will throw GameError if necessary def proceed(self, is_AI=True): - """Further the thing in its tasks. - - Decrements .task.todo; if it thus falls to <= 0, enacts method - whose name is 'task_' + self.task.name and sets .task = - None. If is_AI, calls .decide_task to decide a self.task. + """Further the thing in its tasks, decrease its health. - Before doing anything, ensures an empty map visibility stencil - and checks that task is still possible, and aborts it + First, ensures an empty map, decrements .health and kills + thing if crossing zero (removes from self.world.things for AI + thing, or unsets self.world.player_is_alive for player thing); + then checks that self.task is still possible and aborts if otherwise (for AI things, decides a new task). + Then decrements .task.todo; if it thus falls to <= 0, enacts + method whose name is 'task_' + self.task.name and sets .task = + None. If is_AI, calls .decide_task to decide a self.task. + """ self._stencil = None + self.health -= 1 + if self.health <= 0: + if self is self.world.player: + self.world.player_is_alive = False + else: + del self.world.things[self.world.things.index(self)] + return try: self.task.check() except GameError as e: @@ -123,16 +154,28 @@ class Thing(ThingBase): stencil = self.get_stencil() visible_things = [] for thing in self.world.things: - if stencil[thing.position] == '.': + if (not thing.in_inventory) and stencil[thing.position] == '.': visible_things += [thing] return visible_things + def get_pickable_items(self): + pickable_ids = [] + for t in [t for t in self.get_visible_things() if + isinstance(t, ThingItem) and + (t.position == self.position or + t.position in + self.world.map_.get_neighbors(self.position).values())]: + pickable_ids += [t.id_] + return pickable_ids + -class ThingHuman(Thing): +class ThingHuman(ThingAnimate): type_ = 'human' + health = 100 -class ThingMonster(Thing): +class ThingMonster(ThingAnimate): type_ = 'monster' + health = 50