PutableAction.py 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from synergine.synergy.event.Action import Action
  2. from intelligine.synergy.event.transport.PutableEvent import PutableEvent
  3. from intelligine.cst import CANT_CARRY_STILL
  4. from xyzworld.cst import POSITIONS
  5. from synergine.synergy.event.exception.ActionAborted import ActionAborted
  6. class PutableAction(Action):
  7. _listen = PutableEvent
  8. def __init__(self, object_id, parameters):
  9. super().__init__(object_id, parameters)
  10. def prepare(self, context):
  11. pass
  12. def run(self, obj, collection, context, synergy_manager):
  13. # TODO: DEV
  14. obj_id_transportable = self._parameters['objects_ids_transportable'][0]
  15. obj_transportable = synergy_manager.get_map().get_object(obj_id_transportable)
  16. # TODO: Cette logique de calcul cote process!
  17. position_to_put = self._get_position_to_put(context, obj, obj_transportable)
  18. # TODO: Doit etre du meme type que ce qui est transporte !
  19. obj_transported = obj.get_carried()
  20. obj_transported.set_carried_by(None)
  21. obj.put_carry(obj_transported, position_to_put)
  22. context.metas.value.set(CANT_CARRY_STILL, obj.get_id(), 5)
  23. def _get_position_to_put(self, context, obj, obj_transportable):
  24. obj_transportable_pos = obj_transportable.get_position()
  25. if self._is_available_position(context, obj_transportable_pos):
  26. return obj_transportable_pos
  27. poss_arround_target = context.get_arround_points_of_point(obj_transportable_pos)
  28. poss_arround_obj = context.get_arround_points_of_point(obj.get_position())
  29. # For each position between target and current transporter
  30. for pos_arround_target in poss_arround_target:
  31. if pos_arround_target in poss_arround_obj:
  32. if self._is_available_position(context, pos_arround_target):
  33. return pos_arround_target
  34. raise ActionAborted()
  35. def _is_available_position(self, context, position):
  36. # TODO: Pour le moment on ne regarde pas si ce sont tous des oeufs
  37. count_obj_here = len(context.metas.list.get(POSITIONS, position, allow_empty=True))
  38. if count_obj_here <= 5:
  39. return True
  40. return False