AntBrain.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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_HOME, PHEROMON_DIR_EXPLO, \
  5. BRAIN_PART_TAKE, BRAIN_PART_PUT, MOVE_MODE_NURSE, PHEROMON_DIR_NONE, BRAIN_PART_ATTACK, MOVE_MODE_HOME
  6. from intelligine.cst import PHEROMONE_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. class AntBrain(Brain):
  11. # TODO: methode __init_ pour la classe ? Pour surcharger ici.
  12. _brain_parts = {
  13. BRAIN_PART_MOVE: AntMoveBrainPart,
  14. BRAIN_PART_TAKE: AntTakeBrainPart,
  15. BRAIN_PART_PUT: AntPutBrainPart,
  16. BRAIN_PART_ATTACK: AttackBrainPart
  17. }
  18. def __init__(self, context, host):
  19. super().__init__(context, host)
  20. self._movement_mode = MOVE_MODE_HOME
  21. self._distance_from_objective = 0 # TODO rename: distance_since_objective
  22. self._molecule_searching = PHEROMON_DIR_EXPLO
  23. def switch_to_mode(self, mode):
  24. # TODO: Mode explo: reinit exploration vector
  25. self._movement_mode = mode
  26. self._update_molecule_gland(mode)
  27. self._context.metas.value.set(MOVE_MODE, self._host.get_id(), mode)
  28. self._distance_from_objective = 0
  29. self._update_molecule_searching(mode)
  30. def _update_molecule_gland(self, mode):
  31. if mode == MOVE_MODE_EXPLO:
  32. molecule_direction_type = PHEROMON_DIR_HOME
  33. elif mode == MOVE_MODE_GOHOME:
  34. molecule_direction_type = PHEROMON_DIR_EXPLO
  35. elif mode == MOVE_MODE_NURSE:
  36. molecule_direction_type = None
  37. elif mode == MOVE_MODE_HOME:
  38. molecule_direction_type = None
  39. else:
  40. raise NotImplementedError()
  41. if molecule_direction_type:
  42. self._host.get_movement_molecule_gland().set_molecule_type(molecule_direction_type)
  43. self._host.get_movement_molecule_gland().enable()
  44. else:
  45. self._host.get_movement_molecule_gland().disable()
  46. def _update_molecule_searching(self, mode):
  47. if mode == MOVE_MODE_EXPLO:
  48. molecule_searching = PHEROMON_DIR_EXPLO
  49. elif mode == MOVE_MODE_GOHOME:
  50. molecule_searching = PHEROMON_DIR_HOME
  51. elif mode == MOVE_MODE_NURSE:
  52. molecule_searching = PHEROMON_DIR_NONE
  53. elif mode == MOVE_MODE_HOME:
  54. return
  55. else:
  56. raise NotImplementedError()
  57. self._molecule_searching = molecule_searching
  58. self._context.metas.value.set(PHEROMONE_SEARCHING, self._host.get_id(), molecule_searching)
  59. def get_movement_mode(self):
  60. return self._movement_mode
  61. def host_moved(self, distance=1):
  62. self._distance_from_objective += 1
  63. def set_distance_from_objective(self, distance):
  64. self._distance_from_objective = distance
  65. def get_distance_from_objective(self):
  66. return self._distance_from_objective