Mercurial > nagslang
annotate nagslang/protagonist.py @ 371:21c1c329f8e3
Automatic weapons.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Fri, 06 Sep 2013 21:56:57 +0200 |
parents | b5a0081f5784 |
children | 150332d6c1fb |
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) |
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 |
367
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
24 for shape in form_shapes.values(): |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
25 shape.physicser = self |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
26 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
27 def switch_form(self, old_form, new_form): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
28 self._space.remove(self._form_shapes[old_form]) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
29 shape = self._form_shapes[new_form] |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
30 self._space.add(shape) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
31 for attr, value in shape.protagonist_body_props.iteritems(): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
32 setattr(shape.body, attr, value) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
33 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
34 def get_shape(self): |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
35 return self._form_shapes[self.game_object.form] |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
36 |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
37 |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
38 class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer): |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
39 def select_renderer(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
40 return self.game_object.form |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
41 |
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
42 |
338 | 43 def _make_change_sequence(old, new): |
44 return ( | |
45 new, new, old, old, old, old, | |
46 new, new, old, old, old, | |
47 new, new, old, old, | |
48 new, new, new, old, old, | |
49 new, new, new, new, old, old, | |
50 new) | |
51 | |
52 | |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
53 class Protagonist(GameObject): |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 """Representation of our fearless protagonist. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
55 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
56 TODO: Factor out a bunch of this stuff when we need it for other objects. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
57 """ |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
58 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
59 HUMAN_FORM = 'human' |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
60 WOLF_FORM = 'wolf' |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
61 |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
62 CHANGING_SEQUENCE = { |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
63 # The key is the form we're changing *from*. |
338 | 64 HUMAN_FORM: _make_change_sequence(HUMAN_FORM, WOLF_FORM), |
65 WOLF_FORM: _make_change_sequence(WOLF_FORM, HUMAN_FORM), | |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
66 } |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
67 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
68 zorder = ZORDER_MID |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
69 |
277
56e42c00da25
Protagonist and enemies should see the world
Neil Muller <drnlmuller@gmail.com>
parents:
276
diff
changeset
|
70 def __init__(self, space, world, position): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
71 self.form = self.HUMAN_FORM |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
72 super(Protagonist, self).__init__( |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
73 self._make_physics(space, position), self._make_renderer()) |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
74 self.world = world |
370
b5a0081f5784
Make the inventory a set
Stefano Rivera <stefano@rivera.za.net>
parents:
367
diff
changeset
|
75 self.inventory = set() |
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): |
192 if self.changing_sequence or self.check_timer('attack_cooldown'): | |
193 return | |
194 self.start_timer('attack_cooldown') | |
195 self.world.attacks += 1 | |
196 self.attack() | |
197 | |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
198 def handle_keypress(self, key_command): |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
199 if self.changing_sequence: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
200 return |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
201 if key_command == CMD_TOGGLE_FORM: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
202 self.world.transformations += 1 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
203 self.toggle_form() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
204 if key_command == CMD_ACTION: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
205 self.perform_action() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
206 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
81
diff
changeset
|
207 def get_render_angle(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
208 # No image rotation when rendering, please. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
209 return 0 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
210 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
211 def get_facing_direction(self): |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
212 # 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
|
213 # 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
|
214 # 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
|
215 # 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
|
216 vec = vec_from_angle(self.angle) |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
217 x = int(round(vec.x)) |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
218 y = int(round(vec.y)) |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
219 |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
220 return { |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
221 (0, 1): 'N', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
222 (0, -1): 'S', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
223 (-1, 0): 'W', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
224 (1, 0): 'E', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
225 (1, 1): 'NE', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
226 (1, -1): 'SE', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
227 (-1, 1): 'NW', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
228 (-1, -1): 'SW', |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
218
diff
changeset
|
229 }[(x, y)] |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
81
diff
changeset
|
230 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
231 def go_werewolf(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
232 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
|
233 self.form = self.WOLF_FORM |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
234 self.impulse_factor = 4000 |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
235 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
236 def go_human(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
237 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
|
238 self.form = self.HUMAN_FORM |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
239 self.impulse_factor = 500 |
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 set_direction(self, dx, dy): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
242 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
|
243 self.is_moving = False |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
244 return |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
245 self.is_moving = True |
334
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
246 vec = vec_with_length((dx, dy), self.impulse_factor) |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
247 self.angle = vec.angle |
a3f1b2f0e3fb
Physics-related cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
248 self.physicser.apply_impulse(vec) |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
249 |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
250 def set_position(self, position): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
251 self.physicser.position = position |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
252 |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
253 def copy_state(self, old_protagonist): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
254 self.physicser.position = old_protagonist.physicser.position |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
255 self.physicser.switch_form(self.form, old_protagonist.form) |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
256 self.impulse_factor = old_protagonist.impulse_factor |
179
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
257 self.form = old_protagonist.form |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
258 self.angle = old_protagonist.angle |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
259 self.inventory = old_protagonist.inventory |
1ee8756888e4
Add some state manipulation helper methods
Neil Muller <drnlmuller@gmail.com>
parents:
156
diff
changeset
|
260 |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
261 def toggle_form(self): |
371 | 262 if self.check_timer('change_delay'): |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
263 return |
338 | 264 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
|
265 |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
266 def _go_to_next_form(self): |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
267 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
|
268 self.go_werewolf() |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
269 else: |
65
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
270 self.go_human() |
a99ac95a2940
Move protagonist object to the right place.
Jeremy Thurgood <firxen@gmail.com>
parents:
28
diff
changeset
|
271 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
272 def get_current_interactible(self): |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
273 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
|
274 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
|
275 # No game object here. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
276 continue |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
277 interactible = shape.physicser.game_object.interactible |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
278 if interactible is not None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
279 return interactible |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
280 return None |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
281 |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
282 def perform_action(self): |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
283 """Perform an action on the target. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
284 """ |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
285 interactible = self.get_current_interactible() |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
286 if interactible is None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
287 # Nothing to interact with. |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
288 return |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
289 action = interactible.select_action(self) |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
290 if action is None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
277
diff
changeset
|
291 # Nothing to do with it. |
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 return action.perform(self) |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
294 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
295 def attack(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
296 """Attempt to hurt something. |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
297 """ |
265 | 298 if self.in_wolf_form(): |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
309
diff
changeset
|
299 self.claw() |
265 | 300 else: |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
301 self.shoot() |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
302 |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
303 def shoot(self): |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
285
diff
changeset
|
304 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
|
305 return |
361
534eac55a178
ChargingEnemy spits acid
Stefano Rivera <stefano@rivera.za.net>
parents:
357
diff
changeset
|
306 vec = vec_from_angle(self.angle, BULLET_SPEED) |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
307 FireEvent.post( |
363
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
361
diff
changeset
|
308 self.physicser.position, vec, BULLET_DAMAGE, 'bullet', |
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
361
diff
changeset
|
309 COLLISION_TYPE_PLAYER) |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
310 |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
309
diff
changeset
|
311 def claw(self): |
356 | 312 claw_range = (math.sqrt(math.pow(self.physicser.get_velocity()[0], 2) + |
313 math.pow(self.physicser.get_velocity()[1], 2)) | |
314 / 20) + 30 | |
315 vec = vec_from_angle(self.angle, claw_range) | |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
316 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
|
317 |
28
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
318 def in_wolf_form(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
319 return self.form == self.WOLF_FORM |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
320 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
321 def in_human_form(self): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
322 return self.form == self.HUMAN_FORM |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
323 |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
324 def has_item(self, item): |
c03982fe3c70
Protagonist and environment.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
325 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
|
326 |
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
327 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
|
328 if (dx, dy) == (0, 0): |
e118458a4e9c
Added environmental motion effects to protagonist.
davidsharpe@185.4.16.172.in-addr.arpa
parents:
66
diff
changeset
|
329 return |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
208
diff
changeset
|
330 self.physicser.apply_impulse((dx, dy)) |
246 | 331 |
332 def get_health_level(self): | |
249 | 333 """Return current health level |
334 """ | |
246 | 335 return self.health_level |
336 | |
367
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
337 def hit(self, weapon): |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
338 '''Recieve an attack''' |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
339 self.lose_health(weapon.damage) |
ea315cdf286d
Enemy ranged attacks do damage
Stefano Rivera <stefano@rivera.za.net>
parents:
363
diff
changeset
|
340 |
285 | 341 def die(self): |
342 # Handle player death - may be called due to other reasons | |
343 # than zero health | |
344 ScreenChange.post('dead') | |
345 | |
246 | 346 def lose_health(self, amount): |
347 if self.in_human_form(): | |
348 self.health_level -= amount | |
349 else: | |
350 self.health_level -= amount / WEREWOLF_SOAK_FACTOR | |
285 | 351 if self.health_level <= PROTAGONIST_HEALTH_MIN_LEVEL: |
352 self.die() | |
246 | 353 |
354 def gain_health(self, amount): | |
355 self.health_level += amount | |
356 if self.health_level > PROTAGONIST_HEALTH_MAX_LEVEL: | |
248 | 357 self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
358 |
371 | 359 def _decrement_timer(self, timer, dt): |
360 if self._timers[timer] > 0: | |
361 self._timers[timer] -= dt | |
362 if self._timers[timer] < 0: | |
363 self._timers[timer] = 0 | |
364 | |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
365 def update(self, dt): |
336
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
366 if self.changing_sequence: |
1d487646a4d4
Better key handling, form change delay.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
367 self._go_to_next_form() |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
368 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
|
369 if self.in_wolf_form(): |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
313
diff
changeset
|
370 self.gain_health(1) |
309
2b0494b3ce6a
Werewolf form heals every second.
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
371 super(Protagonist, self).update(dt) |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
372 |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
373 def force_wolf_form(self): |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
374 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
|
375 self.toggle_form() |
371 | 376 self.start_timer('change_delay') |