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