Mercurial > nagslang
annotate nagslang/enemies.py @ 598:e65d59081bdd
Quieter sound.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sat, 07 Sep 2013 23:43:20 +0200 |
parents | 400f52d4279d |
children | 28af98fe38d7 |
rev | line source |
---|---|
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
1 import math |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
2 import random |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
3 |
168 | 4 import pymunk |
5 import pymunk.pygame_util | |
6 | |
207 | 7 from nagslang import render |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
8 from nagslang.constants import ( |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
9 COLLISION_TYPE_ENEMY, COLLISION_TYPE_FURNITURE, COLLISION_TYPE_SHEEP, |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
10 ACID_SPEED, ACID_DAMAGE, ZORDER_MID) |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
11 from nagslang.game_object import (GameObject, SingleShapePhysicser, Result, |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
12 Bullet, make_body) |
168 | 13 from nagslang.mutators import FLIP_H |
14 from nagslang.resources import resources | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
15 from nagslang.utils import vec_with_length |
168 | 16 |
17 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
18 def get_editable_enemies(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
19 classes = [] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
20 for cls_name, cls in globals().iteritems(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
21 if isinstance(cls, type) and issubclass(cls, Enemy): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
22 if hasattr(cls, 'requires'): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
23 classes.append((cls_name, cls)) |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
24 return classes |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
25 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
26 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
27 def get_alien_image(enemy_type, suffix, *transforms): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
28 image_name = 'alien_%s_%s.png' % (enemy_type, suffix) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
29 return resources.get_image('creatures', image_name, transforms=transforms) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
30 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
31 |
168 | 32 class Enemy(GameObject): |
33 """A base class for mobile enemies""" | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
34 zorder = ZORDER_MID |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
35 enemy_type = None # Which set of images to use |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
36 enemy_damage = None |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
37 health = None |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
38 impulse_factor = None |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
39 random_move_time = 0.3 |
168 | 40 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
41 def __init__(self, space, world, position): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
42 super(Enemy, self).__init__( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
43 self.make_physics(space, position), self.make_renderer()) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
44 self.world = world |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
45 self.angle = 0 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
46 self.add_timer('random_move', self.random_move_time) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
47 self._last_random_direction = (0, 0) |
168 | 48 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
49 def make_physics(self, space, position): |
168 | 50 raise NotImplementedError |
51 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
52 def make_renderer(self): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
53 return render.FacingSelectionRenderer({ |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
54 'left': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
55 [get_alien_image(self.enemy_type, '1'), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
56 get_alien_image(self.enemy_type, '2')], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
57 'right': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
58 [get_alien_image(self.enemy_type, '1', FLIP_H), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
59 get_alien_image(self.enemy_type, '2', FLIP_H)], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
60 }) |
168 | 61 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
62 def get_render_angle(self): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
63 # No image rotation when rendering, please. |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
64 return 0 |
168 | 65 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
66 def get_facing_direction(self): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
67 # Enemies can face left or right. |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
68 if - math.pi / 2 < self.angle <= math.pi / 2: |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
69 return 'right' |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
70 else: |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
71 return 'left' |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
72 |
310
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
73 def hit(self, weapon): |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
74 self.lose_health(weapon.damage) |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
75 |
305 | 76 def lose_health(self, amount): |
77 self.health -= amount | |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
78 if self.health <= 0: |
406
7fcde01ea50e
No, we really don't need EnemyDeathEvent
Stefano Rivera <stefano@rivera.za.net>
parents:
393
diff
changeset
|
79 self.world.kills += 1 |
305 | 80 self.physicser.remove_from_space() |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
81 |
446 | 82 def set_direction(self, dx, dy, force_factor=1): |
83 vec = vec_with_length((dx, dy), self.impulse_factor * force_factor) | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
84 self.angle = vec.angle |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
85 self.physicser.apply_impulse(vec) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
86 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
87 def collide_with_protagonist(self, protagonist): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
88 if self.enemy_damage is not None: |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
89 protagonist.lose_health(self.enemy_damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
90 |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
91 def collide_with_claw_attack(self, claw_attack): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
92 self.lose_health(claw_attack.damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
93 |
409
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
94 def range_to_visible_protagonist(self): |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
95 """Get a vector to the protagonist if there are no barriers in between. |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
96 |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
97 Returns a vector to the protagonist if she is within line of sight, |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
98 otherwise `None` |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
99 """ |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
100 |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
101 pos = self.physicser.position |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
102 target = self.world.protagonist.get_shape().body.position |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
103 |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
104 for collision in self.get_space().segment_query(pos, target): |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
105 shape = collision.shape |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
106 if (shape in (self.get_shape(), self.world.protagonist.get_shape()) |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
107 or shape.sensor): |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
108 continue |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
109 return None |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
110 return target - pos |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
111 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
112 def ranged_attack(self, range_, speed, damage, type_, reload_time, result): |
409
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
113 vec = self.range_to_visible_protagonist() |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
114 if vec is None: |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
115 return |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
116 |
372
024304f6d068
Use timers for enemy ballistics cooldown.
Jeremy Thurgood <firxen@gmail.com>
parents:
368
diff
changeset
|
117 if not self.check_timer('reload_time'): |
024304f6d068
Use timers for enemy ballistics cooldown.
Jeremy Thurgood <firxen@gmail.com>
parents:
368
diff
changeset
|
118 self.start_timer('reload_time', reload_time) |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
119 if vec.length < range_: |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
120 vec.length = speed |
409
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
121 result.add += (Bullet( |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
122 self.get_space(), self.physicser.position, vec, damage, |
180c27514619
Better protagonist finding for enemies.
Jeremy Thurgood <firxen@gmail.com>
parents:
406
diff
changeset
|
123 type_, COLLISION_TYPE_ENEMY),) |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
124 |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
125 def greedy_move(self, target): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
126 """Simple greedy path finder""" |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
127 def _calc_step(tp, pp): |
453 | 128 step = 0 |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
129 if (tp < pp): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
130 step = max(-1, tp - pp) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
131 elif (tp > pp): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
132 step = min(1, tp - pp) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
133 if abs(step) < 0.5: |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
134 step = 0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
135 return step |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
136 x_step = _calc_step(target[0], self.physicser.position[0]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
137 y_step = _calc_step(target[1], self.physicser.position[1]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
138 return (x_step, y_step) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
139 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
140 def random_move(self): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
141 """Random move""" |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
142 if not self.check_timer('random_move'): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
143 self.start_timer('random_move') |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
144 self._last_random_direction = ( |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
145 random.choice([-1, 0, 1]), random.choice([-1, 0, 1])) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
146 return self._last_random_direction |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
147 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
148 def attack(self, result): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
149 pass |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
150 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
151 def move(self, result): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
152 pass |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
153 |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
154 def update(self, dt): |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
155 super(Enemy, self).update(dt) |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
156 result = Result() |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
157 if self.health <= 0: |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
158 result.remove += (self,) |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
159 result.add += (DeadEnemy(self.get_space(), self.world, |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
160 self.physicser.position, |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
161 self.enemy_type),) |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
162 self.move(result) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
163 self.attack(result) |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
391
diff
changeset
|
164 return result |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
165 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
166 @classmethod |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
167 def requires(cls): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
168 return [("name", "string"), ("position", "coordinates")] |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
169 |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
170 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
171 class DeadEnemy(GameObject): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
172 def __init__(self, space, world, position, enemy_type='A'): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
173 body = make_body(10, 10000, position, damping=0.5) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
174 self.shape = pymunk.Poly( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
175 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)]) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
176 self.shape.friction = 0.5 |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
310
diff
changeset
|
177 self.shape.collision_type = COLLISION_TYPE_FURNITURE |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
178 super(DeadEnemy, self).__init__( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
179 SingleShapePhysicser(space, self.shape), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
180 render.ImageRenderer(resources.get_image( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
181 'creatures', 'alien_%s_dead.png' % enemy_type)), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
182 ) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
183 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
184 @classmethod |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
185 def requires(cls): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
186 return [("name", "string"), ("position", "coordinates")] |
305 | 187 |
168 | 188 |
189 class PatrollingAlien(Enemy): | |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
190 is_moving = True # Always walking. |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
191 enemy_type = 'A' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
192 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
193 enemy_damage = 15 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
194 impulse_factor = 50 |
168 | 195 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
196 def __init__(self, space, world, position, end_position): |
168 | 197 # 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
|
198 super(PatrollingAlien, self).__init__(space, world, position) |
168 | 199 self._start_pos = position |
200 self._end_pos = end_position | |
201 self._direction = 'away' | |
202 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
203 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
204 body = make_body(10, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
205 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
206 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
207 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
208 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
209 return SingleShapePhysicser(space, shape) |
168 | 210 |
211 def _switch_direction(self): | |
212 if self._direction == 'away': | |
213 self._direction = 'towards' | |
214 else: | |
215 self._direction = 'away' | |
216 | |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
217 def move(self, result): |
168 | 218 if self._direction == 'away': |
219 target = self._end_pos | |
220 else: | |
221 target = self._start_pos | |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
222 x_step, y_step = self.greedy_move(target) |
168 | 223 if abs(x_step) < 1 and abs(y_step) < 1: |
224 self._switch_direction() | |
225 self.set_direction(x_step, y_step) | |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
226 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
227 def attack(self, result): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
228 self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2, result) |
258 | 229 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
230 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
231 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
232 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
233 ("end_position", "coordinates")] |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
234 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
235 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
236 class ChargingAlien(Enemy): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
237 # Simplistic charging of the protagonist |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
238 is_moving = False |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
239 enemy_type = 'B' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
240 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
241 enemy_damage = 20 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
242 impulse_factor = 300 |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
243 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
244 def __init__(self, space, world, position, attack_range=100): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
245 super(ChargingAlien, self).__init__(space, world, position) |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
246 self._range = attack_range |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
247 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
248 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
249 body = make_body(100, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
250 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
251 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
252 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
253 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
254 return SingleShapePhysicser(space, shape) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
255 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
256 def move(self, result): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
257 pos = self.physicser.position |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
258 target = self.world.protagonist.get_shape().body.position |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
259 if pos.get_distance(target) > self._range: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
260 # stop |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
261 self.is_moving = False |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
262 return 0, 0 |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
263 self.is_moving = True |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
264 dx, dy = self.greedy_move(target) |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
265 self.set_direction(dx, dy) |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
266 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
267 def attack(self, result): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
268 self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2, result) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
269 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
270 @classmethod |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
271 def requires(cls): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
272 return [("name", "string"), ("position", "coordinates"), |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
273 ("attack_range", "distance")] |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
274 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
275 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
276 class RunAndGunAlien(ChargingAlien): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
277 # Simplistic shooter |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
278 # Move until we're in range, and then randomly |
500
6ca8fc93a40d
split out first alien chamber
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
453
diff
changeset
|
279 enemy_type = "C" |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
280 impulse_factor = 90 |
500
6ca8fc93a40d
split out first alien chamber
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
453
diff
changeset
|
281 health = 42 |
6ca8fc93a40d
split out first alien chamber
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
453
diff
changeset
|
282 enemy_damage = 25 |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
283 is_moving = True |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
284 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
285 def make_physics(self, space, position): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
286 body = make_body(10, pymunk.inf, position, 0.8) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
287 shape = pymunk.Circle(body, 30) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
288 shape.elasticity = 1.0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
289 shape.friction = 0.05 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
290 shape.collision_type = COLLISION_TYPE_ENEMY |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
291 return SingleShapePhysicser(space, shape) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
292 |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
293 def move(self, result): |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
294 pos = self.physicser.position |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
295 target = self.world.protagonist.get_shape().body.position |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
296 if pos.get_distance(target) < self._range: |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
297 step = self.random_move() |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
298 else: |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
299 step = self.greedy_move(target) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
300 self.set_direction(*step) |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
301 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
302 @classmethod |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
303 def requires(cls): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
304 return [("name", "string"), ("position", "coordinates"), |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
305 ("attack_range", "distance")] |
554 | 306 |
553
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
307 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
308 class Queen(RunAndGunAlien): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
309 enemy_type = "queen" |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
310 impulse_factor = 180 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
311 health = 500 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
312 enemy_damage = 50 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
313 is_moving = True |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
314 spawn_time = 10 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
315 spawn_size = 5 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
316 spawn_class = ChargingAlien |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
317 spawn_class_args = (200,) |
554 | 318 |
553
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
319 def __init__(self, space, world, position, attack_range=100): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
320 super(Queen, self).__init__(space, world, position, attack_range) |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
321 self.add_timer('spawn', self.spawn_time) |
554 | 322 |
553
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
323 def spawn(self, result): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
324 if not self.check_timer('spawn'): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
325 self.start_timer('spawn', self.spawn_time) |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
326 for i in range(self.spawn_size): |
554 | 327 result.add += (self.spawn_class(self.get_space(), |
328 self.world, self.physicser.position, | |
553
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
329 *self.spawn_class_args),) |
554 | 330 |
553
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
331 def attack(self, result): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
332 self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 1, result) |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
333 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
334 def update(self, dt): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
335 result = super(Queen, self).update(dt) |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
336 self.spawn(result) |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
337 return result |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
338 |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
339 @classmethod |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
340 def requires(cls): |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
341 return [("name", "string"), ("position", "coordinates"), |
a47100b28b7d
the black goat with a thousand young
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
500
diff
changeset
|
342 ("attack_range", "distance")] |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
343 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
344 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
345 class Sheep(Enemy): # Only because we don't have a DeliciousCreature class. |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
346 is_moving = True # Always walking. |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
347 enemy_type = 'sheep' |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
348 health = 10 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
349 impulse_factor = 50 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
350 |
415 | 351 human_vision_range = 100 |
352 wolf_vision_range = 200 | |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
353 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
354 def make_physics(self, space, position): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
355 body = make_body(10, pymunk.inf, position, 0.8) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
356 shape = pymunk.Circle(body, 30) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
357 shape.elasticity = 1.0 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
358 shape.friction = 0.05 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
359 shape.collision_type = COLLISION_TYPE_SHEEP |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
360 return SingleShapePhysicser(space, shape) |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
361 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
362 def move(self, result): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
363 vec = self.range_to_visible_protagonist() |
415 | 364 prot = self.world.protagonist |
365 if vec is not None: | |
366 if prot.in_human_form() and vec.length < self.human_vision_range: | |
446 | 367 self.set_direction(vec.x, vec.y, 1.5) |
368 return | |
415 | 369 if prot.in_wolf_form() and vec.length < self.wolf_vision_range: |
446 | 370 vec = -vec |
371 self.set_direction(vec.x, vec.y, 3) | |
372 return | |
373 self.set_direction(*self.random_move()) | |
410
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
374 |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
375 @classmethod |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
376 def requires(cls): |
d7bd9adb105a
Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents:
409
diff
changeset
|
377 return [("name", "string"), ("position", "coordinates")] |