changeset 366:9898fa231c4b

Move ranged attack code to Enemy. Don't shoot through solid objects
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 21:07:24 +0200
parents 3aa3981a64a4
children ea315cdf286d
files nagslang/enemies.py
diffstat 1 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/enemies.py	Fri Sep 06 20:59:37 2013 +0200
+++ b/nagslang/enemies.py	Fri Sep 06 21:07:24 2013 +0200
@@ -2,6 +2,7 @@
 
 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,
@@ -40,6 +41,7 @@
             self.make_physics(space, position), self.make_renderer())
         self.world = world
         self.angle = 0
+        self._last_fired = 0
 
     def make_physics(self, space, position):
         raise NotImplementedError
@@ -83,6 +85,26 @@
     def collide_with_claw_attack(self, claw_attack):
         self.lose_health(claw_attack.damage)
 
+    def ranged_attack(self, range_, speed, damage, type_, reload_time):
+        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
+            return
+
+        if self.lifetime - self._last_fired >= reload_time:
+            vec = Vec2d((target.x - pos.x, target.y - pos.y))
+            if vec.length < range_:
+                vec.length = speed
+                FireEvent.post(pos, vec, damage, type_,
+                               COLLISION_TYPE_ENEMY)
+                self._last_fired = self.lifetime
+
 
 class DeadEnemy(GameObject):
     def __init__(self, space, world, position, enemy_type='A'):
@@ -164,6 +186,7 @@
         if abs(x_step) < 1 and abs(y_step) < 1:
             self._switch_direction()
         self.set_direction(x_step, y_step)
+        self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2)
         super(PatrollingAlien, self).update(dt)
 
     @classmethod
@@ -179,12 +202,10 @@
     health = 42
     enemy_damage = 20
     impulse_factor = 300
-    reload_time = 0.2
 
     def __init__(self, space, world, position, attack_range=100):
         super(ChargingAlien, self).__init__(space, world, position)
         self._range = attack_range
-        self._last_fired = 0
 
     def make_physics(self, space, position):
         body = make_body(100, pymunk.inf, position, 0.8)
@@ -208,6 +229,7 @@
     def update(self, dt):
         # Calculate the step every frame
         # Distance to the protagonist
+        self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2)
         pos = self.physicser.position
         target = self.world.protagonist.get_shape().body.position
         if pos.get_distance(target) > self._range:
@@ -218,10 +240,6 @@
         dx = target.x - pos.x
         dy = target.y - pos.y
         self.set_direction(dx, dy)
-        if self.lifetime - self._last_fired >= self.reload_time:
-            FireEvent.post(pos, vec_with_length((dx, dy), ACID_SPEED),
-                           ACID_DAMAGE, 'acid', COLLISION_TYPE_ENEMY)
-            self._last_fired = self.lifetime
         super(ChargingAlien, self).update(dt)
 
     @classmethod