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