annotate nagslang/protagonist.py @ 394:76f053cf2322

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