MoveEvent.py 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from intelligine.core.exceptions import UnableToFoundMovement, MovementModeExpired
  2. from intelligine.synergy.event.move.direction import get_position_with_direction_decal
  3. from intelligine.shorcut.brain import get_brain_part
  4. from synergine.core.exceptions import NotConcernedEvent
  5. from intelligine.synergy.event.Event import Event
  6. from synergine.core.simulation.mechanism.Mechanism import Mechanism
  7. from intelligine.cst import COL_WALKER, BRAIN_SCHEMA, BRAIN_PART_MOVE
  8. from synergine_xyz.cst import POSITION
  9. class MoveEvent(Event):
  10. PARAM_POSITION = 'pos'
  11. PARAM_DIRECTION = 'dir'
  12. PARAM_NEW_MODE = 'mod'
  13. _mechanism = Mechanism
  14. _concern = COL_WALKER
  15. def _prepare(self, object_id, context, parameters={}):
  16. try:
  17. direction = self._get_direction(object_id, context)
  18. except UnableToFoundMovement:
  19. raise NotConcernedEvent()
  20. except MovementModeExpired as movement_expired:
  21. parameters[self.PARAM_NEW_MODE] = movement_expired.get_switch_to_mode()
  22. return parameters
  23. object_point = context.metas.value.get(POSITION, object_id)
  24. move_to_point = get_position_with_direction_decal(direction, object_point)
  25. # TODO: future: c le brain qui calcule ou aller, et donc si c possible
  26. if self._direction_point_is_possible(context, move_to_point):
  27. parameters[self.PARAM_POSITION] = move_to_point
  28. parameters[self.PARAM_DIRECTION] = direction
  29. # TODO: Sinon lever un NotConcernedEvent
  30. return parameters
  31. def _get_direction(self, object_id, context):
  32. object_move_brain_part = get_brain_part(context, object_id, BRAIN_PART_MOVE)
  33. return object_move_brain_part.get_direction(context, object_id)
  34. @staticmethod
  35. def _direction_point_is_possible(context, direction_point):
  36. return context.position_is_penetrable(direction_point)