# HG changeset patch # User Stefano Rivera # Date 1378494444 -7200 # Node ID 9898fa231c4b8f6122eb0c01b325c1e3e074e2da # Parent 3aa3981a64a4db133d2ca6add4d1b60f87b0983c Move ranged attack code to Enemy. Don't shoot through solid objects diff -r 3aa3981a64a4 -r 9898fa231c4b nagslang/enemies.py --- 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