MoveAction.py 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from synergine.synergy.event.Action import Action
  2. from intelligine.synergy.event.move.MoveEvent import MoveEvent
  3. from synergine.synergy.event.exception.ActionAborted import ActionAborted
  4. from xyzworld.cst import POSITION
  5. from intelligine.cst import BRAIN_PART_MOVE, BRAIN_SCHEMA
  6. from xyzworld.cst import BLOCKED_SINCE
  7. from intelligine.synergy.event.move.direction import get_position_with_direction_decal
  8. class MoveAction(Action):
  9. _listen = MoveEvent
  10. def __init__(self, object_id, parameters):
  11. super().__init__(object_id, parameters)
  12. self._move_to_point = None
  13. self._move_to_direction = None
  14. def prepare(self, context):
  15. object_point = context.metas.value.get(POSITION, self._object_id)
  16. direction = self._get_prepared_direction(context)
  17. self._set_prepared_direction(context, object_point, direction)
  18. def _get_prepared_direction(self, context):
  19. object_brain_schema = context.metas.value.get(BRAIN_SCHEMA, self._object_id)
  20. object_move_brain_part = object_brain_schema[BRAIN_PART_MOVE]
  21. return object_move_brain_part.get_direction(context, self._object_id)
  22. def _set_prepared_direction(self, context, object_point, direction):
  23. move_to_point = get_position_with_direction_decal(direction, object_point)
  24. if self._direction_point_is_possible(context, move_to_point):
  25. self._move_to_point = move_to_point
  26. self._move_to_direction = direction
  27. else:
  28. # TODO: mettre self._dont_move = True ?
  29. pass
  30. @staticmethod
  31. def _direction_point_is_possible(context, direction_point):
  32. return context.position_is_penetrable(direction_point)
  33. def run(self, obj, context, synergy_manager):
  34. try:
  35. self._apply_move(obj, context)
  36. except ActionAborted:
  37. blocked_since = context.metas.value.get(BLOCKED_SINCE, self._object_id, allow_empty=True, empty_value=0)
  38. context.metas.value.set(BLOCKED_SINCE, self._object_id, blocked_since+1)
  39. def _apply_move(self, obj, context):
  40. # TODO: il ne faut pas choisir une direction 14.
  41. if self._move_to_point is None or self._move_to_direction == 14:
  42. raise ActionAborted()
  43. obj.set_position(self._move_to_point)
  44. obj.set_previous_direction(self._move_to_direction)
  45. obj.get_brain().get_part(BRAIN_PART_MOVE).done(obj, context)