MoveBrainPart.py 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from intelligine.core.exceptions import DirectionException
  2. from intelligine.simulation.object.brain.part.BrainPart import BrainPart
  3. from intelligine.synergy.event.move.direction import directions_same_level, directions_slighty
  4. from random import randint, choice, randrange
  5. from synergine_xyz.cst import BLOCKED_SINCE, PREVIOUS_DIRECTION
  6. class MoveBrainPart(BrainPart):
  7. @classmethod
  8. def get_direction(cls, context, object_id):
  9. try:
  10. return cls._get_slighty_direction(context, object_id)
  11. except DirectionException:
  12. return cls._get_random_direction(context, object_id)
  13. @classmethod
  14. def _get_slighty_direction(cls, context, object_id):
  15. # TODO: A terme le calcul de la direction devra prendre en compte les directions bloques
  16. blocked_since = context.metas.value.get(BLOCKED_SINCE, object_id, allow_empty=True, empty_value=0)
  17. if blocked_since <= 3: #TODO: config
  18. try:
  19. previous_direction = context.metas.value.get(PREVIOUS_DIRECTION, object_id)
  20. except KeyError:
  21. # No previous direction
  22. return cls._get_random_direction(context, object_id)
  23. # TODO: Faut mettre ca en plus propre (proba d'aller tou droit, config, etc)
  24. if randrange(100) < 75: # 75% de change d'aller tout droit
  25. # Dans le futur: les fourmis vont moins tout droit quand elle se croient et se touche
  26. return previous_direction
  27. directions_list = directions_slighty[previous_direction]
  28. # TODO: TMP tant que 1 niveau (z)
  29. directions_list = [direction for direction in directions_list if 9 < direction < 19]
  30. return choice(directions_list)
  31. raise DirectionException()
  32. @classmethod
  33. def _get_random_direction(cls, context, object_id):
  34. return randint(directions_same_level[0], directions_same_level[-1])