behaviour.py 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # coding: utf-8
  2. import time
  3. from sandbox.tile.simulation.event import NoLongerVisibleOpponent
  4. from sandbox.tile.simulation.event import NewVisibleOpponent
  5. from sandbox.tile.simulation.mechanism import OpponentVisibleMechanism
  6. from sandbox.tile.user_action import UserAction
  7. from synergine2.config import Config
  8. from synergine2.simulation import Simulation
  9. from synergine2.simulation import SubjectBehaviour
  10. from synergine2.simulation import Event
  11. from synergine2.simulation import Subject
  12. from synergine2_xyz.move.simulation import MoveToBehaviour as BaseMoveToBehaviour
  13. class MoveToBehaviour(BaseMoveToBehaviour):
  14. def __init__(
  15. self,
  16. config: Config,
  17. simulation: Simulation,
  18. subject: Subject,
  19. ) -> None:
  20. super().__init__(config, simulation, subject)
  21. self._walk_duration = float(self.config.resolve('game.move.walk_ref_time'))
  22. self._run_duration = float(self.config.resolve('game.move.run_ref_time'))
  23. self._crawl_duration = float(self.config.resolve('game.move.crawl_ref_time'))
  24. def _can_move_to_next_step(self, move_to_data: dict) -> bool:
  25. if move_to_data['gui_action'] == UserAction.ORDER_MOVE:
  26. return time.time() - move_to_data['last_intention_time'] >= self._walk_duration
  27. if move_to_data['gui_action'] == UserAction.ORDER_MOVE_FAST:
  28. return time.time() - move_to_data['last_intention_time'] >= self._run_duration
  29. if move_to_data['gui_action'] == UserAction.ORDER_MOVE_CRAWL:
  30. return time.time() - move_to_data['last_intention_time'] >= self._crawl_duration
  31. class LookAroundBehaviour(SubjectBehaviour):
  32. """
  33. Behaviour who permit to reference visible things like enemies
  34. """
  35. visible_mechanism = OpponentVisibleMechanism
  36. use = [visible_mechanism]
  37. force_action = True
  38. def action(self, data) -> [Event]:
  39. new_visible_subject_events = []
  40. no_longer_visible_subject_events = []
  41. for no_longer_visible_subject_id in data['no_longer_visible_subject_ids']:
  42. no_longer_visible_subject_events.append(NoLongerVisibleOpponent(
  43. observer_subject_id=self.subject.id,
  44. observed_subject_id=no_longer_visible_subject_id,
  45. ))
  46. self.subject.visible_opponent_ids.remove(no_longer_visible_subject_id)
  47. for new_visible_subject_id in data['new_visible_subject_ids']:
  48. new_visible_subject_events.append(NewVisibleOpponent(
  49. observer_subject_id=self.subject.id,
  50. observed_subject_id=new_visible_subject_id,
  51. ))
  52. self.subject.visible_opponent_ids.append(new_visible_subject_id)
  53. return new_visible_subject_events + no_longer_visible_subject_events
  54. def run(self, data):
  55. visible_subjects = data[self.visible_mechanism]['visible_subjects']
  56. visible_subject_ids = [s.id for s in visible_subjects]
  57. new_visible_subject_ids = []
  58. no_longer_visible_subject_ids = []
  59. for subject_id in self.subject.visible_opponent_ids:
  60. if subject_id not in visible_subject_ids:
  61. no_longer_visible_subject_ids.append(subject_id)
  62. for subject in visible_subjects:
  63. if subject.id not in self.subject.visible_opponent_ids:
  64. new_visible_subject_ids.append(subject.id)
  65. return {
  66. 'new_visible_subject_ids': new_visible_subject_ids,
  67. 'no_longer_visible_subject_ids': no_longer_visible_subject_ids,
  68. }