PutableEvent.py 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from intelligine.core.exceptions import NearNothingFound, CantFindWhereToPut
  2. from intelligine.shorcut.brain import get_brain_part
  3. from intelligine.synergy.event.src.NearEvent import NearEvent
  4. from synergine.core.exceptions import NotConcernedEvent
  5. from intelligine.cst import CANT_PUT_STILL, COL_TRANSPORTER_CARRYING, TRANSPORTABLE, BRAIN_SCHEMA, BRAIN_PART_PUT
  6. from synergine_xyz.mechanism.AroundMechanism import AroundMechanism
  7. class PutableEvent(NearEvent):
  8. """
  9. TODO: Refactorise with TakableEvent
  10. """
  11. PARAM_PUT = 'put'
  12. PARAM_PUT_TO = 'put_to'
  13. _mechanism = AroundMechanism
  14. _concern = COL_TRANSPORTER_CARRYING
  15. _near_name = 'objects_ids_putable'
  16. _near_map = lambda self, near_object_id, context: context.metas.states.have(near_object_id, TRANSPORTABLE)
  17. def _prepare(self, object_id, context, parameters={}):
  18. if not self._can_put(object_id, context):
  19. raise NotConcernedEvent()
  20. try:
  21. self.map(context, parameters, stop_at_first=False)
  22. except NearNothingFound:
  23. raise NotConcernedEvent()
  24. brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT)
  25. parameters[self.PARAM_PUT] = []
  26. parameters[self.PARAM_PUT_TO] = []
  27. for object_near_id in parameters[self._near_name]:
  28. if brain_part.can_put(context, object_id, object_near_id):
  29. try:
  30. put_position = brain_part.get_put_position(context, object_id, object_near_id)
  31. parameters[self.PARAM_PUT].append(object_near_id)
  32. parameters[self.PARAM_PUT_TO].append(put_position)
  33. return parameters # Si a terme on veut tous les calculer a l'avance, ne pas retourner ici
  34. except CantFindWhereToPut:
  35. pass # On continu la booucle
  36. # Si a terme on veut tous les calculer a l'avance, raise que si rien trouve
  37. raise NotConcernedEvent()
  38. @staticmethod
  39. def _can_put(object_id, context):
  40. return not context.metas.value.get(CANT_PUT_STILL, object_id, allow_empty=True)
  41. @classmethod
  42. def _object_can_put(cls, object_id, context, object_to_put_id):
  43. object_take_brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT)
  44. return object_take_brain_part.can_put(context, object_id, object_to_put_id)