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