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

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