Mercurial > pyntnclick
annotate gamelib/state.py @ 133:0530547a131f
Better map handling, detail_view stuff in Result.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Tue, 24 Aug 2010 19:49:10 +0200 |
parents | 686bb74a52f8 |
children | b43599b7f8a2 |
rev | line source |
---|---|
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
1 """Utilities and base classes for dealing with scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
2 |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
3 from albow.resource import get_image |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
4 from albow.utils import frame_rect |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
5 from widgets import BoomLabel |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
6 from pygame.locals import BLEND_ADD |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
7 from pygame.rect import Rect |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
8 from pygame.surface import Surface |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
9 from pygame.color import Color |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
10 |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
11 import constants |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
12 from sound import get_sound |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
13 from cursor import HAND |
11 | 14 |
124 | 15 |
78 | 16 class Result(object): |
17 """Result of interacting with a thing""" | |
18 | |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
19 def __init__(self, message=None, soundfile=None, detail_view=None): |
78 | 20 self.message = message |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
21 self.sound = None |
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
22 if soundfile: |
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
23 self.sound = get_sound(soundfile) |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
24 self.detail_view = detail_view |
78 | 25 |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
26 def process(self, scene_widget): |
126
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
27 """Helper function to do the right thing with a result object""" |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
28 if self.sound: |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
29 self.sound.play() |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
30 if self.message: |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
31 scene_widget.show_message(self.message) |
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
32 if self.detail_view: |
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
33 scene_widget.show_detail(self.detail_view) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
34 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
35 def initial_state(screen): |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
36 """Load the initial state.""" |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
37 state = State(screen) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
38 state.load_scenes("cryo") |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
39 state.load_scenes("bridge") |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
40 state.load_scenes("mess") |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
41 # state.load_scenes("engine") |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
42 # state.load_scenes("machine") |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
43 state.load_scenes("map") |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
44 state.set_current_scene("cryo") |
120 | 45 state.set_do_enter_leave() |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
46 return state |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
47 |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
48 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
49 class State(object): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
50 """Complete game state. |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
51 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
52 Game state consists of: |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
53 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
54 * items |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
55 * scenes |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
56 """ |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
57 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
58 def __init__(self, screen): |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
59 # map of scene name -> Scene object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
60 self.scenes = {} |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
61 # map of detail view name -> DetailView object |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
62 self.detail_views = {} |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
63 # map of item name -> Item object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
64 self.items = {} |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
65 # list of item objects in inventory |
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
66 self.inventory = [] |
73 | 67 # currently selected tool (item) |
68 self.tool = None | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
69 # current scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
70 self.current_scene = None |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
71 # current detail view |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
72 self.current_detail = None |
120 | 73 # scene we came from, for enter and leave processing |
74 self.previous_scene = None | |
75 # scene transion helpers | |
76 self.do_check = None | |
77 self.old_pos = None | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
78 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
79 self.screen = screen |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
80 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
81 def add_scene(self, scene): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
82 self.scenes[scene.name] = scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
83 |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
84 def add_detail_view(self, detail_view): |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
85 self.detail_views[detail_view.name] = detail_view |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
86 |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
87 def add_item(self, item): |
35 | 88 self.items[item.name] = item |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
89 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
90 def load_scenes(self, modname): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
91 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
92 for scene_cls in mod.SCENES: |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
93 self.add_scene(scene_cls(self)) |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
94 if hasattr(mod, 'DETAIL_VIEWS'): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
95 for scene_cls in mod.DETAIL_VIEWS: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
96 self.add_detail_view(scene_cls(self)) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
97 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
98 def set_current_scene(self, name): |
120 | 99 old_scene = self.current_scene |
29
6322d92dc8f0
Add state widget for rendering state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
28
diff
changeset
|
100 self.current_scene = self.scenes[name] |
120 | 101 if old_scene and old_scene != self.current_scene: |
102 self.previous_scene = old_scene | |
103 self.set_do_enter_leave() | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
104 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
105 def set_current_detail(self, name): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
106 if name is None: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
107 self.current_detail = None |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
108 else: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
109 self.current_detail = self.detail_views[name] |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
110 return self.current_detail.get_detail_size() |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
111 |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
112 def add_inventory_item(self, name): |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
113 self.inventory.append(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
114 |
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
115 def remove_inventory_item(self, name): |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
116 self.inventory.remove(self.items[name]) |
117
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
117 # Unselect tool if it's removed |
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
118 if self.tool == self.items[name]: |
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
119 self.set_tool(None) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
120 |
73 | 121 def set_tool(self, item): |
122 self.tool = item | |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
123 if item is None: |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
124 self.screen.set_cursor(HAND) |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
125 else: |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
126 self.screen.set_cursor(item.CURSOR) |
73 | 127 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
128 def draw(self, surface): |
120 | 129 if self.do_check and self.previous_scene and self.do_check == constants.LEAVE: |
130 # We still need to handle leave events, so still display the scene | |
131 self.previous_scene.draw(surface) | |
132 else: | |
133 self.current_scene.draw(surface) | |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
134 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
135 def draw_detail(self, surface): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
136 self.current_detail.draw(surface) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
137 |
73 | 138 def interact(self, pos): |
78 | 139 return self.current_scene.interact(self.tool, pos) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
140 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
141 def interact_detail(self, pos): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
142 return self.current_detail.interact(self.tool, pos) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
143 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
144 def animate(self): |
120 | 145 if not self.do_check: |
146 return self.current_scene.animate() | |
147 | |
148 def check_enter_leave(self): | |
149 if not self.do_check: | |
150 return None | |
151 if self.do_check == constants.LEAVE: | |
152 self.do_check = constants.ENTER | |
153 if self.previous_scene: | |
154 return self.previous_scene.leave() | |
155 return None | |
156 elif self.do_check == constants.ENTER: | |
157 self.do_check = None | |
158 # Fix descriptions, etc. | |
159 if self.old_pos: | |
160 self.current_scene.mouse_move(self.tool, self.old_pos) | |
161 return self.current_scene.enter() | |
162 raise RuntimeError('invalid do_check value %s' % self.do_check) | |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
163 |
73 | 164 def mouse_move(self, pos): |
165 self.current_scene.mouse_move(self.tool, pos) | |
120 | 166 # So we can do sensible things on enter and leave |
167 self.old_pos = pos | |
168 | |
169 def set_do_enter_leave(self): | |
170 """Flag that we need to run the enter loop""" | |
171 self.do_check = constants.LEAVE | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
172 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
173 def mouse_move_detail(self, pos): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
174 self.current_detail.mouse_move(self.tool, pos) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
175 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
176 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
177 class StatefulGizmo(object): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
178 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
179 # initial data (optional, defaults to none) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
180 INITIAL_DATA = None |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
181 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
182 def __init__(self): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
183 self.data = {} |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
184 if self.INITIAL_DATA: |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
185 self.data.update(self.INITIAL_DATA) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
186 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
187 def set_data(self, key, value): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
188 self.data[key] = value |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
189 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
190 def get_data(self, key): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
191 return self.data.get(key, None) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
192 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
193 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
194 class Scene(StatefulGizmo): |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
195 """Base class for scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
196 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
197 # sub-folder to look for resources in |
22 | 198 FOLDER = None |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
199 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
200 # name of background image resource |
22 | 201 BACKGROUND = None |
202 | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
203 # name of scene (optional, defaults to folder) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
204 NAME = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
205 |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
206 # size (for detail views) |
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
207 SIZE = constants.SCENE_SIZE |
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
208 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
209 def __init__(self, state): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
210 StatefulGizmo.__init__(self) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
211 # scene name |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
212 self.name = self.NAME if self.NAME is not None else self.FOLDER |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
213 # link back to state object |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
214 self.state = state |
22 | 215 # map of thing names -> Thing objects |
216 self.things = {} | |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
217 if self.BACKGROUND is not None: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
218 self._background = get_image(self.FOLDER, self.BACKGROUND) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
219 else: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
220 self._background = None |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
221 self._current_thing = None |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
222 self._current_description = None |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
223 |
35 | 224 def add_item(self, item): |
225 self.state.add_item(item) | |
226 | |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
227 def add_thing(self, thing): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
228 self.things[thing.name] = thing |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
229 thing.set_scene(self) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
230 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
231 def remove_thing(self, thing): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
232 del self.things[thing.name] |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
233 |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
234 def _make_description(self, text): |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
235 if text is None: |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
236 return None |
79
d7c0a702a0b4
Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
78
diff
changeset
|
237 label = BoomLabel(text) |
d7c0a702a0b4
Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
78
diff
changeset
|
238 label.set_margin(5) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
239 label.border_width = 1 |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
240 label.border_color = (0, 0, 0) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
241 label.bg_color = (127, 127, 127) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
242 label.fg_color = (0, 0, 0) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
243 return label |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
244 |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
245 def draw_description(self, surface): |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
246 if self._current_description is not None: |
77
bb7c8072f8c0
Some hacks to make Label work.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
76
diff
changeset
|
247 sub = surface.subsurface( |
bb7c8072f8c0
Some hacks to make Label work.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
76
diff
changeset
|
248 Rect(5, 5, *self._current_description.size)) |
bb7c8072f8c0
Some hacks to make Label work.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
76
diff
changeset
|
249 self._current_description.draw_all(sub) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
250 |
22 | 251 def draw_background(self, surface): |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
252 if self._background is not None: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
253 surface.blit(self._background, (0, 0), None) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
254 else: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
255 surface.fill((200, 200, 200)) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
256 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
257 def draw_things(self, surface): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
258 for thing in self.things.itervalues(): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
259 thing.draw(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
260 |
22 | 261 def draw(self, surface): |
262 self.draw_background(surface) | |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
263 self.draw_things(surface) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
264 self.draw_description(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
265 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
266 def interact(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
267 """Interact with a particular position. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
268 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
269 Item may be an item in the list of items or None for the hand. |
78 | 270 |
271 Returns a Result object to provide feedback to the player. | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
272 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
273 for thing in self.things.itervalues(): |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
274 if thing.contains(pos): |
78 | 275 result = thing.interact(item) |
276 if result: | |
277 if self._current_thing: | |
278 # Also update descriptions if needed | |
279 self._current_description = self._make_description( | |
280 self._current_thing.get_description()) | |
281 return result | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
282 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
283 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
284 """Animate all the things in the scene. |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
285 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
286 Return true if any of them need to queue a redraw""" |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
287 result = False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
288 for thing in self.things.itervalues(): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
289 if thing.animate(): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
290 result = True |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
291 return result |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
292 |
120 | 293 def enter(self): |
294 return None | |
295 | |
296 def leave(self): | |
297 self._current_description = None | |
298 return None | |
299 | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
300 def mouse_move(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
301 """Call to check whether the cursor has entered / exited a thing. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
302 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
303 Item may be an item in the list of items or None for the hand. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
304 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
305 if self._current_thing is not None: |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
306 if self._current_thing.contains(pos): |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
307 return |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
308 else: |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
309 self._current_thing.leave() |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
310 self._current_thing = None |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
311 self._current_description = None |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
312 for thing in self.things.itervalues(): |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
313 if thing.contains(pos): |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
314 thing.enter(item) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
315 self._current_thing = thing |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
316 self._current_description = self._make_description( |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
317 thing.get_description()) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
318 break |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
319 |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
320 def get_detail_size(self): |
127
9646e7c8bb97
Size detail window based on the Scene background image.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
321 return self._background.get_size() |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
322 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
323 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
324 class Interact(object): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
325 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
326 def __init__(self, image, rect, interact_rect): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
327 self.image = image |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
328 self.rect = rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
329 self.interact_rect = interact_rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
330 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
331 def set_thing(self, thing): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
332 pass |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
333 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
334 def draw(self, surface): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
335 if self.image is not None: |
88
053bc8e167fc
Don't render with BLEND_ADD, use normal overlay.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
86
diff
changeset
|
336 surface.blit(self.image, self.rect, None) |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
337 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
338 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
339 return False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
340 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
341 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
342 class InteractNoImage(Interact): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
343 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
344 def __init__(self, x, y, w, h): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
345 super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h)) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
346 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
347 |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
348 class InteractText(Interact): |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
349 """Display box with text to interact with -- mostly for debugging.""" |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
350 |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
351 def __init__(self, x, y, text, bg_color=None): |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
352 if bg_color is None: |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
353 bg_color = (127, 127, 127) |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
354 label = BoomLabel(text) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
355 label.set_margin(5) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
356 label.border_width = 1 |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
357 label.border_color = (0, 0, 0) |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
358 label.bg_color = bg_color |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
359 label.fg_color = (0, 0, 0) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
360 image = Surface(label.size) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
361 rect = Rect((x, y), label.size) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
362 label.draw_all(image) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
363 super(InteractText, self).__init__(image, rect, rect) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
364 |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
365 |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
366 class InteractRectUnion(Interact): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
367 |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
368 def __init__(self, rect_list): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
369 # pygame.rect.Rect.unionall should do this, but is broken |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
370 # in some pygame versions (including 1.8, it appears) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
371 rect_list = [Rect(x) for x in rect_list] |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
372 union_rect = rect_list[0] |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
373 for rect in rect_list[1:]: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
374 union_rect = union_rect.union(rect) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
375 super(InteractRectUnion, self).__init__(None, None, union_rect) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
376 self.interact_rect = rect_list |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
377 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
378 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
379 class InteractImage(Interact): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
380 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
381 def __init__(self, x, y, image_name): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
382 super(InteractImage, self).__init__(None, None, None) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
383 self._pos = (x, y) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
384 self._image_name = image_name |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
385 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
386 def set_thing(self, thing): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
387 self.image = get_image(thing.folder, self._image_name) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
388 self.rect = Rect(self._pos, self.image.get_size()) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
389 self.interact_rect = self.rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
390 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
391 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
392 class InteractAnimated(Interact): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
393 """Interactive with an animation rather than an image""" |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
394 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
395 # FIXME: Assumes all images are the same size |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
396 # anim_seq - sequence of image names |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
397 # delay - number of frames to wait between changing images |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
398 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
399 def __init__(self, x, y, anim_seq, delay): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
400 self._pos = (x, y) |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
401 self._anim_pos = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
402 self._names = anim_seq |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
403 self._frame_count = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
404 self._anim_seq = None |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
405 self._delay = delay |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
406 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
407 def set_thing(self, thing): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
408 self._anim_seq = [get_image(thing.folder, x) for x in self._names] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
409 self.image = self._anim_seq[0] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
410 self.rect = Rect(self._pos, self.image.get_size()) |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
411 self.interact_rect = self.rect |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
412 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
413 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
414 if self._anim_seq: |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
415 self._frame_count += 1 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
416 if self._frame_count > self._delay: |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
417 self._frame_count = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
418 self._anim_pos += 1 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
419 if self._anim_pos >= len(self._anim_seq): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
420 self._anim_pos = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
421 self.image = self._anim_seq[self._anim_pos] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
422 # queue redraw |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
423 return True |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
424 return False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
425 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
426 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
427 class Thing(StatefulGizmo): |
22 | 428 """Base class for things in a scene that you can interact with.""" |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
429 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
430 # name of thing |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
431 NAME = None |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
432 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
433 # sub-folder to look for resources in (defaults to scenes folder) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
434 FOLDER = None |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
435 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
436 # list of Interact objects |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
437 INTERACTS = {} |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
438 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
439 # name first interact |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
440 INITIAL = None |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
441 |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
442 # Interact rectangle hi-light color (for debugging) |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
443 # (set to None to turn off) |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
444 if constants.DEBUG: |
75 | 445 _interact_hilight_color = Color('red') |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
446 else: |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
447 _interact_hilight_color = None |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
448 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
449 def __init__(self): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
450 StatefulGizmo.__init__(self) |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
451 # name of the thing |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
452 self.name = self.NAME |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
453 # folder for resource (None is overridden by scene folder) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
454 self.folder = self.FOLDER |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
455 # interacts |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
456 self.interacts = self.INTERACTS |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
457 # these are set by set_scene |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
458 self.scene = None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
459 self.state = None |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
460 self.current_interact = None |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
461 self.rect = None |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
462 # TODO: add masks |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
463 |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
464 def set_scene(self, scene): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
465 assert self.scene is None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
466 self.scene = scene |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
467 if self.folder is None: |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
468 self.folder = scene.FOLDER |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
469 self.state = scene.state |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
470 for interact in self.interacts.itervalues(): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
471 interact.set_thing(self) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
472 self.set_interact(self.INITIAL) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
473 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
474 def set_interact(self, name): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
475 self.current_interact = self.interacts[name] |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
476 self.rect = self.current_interact.interact_rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
477 assert self.rect is not None, name |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
478 |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
479 def contains(self, pos): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
480 if hasattr(self.rect, 'collidepoint'): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
481 return self.rect.collidepoint(pos) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
482 else: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
483 # FIXME: add sanity check |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
484 for rect in list(self.rect): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
485 if rect.collidepoint(pos): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
486 return True |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
487 return False |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
488 |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
489 def get_description(self): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
490 return None |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
491 |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
492 def is_interactive(self): |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
493 return self.current_interact is not None |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
494 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
495 def enter(self, item): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
496 """Called when the cursor enters the Thing.""" |
101
19d784fd3918
Remove debugging prints (descriptions now provide pretty much the same feedback anyway).
Simon Cross <simon@simonx>
parents:
94
diff
changeset
|
497 pass |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
498 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
499 def leave(self): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
500 """Called when the cursr leaves the Thing.""" |
101
19d784fd3918
Remove debugging prints (descriptions now provide pretty much the same feedback anyway).
Simon Cross <simon@simonx>
parents:
94
diff
changeset
|
501 pass |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
502 |
22 | 503 def interact(self, item): |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
504 if not self.is_interactive(): |
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
505 return |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
506 if item is None: |
78 | 507 return self.interact_without() |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
508 else: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
509 handler = getattr(self, 'interact_with_' + item.name, None) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
510 if handler is not None: |
78 | 511 return handler(item) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
512 else: |
78 | 513 return self.interact_default(item) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
514 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
515 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
516 return self.current_interact.animate() |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
517 |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
518 def interact_without(self): |
78 | 519 return self.interact_default(None) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
520 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
521 def interact_default(self, item): |
78 | 522 return Result("It doesn't work.") |
22 | 523 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
524 def draw(self, surface): |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
525 self.current_interact.draw(surface) |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
526 if self._interact_hilight_color is not None: |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
527 if hasattr(self.rect, 'collidepoint'): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
528 frame_rect(surface, self._interact_hilight_color, |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
529 self.rect.inflate(1, 1), 1) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
530 else: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
531 for rect in self.rect: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
532 frame_rect(surface, self._interact_hilight_color, |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
533 rect.inflate(1, 1), 1) |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
534 |
22 | 535 |
536 class Item(object): | |
537 """Base class for inventory items.""" | |
538 | |
35 | 539 # image for inventory |
540 INVENTORY_IMAGE = None | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
541 |
35 | 542 def __init__(self, name): |
543 self.name = name | |
544 self.inventory_image = get_image('items', self.INVENTORY_IMAGE) | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
545 # TODO: needs cursor |
22 | 546 |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
547 def get_inventory_image(self): |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
548 return self.inventory_image |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
549 |