ApposeDirection.py 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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
  5. from xyzworld.geometry import get_direction_degrees, get_degree_from_north
  6. from intelligine.synergy.event.move.direction import get_direction_for_degrees, get_direction_opposite
  7. class ApposeDirection(Action):
  8. _listen = PheromoneEvent
  9. def prepare(self, context):
  10. """
  11. Recupere chaque coordonnees de points qui doivent etre update
  12. pour ne pas avoir a e calculer dans le run
  13. :param context:
  14. :return:
  15. """
  16. object_point = context.metas.value.get(POSITION, self._object_id)
  17. distance = 1 # TODO: Config ?
  18. self._parameters['concerned_points'] = context.get_arround_points_of(object_point, distance)
  19. def run(self, obj, context, synergy_manager):
  20. """
  21. On effectue l'incrementation dans le process principal. Beaucoups plus lourd que de le faie dans les
  22. process. Mais si on le fait dans les process on va rater des infos ...
  23. met a jour les pts (incremente)
  24. :param obj:
  25. :param context:
  26. :param synergy_manager:
  27. :return:
  28. """
  29. # TODO: Remonter ca dans une objet
  30. # a = get_direction_degrees((0, 0, 0), (0, -1, -1)) # 315
  31. # a = get_direction_degrees((0, 0, 0), (0, 0, -1)) # 0
  32. # a = get_direction_degrees((0, 0, 0), (0, 1, -1)) # 45
  33. # a = get_direction_degrees((0, 0, 0), (0, -1, 0)) # 270
  34. # a = get_direction_degrees((0, 0, 0), (0, 1, 0)) # 90
  35. # a = get_direction_degrees((0, 0, 0), (0, -1, 1)) # 225
  36. # a = get_direction_degrees((0, 0, 0), (0, 0, 1)) # 180
  37. # a = get_direction_degrees((0, 0, 0), (0, 1, 1)) # 135
  38. # a = get_degree_from_north((0, 0, 0), (0, -1, -1)) # 315
  39. # a = get_degree_from_north((0, 0, 0), (0, 0, -1)) # 0
  40. # a = get_degree_from_north((0, 0, 0), (0, 1, -1)) # 45
  41. # a = get_degree_from_north((0, 0, 0), (0, -1, 0)) # 270
  42. # a = get_degree_from_north((0, 0, 0), (0, 1, 0)) # 90
  43. # a = get_degree_from_north((0, 0, 0), (0, -1, 1)) # 225
  44. # a = get_degree_from_north((0, 0, 0), (0, 0, 1)) # 180
  45. # a = get_degree_from_north((0, 0, 0), (0, 1, 1)) # 135
  46. self._appose_pheromones(obj, context, synergy_manager)
  47. def _appose_pheromones(self, obj, context, synergy_manager):
  48. obj_position = obj.get_position()
  49. obj_last_pheromon_position = obj.get_last_pheromone_point(PHEROMON_DIRECTION)
  50. try:
  51. direction_degrees = get_degree_from_north(obj_last_pheromon_position, obj_position)
  52. except ZeroDivisionError:
  53. return
  54. direction = get_direction_for_degrees(direction_degrees)
  55. from_direction = get_direction_opposite(direction)
  56. depose_intensity = 1 # TODO: config
  57. for affected_point in self._parameters['concerned_points']:
  58. self._appose_pheromone(context, affected_point, direction, depose_intensity)
  59. context.metas.list.add(PHEROMON_POSITIONS, PHEROMON_POSITIONS, affected_point, assert_not_in=False)
  60. obj.set_last_pheromone_point(PHEROMON_DIRECTION, obj.get_position())
  61. def _appose_pheromone(self, context, affected_point, direction, depose_intensity):
  62. context.pheromones().increment(affected_point, [PHEROMON_DIRECTION,
  63. PHEROMON_DIR_EXPLO,
  64. direction], depose_intensity)