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