Mercurial > nagslang
annotate nagslang/protagonist.py @ 394:76f053cf2322
Use Result instead of ClawEvent
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 07 Sep 2013 01:10:53 +0200 |
parents | 8d961e05b7b6 |
children | a7d48819a711 |
rev | line source |
---|---|
356 | 1 import math |
2 | |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
3 import pymunk |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
4 import pymunk.pygame_util |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
5 |
207 | 6 from nagslang import render |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
7 from nagslang.constants import ( |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
8 COLLISION_TYPE_PLAYER, ZORDER_MID, WEREWOLF_SOAK_FACTOR, |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
9 PROTAGONIST_HEALTH_MIN_LEVEL, PROTAGONIST_HEALTH_MAX_LEVEL, |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
357
diff
changeset
|
10 NON_GAME_OBJECT_COLLIDERS, BULLET_DAMAGE, BULLET_SPEED, CLAW_DAMAGE, |
371 | 11 CMD_TOGGLE_FORM, CMD_ACTION) |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
12 from nagslang.game_object import ( |
394
76f053cf2322
Use Result instead of ClawEvent
Stefano Rivera <stefano@rivera.za.net>
parents:
393
diff
changeset
|
13 GameObject, Physicser, Result, Bullet, ClawAttack, make_body) |
76 | 14 from nagslang.mutators import FLIP_H |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
15 from nagslang.resources import resources |
285 | 16 from nagslang.events import ScreenChange |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
17 from nagslang.utils import vec_from_angle, vec_with_length |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
18 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
19 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
20 class ProtagonistPhysicser(Physicser): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
21 def __init__(self, space, form_shapes): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
22 self._space = space |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
23 self._form_shapes = form_shapes |
367
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
24 for shape in form_shapes.values(): |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
25 shape.physicser = self |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
26 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
27 def switch_form(self, old_form, new_form): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
28 self._space.remove(self._form_shapes[old_form]) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
29 shape = self._form_shapes[new_form] |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
30 self._space.add(shape) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
31 for attr, value in shape.protagonist_body_props.iteritems(): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
32 setattr(shape.body, attr, value) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
33 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
34 def get_shape(self): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
35 return self._form_shapes[self.game_object.form] |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
36 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
37 |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
38 class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer): |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
39 def select_renderer(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
40 return self.game_object.form |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
41 |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
42 |
338 | 43 def _make_change_sequence(old, new): |
44 return ( | |
45 new, new, old, old, old, old, | |
46 new, new, old, old, old, | |
47 new, new, old, old, | |
48 new, new, new, old, old, | |
49 new, new, new, new, old, old, | |
50 new) | |
51 | |
52 | |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
53 class Protagonist(GameObject): |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 """Representation of our fearless protagonist. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
55 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
56 TODO: Factor out a bunch of this stuff when we need it for other objects. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
57 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
58 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
59 HUMAN_FORM = 'human' |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
60 WOLF_FORM = 'wolf' |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
61 |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
62 CHANGING_SEQUENCE = { |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
63 # The key is the form we're changing *from*. |
338 | 64 HUMAN_FORM: _make_change_sequence(HUMAN_FORM, WOLF_FORM), |
65 WOLF_FORM: _make_change_sequence(WOLF_FORM, HUMAN_FORM), | |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
66 } |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
67 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
68 zorder = ZORDER_MID |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
69 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
276
diff
changeset
|
70 def __init__(self, space, world, position): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
71 self.form = self.HUMAN_FORM |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
72 super(Protagonist, self).__init__( |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
73 self._make_physics(space, position), self._make_renderer()) |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
74 self.world = world |
339
9137e792307b
Use constants for health.
Jeremy Thurgood <firxen@gmail.com>
parents:
338
diff
changeset
|
75 self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
76 |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
77 self.angle = 0 |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
78 self.is_moving = False |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
79 self.changing_sequence = [] |
371 | 80 self.add_timer('attack_cooldown', 0.2) |
81 self.add_timer('change_delay', 0.1) | |
246 | 82 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
83 self.go_human() |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
84 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
85 def _make_physics(self, space, position): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
86 body = make_body(10, pymunk.inf, position, 0.8) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
87 body.velocity_limit = 1000 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
88 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
89 human = pymunk.Poly(body, [(-15, -30), (15, -30), (15, 30), (-15, 30)]) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
90 human.elasticity = 1.0 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
91 human.collision_type = COLLISION_TYPE_PLAYER |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
92 human.protagonist_body_props = { |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
93 'mass': 10, |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
94 'damping': 0.8, |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
81
diff
changeset
|
95 } |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
96 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
97 wolf = pymunk.Circle(body, 30) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
98 wolf.elasticity = 1.0 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
99 wolf.collision_type = COLLISION_TYPE_PLAYER |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
100 wolf.protagonist_body_props = { |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
101 'mass': 100, |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
102 'damping': 0.9, |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
103 } |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
104 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
105 return ProtagonistPhysicser(space, { |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
106 self.HUMAN_FORM: human, |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
107 self.WOLF_FORM: wolf, |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
108 }) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
109 |
66 | 110 def _get_image(self, name, *transforms): |
111 return resources.get_image('creatures', name, transforms=transforms) | |
112 | |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
113 def change_space(self, new_space): |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
114 self.physicser.remove_from_space() |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
115 self.physicser.set_space(new_space) |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
116 self.physicser.add_to_space() |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
265
diff
changeset
|
117 |
285 | 118 def reset(self): |
339
9137e792307b
Use constants for health.
Jeremy Thurgood <firxen@gmail.com>
parents:
338
diff
changeset
|
119 self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL |
285 | 120 self.is_moving = False |
121 | |
122 self.go_human() | |
123 | |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
124 def _make_renderer(self): |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
125 return ProtagonistFormSelectionRenderer({ |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
126 self.HUMAN_FORM: render.FacingSelectionRenderer( |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
127 { |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
128 'N': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
129 [self._get_image('human_N_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
130 self._get_image('human_N_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
131 'S': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
132 [self._get_image('human_S_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
133 self._get_image('human_S_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
134 'W': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
135 [self._get_image('human_W_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
136 self._get_image('human_W_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
137 'E': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
138 [self._get_image('human_W_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
139 self._get_image('human_W_2.png', FLIP_H)], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
140 'NW': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
141 [self._get_image('human_NW_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
142 self._get_image('human_NW_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
143 'NE': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
144 [self._get_image('human_NW_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
145 self._get_image('human_NW_2.png', FLIP_H)], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
146 'SW': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
147 [self._get_image('human_SW_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
148 self._get_image('human_SW_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
149 'SE': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
150 [self._get_image('human_SW_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
151 self._get_image('human_SW_2.png', FLIP_H)], 3), |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
152 }), |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
153 self.WOLF_FORM: render.FacingSelectionRenderer( |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
154 { |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
155 'N': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
156 [self._get_image('werewolf_N_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
157 self._get_image('werewolf_N_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
158 'S': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
159 [self._get_image('werewolf_S_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
160 self._get_image('werewolf_S_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
161 'W': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
162 [self._get_image('werewolf_W_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
163 self._get_image('werewolf_W_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
164 'E': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
165 [self._get_image('werewolf_W_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
166 self._get_image('werewolf_W_2.png', FLIP_H)], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
167 'NW': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
168 [self._get_image('werewolf_NW_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
169 self._get_image('werewolf_NW_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
170 'NE': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
171 [self._get_image('werewolf_NW_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
172 self._get_image('werewolf_NW_2.png', FLIP_H)], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
173 'SW': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
174 [self._get_image('werewolf_SW_1.png'), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
175 self._get_image('werewolf_SW_2.png')], 3), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
176 'SE': render.MovementAnimatedRenderer( |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
177 [self._get_image('werewolf_SW_1.png', FLIP_H), |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
178 self._get_image('werewolf_SW_2.png', FLIP_H)], 3), |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
179 }), |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
180 }) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
181 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
182 @classmethod |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
183 def from_saved_state(cls, saved_state): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
184 """Create an instance from the provided serialised state. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
185 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
186 obj = cls() |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
187 # TODO: Update from saved state. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
188 return obj |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
189 |
371 | 190 def handle_attack_key_down(self): |
191 if self.changing_sequence or self.check_timer('attack_cooldown'): | |
192 return | |
193 self.start_timer('attack_cooldown') | |
194 self.world.attacks += 1 | |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
195 return self.attack() |
371 | 196 |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
197 def handle_keypress(self, key_command): |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
198 if self.changing_sequence: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
199 return |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
200 if key_command == CMD_TOGGLE_FORM: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
201 self.world.transformations += 1 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
202 self.toggle_form() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
203 if key_command == CMD_ACTION: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
204 self.perform_action() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
205 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
81
diff
changeset
|
206 def get_render_angle(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
207 # No image rotation when rendering, please. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
208 return 0 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
209 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
210 def get_facing_direction(self): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
211 # Our angle is quantised to 45 degree intervals, so possible values for |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
212 # x and y in a unit vector are +/-(0, sqrt(2)/2, 1) with some floating |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
213 # point imprecision. Rounding will normalise these to (-1.0, 0.0, 1.0) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
214 # which we can safely turn into integers and use as dict keys. |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
215 vec = vec_from_angle(self.angle) |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
216 x = int(round(vec.x)) |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
217 y = int(round(vec.y)) |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
218 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
219 return { |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
220 (0, 1): 'N', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
221 (0, -1): 'S', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
222 (-1, 0): 'W', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
223 (1, 0): 'E', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
224 (1, 1): 'NE', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
225 (1, -1): 'SE', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
226 (-1, 1): 'NW', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
227 (-1, -1): 'SW', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
228 }[(x, y)] |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
81
diff
changeset
|
229 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
230 def go_werewolf(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
231 self.physicser.switch_form(self.form, self.WOLF_FORM) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
232 self.form = self.WOLF_FORM |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
233 self.impulse_factor = 4000 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
234 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
235 def go_human(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
236 self.physicser.switch_form(self.form, self.HUMAN_FORM) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
237 self.form = self.HUMAN_FORM |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
238 self.impulse_factor = 500 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
239 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
240 def set_direction(self, dx, dy): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
241 if (dx, dy) == (0, 0) or self.changing_sequence: |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
242 self.is_moving = False |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
243 return |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
244 self.is_moving = True |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
245 vec = vec_with_length((dx, dy), self.impulse_factor) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
246 self.angle = vec.angle |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
247 self.physicser.apply_impulse(vec) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
248 |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
249 def set_position(self, position): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
250 self.physicser.position = position |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
251 |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
252 def copy_state(self, old_protagonist): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
253 self.physicser.position = old_protagonist.physicser.position |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
254 self.physicser.switch_form(self.form, old_protagonist.form) |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
255 self.impulse_factor = old_protagonist.impulse_factor |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
256 self.form = old_protagonist.form |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
257 self.angle = old_protagonist.angle |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
258 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
259 def toggle_form(self): |
371 | 260 if self.check_timer('change_delay'): |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
261 return |
338 | 262 self.changing_sequence.extend(self.CHANGING_SEQUENCE[self.form]) |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
263 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
264 def _go_to_next_form(self): |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
265 if self.changing_sequence.pop(0) == self.WOLF_FORM: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
266 self.go_werewolf() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
267 else: |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
268 self.go_human() |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
269 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
270 def get_current_interactible(self): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
271 for shape in self.get_space().shape_query(self.get_shape()): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
272 if shape.collision_type in NON_GAME_OBJECT_COLLIDERS: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
273 # No game object here. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
274 continue |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
275 interactible = shape.physicser.game_object.interactible |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
276 if interactible is not None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
277 return interactible |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
278 return None |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
279 |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
280 def perform_action(self): |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
281 """Perform an action on the target. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
282 """ |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
283 interactible = self.get_current_interactible() |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
284 if interactible is None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
285 # Nothing to interact with. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
286 return |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
287 action = interactible.select_action(self) |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
288 if action is None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
289 # Nothing to do with it. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
290 return |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
291 return action.perform(self) |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
292 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
293 def attack(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
294 """Attempt to hurt something. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
295 """ |
265 | 296 if self.in_wolf_form(): |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
297 return self.claw() |
265 | 298 else: |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
299 return self.shoot() |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
300 |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
301 def shoot(self): |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
302 if not self.has_item('gun'): |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
303 return |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
357
diff
changeset
|
304 vec = vec_from_angle(self.angle, BULLET_SPEED) |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
305 return Result(add=(Bullet(self.get_space(), self.physicser.position, |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
306 vec, BULLET_DAMAGE, 'bullet', |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
307 COLLISION_TYPE_PLAYER),)) |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
308 |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
309
diff
changeset
|
309 def claw(self): |
356 | 310 claw_range = (math.sqrt(math.pow(self.physicser.get_velocity()[0], 2) + |
311 math.pow(self.physicser.get_velocity()[1], 2)) | |
312 / 20) + 30 | |
313 vec = vec_from_angle(self.angle, claw_range) | |
394
76f053cf2322
Use Result instead of ClawEvent
Stefano Rivera <stefano@rivera.za.net>
parents:
393
diff
changeset
|
314 return Result(add=(ClawAttack( |
76f053cf2322
Use Result instead of ClawEvent
Stefano Rivera <stefano@rivera.za.net>
parents:
393
diff
changeset
|
315 self.get_space(), self.physicser.position, vec, CLAW_DAMAGE),)) |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
309
diff
changeset
|
316 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
317 def in_wolf_form(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
318 return self.form == self.WOLF_FORM |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
319 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
320 def in_human_form(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
321 return self.form == self.HUMAN_FORM |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
322 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
323 def has_item(self, item): |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
371
diff
changeset
|
324 return item in self.world.inventory |
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
371
diff
changeset
|
325 |
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
371
diff
changeset
|
326 def add_item(self, item): |
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
371
diff
changeset
|
327 self.world.inventory.add(item) |
73
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
328 |
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
329 def environmental_movement(self, dx, dy): |
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
330 if (dx, dy) == (0, 0): |
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
331 return |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
332 self.physicser.apply_impulse((dx, dy)) |
246 | 333 |
334 def get_health_level(self): | |
249 | 335 """Return current health level |
336 """ | |
246 | 337 return self.health_level |
338 | |
367
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
339 def hit(self, weapon): |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
340 '''Recieve an attack''' |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
341 self.lose_health(weapon.damage) |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
342 |
285 | 343 def die(self): |
344 # Handle player death - may be called due to other reasons | |
345 # than zero health | |
375 | 346 self.world.deaths += 1 |
285 | 347 ScreenChange.post('dead') |
348 | |
246 | 349 def lose_health(self, amount): |
350 if self.in_human_form(): | |
351 self.health_level -= amount | |
352 else: | |
353 self.health_level -= amount / WEREWOLF_SOAK_FACTOR | |
285 | 354 if self.health_level <= PROTAGONIST_HEALTH_MIN_LEVEL: |
355 self.die() | |
246 | 356 |
357 def gain_health(self, amount): | |
358 self.health_level += amount | |
359 if self.health_level > PROTAGONIST_HEALTH_MAX_LEVEL: | |
248 | 360 self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
361 |
371 | 362 def _decrement_timer(self, timer, dt): |
363 if self._timers[timer] > 0: | |
364 self._timers[timer] -= dt | |
365 if self._timers[timer] < 0: | |
366 self._timers[timer] = 0 | |
367 | |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
368 def update(self, dt): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
369 if self.changing_sequence: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
370 self._go_to_next_form() |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
371 if int(self.lifetime + dt) > int(self.lifetime): |
341
63d0c70a4e15
Enemies can hurt things again. (Oops.)
Jeremy Thurgood <firxen@gmail.com>
parents:
339
diff
changeset
|
372 if self.in_wolf_form(): |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
373 self.gain_health(1) |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
374 super(Protagonist, self).update(dt) |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
375 |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
376 def force_wolf_form(self): |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
377 if self.in_human_form() and not self.changing_sequence: |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
378 self.toggle_form() |
371 | 379 self.start_timer('change_delay') |