changeset 409:180c27514619

Better protagonist finding for enemies.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 07 Sep 2013 11:21:54 +0200
parents d04981e24fda
children d7bd9adb105a
files nagslang/enemies.py
diffstat 1 files changed, 23 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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):