Mercurial > pyntnclick
comparison gamelib/state.py @ 511:93ddcac0b772
Merged in engine refactorings.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 04 Sep 2010 09:53:00 +0200 |
parents | 168e9424fe91 c1f4f9149349 |
children | b10dae40dc32 |
comparison
equal
deleted
inserted
replaced
510:d274cc414178 | 511:93ddcac0b772 |
---|---|
112 def add_detail_view(self, detail_view): | 112 def add_detail_view(self, detail_view): |
113 self.detail_views[detail_view.name] = detail_view | 113 self.detail_views[detail_view.name] = detail_view |
114 | 114 |
115 def add_item(self, item): | 115 def add_item(self, item): |
116 self.items[item.name] = item | 116 self.items[item.name] = item |
117 item.set_state(self) | |
117 | 118 |
118 def load_scenes(self, modname): | 119 def load_scenes(self, modname): |
119 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) | 120 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) |
120 for scene_cls in mod.SCENES: | 121 for scene_cls in mod.SCENES: |
121 self.add_scene(scene_cls(self)) | 122 self.add_scene(scene_cls(self)) |
376 | 377 |
377 def get_detail_size(self): | 378 def get_detail_size(self): |
378 return self._background.get_size() | 379 return self._background.get_size() |
379 | 380 |
380 | 381 |
381 class Thing(StatefulGizmo): | 382 class InteractiveMixin(object): |
383 def is_interactive(self): | |
384 return True | |
385 | |
386 def interact(self, tool): | |
387 if not self.is_interactive(): | |
388 return None | |
389 if tool is None: | |
390 return self.interact_without() | |
391 handler = getattr(self, 'interact_with_' + tool.tool_name, None) | |
392 inverse_handler = self.get_inverse_interact(tool) | |
393 if handler is not None: | |
394 return handler(tool) | |
395 elif inverse_handler is not None: | |
396 return inverse_handler(self) | |
397 else: | |
398 return self.interact_default(tool) | |
399 | |
400 def get_inverse_interact(self, tool): | |
401 return None | |
402 | |
403 def interact_without(self): | |
404 return self.interact_default(None) | |
405 | |
406 def interact_default(self, item=None): | |
407 return None | |
408 | |
409 | |
410 | |
411 class Thing(StatefulGizmo, InteractiveMixin): | |
382 """Base class for things in a scene that you can interact with.""" | 412 """Base class for things in a scene that you can interact with.""" |
383 | 413 |
384 # name of thing | 414 # name of thing |
385 NAME = None | 415 NAME = None |
386 | 416 |
450 return False | 480 return False |
451 | 481 |
452 def get_description(self): | 482 def get_description(self): |
453 return None | 483 return None |
454 | 484 |
455 def is_interactive(self): | |
456 return True | |
457 | |
458 def enter(self, item): | 485 def enter(self, item): |
459 """Called when the cursor enters the Thing.""" | 486 """Called when the cursor enters the Thing.""" |
460 pass | 487 pass |
461 | 488 |
462 def leave(self): | 489 def leave(self): |
463 """Called when the cursr leaves the Thing.""" | 490 """Called when the cursr leaves the Thing.""" |
464 pass | 491 pass |
465 | 492 |
466 def interact(self, item): | |
467 if not self.is_interactive(): | |
468 return | |
469 if item is None: | |
470 return self.interact_without() | |
471 else: | |
472 handler = getattr(self, 'interact_with_' + item.tool_name, None) | |
473 if handler is not None: | |
474 return handler(item) | |
475 else: | |
476 return self.interact_default(item) | |
477 | |
478 def animate(self): | 493 def animate(self): |
479 return self.current_interact.animate() | 494 return self.current_interact.animate() |
480 | |
481 def interact_without(self): | |
482 return self.interact_default(None) | |
483 | |
484 def interact_default(self, item): | |
485 return None | |
486 | 495 |
487 def draw(self, surface): | 496 def draw(self, surface): |
488 old_rect = self.current_interact.rect | 497 old_rect = self.current_interact.rect |
489 if old_rect: | 498 if old_rect: |
490 self.current_interact.rect = old_rect.move(self.scene.OFFSET) | 499 self.current_interact.rect = old_rect.move(self.scene.OFFSET) |
498 for rect in self.rect: | 507 for rect in self.rect: |
499 frame_rect(surface, self._interact_hilight_color, | 508 frame_rect(surface, self._interact_hilight_color, |
500 rect.inflate(1, 1), 1) | 509 rect.inflate(1, 1), 1) |
501 | 510 |
502 | 511 |
503 class Item(object): | 512 class Item(InteractiveMixin): |
504 """Base class for inventory items.""" | 513 """Base class for inventory items.""" |
505 | 514 |
506 # image for inventory | 515 # image for inventory |
507 INVENTORY_IMAGE = None | 516 INVENTORY_IMAGE = None |
508 | 517 |
518 # name of item | |
519 NAME = None | |
520 | |
509 # name for interactions (i.e. def interact_with_<TOOL_NAME>) | 521 # name for interactions (i.e. def interact_with_<TOOL_NAME>) |
510 TOOL_NAME = None | 522 TOOL_NAME = None |
511 | 523 |
512 # set to instance of CursorSprite | 524 # set to instance of CursorSprite |
513 CURSOR = None | 525 CURSOR = None |
514 | 526 |
515 def __init__(self, name): | 527 def __init__(self, name=None): |
516 self.name = name | 528 self.state = None |
529 self.name = self.NAME | |
530 if name is not None: | |
531 self.name = name | |
517 self.tool_name = name | 532 self.tool_name = name |
518 if self.TOOL_NAME is not None: | 533 if self.TOOL_NAME is not None: |
519 self.tool_name = self.TOOL_NAME | 534 self.tool_name = self.TOOL_NAME |
520 self.inventory_image = get_image('items', self.INVENTORY_IMAGE) | 535 self.inventory_image = get_image('items', self.INVENTORY_IMAGE) |
521 | 536 |
537 def set_state(self, state): | |
538 assert self.state is None | |
539 self.state = state | |
540 | |
522 def get_inventory_image(self): | 541 def get_inventory_image(self): |
523 return self.inventory_image | 542 return self.inventory_image |
524 | 543 |
525 def interact(self, tool, state): | 544 def get_inverse_interact(self, tool): |
526 if tool is None: | 545 return getattr(tool, 'interact_with_' + self.tool_name, None) |
527 return self.interact_without(state) | |
528 handler = getattr(self, 'interact_with_' + tool.name, None) | |
529 inverse_handler = getattr(tool, 'interact_with_' + self.tool_name, None) | |
530 if handler is not None: | |
531 return handler(tool, state) | |
532 elif inverse_handler is not None: | |
533 return inverse_handler(self, state) | |
534 else: | |
535 return self.interact_default(tool, state) | |
536 | |
537 def interact_default(self, tool, state): | |
538 return Result("That doesn't do anything useful") | |
539 | 546 |
540 | 547 |
541 class CloneableItem(Item): | 548 class CloneableItem(Item): |
542 _counter = 0 | 549 _counter = 0 |
543 | 550 |
544 @classmethod | 551 @classmethod |
545 def _get_new_id(cls): | 552 def _get_new_id(cls): |
546 cls._counter += 1 | 553 cls._counter += 1 |
547 return cls._counter - 1 | 554 return cls._counter - 1 |
548 | 555 |
549 def __init__(self, name): | 556 def __init__(self, name=None): |
557 super(CloneableItem, self).__init__(name) | |
550 my_count = self._get_new_id() | 558 my_count = self._get_new_id() |
551 super(CloneableItem, self).__init__("%s.%s" % (name, my_count)) | 559 self.name = "%s.%s" % (self.name, my_count) |
552 self.tool_name = name | |
553 if self.TOOL_NAME is not None: | |
554 self.tool_name = self.TOOL_NAME |