annotate nagslang/enemies.py @ 308:3dee86b6c216

Enemies leave corpses
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 00:36:14 +0200
parents c2bbb1e70d6f
children fa408430a174
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
229
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
1 import math
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
2
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3 import pymunk
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 import pymunk.pygame_util
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 168
diff changeset
6 from nagslang import render
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
7 from nagslang.constants import (COLLISION_TYPE_ENEMY, COLLISION_TYPE_BOX,
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
8 ZORDER_MID)
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
9 from nagslang.events import EnemyDeathEvent
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 168
diff changeset
10 from nagslang.game_object import GameObject, SingleShapePhysicser, make_body
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
11 from nagslang.mutators import FLIP_H
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12 from nagslang.resources import resources
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
15 def get_editable_enemies():
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
16 classes = []
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
17 for cls_name, cls in globals().iteritems():
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
18 if isinstance(cls, type) and issubclass(cls, Enemy):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
19 if hasattr(cls, 'requires'):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
20 classes.append((cls_name, cls))
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
21 return classes
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
22
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
23
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
24 class Enemy(GameObject):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
25 """A base class for mobile enemies"""
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
26 enemy_type = None # Image to use for dead Enemy
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
27
277
56e42c00da25 Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
28 def __init__(self, space, world, position):
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29 self._setup_physics(space, position)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
30 self._setup_renderer()
305
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
31 self.health = 42
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
32
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
33 super(Enemy, self).__init__(
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
34 self._physicser, self.renderer)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 self.zorder = ZORDER_MID
277
56e42c00da25 Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
36 self.world = world
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
38 def _get_image(self, name, *transforms):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39 return resources.get_image('creatures', name, transforms=transforms)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
40
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 def _setup_physics(self, space, position):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
42 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
43
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
44 def _setup_renderer(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
46
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
47 def attack(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
50 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
51 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
52 return [("name", "string"), ("position", "coordinates")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
53
305
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
54 def lose_health(self, amount):
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
55 self.health -= amount
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
56 if self.health < 0:
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
57 self.physicser.remove_from_space()
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
58 self.remove = True
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
59 EnemyDeathEvent.post(self.physicser.position, 'A')
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
60
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
61
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
62 class DeadEnemy(GameObject):
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
63 def __init__(self, space, world, position, enemy_type='A'):
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
64 body = make_body(10, 10000, position, damping=0.5)
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
65 self.shape = pymunk.Poly(
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
66 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)])
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
67 self.shape.friction = 0.5
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
68 self.shape.collision_type = COLLISION_TYPE_BOX
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
69 super(DeadEnemy, self).__init__(
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
70 SingleShapePhysicser(space, self.shape),
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
71 render.ImageRenderer(resources.get_image(
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
72 'creatures', 'alien_%s_dead.png' % enemy_type)),
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
73 )
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
74
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
75 @classmethod
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
76 def requires(cls):
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
77 return [("name", "string"), ("position", "coordinates")]
305
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
78
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
79
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
80 class PatrollingAlien(Enemy):
218
9e2ef2f15035 Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 217
diff changeset
81 is_moving = True # Always walking.
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
82 enemy_type = 'A'
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
83
277
56e42c00da25 Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
84 def __init__(self, space, world, position, end_position):
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
85 # An enemy that patrols between the two points
277
56e42c00da25 Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
86 super(PatrollingAlien, self).__init__(space, world, position)
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
87 self._start_pos = position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
88 self._end_pos = end_position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
89 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
90
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
91 def _setup_physics(self, space, position):
208
3d54fe7a2998 Fun with mass and friction.
Jeremy Thurgood <firxen@gmail.com>
parents: 207
diff changeset
92 self._body = make_body(10, pymunk.inf, position, 0.8)
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
93
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
94 self._shape = pymunk.Circle(self._body, 30)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
95
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
96 self._shape.elasticity = 1.0
208
3d54fe7a2998 Fun with mass and friction.
Jeremy Thurgood <firxen@gmail.com>
parents: 207
diff changeset
97 self._shape.friction = 0.05
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
98 self._shape.collision_type = COLLISION_TYPE_ENEMY
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
99 self._physicser = SingleShapePhysicser(space, self._shape)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
100 self.impulse_factor = 50
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
101 self.angle = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
102
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
103 def _setup_renderer(self):
217
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
104 self.renderer = render.FacingSelectionRenderer({
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
105 'left': render.TimedAnimatedRenderer(
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
106 [self._get_image('alien_A_1.png'),
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
107 self._get_image('alien_A_2.png')], 3),
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
108 'right': render.TimedAnimatedRenderer(
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
109 [self._get_image('alien_A_1.png', FLIP_H),
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
110 self._get_image('alien_A_2.png', FLIP_H)], 3),
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 208
diff changeset
111 })
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
112
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
113 def get_render_angle(self):
229
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
114 # No image rotation when rendering, please.
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
115 return 0
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
116
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
117 def get_facing_direction(self):
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
118 # Enemies can face left or right.
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
119 if - math.pi / 2 < self.angle <= math.pi / 2:
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
120 return 'right'
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
121 else:
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
122 return 'left'
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
123
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
124 def _switch_direction(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
125 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
126 self._direction = 'towards'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
127 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
128 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
129
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
130 def set_direction(self, dx, dy):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
131 self.angle = pymunk.Vec2d((dx, dy)).angle
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
132 self._body.apply_impulse(
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
133 (dx * self.impulse_factor, dy * self.impulse_factor))
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
134
307
c2bbb1e70d6f Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents: 305
diff changeset
135 def update(self, seconds):
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
136 # Calculate the step every frame
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
137 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
138 target = self._end_pos
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
139 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
140 target = self._start_pos
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
141 x_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
142 y_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
143 if (target[0] < self._body.position[0]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
144 x_step = max(-1, target[0] - self._body.position[0])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
145 elif (target[0] > self._body.position[0]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
146 x_step = min(1, target[0] - self._body.position[0])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
147 if abs(x_step) < 0.5:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
148 x_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
149 if (target[1] < self._body.position[1]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
150 y_step = max(-1, target[1] - self._body.position[1])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
151 elif (target[1] > self._body.position[1]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
152 y_step = min(1, target[1] - self._body.position[1])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
153 if abs(y_step) < 0.5:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
154 y_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
155 if abs(x_step) < 1 and abs(y_step) < 1:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
156 self._switch_direction()
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
157 self.set_direction(x_step, y_step)
307
c2bbb1e70d6f Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents: 305
diff changeset
158 super(PatrollingAlien, self).update(seconds)
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
159
259
f23be1013c94 Fix function signature
Neil Muller <drnlmuller@gmail.com>
parents: 258
diff changeset
160 def collide_with_protagonist(self, protagonist):
265
8a695b8ecd6c Correcting damage application
David Sharpe
parents: 259
diff changeset
161 protagonist.lose_health(15)
258
083053422a84 Added collision damage with enemies.
David Sharpe
parents: 235
diff changeset
162
305
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
163 def hit(self, weapon):
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
164 self.lose_health(weapon.damage)
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
165
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
166 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
167 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
168 return [("name", "string"), ("position", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
169 ("end_position", "coordinates")]
278
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
170
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
171
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
172 class ChargingAlien(Enemy):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
173 # Simplistic charging of the protagonist
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
174 is_moving = False
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
175 enemy_type = 'B'
278
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
176
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
177 def __init__(self, space, world, position, attack_range=100):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
178 super(ChargingAlien, self).__init__(space, world, position)
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
179 self._range = attack_range
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
180
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
181 def _setup_physics(self, space, position):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
182 self._body = make_body(100, pymunk.inf, position, 0.8)
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
183
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
184 self._shape = pymunk.Circle(self._body, 30)
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
185
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
186 self._shape.elasticity = 1.0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
187 self._shape.friction = 0.05
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
188 self._shape.collision_type = COLLISION_TYPE_ENEMY
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
189 self._physicser = SingleShapePhysicser(space, self._shape)
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
190 self.impulse_factor = 300
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
191 self.angle = 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
192
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
193 def _setup_renderer(self):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
194 self.renderer = render.FacingSelectionRenderer({
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
195 'left': render.TimedAnimatedRenderer(
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
196 [self._get_image('alien_B_1.png'),
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
197 self._get_image('alien_B_2.png')], 3),
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
198 'right': render.TimedAnimatedRenderer(
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
199 [self._get_image('alien_B_1.png', FLIP_H),
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
200 self._get_image('alien_B_2.png', FLIP_H)], 3),
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
201 })
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
202
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
203 def get_render_angle(self):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
204 # No image rotation when rendering, please.
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
205 return 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
206
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
207 def get_facing_direction(self):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
208 # Enemies can face left or right.
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
209 if - math.pi / 2 < self.angle <= math.pi / 2:
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
210 return 'right'
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
211 else:
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
212 return 'left'
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
213
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
214 def set_direction(self, dx, dy):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
215 self.angle = pymunk.Vec2d((dx, dy)).angle
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
216 self._body.apply_impulse(
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
217 (dx * self.impulse_factor, dy * self.impulse_factor))
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
218
307
c2bbb1e70d6f Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents: 305
diff changeset
219 def update(self, seconds):
278
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
220 # Calculate the step every frame
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
221 # Distance to the protagonist
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
222 pos = self._body.position
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
223 target = self.world.protagonist.get_shape().body.position
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
224 if pos.get_distance(target) > self._range:
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
225 # stop
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
226 self.is_moving = False
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
227 return
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
228 self.is_moving = True
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
229 x_step = 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
230 y_step = 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
231 if (target[0] < pos[0]):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
232 x_step = max(-1, target[0] - pos[0])
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
233 elif (target[0] > pos[0]):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
234 x_step = min(1, target[0] - pos[0])
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
235 if abs(x_step) < 0.5:
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
236 x_step = 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
237 if (target[1] < pos[1]):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
238 y_step = max(-1, target[1] - pos[1])
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
239 elif (target[1] > pos[1]):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
240 y_step = min(1, target[1] - pos[1])
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
241 if abs(y_step) < 0.5:
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
242 y_step = 0
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
243 self.set_direction(x_step, y_step)
307
c2bbb1e70d6f Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents: 305
diff changeset
244 super(ChargingAlien, self).update(seconds)
278
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
245
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
246 def collide_with_protagonist(self, protagonist):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
247 protagonist.lose_health(20)
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
248
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
249 @classmethod
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
250 def requires(cls):
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
251 return [("name", "string"), ("position", "coordinates"),
e72025e9aa07 simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
252 ("attack_range", "distance")]