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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
229
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 218
diff changeset
1 import math
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 import pymunk
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 import pymunk.pygame_util
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 168
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 from nagslang.mutators import FLIP_H
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
32 class Enemy(GameObject):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48
334
a3f1b2f0e3fb Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 333
diff changeset
49 def make_physics(self, space, position):
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
50 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
76 def lose_health(self, amount):
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
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
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
80 self.physicser.remove_from_space()
308
3dee86b6c216 Enemies leave corpses
Stefano Rivera <stefano@rivera.za.net>
parents: 307
diff changeset
81
446
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
82 def set_direction(self, dx, dy, force_factor=1):
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
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
12c71124bbca Zero is allowed
Neil Muller <drnlmuller@gmail.com>
parents: 446
diff changeset
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
ce11e1cae0ed Enemies now die
Stefano Rivera <stefano@rivera.za.net>
parents: 278
diff changeset
187
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
188
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
199 self._start_pos = position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
200 self._end_pos = end_position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
201 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
210
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
211 def _switch_direction(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
212 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
213 self._direction = 'towards'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
214 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
215 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
216
410
d7bd9adb105a Sheep! (And refactoring!)
Jeremy Thurgood <firxen@gmail.com>
parents: 409
diff changeset
217 def move(self, result):
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
218 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
219 target = self._end_pos
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
220 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
223 if abs(x_step) < 1 and abs(y_step) < 1:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
224 self._switch_direction()
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
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
083053422a84 Added collision damage with enemies.
David Sharpe
parents: 235
diff changeset
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
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
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
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
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
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
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
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
327 result.add += (self.spawn_class(self.get_space(),
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
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
400f52d4279d whitespace
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 553
diff changeset
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
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
351 human_vision_range = 100
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
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
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
364 prot = self.world.protagonist
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
365 if vec is not None:
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
366 if prot.in_human_form() and vec.length < self.human_vision_range:
446
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
367 self.set_direction(vec.x, vec.y, 1.5)
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
368 return
415
9d2a8dfba670 Sheep behaviour.
Jeremy Thurgood <firxen@gmail.com>
parents: 410
diff changeset
369 if prot.in_wolf_form() and vec.length < self.wolf_vision_range:
446
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
370 vec = -vec
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
371 self.set_direction(vec.x, vec.y, 3)
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
372 return
3054c62f9d64 Faster sheep running.
Jeremy Thurgood <firxen@gmail.com>
parents: 415
diff changeset
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")]