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 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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, myPlace: THUAI6.PlaceType, newPlace: THUAI6.PlaceType, map: List[List[THUAI6.PlaceType]]) -> bool:
  20. deltaX: int = newX - x
  21. deltaY: int = newY - y
  22. distance: float = deltaX**2 + deltaY**2
  23. if myPlace != THUAI6.PlaceType.Grass and newPlace == THUAI6.PlaceType.Grass:
  24. return False
  25. if distance <= viewRange * viewRange:
  26. divide: int = max(abs(deltaX), abs(deltaY)) // 100
  27. dx: float = deltaX / divide
  28. dy: float = deltaY / divide
  29. selfX: float = float(x)
  30. selfY: float = float(y)
  31. if newPlace == THUAI6.PlaceType.Grass and myPlace == THUAI6.PlaceType.Grass:
  32. for i in range(divide):
  33. selfX += dx
  34. selfY += dy
  35. if map[AssistFunction.GridToCell(int(selfX))][AssistFunction.GridToCell(int(selfY))] != THUAI6.PlaceType.Grass:
  36. return False
  37. else:
  38. return True
  39. else:
  40. for i in range(divide):
  41. selfX += dx
  42. selfY += dy
  43. if map[AssistFunction.GridToCell(int(selfX))][AssistFunction.GridToCell(int(selfY))] == THUAI6.PlaceType.Wall:
  44. return False
  45. else:
  46. return True
  47. else:
  48. return False
  49. class Proto2THUAI6(NoInstance):
  50. placeTypeDict: Final[dict] = {
  51. MessageType.NULL_PLACE_TYPE: THUAI6.PlaceType.NullPlaceType,
  52. MessageType.WALL: THUAI6.PlaceType.Wall,
  53. MessageType.LAND: THUAI6.PlaceType.Land,
  54. MessageType.GRASS: THUAI6.PlaceType.Grass,
  55. MessageType.CLASSROOM: THUAI6.PlaceType.ClassRoom,
  56. MessageType.GATE: THUAI6.PlaceType.Gate,
  57. MessageType.HIDDEN_GATE: THUAI6.PlaceType.HiddenGate,
  58. MessageType.WINDOW: THUAI6.PlaceType.Window,
  59. MessageType.DOOR: THUAI6.PlaceType.Door,
  60. }
  61. shapeTypeDict: Final[dict] = {
  62. MessageType.NULL_SHAPE_TYPE: THUAI6.ShapeType.NullShapeType,
  63. MessageType.SQUARE: THUAI6.ShapeType.Square,
  64. MessageType.CIRCLE: THUAI6.ShapeType.Circle}
  65. propTypeDict: Final[dict] = {
  66. MessageType.NULL_PROP_TYPE: THUAI6.PropType.NullPropType,
  67. MessageType.PTYPE1: THUAI6.PropType.PropType1, }
  68. playerTypeDict: Final[dict] = {
  69. MessageType.NULL_PLAYER_TYPE: THUAI6.PlayerType.NullPlayerType,
  70. MessageType.STUDENT_PLAYER: THUAI6.PlayerType.StudentPlayer,
  71. MessageType.TRICKER_PLAYER: THUAI6.PlayerType.TrickerPlayer, }
  72. studentTypeDict: Final[dict] = {
  73. MessageType.NULL_STUDENT_TYPE: THUAI6.StudentType.NullStudentType,
  74. MessageType.STUDENTTYPE1: THUAI6.StudentType.StudentType1, }
  75. trickerTypeDict: Final[dict] = {
  76. MessageType.NULL_TRICKER_TYPE: THUAI6.TrickerType.NullTrickerType,
  77. MessageType.TRICKERTYPE1: THUAI6.TrickerType.TrickerType1, }
  78. studentBuffTypeDict: Final[dict] = {
  79. MessageType.NULL_SBUFF_TYPE: THUAI6.StudentBuffType.NullStudentBuffType,
  80. MessageType.SBUFFTYPE1: THUAI6.StudentBuffType.StudentBuffType1, }
  81. trickerBuffTypeDict: Final[dict] = {
  82. MessageType.NULL_TBUFF_TYPE: THUAI6.TrickerBuffType.NullTrickerBuffType,
  83. MessageType.TBUFFTYPE1: THUAI6.TrickerBuffType.TrickerBuffType1, }
  84. playerStateDict: Final[dict] = {
  85. MessageType.NULL_STATUS: THUAI6.PlayerState.NullState,
  86. MessageType.IDLE: THUAI6.PlayerState.Idle,
  87. MessageType.LEARNING: THUAI6.PlayerState.Learning,
  88. MessageType.ADDICTED: THUAI6.PlayerState.Addicted,
  89. MessageType.QUIT: THUAI6.PlayerState.Quit,
  90. MessageType.GRADUATED: THUAI6.PlayerState.Graduated,
  91. MessageType.RESCUED: THUAI6.PlayerState.Rescued,
  92. MessageType.TREATED: THUAI6.PlayerState.Treated,
  93. MessageType.STUNNED: THUAI6.PlayerState.Stunned,
  94. MessageType.RESCUING: THUAI6.PlayerState.Rescuing,
  95. MessageType.TREATING: THUAI6.PlayerState.Treating, }
  96. gameStateDict: Final[dict] = {
  97. MessageType.NULL_GAME_STATE: THUAI6.GameState.NullGameState,
  98. MessageType.GAME_START: THUAI6.GameState.GameStart,
  99. MessageType.GAME_RUNNING: THUAI6.GameState.GameRunning,
  100. MessageType.GAME_END: THUAI6.GameState.GameEnd}
  101. bulletTypeDict: Final[dict] = {
  102. MessageType.NULL_BULLET_TYPE: THUAI6.BulletType.NullBulletType,
  103. MessageType.COMMON_BULLET: THUAI6.BulletType.CommonBullet,
  104. MessageType.FAST_BULLET: THUAI6.BulletType.FastBullet,
  105. MessageType.LINE_BULLET: THUAI6.BulletType.LineBullet,
  106. MessageType.ORDINARY_BULLET: THUAI6.BulletType.OrdinaryBullet,
  107. MessageType.ATOM_BOMB: THUAI6.BulletType.AtomBomb, }
  108. # 用于将Proto的对象转为THUAI6的对象
  109. @staticmethod
  110. def Protobuf2THUAI6Tricker(trickerMsg: Message2Clients.MessageOfTricker) -> THUAI6.Tricker:
  111. tricker = THUAI6.Tricker()
  112. tricker.x = trickerMsg.x
  113. tricker.y = trickerMsg.y
  114. tricker.speed = trickerMsg.speed
  115. tricker.damage = trickerMsg.damage
  116. for time in trickerMsg.time_until_skill_available:
  117. tricker.timeUntilSkillAvailable.append(time)
  118. tricker.place = Proto2THUAI6.placeTypeDict[trickerMsg.place]
  119. tricker.playerState = Proto2THUAI6.playerStateDict[trickerMsg.player_state]
  120. for item in trickerMsg.prop:
  121. tricker.prop.append(Proto2THUAI6.propTypeDict[item])
  122. tricker.trickerType = Proto2THUAI6.trickerTypeDict[trickerMsg.tricker_type]
  123. tricker.guid = trickerMsg.guid
  124. tricker.playerID = trickerMsg.player_id
  125. tricker.viewRange = trickerMsg.view_range
  126. tricker.radius = trickerMsg.radius
  127. tricker.buff.clear()
  128. for buff in trickerMsg.buff:
  129. tricker.buff.append(Proto2THUAI6.trickerBuffTypeDict[buff])
  130. return tricker
  131. @staticmethod
  132. def Protobuf2THUAI6Student(studentMsg: Message2Clients.MessageOfStudent) -> THUAI6.Student:
  133. student = THUAI6.Student()
  134. student.x = studentMsg.x
  135. student.y = studentMsg.y
  136. student.speed = studentMsg.speed
  137. student.determination = studentMsg.determination
  138. student.addiction = studentMsg.addiction
  139. for time in studentMsg.time_until_skill_available:
  140. student.timeUntilSkillAvailable.append(time)
  141. student.damage = studentMsg.damage
  142. student.place = Proto2THUAI6.placeTypeDict[studentMsg.place]
  143. for item in studentMsg.prop:
  144. student.prop.append(Proto2THUAI6.propTypeDict[item])
  145. student.studentType = Proto2THUAI6.studentTypeDict[studentMsg.student_type]
  146. student.guid = studentMsg.guid
  147. student.playerState = Proto2THUAI6.playerStateDict[studentMsg.player_state]
  148. student.playerID = studentMsg.player_id
  149. student.viewRange = studentMsg.view_range
  150. student.radius = studentMsg.radius
  151. for buff in studentMsg.buff:
  152. student.buff.append(Proto2THUAI6.studentBuffTypeDict[buff])
  153. return student
  154. @staticmethod
  155. def Protobuf2THUAI6Prop(propMsg: Message2Clients.MessageOfProp) -> THUAI6.Prop:
  156. prop = THUAI6.Prop()
  157. prop.x = propMsg.x
  158. prop.y = propMsg.y
  159. prop.type = Proto2THUAI6.propTypeDict[propMsg.type]
  160. prop.guid = propMsg.guid
  161. prop.size = propMsg.size
  162. prop.facingDirection = propMsg.facing_direction
  163. prop.isMoving = propMsg.is_moving
  164. return prop
  165. @staticmethod
  166. def Protobuf2THUAI6GameInfo(allMsg: Message2Clients.MessageOfAll):
  167. gameInfo = THUAI6.GameInfo()
  168. gameInfo.gameTime = allMsg.game_time
  169. gameInfo.subjectLeft = allMsg.subject_left
  170. gameInfo.studentGraduated = allMsg.student_graduated
  171. gameInfo.studentQuited = allMsg.student_quited
  172. gameInfo.studentScore = allMsg.student_score
  173. gameInfo.trickerScore = allMsg.tricker_score
  174. gameInfo.gateOpened = allMsg.gate_opened
  175. gameInfo.hiddenGateOpened = allMsg.hidden_gate_opened
  176. gameInfo.hiddenGateRefreshed = allMsg.hidden_gate_refreshed
  177. return gameInfo
  178. @staticmethod
  179. def Protobuf2THUAI6Bullet(bulletMsg: Message2Clients.MessageOfBullet) -> THUAI6.Bullet:
  180. bullet = THUAI6.Bullet()
  181. bullet.x = bulletMsg.x
  182. bullet.y = bulletMsg.y
  183. bullet.bulletType = Proto2THUAI6.bulletTypeDict[bulletMsg.type]
  184. bullet.facingDirection = bulletMsg.facing_direction
  185. bullet.guid = bulletMsg.guid
  186. bullet.team = Proto2THUAI6.playerTypeDict[bulletMsg.team]
  187. bullet.place = Proto2THUAI6.placeTypeDict[bulletMsg.place]
  188. bullet.bombRange = bulletMsg.bomb_range
  189. return bullet
  190. @staticmethod
  191. def Protobuf2THUAI6BombedBullet(bulletMsg: Message2Clients.MessageOfBombedBullet) -> THUAI6.BombedBullet:
  192. bullet = THUAI6.BombedBullet()
  193. bullet.x = bulletMsg.x
  194. bullet.y = bulletMsg.y
  195. bullet.bulletType = Proto2THUAI6.bulletTypeDict[bulletMsg.type]
  196. bullet.facingDirection = bulletMsg.facing_direction
  197. bullet.mappingID = bulletMsg.mapping_id
  198. bullet.bombRange = bulletMsg.bomb_range
  199. return bullet
  200. @staticmethod
  201. def Protobuf2THUAI6Map(mapMsg: Message2Clients.MessageOfMap) -> List[List[THUAI6.PlaceType]]:
  202. map = []
  203. for row in mapMsg.row:
  204. newRow = []
  205. for place in row.col:
  206. newRow.append(Proto2THUAI6.placeTypeDict[place])
  207. map.append(newRow)
  208. return map
  209. class THUAI62Proto(NoInstance):
  210. placeTypeDict: Final[dict] = {
  211. THUAI6.PlaceType.NullPlaceType: MessageType.NULL_PLACE_TYPE,
  212. THUAI6.PlaceType.Wall: MessageType.WALL,
  213. THUAI6.PlaceType.Land: MessageType.LAND,
  214. THUAI6.PlaceType.Grass: MessageType.GRASS,
  215. THUAI6.PlaceType.ClassRoom: MessageType.CLASSROOM,
  216. THUAI6.PlaceType.Gate: MessageType.GATE,
  217. THUAI6.PlaceType.HiddenGate: MessageType.HIDDEN_GATE,
  218. THUAI6.PlaceType.Door: MessageType.DOOR,
  219. THUAI6.PlaceType.Chest: MessageType.CHEST,
  220. THUAI6.PlaceType.Window: MessageType.WINDOW, }
  221. playerTypeDict: Final[dict] = {
  222. THUAI6.PlayerType.NullPlayerType: MessageType.NULL_PLAYER_TYPE,
  223. THUAI6.PlayerType.StudentPlayer: MessageType.STUDENT_PLAYER,
  224. THUAI6.PlayerType.TrickerPlayer: MessageType.TRICKER_PLAYER}
  225. studentTypeDict: Final[dict] = {
  226. THUAI6.StudentType.NullStudentType: MessageType.NULL_STUDENT_TYPE,
  227. THUAI6.StudentType.StudentType1: MessageType.STUDENTTYPE1, }
  228. trickerTypeDict: Final[dict] = {
  229. THUAI6.TrickerType.NullTrickerType: MessageType.NULL_TRICKER_TYPE,
  230. THUAI6.TrickerType.TrickerType1: MessageType.TRICKERTYPE1, }
  231. propTypeDict: Final[dict] = {
  232. THUAI6.PropType.NullPropType: MessageType.NULL_PROP_TYPE,
  233. THUAI6.PropType.PropType1: MessageType.PTYPE1, }
  234. # 用于将THUAI6的对象转为Proto的对象
  235. @staticmethod
  236. def THUAI62ProtobufPlayer(playerID: int, playerType: THUAI6.PlayerType, studentType: THUAI6.StudentType, trickerType: THUAI6.TrickerType) -> Message2Server.PlayerMsg:
  237. return Message2Server.PlayerMsg(player_id=playerID, player_type=THUAI62Proto.playerTypeDict[playerType], student_type=THUAI62Proto.studentTypeDict[studentType], tricker_type=THUAI62Proto.trickerTypeDict[trickerType])
  238. @staticmethod
  239. def THUAI62ProtobufID(playerID: int) -> Message2Server.IDMsg:
  240. return Message2Server.IDMsg(player_id=playerID)
  241. @staticmethod
  242. def THUAI62ProtobufMove(time: int, angle: float, id: int) -> Message2Server.MoveMsg:
  243. return Message2Server.MoveMsg(player_id=id, angle=angle, time_in_milliseconds=time)
  244. @staticmethod
  245. def THUAI62ProtobufPick(prop: THUAI6.PropType, id: int) -> Message2Server.PropMsg:
  246. return Message2Server.PropMsg(player_id=id, prop_type=THUAI62Proto.propTypeDict[prop])
  247. @staticmethod
  248. def THUAI62ProtobufSend(msg: str, toID: int, id: int) -> Message2Server.SendMsg:
  249. return Message2Server.SendMsg(player_id=id, to_player_id=toID, message=msg)
  250. @staticmethod
  251. def THUAI62ProtobufTrick(angle: float, id: int) -> Message2Server.AttackMsg:
  252. return Message2Server.AttackMsg(player_id=id, angle=angle)