annotate nagslang/game_object.py @ 302:a0a471ad2ee8

Pass bullet hits through to the target
author Stefano Rivera <stefano@rivera.za.net>
date Thu, 05 Sep 2013 23:57:50 +0200
parents b00ed05f7364
children ce11e1cae0ed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
4 import math
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
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
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
8 from nagslang import render
296
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
9 from nagslang.mutators import FLIP_H
107
b90d01e4d9d4 Layered drawing.
Jeremy Thurgood <firxen@gmail.com>
parents: 106
diff changeset
10 from nagslang.constants import (
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
11 SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, COLLISION_TYPE_BOX, ZORDER_LOW,
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
12 ZORDER_FLOOR, COLLISION_TYPE_DOOR, COLLISION_TYPE_PROJECTILE)
155
b455873020be Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents: 145
diff changeset
13 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
14 from nagslang.events import DoorEvent
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
15
82
11b0017b5e4b Fix whitespace.
davidsharpe@185.4.16.172.in-addr.arpa
parents: 81
diff changeset
16
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
17 def get_editable_game_objects():
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
18 classes = []
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
19 for cls_name, cls in globals().iteritems():
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
20 if isinstance(cls, type) and hasattr(cls, 'requires'):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
21 classes.append((cls_name, cls))
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
22 return classes
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
23
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
24
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
25 class Physicser(object):
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
26 def __init__(self, space):
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
27 self._space = space
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
28
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
29 def get_space(self):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
30 return self._space
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
31
276
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
32 def set_space(self, new_space):
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
33 self._space = new_space
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 264
diff changeset
34
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
35 def set_game_object(self, game_object):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
36 self.game_object = game_object
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
37
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
38 def get_shape(self):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
39 raise NotImplementedError()
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
40
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
41 def add_to_space(self):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
42 shape = self.get_shape()
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
43 self.get_space().add(shape)
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
44 if not shape.body.is_static:
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
45 self.get_space().add(shape.body)
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
46
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
47 def remove_from_space(self):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
48 shape = self.get_shape()
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
49 self.get_space().remove(shape)
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
50 if not shape.body.is_static:
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
51 self.get_space().remove(shape.body)
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
52
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
53 def get_render_position(self, surface):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
54 pos = self.get_shape().body.position
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
55 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
56
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
57 def get_angle(self):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
58 return self.get_shape().body.angle
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
59
217
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 216
diff changeset
60 def get_velocity(self):
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 216
diff changeset
61 return self.get_shape().body.velocity
d98daba73055 Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 216
diff changeset
62
216
f23ab2dd6ce8 Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents: 215
diff changeset
63 def _get_position(self):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
64 return self.get_shape().body.position
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
65
216
f23ab2dd6ce8 Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents: 215
diff changeset
66 def _set_position(self, position):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
67 self.get_shape().body.position = position
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
68
216
f23ab2dd6ce8 Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents: 215
diff changeset
69 position = property(_get_position, _set_position)
f23ab2dd6ce8 Clunkier properties to make pyflakes happy.
Jeremy Thurgood <firxen@gmail.com>
parents: 215
diff changeset
70
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
71 def apply_impulse(self, j, r=(0, 0)):
215
325c317cbfa1 Better protagonist physicser.
Jeremy Thurgood <firxen@gmail.com>
parents: 211
diff changeset
72 return self.get_shape().body.apply_impulse(j, r)
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
73
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
74
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
75 class SingleShapePhysicser(Physicser):
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
76 def __init__(self, space, shape):
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
77 super(SingleShapePhysicser, self).__init__(space)
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
78 self._shape = shape
186
d63c19003aec Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 185
diff changeset
79 shape.physicser = self
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
80
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
81 def get_shape(self):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
82 return self._shape
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
83
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
84
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
85 def damping_velocity_func(body, gravity, damping, dt):
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
86 """Apply custom damping to this body's velocity.
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
87 """
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
88 damping = getattr(body, 'damping', damping)
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
89 return pymunk.Body.update_velocity(body, gravity, damping, dt)
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
90
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
91
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
92 def make_body(mass, moment, position, damping=None):
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
93 body = pymunk.Body(mass, moment)
145
0c49627920eb Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
94 body.position = tuple(position)
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
95 if damping is not None:
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
96 body.damping = damping
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
97 body.velocity_func = damping_velocity_func
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
98 return body
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
99
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
100
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
101 class GameObject(object):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
102 """A representation of a thing in the game world.
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
103
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
104 This has a rendery thing, physicsy things and maybe some other things.
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
105 """
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
106
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
107 zorder = ZORDER_LOW
218
9e2ef2f15035 Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 217
diff changeset
108 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
109
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
110 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
111 interactible=None):
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
112 self.physicser = physicser
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
113 physicser.set_game_object(self)
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
114 self.physicser.add_to_space()
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
115 self.renderer = renderer
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
116 renderer.set_game_object(self)
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
117 self.puzzler = puzzler
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
118 if puzzler is not None:
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
119 puzzler.set_game_object(self)
191
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
120 self.overlay = overlay
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
121 if overlay is not None:
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
122 self.overlay.set_game_object(self)
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
123 self.interactible = interactible
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
124 if interactible is not None:
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
125 self.interactible.set_game_object(self)
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
126 self.remove = False # If true, will be removed from drawables
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
127
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
128 def get_space(self):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
129 return self.physicser.get_space()
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
130
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
131 def get_shape(self):
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
132 return self.physicser.get_shape()
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
133
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
134 def get_render_position(self, surface):
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
135 return self.physicser.get_render_position(surface)
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
136
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
137 def get_render_angle(self):
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
138 return self.physicser.get_angle()
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
139
229
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 224
diff changeset
140 def get_facing_direction(self):
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 224
diff changeset
141 """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
142 """
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 224
diff changeset
143 return None
329b3044ddef Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents: 224
diff changeset
144
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
145 def render(self, surface):
123
23b533d6f27e Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
146 return self.renderer.render(surface)
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
147
143
deac6a4008e7 Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents: 140
diff changeset
148 def animate(self):
deac6a4008e7 Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents: 140
diff changeset
149 self.renderer.animate()
deac6a4008e7 Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents: 140
diff changeset
150
302
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
151 def hit(self, weapon):
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
152 '''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
153 pass
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
154
256
2a0bad886956 Collision handlers get the protagonist.
Jeremy Thurgood <firxen@gmail.com>
parents: 235
diff changeset
155 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
156 """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
157
d63c19003aec Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 185
diff changeset
158 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
159 (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
160 """
192
3dc2b6290e66 Document collision handler a little better.
Jeremy Thurgood <firxen@gmail.com>
parents: 191
diff changeset
161 return True
186
d63c19003aec Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 185
diff changeset
162
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
163 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
164 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
165 """Hints for the level editor"""
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
166 return [("name", "string")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
167
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
168
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
169 class FloorSwitch(GameObject):
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
170 zorder = ZORDER_FLOOR
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
171
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
172 def __init__(self, space, position):
145
0c49627920eb Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
173 body = make_body(None, None, position)
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
174 self.shape = pymunk.Circle(body, 30)
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
175 self.shape.collision_type = COLLISION_TYPE_SWITCH
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
176 self.shape.sensor = True
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
177 super(FloorSwitch, self).__init__(
93
d6a49f0c1e6e Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents: 91
diff changeset
178 SingleShapePhysicser(space, self.shape),
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
179 render.ImageStateRenderer({
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
180 True: resources.get_image('objects', 'sensor_on.png'),
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
181 False: resources.get_image('objects', 'sensor_off.png'),
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
182 }),
201
3495a2025bc6 Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents: 196
diff changeset
183 puzzle.CollidePuzzler(*SWITCH_PUSHERS),
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
184 )
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
185
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
186 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
187 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
188 return [("name", "string"), ("position", "coordinates")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
189
106
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
190
191
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
191 class Note(GameObject):
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
192 zorder = ZORDER_FLOOR
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
193
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
194 def __init__(self, space, position, message):
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
195 body = make_body(None, None, position)
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
196 self.shape = pymunk.Circle(body, 30)
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
197 self.shape.sensor = True
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
198 super(Note, self).__init__(
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
199 SingleShapePhysicser(space, self.shape),
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
200 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
201 puzzle.CollidePuzzler(),
222
cc5f2a5ac501 Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
202 render.TextOverlay(message),
191
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
203 )
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
204
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
205 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
206 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
207 return [("name", "string"), ("position", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
208 ("message", "text")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
209
191
e080fcd07fa9 Overlay notes
Stefano Rivera <stefano@rivera.za.net>
parents: 188
diff changeset
210
106
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
211 class FloorLight(GameObject):
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
212 zorder = ZORDER_FLOOR
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
213
106
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
214 def __init__(self, space, position, state_source):
145
0c49627920eb Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
215 body = make_body(None, None, position)
106
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
216 self.shape = pymunk.Circle(body, 10)
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
217 self.shape.collision_type = COLLISION_TYPE_SWITCH
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
218 self.shape.sensor = True
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
219 super(FloorLight, self).__init__(
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
220 SingleShapePhysicser(space, self.shape),
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
221 render.ImageStateRenderer({
162
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
222 True: resources.get_image('objects', 'light_on.png'),
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
223 False: resources.get_image('objects', 'light_off.png'),
507df17cfbaf Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents: 160
diff changeset
224 }),
201
3495a2025bc6 Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents: 196
diff changeset
225 puzzle.StateProxyPuzzler(state_source),
106
bce9cd8a4a8c FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
226 )
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
227
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
228 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
229 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
230 return [("name", "string"), ("position", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
231 ("state_source", "puzzler")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
232
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
233
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
234 class Box(GameObject):
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
235 def __init__(self, space, position):
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
236 body = make_body(10, 10000, position, damping=0.5)
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
237 self.shape = pymunk.Poly(
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
238 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
239 self.shape.friction = 0.5
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
240 self.shape.collision_type = COLLISION_TYPE_BOX
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
241 super(Box, self).__init__(
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
242 SingleShapePhysicser(space, self.shape),
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
243 render.ImageRenderer(resources.get_image('objects', 'crate.png')),
133
Jeremy Thurgood <firxen@gmail.com>
parents: 126
diff changeset
244 )
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
245
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
246 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
247 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
248 return [("name", "string"), ("position", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
249 ("state_source", "puzzler")]
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
250
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
251
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
252 class Door(GameObject):
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
253 zorder = ZORDER_FLOOR
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
254
263
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
255 def __init__(self, space, position, destination, dest_pos, angle,
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
256 key_state=None):
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
257 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
258 self.shape = pymunk.Circle(body, 30)
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
259 self.shape.collision_type = COLLISION_TYPE_DOOR
264
Neil Muller <drnlmuller@gmail.com>
parents: 263
diff changeset
260 self.shape.body.angle = float(angle) / 180 * math.pi
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
261 self.shape.sensor = True
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
262 self.destination = destination
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
263 self.dest_pos = tuple(dest_pos)
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
264 puzzler = None
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
265 action = environment.Action(self._post_door_event)
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
266 if key_state is not None:
201
3495a2025bc6 Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents: 196
diff changeset
267 puzzler = puzzle.StateProxyPuzzler(key_state)
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
268 action.condition = environment.PuzzleStateCondition(puzzler)
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
269 super(Door, self).__init__(
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
270 SingleShapePhysicser(space, self.shape),
207
42e8993c31fd Break out Renderers
Stefano Rivera <stefano@rivera.za.net>
parents: 203
diff changeset
271 render.ImageRenderer(resources.get_image('objects', 'door.png')),
186
d63c19003aec Some refactoring and fixing, start of better collision handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 185
diff changeset
272 puzzler,
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
273 interactible=environment.Interactible(action),
176
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
274 )
054944c6472b Initial door object
Neil Muller <drnlmuller@gmail.com>
parents: 162
diff changeset
275
281
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
276 def _post_door_event(self, protagonist):
9b56e954c674 Protagonist actions, now required for operating doors.
Jeremy Thurgood <firxen@gmail.com>
parents: 276
diff changeset
277 DoorEvent.post(self.destination, self.dest_pos)
224
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
278
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
279 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
280 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
281 return [("name", "string"), ("position", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
282 ("destination", "level name"), ("dest_pos", "coordinate"),
263
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
283 ("angle", "degrees"),
6c554ce627e3 Add angle to doors
Neil Muller <drnlmuller@gmail.com>
parents: 261
diff changeset
284 ("key_state", "puzzler (optional)")]
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
285
224
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
286
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
287 class Bulkhead(GameObject):
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
288 zorder = ZORDER_FLOOR
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
289
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
290 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
291 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
292 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
293 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
294 if key_state is None:
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
295 puzzler = puzzle.YesPuzzler()
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
296 else:
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
297 puzzler = puzzle.StateProxyPuzzler(key_state)
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
298 super(Bulkhead, self).__init__(
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
299 SingleShapePhysicser(space, self.shape),
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
300 render.ShapeStateRenderer(),
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
301 puzzler,
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
302 )
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
303
256
2a0bad886956 Collision handlers get the protagonist.
Jeremy Thurgood <firxen@gmail.com>
parents: 235
diff changeset
304 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
305 if self.puzzler.get_state():
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
306 # 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
307 return False
b6db213e53a2 Bulkheads are bits of wall you can walk through.
Jeremy Thurgood <firxen@gmail.com>
parents: 222
diff changeset
308 return True
235
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
309
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
310 @classmethod
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
311 def requires(cls):
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
312 return [("name", "string"), ("end1", "coordinates"),
831e4f6b3d18 Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
313 ("end2", "coordinates"), ("key_state", "puzzler")]
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
314
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
315
282
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
316 class ToggleSwitch(GameObject):
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
317 zorder = ZORDER_LOW
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
318
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
319 def __init__(self, space, position):
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
320 body = make_body(None, None, position)
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
321 self.shape = pymunk.Circle(body, 20)
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
322 self.shape.sensor = True
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
323 self.toggle_on = False
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
324 super(ToggleSwitch, self).__init__(
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
325 SingleShapePhysicser(space, self.shape),
296
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
326 render.ImageStateRenderer({
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
327 True: resources.get_image('objects', 'lever.png'),
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
328 False: resources.get_image(
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
329 'objects', 'lever.png', transforms=(FLIP_H,)),
eb08426a58fe Levers look like levers.
Jeremy Thurgood <firxen@gmail.com>
parents: 295
diff changeset
330 }),
282
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
331 puzzle.ParentAttrPuzzler('toggle_on'),
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
332 interactible=environment.Interactible(
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
333 environment.Action(self._toggle)),
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
334 )
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
335
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
336 def _toggle(self, protagonist):
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
337 self.toggle_on = not self.toggle_on
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
338
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
339 @classmethod
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
340 def requires(cls):
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
341 return [("name", "string"), ("position", "coordinates")]
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
342
9d186b897d82 Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents: 281
diff changeset
343
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
344 class Bullet(GameObject):
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
345 def __init__(self, space, position, impulse, source_collision_type):
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
346 body = make_body(1, pymunk.inf, position)
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
347 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
348 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
349 self.shape.sensor = True
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
350 self.shape.collision_type = COLLISION_TYPE_PROJECTILE
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
351 self.source_collision_type = source_collision_type
261
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
352 super(Bullet, self).__init__(
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
353 SingleShapePhysicser(space, self.shape),
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
354 render.ImageRenderer(resources.get_image('objects', 'bullet.png')),
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
355 )
db7c8e74efb4 (really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents: 256
diff changeset
356 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
357
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
358 def animate(self):
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
359 super(Bullet, self).animate()
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
360 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
361 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
362 self.last_position = position
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
363 for collision in r:
302
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
364 shape = collision.shape
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
365 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
366 or shape == self.physicser.get_shape()
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
367 or shape.sensor):
293
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
368 continue
302
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
369 if hasattr(shape, 'physicser'):
a0a471ad2ee8 Pass bullet hits through to the target
Stefano Rivera <stefano@rivera.za.net>
parents: 297
diff changeset
370 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
371 self.physicser.remove_from_space()
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
372 self.remove = True
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
373 break
47226c661ae2 Bullets that mostly die when they hit things
Stefano Rivera <stefano@rivera.za.net>
parents: 286
diff changeset
374
286
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
375
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
376 class CollectibleGameObject(GameObject):
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
377 zorder = ZORDER_LOW
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
378
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
379 def __init__(self, space, name, shape, renderer):
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
380 self._name = name
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
381 shape.sensor = True
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
382 super(CollectibleGameObject, self).__init__(
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
383 SingleShapePhysicser(space, shape),
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
384 renderer,
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
385 interactible=environment.Interactible(
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
386 environment.Action(
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
387 self._collect, environment.HumanFormCondition())),
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
388 )
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
389
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
390 def _collect(self, protagonist):
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
391 protagonist.inventory[self._name] = self
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
392 # TODO: Make this less hacky.
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
393 self.physicser.remove_from_space()
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
394 self.renderer = render.NullRenderer()
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
395
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
396
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
397 class Gun(CollectibleGameObject):
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
398 def __init__(self, space, position):
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
399 body = make_body(None, None, position)
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
400 self.shape = pymunk.Circle(body, 20)
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
401 super(Gun, self).__init__(
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
402 space, 'gun', self.shape,
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
403 render.ImageRenderer(resources.get_image('objects', 'bullet.png')),
248b8fdb160c Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents: 282
diff changeset
404 )