AntBrain.py 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from intelligine.simulation.object.brain.Brain import Brain
  2. from intelligine.simulation.object.brain.part.attack.AttackBrainPart import AttackBrainPart
  3. from intelligine.simulation.object.brain.part.move.AntMoveBrainPart import AntMoveBrainPart
  4. from intelligine.cst import MOVE_MODE, MOVE_MODE_EXPLO, MOVE_MODE_GOHOME, PHEROMON_DIR_EXPLO, \
  5. BRAIN_PART_TAKE, BRAIN_PART_PUT, MOVE_MODE_NURSE, PHEROMON_DIR_NONE, BRAIN_PART_ATTACK, MOVE_MODE_HOME, SMELL_FOOD
  6. from intelligine.cst import MOLECULE_SEARCHING
  7. from intelligine.cst import BRAIN_PART_MOVE
  8. from intelligine.simulation.object.brain.part.transport.AntPutBrainPart import AntPutBrainPart
  9. from intelligine.simulation.object.brain.part.transport.AntTakeBrainPart import AntTakeBrainPart
  10. from intelligine.synergy.object.Food import Food
  11. from synergine.core.exceptions import NotFound
  12. class AntBrain(Brain):
  13. # TODO: methode __init_ pour la classe ? Pour surcharger ici.
  14. _brain_parts = {
  15. BRAIN_PART_MOVE: AntMoveBrainPart,
  16. BRAIN_PART_TAKE: AntTakeBrainPart,
  17. BRAIN_PART_PUT: AntPutBrainPart,
  18. BRAIN_PART_ATTACK: AttackBrainPart
  19. }
  20. _taken_smell_matches = {
  21. Food: SMELL_FOOD
  22. }
  23. """ Correspondance entre ce qui est ramassé et où ce doit être stocké """
  24. def __init__(self, context, host):
  25. super().__init__(context, host)
  26. self._movement_mode = MOVE_MODE_HOME
  27. self._distance_from_objective = 0 # TODO rename: distance_since_objective
  28. self._molecule_searching = PHEROMON_DIR_EXPLO
  29. def switch_to_mode(self, mode):
  30. self._movement_mode = mode
  31. self._update_molecule_gland(mode)
  32. self._context.metas.value.set(MOVE_MODE, self._host.get_id(), mode)
  33. self._update_molecule_searching(mode)
  34. def _update_molecule_gland(self, mode):
  35. if mode == MOVE_MODE_EXPLO:
  36. molecule_direction_type = None
  37. elif mode == MOVE_MODE_GOHOME:
  38. molecule_direction_type = PHEROMON_DIR_EXPLO
  39. self._distance_from_objective = 0
  40. elif mode == MOVE_MODE_NURSE:
  41. molecule_direction_type = None
  42. elif mode == MOVE_MODE_HOME:
  43. molecule_direction_type = PHEROMON_DIR_EXPLO
  44. else:
  45. raise NotImplementedError()
  46. if molecule_direction_type:
  47. self._host.get_movement_molecule_gland().set_molecule_type(molecule_direction_type)
  48. self._host.get_movement_molecule_gland().enable()
  49. else:
  50. self._host.get_movement_molecule_gland().disable()
  51. def _update_molecule_searching(self, mode):
  52. if mode == MOVE_MODE_EXPLO:
  53. molecule_searching = PHEROMON_DIR_EXPLO
  54. elif mode == MOVE_MODE_GOHOME:
  55. molecule_searching = PHEROMON_DIR_NONE
  56. elif mode == MOVE_MODE_NURSE:
  57. molecule_searching = PHEROMON_DIR_NONE
  58. elif mode == MOVE_MODE_HOME:
  59. molecule_searching = self.get_part(BRAIN_PART_TAKE).get_smell_target()
  60. else:
  61. raise NotImplementedError()
  62. self._molecule_searching = molecule_searching
  63. self._context.metas.value.set(MOLECULE_SEARCHING, self._host.get_id(), molecule_searching)
  64. def get_movement_mode(self):
  65. return self._movement_mode
  66. def host_moved(self, distance=1):
  67. self._distance_from_objective += 1
  68. def set_distance_from_objective(self, distance):
  69. self._distance_from_objective = distance
  70. def get_distance_from_objective(self):
  71. return self._distance_from_objective
  72. def get_smell_for_object_taken(self, obj):
  73. for take_class in self._taken_smell_matches:
  74. if isinstance(obj, take_class):
  75. return self._taken_smell_matches[take_class]
  76. raise NotFound()
  77. @classmethod
  78. def get_home_smells(cls):
  79. """
  80. Note: Actually return all know smells. Not really HOME smells.
  81. :return:
  82. """
  83. return cls._taken_smell_matches.values()