base.py 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. # coding: utf-8
  2. import typing
  3. from pyglet.window import key
  4. from cocos.actions import MoveTo as BaseMoveTo
  5. from sandbox.tile.user_action import UserAction
  6. from synergine2.config import Config
  7. from synergine2.log import SynergineLogger
  8. from synergine2.terminals import Terminal
  9. from synergine2_cocos2d.actions import MoveTo
  10. from synergine2_cocos2d.animation import ANIMATION_CRAWL
  11. from synergine2_cocos2d.animation import ANIMATION_WALK
  12. from synergine2_cocos2d.animation import Animate
  13. from synergine2_cocos2d.gl import draw_line
  14. from synergine2_cocos2d.gui import EditLayer as BaseEditLayer
  15. from synergine2_cocos2d.gui import TMXGui
  16. from synergine2_cocos2d.layer import LayerManager
  17. from synergine2_xyz.move.simulation import FinishMoveEvent
  18. from synergine2_xyz.move.simulation import StartMoveEvent
  19. from synergine2_xyz.physics import Physics
  20. from synergine2_xyz.utils import get_angle
  21. from sandbox.tile.simulation.event import NewVisibleOpponent
  22. from sandbox.tile.simulation.event import NoLongerVisibleOpponent
  23. class EditLayer(BaseEditLayer):
  24. def __init__(self, *args, **kwargs) -> None:
  25. super().__init__(*args, **kwargs)
  26. def _on_key_press(self, k, m):
  27. if self.selection:
  28. if k == key.M:
  29. self.user_action_pending = UserAction.ORDER_MOVE
  30. if k == key.R:
  31. self.user_action_pending = UserAction.ORDER_MOVE_FAST
  32. if k == key.C:
  33. self.user_action_pending = UserAction.ORDER_MOVE_CRAWL
  34. if k == key.F:
  35. self.user_action_pending = UserAction.ORDER_FIRE
  36. class TileLayerManager(LayerManager):
  37. edit_layer_class = EditLayer
  38. class Game(TMXGui):
  39. layer_manager_class = TileLayerManager
  40. def __init__(
  41. self,
  42. config: Config,
  43. logger: SynergineLogger,
  44. terminal: Terminal,
  45. physics: Physics,
  46. read_queue_interval: float = 1 / 60.0,
  47. map_dir_path: str=None,
  48. ):
  49. super().__init__(
  50. config,
  51. logger,
  52. terminal,
  53. physics=physics,
  54. read_queue_interval=read_queue_interval,
  55. map_dir_path=map_dir_path,
  56. )
  57. self.terminal.register_event_handler(
  58. FinishMoveEvent,
  59. self.set_subject_position,
  60. )
  61. self.terminal.register_event_handler(
  62. StartMoveEvent,
  63. self.start_move_subject,
  64. )
  65. self.terminal.register_event_handler(
  66. NewVisibleOpponent,
  67. self.new_visible_opponent,
  68. )
  69. self.terminal.register_event_handler(
  70. NoLongerVisibleOpponent,
  71. self.no_longer_visible_opponent,
  72. )
  73. # configs
  74. self.move_duration_ref = float(self.config.resolve('game.move.walk_ref_time'))
  75. self.move_fast_duration_ref = float(self.config.resolve('game.move.run_ref_time'))
  76. self.move_crawl_duration_ref = float(self.config.resolve('game.move.crawl_ref_time'))
  77. def before_run(self) -> None:
  78. from sandbox.tile.gui.move import MoveActorInteraction
  79. from sandbox.tile.gui.move import MoveFastActorInteraction
  80. from sandbox.tile.gui.move import MoveCrawlActorInteraction
  81. from sandbox.tile.gui.fire import FireActorInteraction
  82. self.layer_manager.interaction_manager.register(MoveActorInteraction, self.layer_manager)
  83. self.layer_manager.interaction_manager.register(MoveFastActorInteraction, self.layer_manager)
  84. self.layer_manager.interaction_manager.register(MoveCrawlActorInteraction, self.layer_manager)
  85. self.layer_manager.interaction_manager.register(FireActorInteraction, self.layer_manager)
  86. def set_subject_position(self, event: FinishMoveEvent):
  87. actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
  88. new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
  89. actor.stop_actions((BaseMoveTo,))
  90. actor.set_position(*new_world_position)
  91. def start_move_subject(self, event: StartMoveEvent):
  92. actor = self.layer_manager.subject_layer.subjects_index[event.subject_id]
  93. new_world_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(event.to_position)
  94. if event.gui_action == UserAction.ORDER_MOVE:
  95. animation = ANIMATION_WALK
  96. cycle_duration = 2
  97. move_duration = self.move_duration_ref
  98. elif event.gui_action == UserAction.ORDER_MOVE_FAST:
  99. animation = ANIMATION_WALK
  100. cycle_duration = 0.5
  101. move_duration = self.move_fast_duration_ref
  102. elif event.gui_action == UserAction.ORDER_MOVE_CRAWL:
  103. animation = ANIMATION_CRAWL
  104. cycle_duration = 2
  105. move_duration = self.move_crawl_duration_ref
  106. else:
  107. raise NotImplementedError()
  108. move_action = MoveTo(new_world_position, move_duration)
  109. actor.do(move_action)
  110. actor.do(Animate(animation, duration=move_duration, cycle_duration=cycle_duration))
  111. actor.rotation = get_angle(event.from_position, event.to_position)
  112. def new_visible_opponent(self, event: NewVisibleOpponent):
  113. self.visible_or_no_longer_visible_opponent(event, (153, 0, 153))
  114. def no_longer_visible_opponent(self, event: NoLongerVisibleOpponent):
  115. self.visible_or_no_longer_visible_opponent(event, (255, 102, 0))
  116. def visible_or_no_longer_visible_opponent(
  117. self,
  118. event: typing.Union[NoLongerVisibleOpponent, NewVisibleOpponent],
  119. line_color,
  120. ) -> None:
  121. if self.layer_manager.debug:
  122. observer_actor = self.layer_manager.subject_layer.subjects_index[event.observer_subject_id]
  123. observed_actor = self.layer_manager.subject_layer.subjects_index[event.observed_subject_id]
  124. observer_pixel_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(
  125. observer_actor.subject.position,
  126. )
  127. observed_pixel_position = self.layer_manager.grid_manager.get_pixel_position_of_grid_position(
  128. observed_actor.subject.position,
  129. )
  130. def draw_visible_opponent():
  131. draw_line(
  132. observer_pixel_position,
  133. observed_pixel_position,
  134. line_color,
  135. )
  136. self.layer_manager.edit_layer.append_callback(draw_visible_opponent, 1.0)