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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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")]