Mercurial > pyntnclick
comparison pyntnclick/state.py @ 692:d6ded808cc33 pyntnclick
Much scene management refactoring.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Tue, 14 Feb 2012 13:39:05 +0200 |
parents | 1ddafd55458a |
children | c8b683dd56d3 |
comparison
equal
deleted
inserted
replaced
691:60bf20849231 | 692:d6ded808cc33 |
---|---|
39 if self.widget: | 39 if self.widget: |
40 scene_widget.queue_widget(self.widget) | 40 scene_widget.queue_widget(self.widget) |
41 if self.message: | 41 if self.message: |
42 scene_widget.show_message(self.message) | 42 scene_widget.show_message(self.message) |
43 if self.detail_view: | 43 if self.detail_view: |
44 scene_widget.show_detail(self.detail_view) | 44 scene_widget.game.show_detail(self.detail_view) |
45 if (self.close_detail | |
46 and hasattr(scene_widget, 'parent') | |
47 and hasattr(scene_widget.parent, 'clear_detail')): | |
48 scene_widget.parent.clear_detail() | |
49 if self.end_game: | 45 if self.end_game: |
50 scene_widget.end_game() | 46 scene_widget.end_game() |
51 | 47 |
52 | 48 |
53 def handle_result(result, scene_widget): | 49 def handle_result(result, scene_widget): |
114 self.tool = None | 110 self.tool = None |
115 # Global game data | 111 # Global game data |
116 self.data = GameState() | 112 self.data = GameState() |
117 # current scene | 113 # current scene |
118 self.current_scene = None | 114 self.current_scene = None |
119 # current detail view | |
120 self.current_detail = None | |
121 # scene we came from, for enter and leave processing | |
122 self.previous_scene = None | |
123 # scene transion helpers | |
124 self.do_check = None | |
125 self.old_pos = None | |
126 # current thing | |
127 self.current_thing = None | |
128 self.highlight_override = False | |
129 # debug rects | 115 # debug rects |
130 self.debug_rects = False | 116 self.debug_rects = False |
131 | 117 |
132 def set_custom_data(self, data_object): | 118 def set_custom_data(self, data_object): |
133 self.data = data_object | 119 self.data = data_object |
155 if hasattr(mod, 'DETAIL_VIEWS'): | 141 if hasattr(mod, 'DETAIL_VIEWS'): |
156 for scene_cls in mod.DETAIL_VIEWS: | 142 for scene_cls in mod.DETAIL_VIEWS: |
157 scene = scene_cls(self) | 143 scene = scene_cls(self) |
158 self.add_detail_view(scene) | 144 self.add_detail_view(scene) |
159 | 145 |
160 def set_current_scene(self, name): | 146 def change_scene(self, name): |
161 old_scene = self.current_scene | 147 ScreenEvent.post('game', 'change_scene', |
162 self.current_scene = self.scenes[name] | 148 {'name': name, 'detail': False}) |
163 self.current_thing = None | 149 |
164 if old_scene and old_scene != self.current_scene: | 150 def show_detail(self, name): |
165 self.previous_scene = old_scene | 151 ScreenEvent.post('game', 'change_scene', |
166 self.set_do_enter_leave() | 152 {'name': name, 'detail': True}) |
167 ScreenEvent.post('game', 'change_scene', name) | |
168 | |
169 def set_current_detail(self, name): | |
170 self.current_thing = None | |
171 if name is None: | |
172 self.current_detail = None | |
173 else: | |
174 self.current_detail = self.detail_views[name] | |
175 return self.current_detail | |
176 | 153 |
177 def _update_inventory(self): | 154 def _update_inventory(self): |
178 ScreenEvent.post('game', 'inventory', None) | 155 ScreenEvent.post('game', 'inventory', None) |
179 | 156 |
180 def add_inventory_item(self, name): | 157 def add_inventory_item(self, name): |
206 return True | 183 return True |
207 | 184 |
208 def set_tool(self, item): | 185 def set_tool(self, item): |
209 self.tool = item | 186 self.tool = item |
210 | 187 |
211 def interact(self, pos): | |
212 return self.current_scene.interact(self.tool, pos) | |
213 | |
214 def interact_detail(self, pos): | |
215 return self.current_detail.interact(self.tool, pos) | |
216 | |
217 def cancel_doodah(self, screen): | 188 def cancel_doodah(self, screen): |
218 if self.tool: | 189 if self.tool: |
219 self.set_tool(None) | 190 self.set_tool(None) |
220 # XXX: Needs to be tweaked to work with the new | 191 # XXX: Needs to be tweaked to work with the new |
221 # scene stuff | 192 # scene stuff |
222 #elif self.current_detail: | 193 #elif self.current_detail: |
223 # screen.state_widget.clear_detail() | 194 # screen.state_widget.clear_detail() |
224 | 195 |
225 def do_enter_detail(self): | |
226 if self.current_detail: | |
227 self.current_detail.enter() | |
228 | |
229 def do_leave_detail(self): | |
230 if self.current_detail: | |
231 self.current_detail.leave() | |
232 | |
233 def animate(self): | 196 def animate(self): |
234 if not self.do_check: | 197 if not self.do_check: |
235 return self.current_scene.animate() | 198 return self.current_scene.animate() |
236 | |
237 def check_enter_leave(self, screen): | |
238 if not self.do_check: | |
239 return None | |
240 if self.do_check == self.gd.constants.leave: | |
241 self.do_check = self.gd.constants.enter | |
242 if self.previous_scene: | |
243 return self.previous_scene.leave() | |
244 return None | |
245 elif self.do_check == self.gd.constants.enter: | |
246 self.do_check = None | |
247 # Fix descriptions, etc. | |
248 if self.old_pos: | |
249 self.current_scene.update_current_thing(self.old_pos) | |
250 return self.current_scene.enter() | |
251 raise RuntimeError('invalid do_check value %s' % self.do_check) | |
252 | |
253 def set_do_enter_leave(self): | |
254 """Flag that we need to run the enter loop""" | |
255 self.do_check = self.gd.constants.leave | |
256 | 199 |
257 | 200 |
258 class GameDeveloperGizmo(object): | 201 class GameDeveloperGizmo(object): |
259 """Base class for objects game developers see.""" | 202 """Base class for objects game developers see.""" |
260 | 203 |
326 # scene name | 269 # scene name |
327 self.name = self.NAME if self.NAME is not None else self.FOLDER | 270 self.name = self.NAME if self.NAME is not None else self.FOLDER |
328 self.state_key = self.name | 271 self.state_key = self.name |
329 # map of thing names -> Thing objects | 272 # map of thing names -> Thing objects |
330 self.things = {} | 273 self.things = {} |
274 self.current_thing = None | |
331 self._background = None | 275 self._background = None |
332 | 276 |
333 def set_game(self, game): | 277 def set_game(self, game): |
334 super(Scene, self).set_game(game) | 278 super(Scene, self).set_game(game) |
335 self.set_state(game.data) | 279 self.set_state(game.data) |
342 thing.set_game(self.game) | 286 thing.set_game(self.game) |
343 thing.set_scene(self) | 287 thing.set_scene(self) |
344 | 288 |
345 def remove_thing(self, thing): | 289 def remove_thing(self, thing): |
346 del self.things[thing.name] | 290 del self.things[thing.name] |
347 if thing is self.game.current_thing: | 291 if thing is self.current_thing: |
348 self.game.current_thing.leave() | 292 self.current_thing.leave() |
349 self.game.current_thing = None | 293 self.current_thing = None |
350 | 294 |
351 def _get_description(self, dest_rect): | 295 def _get_description(self, dest_rect): |
352 text = (self.game.current_thing and | 296 text = (self.current_thing and |
353 self.game.current_thing.get_description()) | 297 self.current_thing.get_description()) |
354 if text is None: | 298 if text is None: |
355 return None | 299 return None |
356 label = LabelWidget((0, 10), self.gd, text) | 300 label = LabelWidget((0, 10), self.gd, text) |
357 label.rect.left += (dest_rect.width - label.rect.width) / 2 | 301 label.rect.left += (dest_rect.width - label.rect.width) / 2 |
358 return label | 302 return label |
387 | 331 |
388 Item may be an item in the list of items or None for the hand. | 332 Item may be an item in the list of items or None for the hand. |
389 | 333 |
390 Returns a Result object to provide feedback to the player. | 334 Returns a Result object to provide feedback to the player. |
391 """ | 335 """ |
392 if self.game.current_thing is not None: | 336 if self.current_thing is not None: |
393 return self.game.current_thing.interact(item) | 337 return self.current_thing.interact(item) |
394 | 338 |
395 def animate(self): | 339 def animate(self): |
396 """Animate all the things in the scene. | 340 """Animate all the things in the scene. |
397 | 341 |
398 Return true if any of them need to queue a redraw""" | 342 Return true if any of them need to queue a redraw""" |
407 | 351 |
408 def leave(self): | 352 def leave(self): |
409 return None | 353 return None |
410 | 354 |
411 def update_current_thing(self, pos): | 355 def update_current_thing(self, pos): |
412 if self.game.current_thing is not None: | 356 if self.current_thing is not None: |
413 if not self.game.current_thing.contains(pos): | 357 if not self.current_thing.contains(pos): |
414 self.game.current_thing.leave() | 358 self.current_thing.leave() |
415 self.game.current_thing = None | 359 self.current_thing = None |
416 for thing in self.things.itervalues(): | 360 for thing in self.things.itervalues(): |
417 if thing.contains(pos): | 361 if thing.contains(pos): |
418 thing.enter(self.game.tool) | 362 thing.enter(self.game.tool) |
419 self.game.current_thing = thing | 363 self.current_thing = thing |
420 break | 364 break |
421 | 365 |
422 def mouse_move(self, pos): | 366 def mouse_move(self, pos): |
423 """Call to check whether the cursor has entered / exited a thing. | 367 """Call to check whether the cursor has entered / exited a thing. |
424 | 368 |