interaction.py 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # coding: utf-8
  2. import typing
  3. from synergine2_xyz.move import RequestMoveBehaviour
  4. from synergine2.config import Config
  5. from synergine2.log import SynergineLogger
  6. from synergine2.terminals import Terminal
  7. from synergine2.terminals import TerminalPackage
  8. from synergine2_cocos2d.exception import InteractionNotFound
  9. from synergine2_cocos2d.gl import draw_line
  10. from synergine2_cocos2d.layer import LayerManager
  11. from synergine2_cocos2d.user_action import UserAction
  12. class InteractionManager(object):
  13. def __init__(
  14. self,
  15. config: Config,
  16. logger: SynergineLogger,
  17. terminal: Terminal,
  18. ) -> None:
  19. self.config = config
  20. self.logger = logger
  21. self.terminal = terminal
  22. self.interactions = []
  23. def register(
  24. self,
  25. interaction_class: typing.Type['Interaction'],
  26. layer_manager: LayerManager,
  27. ) -> None:
  28. self.interactions.append(interaction_class(
  29. self.config,
  30. self.logger,
  31. terminal=self.terminal,
  32. layer_manager=layer_manager,
  33. ))
  34. def get_for_user_action(self, action: UserAction) -> 'Interaction':
  35. for interaction in self.interactions:
  36. if interaction.gui_action == action:
  37. return interaction
  38. raise InteractionNotFound('For action"{}"'.format(action))
  39. class Interaction(object):
  40. gui_action = None # type: UserAction
  41. def __init__(
  42. self,
  43. config: Config,
  44. logger: SynergineLogger,
  45. terminal: Terminal,
  46. layer_manager: LayerManager,
  47. ) -> None:
  48. self.config = config
  49. self.logger = logger
  50. self.terminal = terminal
  51. self.layer_manager = layer_manager
  52. def draw_pending(self) -> None:
  53. pass
  54. def execute(self) -> None:
  55. package = self.get_package_for_terminal()
  56. self.terminal.send(package)
  57. def get_package_for_terminal(self) -> TerminalPackage:
  58. raise NotImplementedError()
  59. class BaseMoveActorInteraction(Interaction):
  60. gui_action = None
  61. color = None
  62. request_move_behaviour_class = RequestMoveBehaviour
  63. def draw_pending(self) -> None:
  64. for actor in self.layer_manager.edit_layer.selection:
  65. grid_position = self.layer_manager.grid_manager.get_grid_position(actor.position)
  66. pixel_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(grid_position)
  67. draw_line(
  68. self.layer_manager.scrolling_manager.world_to_screen(*pixel_position),
  69. self.layer_manager.edit_layer.screen_mouse,
  70. self.color,
  71. )
  72. def get_package_for_terminal(self) -> TerminalPackage:
  73. # TODO: FinishMoveEvent ?
  74. actions = []
  75. mouse_grid_position = self.layer_manager.grid_manager.get_grid_position(
  76. self.layer_manager.scrolling_manager.screen_to_world(
  77. *self.layer_manager.edit_layer.screen_mouse,
  78. )
  79. )
  80. for actor in self.layer_manager.edit_layer.selection:
  81. actions.append((
  82. self.request_move_behaviour_class, {
  83. 'subject_id': actor.subject.id,
  84. 'move_to': mouse_grid_position,
  85. 'gui_action': self.gui_action,
  86. }
  87. ))
  88. return TerminalPackage(
  89. simulation_actions=actions,
  90. )
  91. class MoveActorInteraction(BaseMoveActorInteraction):
  92. gui_action = UserAction.ORDER_MOVE
  93. color = (0, 0, 255)
  94. class MoveFastActorInteraction(BaseMoveActorInteraction):
  95. gui_action = UserAction.ORDER_MOVE_FAST
  96. color = (72, 244, 66)
  97. class MoveCrawlActorInteraction(BaseMoveActorInteraction):
  98. gui_action = UserAction.ORDER_MOVE_CRAWL
  99. color = (235, 244, 66)