comparison pyntnclick/state.py @ 592:4e9178215e75 pyntnclick

Introduce .setup() for GameDeveloperGizmos.
author Simon Cross <hodgestar+bzr@gmail.com>
date Sat, 11 Feb 2012 17:38:57 +0200
parents 0571deb177e9
children 59f1ee3f5632
comparison
equal deleted inserted replaced
591:4117d7b201a4 592:4e9178215e75
90 90
91 def set_debug_rects(self, value=True): 91 def set_debug_rects(self, value=True):
92 self.debug_rects = value 92 self.debug_rects = value
93 93
94 def add_scene(self, scene): 94 def add_scene(self, scene):
95 scene.set_state(self)
95 self.scenes[scene.name] = scene 96 self.scenes[scene.name] = scene
96 97
97 def add_detail_view(self, detail_view): 98 def add_detail_view(self, detail_view):
99 detail_view.set_state(self)
98 self.detail_views[detail_view.name] = detail_view 100 self.detail_views[detail_view.name] = detail_view
99 101
100 def add_item(self, item): 102 def add_item(self, item):
103 item.set_state(self)
101 self.items[item.name] = item 104 self.items[item.name] = item
102 item.set_state(self)
103 105
104 def load_scenes(self, modname): 106 def load_scenes(self, modname):
105 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) 107 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname])
106 for scene_cls in mod.SCENES: 108 for scene_cls in mod.SCENES:
107 self.add_scene(scene_cls(self)) 109 self.add_scene(scene_cls(self))
196 def set_do_enter_leave(self): 198 def set_do_enter_leave(self):
197 """Flag that we need to run the enter loop""" 199 """Flag that we need to run the enter loop"""
198 self.do_check = self.gd.constants.leave 200 self.do_check = self.gd.constants.leave
199 201
200 202
201 class StatefulGizmo(object): 203 class GameDeveloperGizmo(object):
204 """Base class for objects game developers see."""
205
206 def __init__(self):
207 """Set """
208 self.state = None
209 self.gd = None
210 self.resource = None
211 self.sound = None
212
213 def set_state(self, state):
214 self.state = state
215 self.gd = state.gd
216 self.resource = self.gd.resource
217 self.sound = self.gd.sound
218 self.setup()
219
220 def setup(self):
221 """Game developers should override this to do their setup.
222
223 It will be called after all the useful state functions have been
224 set.
225 """
226 pass
227
228
229 class StatefulGizmo(GameDeveloperGizmo):
202 230
203 # initial data (optional, defaults to none) 231 # initial data (optional, defaults to none)
204 INITIAL_DATA = None 232 INITIAL_DATA = None
205 233
206 def __init__(self): 234 def __init__(self):
235 GameDeveloperGizmo.__init__(self)
207 self.data = {} 236 self.data = {}
208 if self.INITIAL_DATA: 237 if self.INITIAL_DATA:
209 # deep copy of INITIAL_DATA allows lists, sets and 238 # deep copy of INITIAL_DATA allows lists, sets and
210 # other mutable types to safely be used in INITIAL_DATA 239 # other mutable types to safely be used in INITIAL_DATA
211 self.data.update(copy.deepcopy(self.INITIAL_DATA)) 240 self.data.update(copy.deepcopy(self.INITIAL_DATA))
234 263
235 def __init__(self, state): 264 def __init__(self, state):
236 StatefulGizmo.__init__(self) 265 StatefulGizmo.__init__(self)
237 # scene name 266 # scene name
238 self.name = self.NAME if self.NAME is not None else self.FOLDER 267 self.name = self.NAME if self.NAME is not None else self.FOLDER
239 # link back to state object
240 self.state = state
241 self.sound = state.gd.sound
242 self.resource = state.gd.resource
243 # map of thing names -> Thing objects 268 # map of thing names -> Thing objects
244 self.things = {} 269 self.things = {}
245 self._background = None 270 self._background = None
246 271
247 def add_item(self, item): 272 def add_item(self, item):
248 self.state.add_item(item) 273 self.state.add_item(item)
249 274
250 def add_thing(self, thing): 275 def add_thing(self, thing):
251 self.things[thing.name] = thing 276 self.things[thing.name] = thing
277 thing.set_state(self.state)
252 thing.set_scene(self) 278 thing.set_scene(self)
253 279
254 def remove_thing(self, thing): 280 def remove_thing(self, thing):
255 del self.things[thing.name] 281 del self.things[thing.name]
256 if thing is self.state.current_thing: 282 if thing is self.state.current_thing:
278 Rect(400 - w / 2, 5, w, h)) 304 Rect(400 - w / 2, 5, w, h))
279 description.draw_all(sub) 305 description.draw_all(sub)
280 306
281 def _cache_background(self): 307 def _cache_background(self):
282 if self.BACKGROUND and not self._background: 308 if self.BACKGROUND and not self._background:
283 self._background = self.state.gd.resource.get_image( 309 self._background = self.resource.get_image(
284 (self.FOLDER, self.BACKGROUND)) 310 (self.FOLDER, self.BACKGROUND))
285 311
286 def draw_background(self, surface): 312 def draw_background(self, surface):
287 self._cache_background() 313 self._cache_background()
288 if self._background is not None: 314 if self._background is not None:
403 self.folder = self.FOLDER 429 self.folder = self.FOLDER
404 # interacts 430 # interacts
405 self.interacts = self.INTERACTS 431 self.interacts = self.INTERACTS
406 # these are set by set_scene 432 # these are set by set_scene
407 self.scene = None 433 self.scene = None
408 self.state = None
409 self.current_interact = None 434 self.current_interact = None
410 self.rect = None 435 self.rect = None
411 self.orig_rect = None 436 self.orig_rect = None
412 437
413 def _fix_rect(self): 438 def _fix_rect(self):
475 for rect in self.rect: 500 for rect in self.rect:
476 frame_rect(surface, self._interact_hilight_color, 501 frame_rect(surface, self._interact_hilight_color,
477 rect.inflate(1, 1), 1) 502 rect.inflate(1, 1), 1)
478 503
479 504
480 class Item(InteractiveMixin): 505 class Item(GameDeveloperGizmo, InteractiveMixin):
481 """Base class for inventory items.""" 506 """Base class for inventory items."""
482 507
483 # image for inventory 508 # image for inventory
484 INVENTORY_IMAGE = None 509 INVENTORY_IMAGE = None
485 510
491 516
492 # set to instance of CursorSprite 517 # set to instance of CursorSprite
493 CURSOR = None 518 CURSOR = None
494 519
495 def __init__(self, name=None): 520 def __init__(self, name=None):
496 self.state = None 521 GameDeveloperGizmo.__init__(self)
497 self.name = self.NAME 522 self.name = self.NAME
498 if name is not None: 523 if name is not None:
499 self.name = name 524 self.name = name
500 self.tool_name = name 525 self.tool_name = name
501 if self.TOOL_NAME is not None: 526 if self.TOOL_NAME is not None:
502 self.tool_name = self.TOOL_NAME 527 self.tool_name = self.TOOL_NAME
503 self.inventory_image = None 528 self.inventory_image = None
504 529
505 def _cache_inventory_image(self): 530 def _cache_inventory_image(self):
506 if not self.inventory_image: 531 if not self.inventory_image:
507 self.inventory_image = self.state.gd.resource.get_image( 532 self.inventory_image = self.resource.get_image(
508 ('items', self.INVENTORY_IMAGE)) 533 ('items', self.INVENTORY_IMAGE))
509
510 def set_state(self, state):
511 assert self.state is None
512 self.state = state
513 534
514 def get_inventory_image(self): 535 def get_inventory_image(self):
515 self._cache_inventory_image() 536 self._cache_inventory_image()
516 return self.inventory_image 537 return self.inventory_image
517 538