Mercurial > nagslang
annotate nagslang/game_object.py @ 416:bea0ea5b98df
Well, gravity.
author | davidsharpe@lantea.local |
---|---|
date | Sat, 07 Sep 2013 12:52:16 +0200 |
parents | c08d409a1c87 |
children | 01f48d8dc56a |
rev | line source |
---|---|
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
1 import pymunk |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
2 import pymunk.pygame_util |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
3 |
263 | 4 import math |
5 | |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
6 from nagslang import environment |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
196
diff
changeset
|
7 from nagslang import puzzle |
207 | 8 from nagslang import render |
364 | 9 from nagslang.mutators import FLIP_H, ImageOverlay |
107 | 10 from nagslang.constants import ( |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
313
diff
changeset
|
11 COLLISION_TYPE_DOOR, COLLISION_TYPE_FURNITURE, COLLISION_TYPE_PROJECTILE, |
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
313
diff
changeset
|
12 COLLISION_TYPE_SWITCH, COLLISION_TYPE_WEREWOLF_ATTACK, |
362 | 13 SWITCH_PUSHERS, ZORDER_FLOOR, ZORDER_LOW, ZORDER_HIGH) |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
14 from nagslang.resources import resources |
180
026297a03963
Add DoorEvent and tweak ScreenChange to keep more state when the player goes through a door
Neil Muller <drnlmuller@gmail.com>
parents:
176
diff
changeset
|
15 from nagslang.events import DoorEvent |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
16 |
82 | 17 |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
18 class Result(object): |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
19 ''' |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
20 Return from an update() function, to add new objects to the world, and/or |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
21 remove old objects. |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
22 ''' |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
23 def __init__(self, add=(), remove=()): |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
24 self.add = add |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
25 self.remove = remove |
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
26 |
393
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
27 def merge(self, result): |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
28 if result is not None: |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
29 self.add += result.add |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
30 self.remove += result.remove |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
31 return self |
8d961e05b7b6
Use Result to handle firing
Stefano Rivera <stefano@rivera.za.net>
parents:
390
diff
changeset
|
32 |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
33 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
34 def get_editable_game_objects(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
35 classes = [] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
36 for cls_name, cls in globals().iteritems(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
37 if isinstance(cls, type) and hasattr(cls, 'requires'): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
38 classes.append((cls_name, cls)) |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
39 return classes |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
40 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
41 |
59 | 42 class Physicser(object): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
43 def __init__(self, space): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
44 self._space = space |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
45 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
46 def get_space(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
47 return self._space |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
48 |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
49 def set_space(self, new_space): |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
50 self._space = new_space |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
51 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
52 def set_game_object(self, game_object): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
53 self.game_object = game_object |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
54 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
55 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
56 raise NotImplementedError() |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
57 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
58 def add_to_space(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
59 shape = self.get_shape() |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
60 self.get_space().add(shape) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
61 if not shape.body.is_static: |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
62 self.get_space().add(shape.body) |
59 | 63 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
64 def remove_from_space(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
65 shape = self.get_shape() |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
66 self.get_space().remove(shape) |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
67 if not shape.body.is_static: |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
68 self.get_space().remove(shape.body) |
59 | 69 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
70 def get_render_position(self, surface): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
71 pos = self.get_shape().body.position |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
72 return pymunk.pygame_util.to_pygame(pos, surface) |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
73 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
74 def get_angle(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
75 return self.get_shape().body.angle |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
76 |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
216
diff
changeset
|
77 def get_velocity(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
216
diff
changeset
|
78 return self.get_shape().body.velocity |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
216
diff
changeset
|
79 |
216
f23ab2dd6ce8
Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
80 def _get_position(self): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
81 return self.get_shape().body.position |
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
82 |
216
f23ab2dd6ce8
Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
83 def _set_position(self, position): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
84 self.get_shape().body.position = position |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
85 |
216
f23ab2dd6ce8
Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
86 position = property(_get_position, _set_position) |
f23ab2dd6ce8
Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents:
215
diff
changeset
|
87 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
88 def apply_impulse(self, j, r=(0, 0)): |
215
325c317cbfa1
Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents:
211
diff
changeset
|
89 return self.get_shape().body.apply_impulse(j, r) |
59 | 90 |
91 | |
92 class SingleShapePhysicser(Physicser): | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
93 def __init__(self, space, shape): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
94 super(SingleShapePhysicser, self).__init__(space) |
59 | 95 self._shape = shape |
186
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
96 shape.physicser = self |
59 | 97 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
98 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
99 return self._shape |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
100 |
59 | 101 |
133 | 102 def damping_velocity_func(body, gravity, damping, dt): |
103 """Apply custom damping to this body's velocity. | |
104 """ | |
105 damping = getattr(body, 'damping', damping) | |
106 return pymunk.Body.update_velocity(body, gravity, damping, dt) | |
107 | |
108 | |
109 def make_body(mass, moment, position, damping=None): | |
110 body = pymunk.Body(mass, moment) | |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
111 body.position = tuple(position) |
133 | 112 if damping is not None: |
113 body.damping = damping | |
114 body.velocity_func = damping_velocity_func | |
115 return body | |
116 | |
117 | |
59 | 118 class GameObject(object): |
119 """A representation of a thing in the game world. | |
120 | |
121 This has a rendery thing, physicsy things and maybe some other things. | |
122 """ | |
123 | |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
124 zorder = ZORDER_LOW |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
125 is_moving = False # `True` if a movement animation should play. |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
126 |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
127 def __init__(self, physicser, renderer, puzzler=None, overlay=None, |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
128 interactible=None): |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
129 self.lifetime = 0 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
130 self.physicser = physicser |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
131 physicser.set_game_object(self) |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
132 self.physicser.add_to_space() |
59 | 133 self.renderer = renderer |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
134 renderer.set_game_object(self) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
135 self.puzzler = puzzler |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
136 if puzzler is not None: |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
137 puzzler.set_game_object(self) |
191 | 138 self.overlay = overlay |
139 if overlay is not None: | |
140 self.overlay.set_game_object(self) | |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
141 self.interactible = interactible |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
142 if interactible is not None: |
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
143 self.interactible.set_game_object(self) |
371 | 144 self._timers = {} |
145 self._active_timers = {} | |
146 | |
147 def add_timer(self, name, secs): | |
148 self._timers[name] = secs | |
149 | |
150 def start_timer(self, name, secs=None): | |
151 if secs is None: | |
152 secs = self._timers[name] | |
153 self._active_timers[name] = secs | |
154 | |
155 def check_timer(self, name): | |
156 return name in self._active_timers | |
59 | 157 |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
158 def set_stored_state_dict(self, stored_state): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
159 """Override this to set up whatever state storage you want. |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
160 |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
161 The `stored_state` dict passed in contains whatever saved state we |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
162 might have for this object. If the return value of this method |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
163 evaluates to `True`, the contents of the `stored_state` dict will be |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
164 saved, otherwise it will be discarded. |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
165 """ |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
166 pass |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
167 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
168 def get_space(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
169 return self.physicser.get_space() |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
170 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
171 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
172 return self.physicser.get_shape() |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
173 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
174 def get_render_position(self, surface): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
175 return self.physicser.get_render_position(surface) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
176 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
177 def get_render_angle(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
178 return self.physicser.get_angle() |
59 | 179 |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
224
diff
changeset
|
180 def get_facing_direction(self): |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
224
diff
changeset
|
181 """Used by rendererd that care what direction an object is facing. |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
224
diff
changeset
|
182 """ |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
224
diff
changeset
|
183 return None |
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
224
diff
changeset
|
184 |
59 | 185 def render(self, surface): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
186 return self.renderer.render(surface) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
187 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
188 def update(self, dt): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
189 self.lifetime += dt |
371 | 190 for timer in self._active_timers.keys(): |
191 self._active_timers[timer] -= dt | |
192 if self._active_timers[timer] <= 0: | |
193 self._active_timers.pop(timer) | |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
194 self.renderer.update(dt) |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
195 |
302
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
196 def hit(self, weapon): |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
197 '''Was hit with a weapon (such as a bullet)''' |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
198 pass |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
199 |
256
2a0bad886956
Collision handlers get the protagonist.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
200 def collide_with_protagonist(self, protagonist): |
186
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
201 """Called as a `pre_solve` collision callback with the protagonist. |
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
202 |
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
203 You can return `False` to ignore the collision, anything else |
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
204 (including `None`) to process the collision as normal. |
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
205 """ |
192
3dc2b6290e66
Document collision handler a little better.
Jeremy Thurgood <firxen@gmail.com>
parents:
191
diff
changeset
|
206 return True |
186
d63c19003aec
Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
185
diff
changeset
|
207 |
319
01e98732de46
Open bulkheads are no longer opaque to furniture
Stefano Rivera <stefano@rivera.za.net>
parents:
318
diff
changeset
|
208 def collide_with_furniture(self, furniture): |
01e98732de46
Open bulkheads are no longer opaque to furniture
Stefano Rivera <stefano@rivera.za.net>
parents:
318
diff
changeset
|
209 return True |
01e98732de46
Open bulkheads are no longer opaque to furniture
Stefano Rivera <stefano@rivera.za.net>
parents:
318
diff
changeset
|
210 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
211 def collide_with_claw_attack(self, claw_attack): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
212 return True |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
213 |
416 | 214 def environmental_movement(self, dx, dy): |
215 if (dx, dy) == (0, 0): | |
216 return | |
217 self.physicser.apply_impulse((dx, dy)) | |
218 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
219 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
220 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
221 """Hints for the level editor""" |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
222 return [("name", "string")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
223 |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
224 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
225 class FloorSwitch(GameObject): |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
226 zorder = ZORDER_FLOOR |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
227 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
228 def __init__(self, space, position): |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
229 body = make_body(None, None, position) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
230 self.shape = pymunk.Circle(body, 30) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
231 self.shape.collision_type = COLLISION_TYPE_SWITCH |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
232 self.shape.sensor = True |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
233 super(FloorSwitch, self).__init__( |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
234 SingleShapePhysicser(space, self.shape), |
207 | 235 render.ImageStateRenderer({ |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
236 True: resources.get_image('objects', 'sensor_on.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
237 False: resources.get_image('objects', 'sensor_off.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
238 }), |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
196
diff
changeset
|
239 puzzle.CollidePuzzler(*SWITCH_PUSHERS), |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
240 ) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
241 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
242 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
243 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
244 return [("name", "string"), ("position", "coordinates")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
245 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
246 |
191 | 247 class Note(GameObject): |
248 zorder = ZORDER_FLOOR | |
249 | |
250 def __init__(self, space, position, message): | |
251 body = make_body(None, None, position) | |
252 self.shape = pymunk.Circle(body, 30) | |
253 self.shape.sensor = True | |
254 super(Note, self).__init__( | |
255 SingleShapePhysicser(space, self.shape), | |
207 | 256 render.ImageRenderer(resources.get_image('objects', 'note.png')), |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
196
diff
changeset
|
257 puzzle.CollidePuzzler(), |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
218
diff
changeset
|
258 render.TextOverlay(message), |
191 | 259 ) |
260 | |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
261 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
262 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
263 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
264 ("message", "text")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
265 |
191 | 266 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
267 class FloorLight(GameObject): |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
268 zorder = ZORDER_FLOOR |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
269 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
270 def __init__(self, space, position, state_source): |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
271 body = make_body(None, None, position) |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
272 self.shape = pymunk.Circle(body, 10) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
273 self.shape.collision_type = COLLISION_TYPE_SWITCH |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
274 self.shape.sensor = True |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
275 super(FloorLight, self).__init__( |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
276 SingleShapePhysicser(space, self.shape), |
207 | 277 render.ImageStateRenderer({ |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
278 True: resources.get_image('objects', 'light_on.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
279 False: resources.get_image('objects', 'light_off.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
280 }), |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
196
diff
changeset
|
281 puzzle.StateProxyPuzzler(state_source), |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
282 ) |
133 | 283 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
284 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
285 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
286 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
287 ("state_source", "puzzler")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
288 |
133 | 289 |
290 class Box(GameObject): | |
291 def __init__(self, space, position): | |
292 body = make_body(10, 10000, position, damping=0.5) | |
293 self.shape = pymunk.Poly( | |
294 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)]) | |
208
3d54fe7a2998
Fun with mass and friction.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
295 self.shape.friction = 0.5 |
318
26d1978fa1da
BOX is no longer accurate
Stefano Rivera <stefano@rivera.za.net>
parents:
313
diff
changeset
|
296 self.shape.collision_type = COLLISION_TYPE_FURNITURE |
133 | 297 super(Box, self).__init__( |
298 SingleShapePhysicser(space, self.shape), | |
207 | 299 render.ImageRenderer(resources.get_image('objects', 'crate.png')), |
133 | 300 ) |
176 | 301 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
302 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
303 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
304 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
305 ("state_source", "puzzler")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
306 |
176 | 307 |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
308 class BaseDoor(GameObject): |
176 | 309 zorder = ZORDER_FLOOR |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
310 is_open = True |
176 | 311 |
263 | 312 def __init__(self, space, position, destination, dest_pos, angle, |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
313 renderer, condition): |
176 | 314 body = make_body(pymunk.inf, pymunk.inf, position, damping=0.5) |
281
9b56e954c674
Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents:
276
diff
changeset
|
315 self.shape = pymunk.Circle(body, 30) |
176 | 316 self.shape.collision_type = COLLISION_TYPE_DOOR |
264 | 317 self.shape.body.angle = float(angle) / 180 * math.pi |
176 | 318 self.shape.sensor = True |
319 self.destination = destination | |
320 self.dest_pos = tuple(dest_pos) | |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
321 super(BaseDoor, self).__init__( |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
322 SingleShapePhysicser(space, self.shape), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
323 renderer, |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
324 puzzle.ParentAttrPuzzler('is_open'), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
325 interactible=environment.Interactible( |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
326 environment.Action(self._post_door_event, condition)), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
327 ) |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
328 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
329 def _post_door_event(self, protagonist): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
330 DoorEvent.post(self.destination, self.dest_pos) |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
331 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
332 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
333 class Door(BaseDoor): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
334 def __init__(self, space, position, destination, dest_pos, angle): |
176 | 335 super(Door, self).__init__( |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
336 space, position, destination, dest_pos, angle, |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
337 render.ImageRenderer(resources.get_image('objects', 'door.png')), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
338 environment.YesCondition(), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
339 ) |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
340 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
341 @classmethod |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
342 def requires(cls): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
343 return [("name", "string"), ("position", "coordinates"), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
344 ("destination", "level name"), ("dest_pos", "coordinate"), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
345 ("angle", "degrees")] |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
346 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
347 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
348 class PuzzleDoor(BaseDoor): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
349 def __init__(self, space, position, destination, dest_pos, angle, |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
350 key_state): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
351 self._key_state = key_state |
390
52c94435e38b
Goodbye foul locked_door!
Jeremy Thurgood <firxen@gmail.com>
parents:
385
diff
changeset
|
352 overlay = ImageOverlay(resources.get_image('objects', 'lock.png')) |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
353 super(PuzzleDoor, self).__init__( |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
354 space, position, destination, dest_pos, angle, |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
355 render.ImageStateRenderer({ |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
356 True: resources.get_image('objects', 'door.png'), |
390
52c94435e38b
Goodbye foul locked_door!
Jeremy Thurgood <firxen@gmail.com>
parents:
385
diff
changeset
|
357 False: resources.get_image( |
52c94435e38b
Goodbye foul locked_door!
Jeremy Thurgood <firxen@gmail.com>
parents:
385
diff
changeset
|
358 'objects', 'door.png', transforms=(overlay,)), |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
359 }), |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
360 environment.FunctionCondition(lambda p: self.is_open), |
176 | 361 ) |
362 | |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
363 @property |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
364 def is_open(self): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
365 return self._stored_state['is_open'] |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
366 |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
367 def set_stored_state_dict(self, stored_state): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
368 self._stored_state = stored_state |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
369 self._stored_state.setdefault('is_open', False) |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
370 return True |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
371 |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
372 def update(self, dt): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
373 if not self.is_open: |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
374 self._stored_state['is_open'] = self.puzzler.glue.get_state_of( |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
375 self._key_state) |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
376 super(PuzzleDoor, self).update(dt) |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
377 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
378 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
379 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
380 return [("name", "string"), ("position", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
381 ("destination", "level name"), ("dest_pos", "coordinate"), |
263 | 382 ("angle", "degrees"), |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
383 ("key_state", "puzzler")] |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
384 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
385 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
386 class KeyedDoor(BaseDoor): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
387 def __init__(self, space, position, destination, dest_pos, angle, |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
388 key_item=None): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
389 self._key_item = key_item |
364 | 390 overlay = ImageOverlay( |
391 resources.get_image('objects', '%s.png' % (key_item,))) | |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
392 super(KeyedDoor, self).__init__( |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
393 space, position, destination, dest_pos, angle, |
364 | 394 render.ImageRenderer(resources.get_image( |
395 'objects', 'door.png', transforms=(overlay,))), | |
359
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
396 environment.ItemRequiredCondition(key_item), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
397 ) |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
398 |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
399 @classmethod |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
400 def requires(cls): |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
401 return [("name", "string"), ("position", "coordinates"), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
402 ("destination", "level name"), ("dest_pos", "coordinate"), |
d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
Jeremy Thurgood <firxen@gmail.com>
parents:
357
diff
changeset
|
403 ("angle", "degrees"), ("key_item", "item name")] |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
404 |
224
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
405 |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
406 class Bulkhead(GameObject): |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
407 zorder = ZORDER_FLOOR |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
408 |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
409 def __init__(self, space, end1, end2, key_state=None): |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
410 body = make_body(None, None, (0, 0)) |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
411 self.shape = pymunk.Segment(body, tuple(end1), tuple(end2), 3) |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
412 self.shape.collision_type = COLLISION_TYPE_DOOR |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
413 if key_state is None: |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
414 puzzler = puzzle.YesPuzzler() |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
415 else: |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
416 puzzler = puzzle.StateProxyPuzzler(key_state) |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
417 super(Bulkhead, self).__init__( |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
418 SingleShapePhysicser(space, self.shape), |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
419 render.ShapeStateRenderer(), |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
420 puzzler, |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
421 ) |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
422 |
256
2a0bad886956
Collision handlers get the protagonist.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
423 def collide_with_protagonist(self, protagonist): |
224
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
424 if self.puzzler.get_state(): |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
425 # Reject the collision, we can walk through. |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
426 return False |
b6db213e53a2
Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
427 return True |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
428 |
319
01e98732de46
Open bulkheads are no longer opaque to furniture
Stefano Rivera <stefano@rivera.za.net>
parents:
318
diff
changeset
|
429 collide_with_furniture = collide_with_protagonist |
01e98732de46
Open bulkheads are no longer opaque to furniture
Stefano Rivera <stefano@rivera.za.net>
parents:
318
diff
changeset
|
430 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
431 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
432 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
433 return [("name", "string"), ("end1", "coordinates"), |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
229
diff
changeset
|
434 ("end2", "coordinates"), ("key_state", "puzzler")] |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
435 |
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
436 |
282
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
437 class ToggleSwitch(GameObject): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
438 zorder = ZORDER_LOW |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
439 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
440 def __init__(self, space, position): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
441 body = make_body(None, None, position) |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
442 self.shape = pymunk.Circle(body, 20) |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
443 self.shape.sensor = True |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
444 super(ToggleSwitch, self).__init__( |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
445 SingleShapePhysicser(space, self.shape), |
296
eb08426a58fe
Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents:
295
diff
changeset
|
446 render.ImageStateRenderer({ |
eb08426a58fe
Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents:
295
diff
changeset
|
447 True: resources.get_image('objects', 'lever.png'), |
eb08426a58fe
Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents:
295
diff
changeset
|
448 False: resources.get_image( |
eb08426a58fe
Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents:
295
diff
changeset
|
449 'objects', 'lever.png', transforms=(FLIP_H,)), |
eb08426a58fe
Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents:
295
diff
changeset
|
450 }), |
282
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
451 puzzle.ParentAttrPuzzler('toggle_on'), |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
452 interactible=environment.Interactible( |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
453 environment.Action(self._toggle)), |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
454 ) |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
455 |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
456 @property |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
457 def toggle_on(self): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
458 return self._stored_state['toggle_on'] |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
459 |
282
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
460 def _toggle(self, protagonist): |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
461 self._stored_state['toggle_on'] = not self.toggle_on |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
462 |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
463 def set_stored_state_dict(self, stored_state): |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
464 self._stored_state = stored_state |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
465 # We start in the "off" position. |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
466 self._stored_state.setdefault('toggle_on', False) |
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
335
diff
changeset
|
467 return True |
282
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
468 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
469 @classmethod |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
470 def requires(cls): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
471 return [("name", "string"), ("position", "coordinates")] |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
472 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
281
diff
changeset
|
473 |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
474 class Bullet(GameObject): |
363
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
362
diff
changeset
|
475 def __init__(self, space, position, impulse, damage, bullet_type, |
305 | 476 source_collision_type): |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
477 body = make_body(1, pymunk.inf, position) |
363
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
362
diff
changeset
|
478 body.angle = impulse.angle |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
479 self.last_position = position |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
282
diff
changeset
|
480 self.shape = pymunk.Circle(body, 2) |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
481 self.shape.sensor = True |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
482 self.shape.collision_type = COLLISION_TYPE_PROJECTILE |
305 | 483 self.damage = damage |
363
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
362
diff
changeset
|
484 self.type = bullet_type |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
485 self.source_collision_type = source_collision_type |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
486 super(Bullet, self).__init__( |
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
487 SingleShapePhysicser(space, self.shape), |
363
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
362
diff
changeset
|
488 render.ImageRenderer(resources.get_image( |
3dd08e18580f
Acid attacks shoot things that look like acid
Stefano Rivera <stefano@rivera.za.net>
parents:
362
diff
changeset
|
489 'objects', '%s.png' % self.type)), |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
490 ) |
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
256
diff
changeset
|
491 self.physicser.apply_impulse(impulse) |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
282
diff
changeset
|
492 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
493 def update(self, dt): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
494 super(Bullet, self).update(dt) |
297
b00ed05f7364
Create a tuple of bullet position, so we don't just hold a reference to a mutable object
Stefano Rivera <stefano@rivera.za.net>
parents:
296
diff
changeset
|
495 position = (self.physicser.position.x, self.physicser.position.y) |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
496 r = self.get_space().segment_query(self.last_position, position) |
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
497 self.last_position = position |
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
498 for collision in r: |
302
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
499 shape = collision.shape |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
500 if (shape.collision_type == self.source_collision_type |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
501 or shape == self.physicser.get_shape() |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
502 or shape.sensor): |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
503 continue |
302
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
504 if hasattr(shape, 'physicser'): |
a0a471ad2ee8
Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents:
297
diff
changeset
|
505 shape.physicser.game_object.hit(self) |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
506 self.physicser.remove_from_space() |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
507 return Result(remove=[self]) |
293
47226c661ae2
Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents:
286
diff
changeset
|
508 |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
282
diff
changeset
|
509 |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
510 class ClawAttack(GameObject): |
356 | 511 def __init__(self, space, pos, vector, damage): |
512 body = make_body(1, pymunk.inf, | |
513 (pos[0] + (vector.length * math.cos(vector.angle)), | |
362 | 514 pos[1] + (vector.length * math.sin(vector.angle)))) |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
515 body.angle = vector.angle |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
516 self.shape = pymunk.Circle(body, 30) |
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
517 self.shape.sensor = True |
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
518 self.shape.collision_type = COLLISION_TYPE_WEREWOLF_ATTACK |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
519 self.damage = damage |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
520 super(ClawAttack, self).__init__( |
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
521 SingleShapePhysicser(space, self.shape), |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
522 render.ImageRenderer(resources.get_image( |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
523 'objects', 'werewolf_SW_claw_attack.png', |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
524 transforms=(FLIP_H,))), |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
525 ) |
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
526 |
333
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
527 def update(self, dt): |
3dd32686dbc3
Better wolf claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
332
diff
changeset
|
528 super(ClawAttack, self).update(dt) |
335
78b805549b4e
More interesting claw attack.
Jeremy Thurgood <firxen@gmail.com>
parents:
333
diff
changeset
|
529 if self.lifetime > 0.1: |
312
72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
David Sharpe
parents:
307
diff
changeset
|
530 self.physicser.remove_from_space() |
385
51deb78cae52
Use a result object to get new drawables back to the area
Stefano Rivera <stefano@rivera.za.net>
parents:
384
diff
changeset
|
531 return Result(remove=[self]) |
351 | 532 |
533 | |
534 class HostileTerrain(GameObject): | |
535 zorder = ZORDER_FLOOR | |
536 damage = None | |
401 | 537 tiles = [] |
362 | 538 tile_alpha = 255 |
401 | 539 tile_frame_ticks = 3 |
351 | 540 # How often to hit the player |
541 rate = 5 | |
542 | |
543 def __init__(self, space, position, outline): | |
544 body = make_body(10, pymunk.inf, position) | |
545 # Adjust shape relative to position | |
546 shape_outline = [(p[0] - position[0], p[1] - position[1]) for | |
547 p in outline] | |
548 self.shape = pymunk.Poly(body, shape_outline) | |
549 self._ticks = 0 | |
550 self.shape.collision_type = COLLISION_TYPE_SWITCH | |
551 self.shape.sensor = True | |
401 | 552 if len(self.tiles) > 1: |
553 tile_images = [resources.get_image('tiles', x) | |
554 for x in self.tiles] | |
555 renderer = render.TimedTiledRenderer(outline, tile_images, | |
556 self.tile_frame_ticks, | |
557 self.tile_alpha) | |
558 else: | |
559 tile_image = resources.get_image('tiles', self.tiles[0]) | |
560 renderer = render.TiledRenderer(outline, tile_image, | |
561 self.tile_alpha) | |
351 | 562 super(HostileTerrain, self).__init__( |
563 SingleShapePhysicser(space, self.shape), | |
401 | 564 renderer) |
351 | 565 |
566 def collide_with_protagonist(self, protagonist): | |
567 # We're called every frame we're colliding, so | |
568 # There are timing issues with stepping on and | |
569 # off terrian, but as long as the rate is reasonably | |
570 # low, they shouldn't impact gameplay | |
571 if self._ticks == 0: | |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
572 self.apply_effect(protagonist) |
351 | 573 self._ticks += 1 |
574 if self._ticks > self.rate: | |
575 self._ticks = 0 | |
576 | |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
577 def apply_effect(self, protagonist): |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
578 protagonist.lose_health(self.damage) |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
579 |
351 | 580 @classmethod |
581 def requires(cls): | |
582 return [("name", "string"), ("position", "coordinates"), | |
354
55752fc7b753
Add convex requirement to hint
Neil Muller <drnlmuller@gmail.com>
parents:
351
diff
changeset
|
583 ("outline", "polygon (convex)")] |
351 | 584 |
585 | |
586 class AcidFloor(HostileTerrain): | |
587 damage = 1 | |
402
c08d409a1c87
better bubbles (work in progress)
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
401
diff
changeset
|
588 tiles = ['acid.png', 'acid2.png', 'acid3.png'] |
377
4eb7f5dffa59
new acid and moonlight art
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
374
diff
changeset
|
589 tile_alpha = 200 |
402
c08d409a1c87
better bubbles (work in progress)
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
401
diff
changeset
|
590 tile_frame_ticks = 10 |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
591 |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
592 |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
593 class ForceWolfFloor(HostileTerrain): |
401 | 594 tiles = ['moonlight.png'] |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
595 rate = 0 |
362 | 596 tile_alpha = 150 |
597 zorder = ZORDER_HIGH | |
357
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
598 |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
599 def apply_effect(self, protagonist): |
d2c7e17299a7
Moonlight tiles force wolf form.
Jeremy Thurgood <firxen@gmail.com>
parents:
356
diff
changeset
|
600 protagonist.force_wolf_form() |
416 | 601 |
602 class GravityWell(GameObject): | |
603 zorder = ZORDER_FLOOR | |
604 # How often to hit the player | |
605 rate = 5 | |
606 | |
607 def __init__(self, space, position, size, force): | |
608 body = make_body(10, pymunk.inf, position) | |
609 # Adjust shape relative to position | |
610 self.shape = pymunk.Circle(body, size) | |
611 self._ticks = 0 | |
612 self.force = force | |
613 self.shape.collision_type = COLLISION_TYPE_SWITCH | |
614 self.shape.sensor = True | |
615 super(GravityWell, self).__init__( | |
616 SingleShapePhysicser(space, self.shape), | |
617 render.ImageRenderer(resources.get_image( | |
618 'objects', 'gravity_well.png')), | |
619 ) | |
620 | |
621 def collide_with_protagonist(self, protagonist): | |
622 # We're called every frame we're colliding, so | |
623 # There are timing issues with stepping on and | |
624 # off terrian, but as long as the rate is reasonably | |
625 # low, they shouldn't impact gameplay | |
626 if self._ticks == 0: | |
627 self.apply_effect(protagonist) | |
628 self._ticks += 1 | |
629 if self._ticks > self.rate: | |
630 self._ticks = 0 | |
631 | |
632 def collide_with_furniture(self, furniture): | |
633 # We're called every frame we're colliding, so | |
634 # There are timing issues with stepping on and | |
635 # off terrian, but as long as the rate is reasonably | |
636 # low, they shouldn't impact gameplay | |
637 if self._ticks == 0: | |
638 self.apply_effect(furniture) | |
639 self._ticks += 1 | |
640 if self._ticks > self.rate: | |
641 self._ticks = 0 | |
642 | |
643 def apply_effect(self, object): | |
644 object.environmental_movement(self.force, self.force) | |
645 | |
646 @classmethod | |
647 def requires(cls): | |
648 return [("name", "string"), ("position", "coordinates"), | |
649 ("outline", "polygon (convex)")] |