X-Git-Url: https://plomlompom.com/repos/processes?a=blobdiff_plain;f=new%2Fplomrogue%2Fthings.py;h=31a389a0b248871379bdc27d2938bc7e5b604e42;hb=a82bf1f876b702eeb9a8c04ee2acb6a32d61fc78;hp=5ef429754c41373dbf9a9b986de63ef88e684303;hpb=599f48bd1d9270cf154e885cf276adb05727507a;p=plomrogue2-experiments diff --git a/new/plomrogue/things.py b/new/plomrogue/things.py index 5ef4297..31a389a 100644 --- a/new/plomrogue/things.py +++ b/new/plomrogue/things.py @@ -5,7 +5,7 @@ from plomrogue.errors import GameError class ThingBase: type_ = '?' - def __init__(self, world, id_=None, position=[0,0]): + def __init__(self, world, id_=None, position=(0,0)): self.world = world self.position = position if id_ is None: @@ -29,7 +29,12 @@ class Thing(ThingBase): class ThingItem(Thing): - type_ = 'item' + pass + + + +class ThingFood(ThingItem): + type_ = 'food' @@ -42,7 +47,7 @@ class ThingAnimate(Thing): self._last_task_result = None self._stencil = None - def move_towards_target(self, target): + def move_towards_position(self, target): dijkstra_map = type(self.world.map_)(self.world.map_.size) n_max = 256 dijkstra_map.terrain = [n_max for i in range(dijkstra_map.size_i)] @@ -63,7 +68,7 @@ class ThingAnimate(Thing): 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] @@ -73,7 +78,7 @@ class ThingAnimate(Thing): if target_direction: self.set_task('MOVE', (target_direction,)) - def decide_task(self): + def hunt_player(self): visible_things = self.get_visible_things() target = None for t in visible_things: @@ -82,11 +87,15 @@ class ThingAnimate(Thing): break if target is not None: try: - self.move_towards_target(target) - return + self.move_towards_position(target) + return True except GameError: pass - self.set_task('WAIT') + return False + + def decide_task(self): + if not self.hunt_player(): + self.set_task('WAIT') def set_task(self, task_name, args=()): task_class = self.world.game.tasks[task_name] @@ -94,18 +103,27 @@ class ThingAnimate(Thing): self.task.check() # will throw GameError if necessary def proceed(self, is_AI=True): - """Further the thing in its tasks. + """Further the thing in its tasks, decrease its health. - 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. - - 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: @@ -149,12 +167,24 @@ class ThingAnimate(Thing): 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(ThingAnimate): type_ = 'human' + health = 100 class ThingMonster(ThingAnimate): type_ = 'monster' + health = 50