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