Mercurial > nagslang
annotate nagslang/puzzle.py @ 416:bea0ea5b98df
Well, gravity.
author | davidsharpe@lantea.local |
---|---|
date | Sat, 07 Sep 2013 12:52:16 +0200 |
parents | 14339d2d46bc |
children | 547320870aed |
rev | line source |
---|---|
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
1 from nagslang.constants import COLLISION_TYPE_PLAYER |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
2 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
3 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
4 def get_editable_puzzlers(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
5 classes = [] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
6 for cls_name, cls in globals().iteritems(): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
7 if isinstance(cls, type) and hasattr(cls, 'requires'): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
8 classes.append((cls_name, cls)) |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
9 return classes |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
10 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
11 |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
12 class PuzzleGlue(object): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
13 """Glue that holds bits of a puzzle together. |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
14 """ |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
15 def __init__(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
16 self._components = {} |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
17 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
18 def add_component(self, name, puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
19 if not isinstance(puzzler, Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
20 puzzler = puzzler.puzzler |
328
14339d2d46bc
Only add objects with actual puzzlers to the glue
Neil Muller <drnlmuller@gmail.com>
parents:
282
diff
changeset
|
21 if puzzler is None: |
14339d2d46bc
Only add objects with actual puzzlers to the glue
Neil Muller <drnlmuller@gmail.com>
parents:
282
diff
changeset
|
22 # We've got a name, but no puzzler, |
14339d2d46bc
Only add objects with actual puzzlers to the glue
Neil Muller <drnlmuller@gmail.com>
parents:
282
diff
changeset
|
23 # so we shouldn't actually be stuck |
14339d2d46bc
Only add objects with actual puzzlers to the glue
Neil Muller <drnlmuller@gmail.com>
parents:
282
diff
changeset
|
24 # in here |
14339d2d46bc
Only add objects with actual puzzlers to the glue
Neil Muller <drnlmuller@gmail.com>
parents:
282
diff
changeset
|
25 return |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
26 self._components[name] = puzzler |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
27 puzzler.set_glue(self) |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
28 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
29 def get_state_of(self, name): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
30 return self._components[name].get_state() |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
31 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
32 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
33 class Puzzler(object): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
34 """Behaviour specific to a puzzle component. |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
35 """ |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
36 def set_glue(self, glue): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
37 self.glue = glue |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
38 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
39 def set_game_object(self, game_object): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
40 self.game_object = game_object |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
41 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
42 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
43 raise NotImplementedError() |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
44 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
45 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
46 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
47 """Tell the level editor the arguments we require |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
48 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
49 Format is a list of name: type hint tuples""" |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
50 return [("name", "string")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
51 |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
52 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
53 class YesPuzzler(Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
54 """Yes sir, I'm always on. |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
55 """ |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
56 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
57 return True |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
58 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
59 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
60 class NoPuzzler(Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
61 """No sir, I'm always off. |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
62 """ |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
63 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
64 return False |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
65 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
66 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
67 class CollidePuzzler(Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
68 def __init__(self, *collision_types): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
69 if not collision_types: |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
70 collision_types = (COLLISION_TYPE_PLAYER,) |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
71 self._collision_types = collision_types |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
72 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
73 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
74 space = self.game_object.get_space() |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
75 for shape in space.shape_query(self.game_object.get_shape()): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
76 if shape.collision_type in self._collision_types: |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
77 return True |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
78 return False |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
79 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
80 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
81 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
82 return [("name", "string"), ("collision_types", "list of ints")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
83 |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
84 |
282
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
85 class ParentAttrPuzzler(Puzzler): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
86 def __init__(self, attr_name): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
87 self._attr_name = attr_name |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
88 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
89 def get_state(self): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
90 return getattr(self.game_object, self._attr_name) |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
91 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
92 @classmethod |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
93 def requires(cls): |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
94 return [("name", "string"), ("attr_name", "string")] |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
95 |
9d186b897d82
Toggle switch, sans art.
Jeremy Thurgood <firxen@gmail.com>
parents:
235
diff
changeset
|
96 |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
97 class StateProxyPuzzler(Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
98 def __init__(self, state_source): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
99 self._state_source = state_source |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
100 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
101 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
102 return self.glue.get_state_of(self._state_source) |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
103 |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
104 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
105 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
106 return [("name", "string"), ("sources", "list of names")] |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
107 |
201
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
108 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
109 class StateLogicalAndPuzzler(Puzzler): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
110 def __init__(self, *state_sources): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
111 self._state_sources = state_sources |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
112 |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
113 def get_state(self): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
114 for state_source in self._state_sources: |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
115 if not self.glue.get_state_of(state_source): |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
116 return False |
3495a2025bc6
Break puzzlers out of game_object.py
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
117 return True |
235
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
118 |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
119 @classmethod |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
120 def requires(cls): |
831e4f6b3d18
Add hints for the level editor
Neil Muller <drnlmuller@gmail.com>
parents:
201
diff
changeset
|
121 return [("name", "string"), ("sources", "list of names")] |