You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.py 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import proto.MessageType_pb2 as MessageType
  2. import proto.Message2Server_pb2 as Message2Server
  3. import proto.Message2Clients_pb2 as Message2Clients
  4. import PyAPI.structures as THUAI6
  5. from typing import Final, List
  6. numOfGridPerCell: Final[int] = 1000
  7. # 起到NameSpace的作用
  8. class NoInstance:
  9. def __call__(self):
  10. raise TypeError("This class cannot be instantiated.")
  11. class AssistFunction(NoInstance):
  12. @staticmethod
  13. def CellToGrid(cell: int) -> int:
  14. return cell * numOfGridPerCell + numOfGridPerCell // 2
  15. @staticmethod
  16. def GridToCell(grid: int) -> int:
  17. return grid // numOfGridPerCell
  18. @staticmethod
  19. def HaveView(viewRange: int, x: int, y: int, newX: int, newY: int, map: List[List[THUAI6.PlaceType]]) -> bool:
  20. deltaX: int = newX - x
  21. deltaY: int = newY - y
  22. if deltaX * deltaX + deltaY * deltaY <= viewRange * viewRange:
  23. divide: int = max(abs(deltaX), abs(deltaY)) // 100
  24. dx: float = deltaX / divide
  25. dy: float = deltaY / divide
  26. selfX: float = float(x)
  27. selfY: float = float(y)
  28. for i in range(divide):
  29. selfX += dx
  30. selfY += dy
  31. if map[AssistFunction.GridToCell(int(selfX))][AssistFunction.GridToCell(int(selfY))] != THUAI6.PlaceType.Land:
  32. return False
  33. else:
  34. return True
  35. else:
  36. return False
  37. class Proto2THUAI6(NoInstance):
  38. placeTypeDict: Final[dict] = {
  39. MessageType.NULL_PLACE_TYPE: THUAI6.PlaceType.NullPlaceType,
  40. MessageType.WALL: THUAI6.PlaceType.Wall,
  41. MessageType.LAND: THUAI6.PlaceType.Land,
  42. MessageType.GRASS: THUAI6.PlaceType.Grass,
  43. MessageType.CLASSROOM: THUAI6.PlaceType.ClassRoom,
  44. MessageType.BLACKROOM: THUAI6.PlaceType.BlackRoom,
  45. MessageType.GATE: THUAI6.PlaceType.Gate,
  46. MessageType.HIDDEN_GATE: THUAI6.PlaceType.HiddenGate}
  47. shapeTypeDict: Final[dict] = {
  48. MessageType.NULL_SHAPE_TYPE: THUAI6.ShapeType.NullShapeType,
  49. MessageType.SQUARE: THUAI6.ShapeType.Square,
  50. MessageType.CIRCLE: THUAI6.ShapeType.Circle}
  51. propTypeDict: Final[dict] = {
  52. MessageType.NULL_PROP_TYPE: THUAI6.PropType.NullPropType,
  53. MessageType.PTYPE1: THUAI6.PropType.PropType1, }
  54. playerTypeDict: Final[dict] = {
  55. MessageType.NULL_PLAYER_TYPE: THUAI6.PlayerType.NullPlayerType,
  56. MessageType.STUDENT_PLAYER: THUAI6.PlayerType.StudentPlayer,
  57. MessageType.TRICKER_PLAYER: THUAI6.PlayerType.TrickerPlayer, }
  58. studentTypeDict: Final[dict] = {
  59. MessageType.NULL_STUDENT_TYPE: THUAI6.StudentType.NullStudentType,
  60. MessageType.STUDENTTYPE1: THUAI6.StudentType.StudentType1, }
  61. trickerTypeDict: Final[dict] = {
  62. MessageType.NULL_TRICKER_TYPE: THUAI6.TrickerType.NullTrickerType,
  63. MessageType.TRICKERTYPE1: THUAI6.TrickerType.TrickerType1, }
  64. studentBuffTypeDict: Final[dict] = {
  65. MessageType.NULL_SBUFF_TYPE: THUAI6.StudentBuffType.NullStudentBuffType,
  66. MessageType.SBUFFTYPE1: THUAI6.StudentBuffType.StudentBuffType1, }
  67. trickerBuffTypeDict: Final[dict] = {
  68. MessageType.NULL_TBUFF_TYPE: THUAI6.TrickerBuffType.NullTrickerBuffType,
  69. MessageType.TBUFFTYPE1: THUAI6.TrickerBuffType.TrickerBuffType1, }
  70. studentStateDict: Final[dict] = {
  71. MessageType.NULL_STATUS: THUAI6.StudentState.NullStudentState,
  72. MessageType.IDLE: THUAI6.StudentState.Idle,
  73. MessageType.LEARNING: THUAI6.StudentState.Learning,
  74. MessageType.FAIL: THUAI6.StudentState.Fail,
  75. MessageType.EMOTIONAL: THUAI6.StudentState.Emotional,
  76. MessageType.QUIT: THUAI6.StudentState.Quit,
  77. MessageType.GRADUATED: THUAI6.StudentState.Graduated}
  78. gameStateDict: Final[dict] = {
  79. MessageType.NULL_GAME_STATE: THUAI6.GameState.NullGameState,
  80. MessageType.GAME_START: THUAI6.GameState.GameStart,
  81. MessageType.GAME_RUNNING: THUAI6.GameState.GameRunning,
  82. MessageType.GAME_END: THUAI6.GameState.GameEnd}
  83. # 用于将Proto的对象转为THUAI6的对象
  84. @staticmethod
  85. def Protobuf2THUAI6Tricker(trickerMsg: Message2Clients.MessageOfTricker) -> THUAI6.Tricker:
  86. tricker = THUAI6.Tricker()
  87. tricker.x = trickerMsg.x
  88. tricker.y = trickerMsg.y
  89. tricker.speed = trickerMsg.speed
  90. tricker.damage = trickerMsg.damage
  91. tricker.timeUntilSkillAvailable = trickerMsg.time_until_skill_available
  92. tricker.place = Proto2THUAI6.placeTypeDict[trickerMsg.place]
  93. tricker.prop = Proto2THUAI6.propTypeDict[trickerMsg.prop]
  94. tricker.trickerType = Proto2THUAI6.trickerTypeDict[trickerMsg.tricker_type]
  95. tricker.guid = trickerMsg.guid
  96. tricker.movable = trickerMsg.movable
  97. tricker.playerID = trickerMsg.player_id
  98. tricker.viewRange = trickerMsg.view_range
  99. tricker.radius = trickerMsg.radius
  100. tricker.buff.clear()
  101. for buff in trickerMsg.buff:
  102. tricker.buff.append(Proto2THUAI6.trickerBuffTypeDict[buff])
  103. return tricker
  104. @staticmethod
  105. def Protobuf2THUAI6Student(studentMsg: Message2Clients.MessageOfStudent) -> THUAI6.Student:
  106. student = THUAI6.Student()
  107. student.x = studentMsg.x
  108. student.y = studentMsg.y
  109. student.speed = studentMsg.speed
  110. student.determination = studentMsg.determination
  111. student.failNum = studentMsg.fail_num
  112. student.failTime = studentMsg.fail_time
  113. student.emoTime = studentMsg.emo_time
  114. student.timeUntilSkillAvailable = studentMsg.time_until_skill_available
  115. student.place = Proto2THUAI6.placeTypeDict[studentMsg.place]
  116. student.prop = Proto2THUAI6.propTypeDict[studentMsg.prop]
  117. student.studentType = Proto2THUAI6.studentTypeDict[studentMsg.student_type]
  118. student.guid = studentMsg.guid
  119. student.state = Proto2THUAI6.studentStateDict[studentMsg.state]
  120. student.playerID = studentMsg.player_id
  121. student.viewRange = studentMsg.view_range
  122. student.radius = studentMsg.radius
  123. student.buff.clear()
  124. for buff in studentMsg.buff:
  125. student.buff.append(Proto2THUAI6.studentBuffTypeDict[buff])
  126. return student
  127. @staticmethod
  128. def Protobuf2THUAI6Prop(propMsg: Message2Clients.MessageOfProp) -> THUAI6.Prop:
  129. prop = THUAI6.Prop()
  130. prop.x = propMsg.x
  131. prop.y = propMsg.y
  132. prop.type = Proto2THUAI6.propTypeDict[propMsg.type]
  133. prop.guid = propMsg.guid
  134. prop.size = propMsg.size
  135. prop.facingDirection = propMsg.facing_direction
  136. prop.isMoving = propMsg.is_moving
  137. return prop
  138. @staticmethod
  139. def Protobuf2THUAI6Map(mapMsg: Message2Clients.MessageOfMap) -> List[List[THUAI6.PlaceType]]:
  140. map = []
  141. for row in mapMsg.row:
  142. newRow = []
  143. for place in row.col:
  144. newRow.append(Proto2THUAI6.placeTypeDict[place])
  145. map.append(newRow)
  146. return map
  147. class THUAI62Proto(NoInstance):
  148. placeTypeDict: Final[dict] = {
  149. THUAI6.PlaceType.NullPlaceType: MessageType.NULL_PLACE_TYPE,
  150. THUAI6.PlaceType.Wall: MessageType.WALL,
  151. THUAI6.PlaceType.Land: MessageType.LAND,
  152. THUAI6.PlaceType.Grass: MessageType.GRASS,
  153. THUAI6.PlaceType.ClassRoom: MessageType.CLASSROOM,
  154. THUAI6.PlaceType.BlackRoom: MessageType.BLACKROOM,
  155. THUAI6.PlaceType.Gate: MessageType.GATE,
  156. THUAI6.PlaceType.HiddenGate: MessageType.HIDDEN_GATE}
  157. shapeTypeDict: Final[dict] = {
  158. THUAI6.ShapeType.NullShapeType: MessageType.NULL_SHAPE_TYPE,
  159. THUAI6.ShapeType.Square: MessageType.SQUARE,
  160. THUAI6.ShapeType.Circle: MessageType.CIRCLE}
  161. propTypeDict: Final[dict] = {
  162. THUAI6.PropType.NullPropType: MessageType.NULL_PROP_TYPE,
  163. THUAI6.PropType.PropType1: MessageType.PTYPE1, }
  164. playerTypeDict: Final[dict] = {
  165. THUAI6.PlayerType.NullPlayerType: MessageType.NULL_PLAYER_TYPE,
  166. THUAI6.PlayerType.StudentPlayer: MessageType.STUDENT_PLAYER,
  167. THUAI6.PlayerType.TrickerPlayer: MessageType.TRICKER_PLAYER}
  168. studentTypeDict: Final[dict] = {
  169. THUAI6.StudentType.NullStudentType: MessageType.NULL_STUDENT_TYPE,
  170. THUAI6.StudentType.StudentType1: MessageType.STUDENTTYPE1, }
  171. trickerTypeDict: Final[dict] = {
  172. THUAI6.TrickerType.NullTrickerType: MessageType.NULL_TRICKER_TYPE,
  173. THUAI6.TrickerType.TrickerType1: MessageType.TRICKERTYPE1, }
  174. studentBuffTypeDict: Final[dict] = {
  175. THUAI6.StudentBuffType.NullStudentBuffType: MessageType.NULL_SBUFF_TYPE,
  176. THUAI6.StudentBuffType.StudentBuffType1: MessageType.SBUFFTYPE1, }
  177. trickerBuffTypeDict: Final[dict] = {
  178. THUAI6.TrickerBuffType.NullTrickerBuffType: MessageType.NULL_TBUFF_TYPE,
  179. THUAI6.TrickerBuffType.TrickerBuffType1: MessageType.TBUFFTYPE1, }
  180. studentStateDict: Final[dict] = {
  181. THUAI6.StudentState.NullStudentState: MessageType.NULL_STATUS,
  182. THUAI6.StudentState.Idle: MessageType.IDLE,
  183. THUAI6.StudentState.Learning: MessageType.LEARNING,
  184. THUAI6.StudentState.Fail: MessageType.FAIL,
  185. THUAI6.StudentState.Emotional: MessageType.EMOTIONAL,
  186. THUAI6.StudentState.Quit: MessageType.QUIT,
  187. THUAI6.StudentState.Graduated: MessageType.GRADUATED, }
  188. gameStateDict: Final[dict] = {
  189. THUAI6.GameState.NullGameState: MessageType.NULL_GAME_STATE,
  190. THUAI6.GameState.GameStart: MessageType.GAME_START,
  191. THUAI6.GameState.GameRunning: MessageType.GAME_RUNNING,
  192. THUAI6.GameState.GameEnd: MessageType.GAME_END}
  193. # 用于将THUAI6的对象转为Proto的对象
  194. @staticmethod
  195. def THUAI62ProtobufPlayer(playerID: int, playerType: THUAI6.PlayerType, studentType: THUAI6.StudentType, trickerType: THUAI6.TrickerType) -> Message2Server.PlayerMsg:
  196. return Message2Server.PlayerMsg(player_id=playerID, player_type=THUAI62Proto.playerTypeDict[playerType], student_type=THUAI62Proto.studentTypeDict[studentType], tricker_type=THUAI62Proto.trickerTypeDict[trickerType])
  197. @staticmethod
  198. def THUAI62ProtobufID(playerID: int) -> Message2Server.IDMsg:
  199. return Message2Server.IDMsg(player_id=playerID)
  200. @staticmethod
  201. def THUAI62ProtobufMove(time: int, angle: float, id: int) -> Message2Server.MoveMsg:
  202. return Message2Server.MoveMsg(player_id=id, angle=angle, time_in_milliseconds=time)
  203. @staticmethod
  204. def THUAI62ProtobufPick(prop: THUAI6.PropType, id: int) -> Message2Server.PickMsg:
  205. return Message2Server.PickMsg(player_id=id, prop_type=THUAI62Proto.propTypeDict[prop])
  206. @staticmethod
  207. def THUAI62ProtobufSend(msg: str, toID: int, id: int) -> Message2Server.SendMsg:
  208. return Message2Server.SendMsg(player_id=id, to_player_id=toID, message=msg)
  209. @staticmethod
  210. def THUAI62ProtobufTrick(angle: float, id: int) -> Message2Server.TrickMsg:
  211. return Message2Server.TrickMsg(player_id=id, angle=angle)