ApposeDirection.py 2.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from synergine.synergy.event.Action import Action
  2. from intelligine.synergy.event.pheromone.PheromoneEvent import PheromoneEvent
  3. from xyzworld.cst import POSITION
  4. from intelligine.cst import PHEROMON_DIRECTION, PHEROMON_DIR_EXPLO, PHEROMON_POSITIONS, MOVE_MODE_EXPLO
  5. from xyzworld.geometry import get_degree_from_north
  6. from intelligine.synergy.event.move.direction import get_direction_for_degrees, get_direction_opposite
  7. from intelligine.core.exceptions import SamePosition
  8. class ApposeDirection(Action):
  9. _listen = PheromoneEvent
  10. def prepare(self, context):
  11. """
  12. Recupere chaque coordonnees de points qui doivent etre update
  13. pour ne pas avoir a e calculer dans le run
  14. :param context:
  15. :return:
  16. """
  17. object_point = context.metas.value.get(POSITION, self._object_id)
  18. distance = 1 # TODO: Config ?
  19. self._parameters['concerned_points'] = context.get_arround_points_of(object_point, distance)
  20. def run(self, obj, context, synergy_manager):
  21. """
  22. On effectue l'incrementation dans le process principal. Beaucoups plus lourd que de le faie dans les
  23. process. Mais si on le fait dans les process on va rater des infos ...
  24. met a jour les pts (incremente)
  25. """
  26. self._appose_pheromones(obj, context, synergy_manager)
  27. def _appose_pheromones(self, obj, context, synergy_manager):
  28. try:
  29. from_direction = self._get_from_direction(obj)
  30. except SamePosition:
  31. return
  32. depose_intensity = 1 # TODO: config
  33. pheromone_direction_type = self._get_pheromone_direction_type(obj)
  34. for affected_point in self._parameters['concerned_points']:
  35. context.pheromones().increment(affected_point, [PHEROMON_DIRECTION,
  36. pheromone_direction_type,
  37. from_direction], depose_intensity)
  38. context.metas.list.add(PHEROMON_POSITIONS, PHEROMON_POSITIONS, affected_point, assert_not_in=False)
  39. obj.set_last_pheromone_point(PHEROMON_DIRECTION, obj.get_position())
  40. def _get_from_direction(self, obj):
  41. obj_position = obj.get_position()
  42. obj_last_pheromon_position = obj.get_last_pheromone_point(PHEROMON_DIRECTION)
  43. try:
  44. direction_degrees = get_degree_from_north(obj_last_pheromon_position, obj_position)
  45. except ZeroDivisionError:
  46. raise SamePosition()
  47. direction = get_direction_for_degrees(direction_degrees)
  48. return get_direction_opposite(direction)
  49. def _get_pheromone_direction_type(self, obj):
  50. if obj.get_movement_mode() == MOVE_MODE_EXPLO:
  51. return PHEROMON_DIR_EXPLO