# HG changeset patch # User Jeremy Thurgood # Date 1378545714 -7200 # Node ID 180c27514619a99db0f282321ab0d1ec0f4712b4 # Parent d04981e24fdaf37b7832e00175038def7a71d06a Better protagonist finding for enemies. diff -r d04981e24fda -r 180c27514619 nagslang/enemies.py --- a/nagslang/enemies.py Sat Sep 07 12:32:40 2013 +0200 +++ b/nagslang/enemies.py Sat Sep 07 11:21:54 2013 +0200 @@ -3,7 +3,6 @@ import pymunk import pymunk.pygame_util -from pymunk.vec2d import Vec2d from nagslang import render from nagslang.constants import (COLLISION_TYPE_ENEMY, COLLISION_TYPE_FURNITURE, @@ -84,29 +83,40 @@ def collide_with_claw_attack(self, claw_attack): self.lose_health(claw_attack.damage) + def range_to_visible_protagonist(self): + """Get a vector to the protagonist if there are no barriers in between. + + Returns a vector to the protagonist if she is within line of sight, + otherwise `None` + """ + + pos = self.physicser.position + target = self.world.protagonist.get_shape().body.position + + for collision in self.get_space().segment_query(pos, target): + shape = collision.shape + if (shape in (self.get_shape(), self.world.protagonist.get_shape()) + or shape.sensor): + continue + return None + return target - pos + def ranged_attack(self, range_, speed, damage, type_, reload_time, result=None): if result is None: result = Result() - pos = self.physicser.position - target = self.world.protagonist.get_shape().body.position - - r = self.get_space().segment_query(pos, target) - for collision in r: - shape = collision.shape - if (shape in (self.get_shape(), self.world.protagonist.get_shape()) - or shape.sensor): - continue + vec = self.range_to_visible_protagonist() + if vec is None: return result if not self.check_timer('reload_time'): self.start_timer('reload_time', reload_time) - vec = Vec2d((target.x - pos.x, target.y - pos.y)) if vec.length < range_: vec.length = speed - result.add += (Bullet(self.get_space(), pos, vec, damage, - type_, COLLISION_TYPE_ENEMY),) + result.add += (Bullet( + self.get_space(), self.physicser.position, vec, damage, + type_, COLLISION_TYPE_ENEMY),) return result def greedy_move(self, target):