X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=new%2Fplomrogue%2Fthings.py;h=c9e95d3cbf24dc70bf8ab05bb652435071dc19b2;hb=df8bf97e70c415e95166851e16e19d4ac7acfee1;hp=20ce4867c2211882b506de309d8881eb16842379;hpb=729e72408fa1c3180275ad3c0e6689143a0f2f38;p=plomrogue2-experiments diff --git a/new/plomrogue/things.py b/new/plomrogue/things.py index 20ce486..c9e95d3 100644 --- a/new/plomrogue/things.py +++ b/new/plomrogue/things.py @@ -29,7 +29,12 @@ class Thing(ThingBase): class ThingItem(Thing): - type_ = 'item' + pass + + + +class ThingFood(ThingItem): + type_ = 'food' @@ -42,11 +47,12 @@ class ThingAnimate(Thing): self._last_task_result = None self._stencil = None - def move_towards_target(self, target): + def move_on_dijkstra_map(self, targets): 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)] - dijkstra_map[target] = 0 + for target in targets: + dijkstra_map[target] = 0 shrunk = True visible_map = self.get_visible_map() while shrunk: @@ -70,10 +76,9 @@ class ThingAnimate(Thing): if n_new < n: n = n_new target_direction = direction - if target_direction: - self.set_task('MOVE', (target_direction,)) + return 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,43 @@ class ThingAnimate(Thing): break if target is not None: try: - self.move_towards_target(target) - return + target_dir = self.move_on_dijkstra_map([target]) + if target_dir is not None: + self.set_task('MOVE', (target_dir,)) + return True except GameError: pass - self.set_task('WAIT') + return False + + def hunt_food_satisfaction(self): + for id_ in self.inventory: + t = self.world.get_thing(id_) + if t.type_ == 'food': + self.set_task('EAT', (id_,)) + return True + for id_ in self.get_pickable_items(): + t = self.world.get_thing(id_) + if t.type_ == 'food': + self.set_task('PICKUP', (id_,)) + return True + visible_things = self.get_visible_things() + food_targets = [] + for t in visible_things: + if t.type_ == 'food': + food_targets += [t.position] + target_dir = self.move_on_dijkstra_map(food_targets) + if target_dir: + try: + self.set_task('MOVE', (target_dir,)) + return True + except GameError: + pass + return False + + def decide_task(self): + #if not self.hunt_player(): + if not self.hunt_food_satisfaction(): + self.set_task('WAIT') def set_task(self, task_name, args=()): task_class = self.world.game.tasks[task_name] @@ -94,18 +131,27 @@ class ThingAnimate(Thing): 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: @@ -163,8 +209,10 @@ class ThingAnimate(Thing): class ThingHuman(ThingAnimate): type_ = 'human' + health = 100 class ThingMonster(ThingAnimate): type_ = 'monster' + health = 50