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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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. distance: float = deltaX**2 + deltaY**2
  23. myPlace = map[AssistFunction.GridToCell(
  24. x)][AssistFunction.GridToCell(y)]
  25. newPlace = map[AssistFunction.GridToCell(
  26. newX)][AssistFunction.GridToCell(newY)]
  27. if myPlace != THUAI6.PlaceType.Grass and newPlace == THUAI6.PlaceType.Grass:
  28. return False
  29. if distance <= viewRange * viewRange:
  30. divide: int = max(abs(deltaX), abs(deltaY)) // 100
  31. if divide == 0:
  32. return True
  33. dx: float = deltaX / divide
  34. dy: float = deltaY / divide
  35. selfX: float = float(x)
  36. selfY: float = float(y)
  37. if newPlace == THUAI6.PlaceType.Grass and myPlace == THUAI6.PlaceType.Grass:
  38. for i in range(divide):
  39. selfX += dx
  40. selfY += dy
  41. if map[AssistFunction.GridToCell(int(selfX))][AssistFunction.GridToCell(int(selfY))] != THUAI6.PlaceType.Grass:
  42. return False
  43. else:
  44. return True
  45. else:
  46. for i in range(divide):
  47. selfX += dx
  48. selfY += dy
  49. if map[AssistFunction.GridToCell(int(selfX))][AssistFunction.GridToCell(int(selfY))] == THUAI6.PlaceType.Wall:
  50. return False
  51. else:
  52. return True
  53. else:
  54. return False
  55. class Proto2THUAI6(NoInstance):
  56. placeTypeDict: Final[dict] = {
  57. MessageType.NULL_PLACE_TYPE: THUAI6.PlaceType.NullPlaceType,
  58. MessageType.WALL: THUAI6.PlaceType.Wall,
  59. MessageType.LAND: THUAI6.PlaceType.Land,
  60. MessageType.GRASS: THUAI6.PlaceType.Grass,
  61. MessageType.CLASSROOM: THUAI6.PlaceType.ClassRoom,
  62. MessageType.GATE: THUAI6.PlaceType.Gate,
  63. MessageType.HIDDEN_GATE: THUAI6.PlaceType.HiddenGate,
  64. MessageType.WINDOW: THUAI6.PlaceType.Window,
  65. MessageType.DOOR3: THUAI6.PlaceType.Door3,
  66. MessageType.DOOR5: THUAI6.PlaceType.Door5,
  67. MessageType.DOOR6: THUAI6.PlaceType.Door6,
  68. MessageType.CHEST: THUAI6.PlaceType.Chest, }
  69. shapeTypeDict: Final[dict] = {
  70. MessageType.NULL_SHAPE_TYPE: THUAI6.ShapeType.NullShapeType,
  71. MessageType.SQUARE: THUAI6.ShapeType.Square,
  72. MessageType.CIRCLE: THUAI6.ShapeType.Circle}
  73. propTypeDict: Final[dict] = {
  74. MessageType.NULL_PROP_TYPE: THUAI6.PropType.NullPropType,
  75. MessageType.KEY3: THUAI6.PropType.Key3,
  76. MessageType.KEY5: THUAI6.PropType.Key5,
  77. MessageType.KEY6: THUAI6.PropType.Key6,
  78. MessageType.ADD_SPEED: THUAI6.PropType.AddSpeed,
  79. MessageType.ADD_HP_OR_AP: THUAI6.PropType.AddHpOrAp,
  80. MessageType.ADD_LIFE_OR_AP: THUAI6.PropType.AddLifeOrAp,
  81. MessageType.SHIELD_OR_SPEAR: THUAI6.PropType.ShieldOrSpear,
  82. MessageType.RECOVERY_FROM_DIZZINESS: THUAI6.PropType.RecoveryFromDizziness, }
  83. playerTypeDict: Final[dict] = {
  84. MessageType.NULL_PLAYER_TYPE: THUAI6.PlayerType.NullPlayerType,
  85. MessageType.STUDENT_PLAYER: THUAI6.PlayerType.StudentPlayer,
  86. MessageType.TRICKER_PLAYER: THUAI6.PlayerType.TrickerPlayer, }
  87. studentTypeDict: Final[dict] = {
  88. MessageType.NULL_STUDENT_TYPE: THUAI6.StudentType.NullStudentType,
  89. MessageType.ATHLETE: THUAI6.StudentType.Athlete,
  90. MessageType.STUDENTTYPE2: THUAI6.StudentType.Teacher,
  91. MessageType.STUDENTTYPE3: THUAI6.StudentType.StraightAStudent, }
  92. trickerTypeDict: Final[dict] = {
  93. MessageType.NULL_TRICKER_TYPE: THUAI6.TrickerType.NullTrickerType,
  94. MessageType.ASSASSIN: THUAI6.TrickerType.Assassin,
  95. MessageType.TRICKERTYPE2: THUAI6.TrickerType.Klee,
  96. MessageType.TRICKERTYPE3: THUAI6.TrickerType.ANoisyPerson, }
  97. studentBuffTypeDict: Final[dict] = {
  98. MessageType.NULL_SBUFF_TYPE: THUAI6.StudentBuffType.NullStudentBuffType,
  99. MessageType.SBUFFTYPE1: THUAI6.StudentBuffType.AddSpeed,
  100. MessageType.SBUFFTYPE2: THUAI6.StudentBuffType.AddLife,
  101. MessageType.SBUFFTYPE3: THUAI6.StudentBuffType.Shield,
  102. MessageType.SBUFFTYPE4: THUAI6.StudentBuffType.Invisible, }
  103. trickerBuffTypeDict: Final[dict] = {
  104. MessageType.NULL_TBUFF_TYPE: THUAI6.TrickerBuffType.NullTrickerBuffType,
  105. MessageType.TBUFFTYPE1: THUAI6.TrickerBuffType.AddSpeed,
  106. MessageType.TBUFFTYPE2: THUAI6.TrickerBuffType.Spear,
  107. MessageType.TBUFFTYPE3: THUAI6.TrickerBuffType.AddAp,
  108. MessageType.TBUFFTYPE4: THUAI6.TrickerBuffType.Clairaudience,
  109. MessageType.INVISIBLE: THUAI6.TrickerBuffType.Invisible, }
  110. playerStateDict: Final[dict] = {
  111. MessageType.NULL_STATUS: THUAI6.PlayerState.NullState,
  112. MessageType.IDLE: THUAI6.PlayerState.Idle,
  113. MessageType.LEARNING: THUAI6.PlayerState.Learning,
  114. MessageType.ADDICTED: THUAI6.PlayerState.Addicted,
  115. MessageType.QUIT: THUAI6.PlayerState.Quit,
  116. MessageType.GRADUATED: THUAI6.PlayerState.Graduated,
  117. MessageType.RESCUED: THUAI6.PlayerState.Rescued,
  118. MessageType.TREATED: THUAI6.PlayerState.Treated,
  119. MessageType.STUNNED: THUAI6.PlayerState.Stunned,
  120. MessageType.RESCUING: THUAI6.PlayerState.Rescuing,
  121. MessageType.TREATING: THUAI6.PlayerState.Treating,
  122. MessageType.SWINGING: THUAI6.PlayerState.Swinging,
  123. MessageType.ATTACKING: THUAI6.PlayerState.Attacking,
  124. MessageType.LOCKING: THUAI6.PlayerState.Locking,
  125. MessageType.RUMMAGING: THUAI6.PlayerState.Rummaging,
  126. MessageType.CLIMBING: THUAI6.PlayerState.Climbing,
  127. MessageType.OPENING_A_CHEST: THUAI6.PlayerState.OpeningAChest,
  128. MessageType.USING_SPECIAL_SKILL: THUAI6.PlayerState.UsingSpecialSkill,
  129. MessageType.OPENING_A_GATE: THUAI6.PlayerState.OpeningAGate, }
  130. gameStateDict: Final[dict] = {
  131. MessageType.NULL_GAME_STATE: THUAI6.GameState.NullGameState,
  132. MessageType.GAME_START: THUAI6.GameState.GameStart,
  133. MessageType.GAME_RUNNING: THUAI6.GameState.GameRunning,
  134. MessageType.GAME_END: THUAI6.GameState.GameEnd}
  135. bulletTypeDict: Final[dict] = {
  136. MessageType.NULL_BULLET_TYPE: THUAI6.BulletType.NullBulletType,
  137. MessageType.FLYING_KNIFE: THUAI6.BulletType.FlyingKnife,
  138. MessageType.FAST_BULLET: THUAI6.BulletType.BombBomb,
  139. MessageType.COMMON_ATTACK_OF_TRICKER: THUAI6.BulletType.CommonAttackOfTricker,
  140. MessageType.ORDINARY_BULLET: THUAI6.BulletType.JumpyDumpty,
  141. MessageType.ATOM_BOMB: THUAI6.BulletType.AtomBomb, }
  142. # 用于将Proto的对象转为THUAI6的对象
  143. @ staticmethod
  144. def Protobuf2THUAI6Tricker(trickerMsg: Message2Clients.MessageOfTricker) -> THUAI6.Tricker:
  145. tricker = THUAI6.Tricker()
  146. tricker.x = trickerMsg.x
  147. tricker.y = trickerMsg.y
  148. tricker.speed = trickerMsg.speed
  149. tricker.score = trickerMsg.score
  150. tricker.facingDirection = trickerMsg.facing_direction
  151. tricker.trickDesire = trickerMsg.trick_desire
  152. tricker.classVolume = trickerMsg.class_volume
  153. tricker.bulletType = Proto2THUAI6.bulletTypeDict[trickerMsg.bullet_type]
  154. tricker.timeUntilSkillAvailable.clear()
  155. for time in trickerMsg.time_until_skill_available:
  156. tricker.timeUntilSkillAvailable.append(time)
  157. tricker.place = Proto2THUAI6.placeTypeDict[trickerMsg.place]
  158. tricker.playerState = Proto2THUAI6.playerStateDict[trickerMsg.player_state]
  159. tricker.prop.clear()
  160. for item in trickerMsg.prop:
  161. tricker.prop.append(Proto2THUAI6.propTypeDict[item])
  162. tricker.trickerType = Proto2THUAI6.trickerTypeDict[trickerMsg.tricker_type]
  163. tricker.guid = trickerMsg.guid
  164. tricker.playerID = trickerMsg.player_id
  165. tricker.viewRange = trickerMsg.view_range
  166. tricker.radius = trickerMsg.radius
  167. tricker.buff.clear()
  168. for buff in trickerMsg.buff:
  169. tricker.buff.append(Proto2THUAI6.trickerBuffTypeDict[buff])
  170. tricker.playerType = THUAI6.PlayerType.TrickerPlayer
  171. return tricker
  172. @ staticmethod
  173. def Protobuf2THUAI6Student(studentMsg: Message2Clients.MessageOfStudent) -> THUAI6.Student:
  174. student = THUAI6.Student()
  175. student.x = studentMsg.x
  176. student.y = studentMsg.y
  177. student.speed = studentMsg.speed
  178. student.determination = studentMsg.determination
  179. student.addiction = studentMsg.addiction
  180. student.score = studentMsg.score
  181. student.facingDirection = studentMsg.facing_direction
  182. student.bulletType = Proto2THUAI6.bulletTypeDict[studentMsg.bullet_type]
  183. student.learningSpeed = studentMsg.learning_speed
  184. student.treatSpeed = studentMsg.treat_speed
  185. student.treatProgress = studentMsg.treat_progress
  186. student.rescueProgress = studentMsg.rescue_progress
  187. student.dangerAlert = studentMsg.danger_alert
  188. student.timeUntilSkillAvailable.clear()
  189. for time in studentMsg.time_until_skill_available:
  190. student.timeUntilSkillAvailable.append(time)
  191. student.place = Proto2THUAI6.placeTypeDict[studentMsg.place]
  192. student.prop.clear()
  193. for item in studentMsg.prop:
  194. student.prop.append(Proto2THUAI6.propTypeDict[item])
  195. student.studentType = Proto2THUAI6.studentTypeDict[studentMsg.student_type]
  196. student.guid = studentMsg.guid
  197. student.playerState = Proto2THUAI6.playerStateDict[studentMsg.player_state]
  198. student.playerID = studentMsg.player_id
  199. student.viewRange = studentMsg.view_range
  200. student.radius = studentMsg.radius
  201. student.buff.clear()
  202. for buff in studentMsg.buff:
  203. student.buff.append(Proto2THUAI6.studentBuffTypeDict[buff])
  204. student.playerType = THUAI6.PlayerType.StudentPlayer
  205. return student
  206. @ staticmethod
  207. def Protobuf2THUAI6Prop(propMsg: Message2Clients.MessageOfProp) -> THUAI6.Prop:
  208. prop = THUAI6.Prop()
  209. prop.x = propMsg.x
  210. prop.y = propMsg.y
  211. prop.type = Proto2THUAI6.propTypeDict[propMsg.type]
  212. prop.guid = propMsg.guid
  213. prop.facingDirection = propMsg.facing_direction
  214. return prop
  215. @ staticmethod
  216. def Protobuf2THUAI6GameInfo(allMsg: Message2Clients.MessageOfAll):
  217. gameInfo = THUAI6.GameInfo()
  218. gameInfo.gameTime = allMsg.game_time
  219. gameInfo.subjectFinished = allMsg.subject_finished
  220. gameInfo.studentGraduated = allMsg.student_graduated
  221. gameInfo.studentQuited = allMsg.student_quited
  222. gameInfo.studentScore = allMsg.student_score
  223. gameInfo.trickerScore = allMsg.tricker_score
  224. return gameInfo
  225. @ staticmethod
  226. def Protobuf2THUAI6Bullet(bulletMsg: Message2Clients.MessageOfBullet) -> THUAI6.Bullet:
  227. bullet = THUAI6.Bullet()
  228. bullet.x = bulletMsg.x
  229. bullet.y = bulletMsg.y
  230. bullet.bulletType = Proto2THUAI6.bulletTypeDict[bulletMsg.type]
  231. bullet.facingDirection = bulletMsg.facing_direction
  232. bullet.guid = bulletMsg.guid
  233. bullet.team = Proto2THUAI6.playerTypeDict[bulletMsg.team]
  234. bullet.place = Proto2THUAI6.placeTypeDict[bulletMsg.place]
  235. bullet.bombRange = bulletMsg.bomb_range
  236. return bullet
  237. @ staticmethod
  238. def Protobuf2THUAI6BombedBullet(bulletMsg: Message2Clients.MessageOfBombedBullet) -> THUAI6.BombedBullet:
  239. bullet = THUAI6.BombedBullet()
  240. bullet.x = bulletMsg.x
  241. bullet.y = bulletMsg.y
  242. bullet.bulletType = Proto2THUAI6.bulletTypeDict[bulletMsg.type]
  243. bullet.facingDirection = bulletMsg.facing_direction
  244. bullet.mappingID = bulletMsg.mapping_id
  245. bullet.bombRange = bulletMsg.bomb_range
  246. return bullet
  247. @ staticmethod
  248. def Bool2HiddenGateState(gateMsg: bool) -> THUAI6.HiddenGateState:
  249. if gateMsg:
  250. return THUAI6.HiddenGateState.Opened
  251. else:
  252. return THUAI6.HiddenGateState.Refreshed
  253. class THUAI62Proto(NoInstance):
  254. placeTypeDict: Final[dict] = {
  255. THUAI6.PlaceType.NullPlaceType: MessageType.NULL_PLACE_TYPE,
  256. THUAI6.PlaceType.Wall: MessageType.WALL,
  257. THUAI6.PlaceType.Land: MessageType.LAND,
  258. THUAI6.PlaceType.Grass: MessageType.GRASS,
  259. THUAI6.PlaceType.ClassRoom: MessageType.CLASSROOM,
  260. THUAI6.PlaceType.Gate: MessageType.GATE,
  261. THUAI6.PlaceType.HiddenGate: MessageType.HIDDEN_GATE,
  262. THUAI6.PlaceType.Door3: MessageType.DOOR3,
  263. THUAI6.PlaceType.Door5: MessageType.DOOR5,
  264. THUAI6.PlaceType.Door6: MessageType.DOOR6,
  265. THUAI6.PlaceType.Chest: MessageType.CHEST,
  266. THUAI6.PlaceType.Window: MessageType.WINDOW, }
  267. playerTypeDict: Final[dict] = {
  268. THUAI6.PlayerType.NullPlayerType: MessageType.NULL_PLAYER_TYPE,
  269. THUAI6.PlayerType.StudentPlayer: MessageType.STUDENT_PLAYER,
  270. THUAI6.PlayerType.TrickerPlayer: MessageType.TRICKER_PLAYER}
  271. studentTypeDict: Final[dict] = {
  272. THUAI6.StudentType.NullStudentType: MessageType.NULL_STUDENT_TYPE,
  273. THUAI6.StudentType.Athlete: MessageType.ATHLETE,
  274. THUAI6.StudentType.Teacher: MessageType.STUDENTTYPE2,
  275. THUAI6.StudentType.StraightAStudent: MessageType.STUDENTTYPE3, }
  276. trickerTypeDict: Final[dict] = {
  277. THUAI6.TrickerType.NullTrickerType: MessageType.NULL_TRICKER_TYPE,
  278. THUAI6.TrickerType.Assassin: MessageType.ASSASSIN,
  279. THUAI6.TrickerType.Klee: MessageType.TRICKERTYPE2,
  280. THUAI6.TrickerType.ANoisyPerson: MessageType.TRICKERTYPE3, }
  281. propTypeDict: Final[dict] = {
  282. THUAI6.PropType.NullPropType: MessageType.NULL_PROP_TYPE,
  283. THUAI6.PropType.Key3: MessageType.KEY3,
  284. THUAI6.PropType.Key5: MessageType.KEY5,
  285. THUAI6.PropType.Key6: MessageType.KEY6,
  286. THUAI6.PropType.AddHpOrAp: MessageType.ADD_HP_OR_AP,
  287. THUAI6.PropType.AddLifeOrAp: MessageType.ADD_LIFE_OR_AP,
  288. THUAI6.PropType.AddSpeed: MessageType.ADD_SPEED,
  289. THUAI6.PropType.ShieldOrSpear: MessageType.SHIELD_OR_SPEAR, }
  290. # 用于将THUAI6的对象转为Proto的对象
  291. @ staticmethod
  292. def THUAI62ProtobufPlayer(playerID: int, playerType: THUAI6.PlayerType, studentType: THUAI6.StudentType, trickerType: THUAI6.TrickerType) -> Message2Server.PlayerMsg:
  293. if playerType == THUAI6.PlayerType.StudentPlayer:
  294. return Message2Server.PlayerMsg(player_id=playerID, player_type=MessageType.STUDENT_PLAYER, student_type=THUAI62Proto.studentTypeDict[studentType])
  295. else:
  296. return Message2Server.PlayerMsg(player_id=playerID, player_type=MessageType.TRICKER_PLAYER, tricker_type=THUAI62Proto.trickerTypeDict[trickerType])
  297. @ staticmethod
  298. def THUAI62ProtobufID(playerID: int) -> Message2Server.IDMsg:
  299. return Message2Server.IDMsg(player_id=playerID)
  300. @ staticmethod
  301. def THUAI62ProtobufMove(time: int, angle: float, id: int) -> Message2Server.MoveMsg:
  302. return Message2Server.MoveMsg(player_id=id, angle=angle, time_in_milliseconds=time)
  303. @ staticmethod
  304. def THUAI62ProtobufTreatAndRescue(playerID: int, mateID: int) -> Message2Server.TreatAndRescueMsg:
  305. return Message2Server.TreatAndRescueMsg(player_id=playerID, to_player_id=mateID)
  306. @ staticmethod
  307. def THUAI62ProtobufProp(prop: THUAI6.PropType, id: int) -> Message2Server.PropMsg:
  308. return Message2Server.PropMsg(player_id=id, prop_type=THUAI62Proto.propTypeDict[prop])
  309. @ staticmethod
  310. def THUAI62ProtobufSend(msg: str, toID: int, id: int) -> Message2Server.SendMsg:
  311. return Message2Server.SendMsg(player_id=id, to_player_id=toID, message=msg)
  312. @ staticmethod
  313. def THUAI62ProtobufAttack(angle: float, id: int) -> Message2Server.AttackMsg:
  314. return Message2Server.AttackMsg(player_id=id, angle=angle)
  315. @ staticmethod
  316. def THUAI62ProtobufSkill(skillID: int, id: int) -> Message2Server.SkillMsg:
  317. return Message2Server.SkillMsg(player_id=id, skill_id=skillID)