Mercurial > nagslang
annotate nagslang/enemies.py @ 361:534eac55a178
ChargingEnemy spits acid
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Fri, 06 Sep 2013 20:10:46 +0200 |
parents | 911547a1c378 |
children | 3dd08e18580f |
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, |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
8 ACID_SPEED, ACID_DAMAGE, ZORDER_MID) |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
9 from nagslang.events import EnemyDeathEvent, FireEvent |
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 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
13 from nagslang.utils import vec_with_length |
168 | 14 |
15 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
16 def get_editable_enemies(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
17 classes = [] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
18 for cls_name, cls in globals().iteritems(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
19 if isinstance(cls, type) and issubclass(cls, Enemy): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
20 if hasattr(cls, 'requires'): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
21 classes.append((cls_name, cls)) |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
22 return classes |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
23 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
24 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
25 def get_alien_image(enemy_type, suffix, *transforms): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
26 image_name = 'alien_%s_%s.png' % (enemy_type, suffix) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
27 return resources.get_image('creatures', image_name, transforms=transforms) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
28 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
29 |
168 | 30 class Enemy(GameObject): |
31 """A base class for mobile enemies""" | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
32 zorder = ZORDER_MID |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
33 enemy_type = None # Which set of images to use |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
34 enemy_damage = None |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
35 health = None |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
36 impulse_factor = None |
168 | 37 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
38 def __init__(self, space, world, position): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
39 super(Enemy, self).__init__( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
40 self.make_physics(space, position), self.make_renderer()) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
41 self.world = world |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
42 self.angle = 0 |
168 | 43 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
44 def make_physics(self, space, position): |
168 | 45 raise NotImplementedError |
46 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
47 def make_renderer(self): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
48 return render.FacingSelectionRenderer({ |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
49 'left': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
50 [get_alien_image(self.enemy_type, '1'), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
51 get_alien_image(self.enemy_type, '2')], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
52 'right': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
53 [get_alien_image(self.enemy_type, '1', FLIP_H), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
54 get_alien_image(self.enemy_type, '2', FLIP_H)], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
55 }) |
168 | 56 |
57 def attack(self): | |
58 raise NotImplementedError | |
59 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
60 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
61 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
62 return [("name", "string"), ("position", "coordinates")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
63 |
310
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
64 def hit(self, weapon): |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
65 self.lose_health(weapon.damage) |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
66 |
305 | 67 def lose_health(self, amount): |
68 self.health -= amount | |
69 if self.health < 0: | |
70 self.physicser.remove_from_space() | |
71 self.remove = True | |
310
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
72 EnemyDeathEvent.post(self.physicser.position, self.enemy_type) |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
73 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
74 def set_direction(self, dx, dy): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
75 vec = vec_with_length((dx, dy), self.impulse_factor) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
76 self.angle = vec.angle |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
77 self.physicser.apply_impulse(vec) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
78 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
79 def collide_with_protagonist(self, protagonist): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
80 if self.enemy_damage is not None: |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
81 protagonist.lose_health(self.enemy_damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
82 |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
83 def collide_with_claw_attack(self, claw_attack): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
84 self.lose_health(claw_attack.damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
85 |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
86 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
87 class DeadEnemy(GameObject): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
88 def __init__(self, space, world, position, enemy_type='A'): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
89 body = make_body(10, 10000, position, damping=0.5) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
90 self.shape = pymunk.Poly( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
91 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)]) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
92 self.shape.friction = 0.5 |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
310
diff
changeset
|
93 self.shape.collision_type = COLLISION_TYPE_FURNITURE |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
94 super(DeadEnemy, self).__init__( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
95 SingleShapePhysicser(space, self.shape), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
96 render.ImageRenderer(resources.get_image( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
97 'creatures', 'alien_%s_dead.png' % enemy_type)), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
98 ) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
99 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
100 @classmethod |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
101 def requires(cls): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
102 return [("name", "string"), ("position", "coordinates")] |
305 | 103 |
168 | 104 |
105 class PatrollingAlien(Enemy): | |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
106 is_moving = True # Always walking. |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
107 enemy_type = 'A' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
108 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
109 enemy_damage = 15 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
110 impulse_factor = 50 |
168 | 111 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
112 def __init__(self, space, world, position, end_position): |
168 | 113 # 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
|
114 super(PatrollingAlien, self).__init__(space, world, position) |
168 | 115 self._start_pos = position |
116 self._end_pos = end_position | |
117 self._direction = 'away' | |
118 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
119 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
120 body = make_body(10, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
121 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
122 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
123 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
124 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
125 return SingleShapePhysicser(space, shape) |
168 | 126 |
127 def get_render_angle(self): | |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
128 # No image rotation when rendering, please. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
129 return 0 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
130 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
131 def get_facing_direction(self): |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
132 # Enemies can face left or right. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
133 if - math.pi / 2 < self.angle <= math.pi / 2: |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
134 return 'right' |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
135 else: |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
136 return 'left' |
168 | 137 |
138 def _switch_direction(self): | |
139 if self._direction == 'away': | |
140 self._direction = 'towards' | |
141 else: | |
142 self._direction = 'away' | |
143 | |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
144 def update(self, dt): |
168 | 145 # Calculate the step every frame |
146 if self._direction == 'away': | |
147 target = self._end_pos | |
148 else: | |
149 target = self._start_pos | |
150 x_step = 0 | |
151 y_step = 0 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
152 if (target[0] < self.physicser.position[0]): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
153 x_step = max(-1, target[0] - self.physicser.position[0]) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
154 elif (target[0] > self.physicser.position[0]): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
155 x_step = min(1, target[0] - self.physicser.position[0]) |
168 | 156 if abs(x_step) < 0.5: |
157 x_step = 0 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
158 if (target[1] < self.physicser.position[1]): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
159 y_step = max(-1, target[1] - self.physicser.position[1]) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
160 elif (target[1] > self.physicser.position[1]): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
161 y_step = min(1, target[1] - self.physicser.position[1]) |
168 | 162 if abs(y_step) < 0.5: |
163 y_step = 0 | |
164 if abs(x_step) < 1 and abs(y_step) < 1: | |
165 self._switch_direction() | |
166 self.set_direction(x_step, y_step) | |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
167 super(PatrollingAlien, self).update(dt) |
258 | 168 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
169 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
170 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
171 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
172 ("end_position", "coordinates")] |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
173 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
174 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
175 class ChargingAlien(Enemy): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
176 # Simplistic charging of the protagonist |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
177 is_moving = False |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
178 enemy_type = 'B' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
179 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
180 enemy_damage = 20 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
181 impulse_factor = 300 |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
182 reload_time = 0.2 |
278
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 def __init__(self, space, world, position, attack_range=100): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
185 super(ChargingAlien, self).__init__(space, world, position) |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
186 self._range = attack_range |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
187 self._last_fired = 0 |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
188 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
189 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
190 body = make_body(100, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
191 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
192 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
193 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
194 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
195 return SingleShapePhysicser(space, shape) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
196 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
197 def get_render_angle(self): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
198 # No image rotation when rendering, please. |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
199 return 0 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
200 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
201 def get_facing_direction(self): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
202 # Enemies can face left or right. |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
203 if - math.pi / 2 < self.angle <= math.pi / 2: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
204 return 'right' |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
205 else: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
206 return 'left' |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
207 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
208 def update(self, dt): |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
209 # Calculate the step every frame |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
210 # Distance to the protagonist |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
211 pos = self.physicser.position |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
212 target = self.world.protagonist.get_shape().body.position |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
213 if pos.get_distance(target) > self._range: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
214 # stop |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
215 self.is_moving = False |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
216 return |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
217 self.is_moving = True |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
218 dx = target.x - pos.x |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
219 dy = target.y - pos.y |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
220 self.set_direction(dx, dy) |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
221 if self.lifetime - self._last_fired >= self.reload_time: |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
222 FireEvent.post(pos, vec_with_length((dx, dy), ACID_SPEED), |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
223 ACID_DAMAGE, COLLISION_TYPE_ENEMY) |
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
224 self._last_fired = self.lifetime |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
225 super(ChargingAlien, self).update(dt) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
226 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
227 @classmethod |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
228 def requires(cls): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
229 return [("name", "string"), ("position", "coordinates"), |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
230 ("attack_range", "distance")] |