Mercurial > nagslang
annotate nagslang/enemies.py @ 391:866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 07 Sep 2013 00:42:09 +0200 |
parents | 51deb78cae52 |
children | 8d961e05b7b6 |
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 | |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
6 from pymunk.vec2d import Vec2d |
168 | 7 |
207 | 8 from nagslang import render |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
310
diff
changeset
|
9 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
|
10 ACID_SPEED, ACID_DAMAGE, ZORDER_MID) |
391
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
11 from nagslang.events import FireEvent, EnemyDeathEvent |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
12 from nagslang.game_object import (GameObject, SingleShapePhysicser, Result, |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
13 make_body) |
168 | 14 from nagslang.mutators import FLIP_H |
15 from nagslang.resources import resources | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
16 from nagslang.utils import vec_with_length |
168 | 17 |
18 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
19 def get_editable_enemies(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
20 classes = [] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
21 for cls_name, cls in globals().iteritems(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
22 if isinstance(cls, type) and issubclass(cls, Enemy): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
23 if hasattr(cls, 'requires'): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
24 classes.append((cls_name, cls)) |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
25 return classes |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
26 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
27 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
28 def get_alien_image(enemy_type, suffix, *transforms): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
29 image_name = 'alien_%s_%s.png' % (enemy_type, suffix) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
30 return resources.get_image('creatures', image_name, transforms=transforms) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
31 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
32 |
168 | 33 class Enemy(GameObject): |
34 """A base class for mobile enemies""" | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
35 zorder = ZORDER_MID |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
36 enemy_type = None # Which set of images to use |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
37 enemy_damage = None |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
38 health = None |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
39 impulse_factor = None |
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 |
168 | 46 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
47 def make_physics(self, space, position): |
168 | 48 raise NotImplementedError |
49 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
50 def make_renderer(self): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
51 return render.FacingSelectionRenderer({ |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
52 'left': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
53 [get_alien_image(self.enemy_type, '1'), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
54 get_alien_image(self.enemy_type, '2')], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
55 'right': render.TimedAnimatedRenderer( |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
56 [get_alien_image(self.enemy_type, '1', FLIP_H), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
57 get_alien_image(self.enemy_type, '2', FLIP_H)], 3), |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
58 }) |
168 | 59 |
60 def attack(self): | |
61 raise NotImplementedError | |
62 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
63 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
64 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
65 return [("name", "string"), ("position", "coordinates")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
66 |
310
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
67 def hit(self, weapon): |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
68 self.lose_health(weapon.damage) |
fa408430a174
Now *both* types of enemies die
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
69 |
305 | 70 def lose_health(self, amount): |
71 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
|
72 if self.health <= 0: |
391
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
73 EnemyDeathEvent.post() |
305 | 74 self.physicser.remove_from_space() |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
75 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
76 def set_direction(self, dx, dy): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
77 vec = vec_with_length((dx, dy), self.impulse_factor) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
78 self.angle = vec.angle |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
79 self.physicser.apply_impulse(vec) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
80 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
81 def collide_with_protagonist(self, protagonist): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
82 if self.enemy_damage is not None: |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
83 protagonist.lose_health(self.enemy_damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
84 |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
85 def collide_with_claw_attack(self, claw_attack): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
86 self.lose_health(claw_attack.damage) |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
87 |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
88 def ranged_attack(self, range_, speed, damage, type_, reload_time): |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
89 pos = self.physicser.position |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
90 target = self.world.protagonist.get_shape().body.position |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
91 |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
92 r = self.get_space().segment_query(pos, target) |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
93 for collision in r: |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
94 shape = collision.shape |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
95 if (shape in (self.get_shape(), self.world.protagonist.get_shape()) |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
96 or shape.sensor): |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
97 continue |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
98 return |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
99 |
372
024304f6d068
Use timers for enemy ballistics cooldown.
Jeremy Thurgood <firxen@gmail.com>
parents:
368
diff
changeset
|
100 if not self.check_timer('reload_time'): |
024304f6d068
Use timers for enemy ballistics cooldown.
Jeremy Thurgood <firxen@gmail.com>
parents:
368
diff
changeset
|
101 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
|
102 vec = Vec2d((target.x - pos.x, target.y - pos.y)) |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
103 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
|
104 vec.length = speed |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
105 FireEvent.post(pos, vec, damage, type_, |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
106 COLLISION_TYPE_ENEMY) |
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
107 |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
108 def greedy_move(self, target): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
109 """Simple greedy path finder""" |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
110 def _calc_step(tp, pp): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
111 if (tp < pp): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
112 step = max(-1, tp - pp) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
113 elif (tp > pp): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
114 step = min(1, tp - pp) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
115 if abs(step) < 0.5: |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
116 step = 0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
117 return step |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
118 x_step = _calc_step(target[0], self.physicser.position[0]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
119 y_step = _calc_step(target[1], self.physicser.position[1]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
120 return (x_step, y_step) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
121 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
122 def random_move(self): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
123 """Random move""" |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
124 x_step = random.choice([-1, 0, 1]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
125 y_step = random.choice([-1, 0, 1]) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
126 return x_step, y_step |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
127 |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
128 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
|
129 super(Enemy, self).update(dt) |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
130 if self.health <= 0: |
391
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
131 return Result( |
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
132 add=[DeadEnemy(self.get_space(), self.world, |
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
133 self.physicser.position, self.enemy_type)], |
866cdc74b26a
Use Result to handle enemy death (but keep the event for accounting purposes)
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
134 remove=[self]) |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
135 |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
136 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
137 class DeadEnemy(GameObject): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
138 def __init__(self, space, world, position, enemy_type='A'): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
139 body = make_body(10, 10000, position, damping=0.5) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
140 self.shape = pymunk.Poly( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
141 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)]) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
142 self.shape.friction = 0.5 |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
310
diff
changeset
|
143 self.shape.collision_type = COLLISION_TYPE_FURNITURE |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
144 super(DeadEnemy, self).__init__( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
145 SingleShapePhysicser(space, self.shape), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
146 render.ImageRenderer(resources.get_image( |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
147 'creatures', 'alien_%s_dead.png' % enemy_type)), |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
148 ) |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
149 |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
150 @classmethod |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
151 def requires(cls): |
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
152 return [("name", "string"), ("position", "coordinates")] |
305 | 153 |
168 | 154 |
155 class PatrollingAlien(Enemy): | |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
156 is_moving = True # Always walking. |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
157 enemy_type = 'A' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
158 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
159 enemy_damage = 15 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
160 impulse_factor = 50 |
168 | 161 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
162 def __init__(self, space, world, position, end_position): |
168 | 163 # 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
|
164 super(PatrollingAlien, self).__init__(space, world, position) |
168 | 165 self._start_pos = position |
166 self._end_pos = end_position | |
167 self._direction = 'away' | |
168 | |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
169 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
170 body = make_body(10, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
171 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
172 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
173 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
174 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
175 return SingleShapePhysicser(space, shape) |
168 | 176 |
177 def get_render_angle(self): | |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
178 # No image rotation when rendering, please. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
179 return 0 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
180 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
181 def get_facing_direction(self): |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
182 # Enemies can face left or right. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
183 if - math.pi / 2 < self.angle <= math.pi / 2: |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
184 return 'right' |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
185 else: |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
186 return 'left' |
168 | 187 |
188 def _switch_direction(self): | |
189 if self._direction == 'away': | |
190 self._direction = 'towards' | |
191 else: | |
192 self._direction = 'away' | |
193 | |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
318
diff
changeset
|
194 def update(self, dt): |
168 | 195 # Calculate the step every frame |
196 if self._direction == 'away': | |
197 target = self._end_pos | |
198 else: | |
199 target = self._start_pos | |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
200 x_step, y_step = self.greedy_move(target) |
168 | 201 if abs(x_step) < 1 and abs(y_step) < 1: |
202 self._switch_direction() | |
203 self.set_direction(x_step, y_step) | |
366
9898fa231c4b
Move ranged attack code to Enemy. Don't shoot through solid objects
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
204 self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2) |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
205 return super(PatrollingAlien, self).update(dt) |
258 | 206 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
207 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
208 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
209 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
210 ("end_position", "coordinates")] |
278
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 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
213 class ChargingAlien(Enemy): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
214 # Simplistic charging of the protagonist |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
215 is_moving = False |
308
3dee86b6c216
Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
216 enemy_type = 'B' |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
217 health = 42 |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
334
diff
changeset
|
218 enemy_damage = 20 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
219 impulse_factor = 300 |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
220 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
221 def __init__(self, space, world, position, attack_range=100): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
222 super(ChargingAlien, self).__init__(space, world, position) |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
223 self._range = attack_range |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
224 |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
225 def make_physics(self, space, position): |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
226 body = make_body(100, pymunk.inf, position, 0.8) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
227 shape = pymunk.Circle(body, 30) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
228 shape.elasticity = 1.0 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
229 shape.friction = 0.05 |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
230 shape.collision_type = COLLISION_TYPE_ENEMY |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
231 return SingleShapePhysicser(space, shape) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
232 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
233 def get_render_angle(self): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
234 # No image rotation when rendering, please. |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
235 return 0 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
236 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
237 def get_facing_direction(self): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
238 # Enemies can face left or right. |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
239 if - math.pi / 2 < self.angle <= math.pi / 2: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
240 return 'right' |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
241 else: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
242 return 'left' |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
243 |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
244 def _calc_movement(self): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
245 pos = self.physicser.position |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
246 target = self.world.protagonist.get_shape().body.position |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
247 if pos.get_distance(target) > self._range: |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
248 # stop |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
249 self.is_moving = False |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
250 return 0, 0 |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
251 self.is_moving = True |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
252 dx, dy = self.greedy_move(target) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
253 return dx, dy |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
254 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
255 def update(self, dt): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
256 # Calculate the step every frame |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
257 # Distance to the protagonist |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
258 self.ranged_attack(300, ACID_SPEED, ACID_DAMAGE, 'acid', 0.2) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
259 dx, dy = self._calc_movement() |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
358
diff
changeset
|
260 self.set_direction(dx, dy) |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
261 return super(ChargingAlien, self).update(dt) |
278
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
262 |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
263 @classmethod |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
264 def requires(cls): |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
265 return [("name", "string"), ("position", "coordinates"), |
e72025e9aa07
simple slow charging alien
Neil Muller <drnlmuller@gmail.com>
parents:
277
diff
changeset
|
266 ("attack_range", "distance")] |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
267 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
268 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
269 class RunAndGunAlien(ChargingAlien): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
270 # Simplistic shooter |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
271 # Move until we're in range, and then randomly |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
272 impulse_factor = 90 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
273 is_moving = True |
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 def __init__(self, space, world, position, attack_range=100): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
276 super(RunAndGunAlien, self).__init__(space, world, position, |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
277 attack_range) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
278 self.count = 0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
279 self._old_move = (0, 0) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
280 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
281 def make_physics(self, space, position): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
282 body = make_body(10, pymunk.inf, position, 0.8) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
283 shape = pymunk.Circle(body, 30) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
284 shape.elasticity = 1.0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
285 shape.friction = 0.05 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
286 shape.collision_type = COLLISION_TYPE_ENEMY |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
287 return SingleShapePhysicser(space, shape) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
288 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
289 def _calc_movement(self): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
290 pos = self.physicser.position |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
291 target = self.world.protagonist.get_shape().body.position |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
292 if pos.get_distance(target) < self._range: |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
293 if self.count > 10: |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
294 self._old_move = self.random_move() |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
295 self.count = 0 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
296 return self._old_move |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
297 else: |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
298 return self.greedy_move(target) |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
299 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
300 def update(self, dt): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
301 self.count += 1 |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
372
diff
changeset
|
302 return super(RunAndGunAlien, self).update(dt) |
368
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
303 |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
304 @classmethod |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
305 def requires(cls): |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
306 return [("name", "string"), ("position", "coordinates"), |
57895217bd74
Start refactoring alien movement
Neil Muller <drnlmuller@gmail.com>
parents:
366
diff
changeset
|
307 ("attack_range", "distance")] |