PheromoneMoveAction.py 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from intelligine.synergy.event.move.MoveAction import MoveAction
  2. from intelligine.cst import PHEROMONE_SEARCHING, MOVE_MODE_EXPLO
  3. from intelligine.cst import COL_TRANSPORTER_NOT_CARRYING, COL_TRANSPORTER_CARRYING
  4. from intelligine.core.exceptions import NoPheromone, BestPheromoneHere
  5. from intelligine.simulation.pheromone.DirectionPheromone import DirectionPheromone
  6. class PheromoneMoveAction(MoveAction):
  7. def _get_prepared_direction(self, context, object_point):
  8. try:
  9. return self._get_direction_with_pheromones(context, object_point)
  10. except NoPheromone:
  11. return super()._get_prepared_direction(context, object_point)
  12. def _get_direction_with_pheromones(self, context, object_point):
  13. pheromone_type = context.metas.value.get(PHEROMONE_SEARCHING, self._object_id)
  14. try:
  15. direction = self._get_pheromone_direction_for_point(context, object_point, pheromone_type)
  16. except NoPheromone:
  17. try:
  18. direction = self._get_direction_of_pheromone(context, object_point, pheromone_type)
  19. except NoPheromone:
  20. raise
  21. return direction
  22. @staticmethod
  23. def _get_pheromone_direction_for_point(context, point, pheromone_type):
  24. return DirectionPheromone.get_direction_for_point(context, point, pheromone_type)
  25. @staticmethod
  26. def _get_direction_of_pheromone(context, point, pheromone_type):
  27. search_pheromone_in_points = context.get_arround_points_of(point, distance=1)
  28. try:
  29. best_pheromone_direction = DirectionPheromone.get_best_pheromone_direction_in(context,
  30. point,
  31. search_pheromone_in_points,
  32. pheromone_type)
  33. return best_pheromone_direction
  34. except NoPheromone as err:
  35. raise err
  36. def _apply_move(self, obj, context):
  37. super()._apply_move(obj, context)
  38. self._appose_pheromone(obj, context)
  39. # TEST: le temps de tout tester
  40. if self._move_to_point == obj.get_colony().get_start_position() and obj.is_carrying():
  41. obj_transported = obj.get_carried()
  42. obj_transported.set_carried_by(None)
  43. obj.put_carry(obj_transported, (-1, 0, 0))
  44. obj.get_brain().switch_to_mode(MOVE_MODE_EXPLO)
  45. context.metas.collections.add_remove(obj.get_id(),
  46. COL_TRANSPORTER_NOT_CARRYING,
  47. COL_TRANSPORTER_CARRYING)
  48. @staticmethod
  49. def _appose_pheromone(obj, context):
  50. # TODO: Cette action de pheromone doit etre une surcharge de Move afin d'avoir une Action Move generique.
  51. try:
  52. DirectionPheromone.appose(context,
  53. obj.get_position(),
  54. obj.get_movement_pheromone_gland().get_movement_molecules())
  55. except BestPheromoneHere as best_pheromone_here:
  56. obj.get_brain().set_distance_from_objective(best_pheromone_here.get_best_distance())