Mercurial > boomslang
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 |