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.

DebugAPI.py 24 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. from math import pi
  2. from concurrent.futures import ThreadPoolExecutor, Future
  3. from typing import List, Union
  4. import logging
  5. import os
  6. import datetime
  7. import PyAPI.structures as THUAI6
  8. from PyAPI.Interface import ILogic, IStudentAPI, ITrickerAPI, IGameTimer, IAI
  9. class StudentDebugAPI(IStudentAPI, IGameTimer):
  10. def __init__(self, logic: ILogic, file: bool, screen: bool, warnOnly: bool, playerID: int) -> None:
  11. self.__logic = logic
  12. self.__pool = ThreadPoolExecutor(20)
  13. self.__startPoint = datetime.datetime.now()
  14. self.__logger = logging.getLogger("api " + str(playerID))
  15. self.__logger.setLevel(logging.DEBUG)
  16. formatter = logging.Formatter(
  17. "[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s", "%H:%M:%S.%e")
  18. # 确保文件存在
  19. if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
  20. os.makedirs(os.path.dirname(os.path.dirname(
  21. os.path.realpath(__file__))) + "/logs")
  22. fileHandler = logging.FileHandler(os.path.dirname(
  23. os.path.dirname(os.path.realpath(__file__))) + "/logs/api-" + str(playerID) + "-log.txt")
  24. screenHandler = logging.StreamHandler()
  25. if file:
  26. fileHandler.setLevel(logging.DEBUG)
  27. fileHandler.setFormatter(formatter)
  28. self.__logger.addHandler(fileHandler)
  29. if screen:
  30. if warnOnly:
  31. screenHandler.setLevel(logging.WARNING)
  32. else:
  33. screenHandler.setLevel(logging.INFO)
  34. screenHandler.setFormatter(formatter)
  35. self.__logger.addHandler(screenHandler)
  36. # 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
  37. def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]:
  38. self.__logger.info(
  39. f"Move: timeInMilliseconds = {timeInMilliseconds}, angle = {angle}, called at {self.__GetTime()}ms")
  40. def logMove() -> bool:
  41. result = self.__logic.Move(timeInMilliseconds, angle)
  42. if not result:
  43. self.__logger.warning(
  44. f"Move: failed at {self.__GetTime()}ms")
  45. return result
  46. return self.__pool.submit(logMove)
  47. # 向特定方向移动
  48. def MoveRight(self, timeInMilliseconds: int) -> Future[bool]:
  49. return self.Move(timeInMilliseconds, pi * 0.5)
  50. def MoveLeft(self, timeInMilliseconds: int) -> Future[bool]:
  51. return self.Move(timeInMilliseconds, pi * 1.5)
  52. def MoveUp(self, timeInMilliseconds: int) -> Future[bool]:
  53. return self.Move(timeInMilliseconds, 0)
  54. def MoveDown(self, timeInMilliseconds: int) -> Future[bool]:
  55. return self.Move(timeInMilliseconds, pi)
  56. # 道具和技能相关
  57. def PickProp(self, propType: THUAI6.PropType) -> Future[bool]:
  58. self.__logger.info(
  59. f"PickProp: prop = {propType.name}, called at {self.__GetTime()}ms")
  60. def logPick() -> bool:
  61. result = self.__logic.PickProp(propType)
  62. if not result:
  63. self.__logger.warning(
  64. f"PickProp: failed at {self.__GetTime()}ms")
  65. return result
  66. return self.__pool.submit(logPick)
  67. def UseProp(self) -> Future[bool]:
  68. self.__logger.info(
  69. f"UseProp: called at {self.__GetTime()}ms")
  70. def logUse() -> bool:
  71. result = self.__logic.UseProp()
  72. if not result:
  73. self.__logger.warning(
  74. f"UseProp: failed at {self.__GetTime()}ms")
  75. return result
  76. return self.__pool.submit(logUse)
  77. def UseSkill(self) -> Future[bool]:
  78. self.__logger.info(
  79. f"UseSkill: called at {self.__GetTime()}ms")
  80. def logUse() -> bool:
  81. result = self.__logic.UseSkill()
  82. if not result:
  83. self.__logger.warning(
  84. f"UseSkill: failed at {self.__GetTime()}ms")
  85. return result
  86. return self.__pool.submit(logUse)
  87. # 消息相关,接收消息时无消息则返回(-1, '')
  88. def SendMessage(self, toID: int, message: str) -> Future[bool]:
  89. self.__logger.info(
  90. f"SendMessage: toID = {toID}, message = {message}, called at {self.__GetTime()}ms")
  91. def logSend() -> bool:
  92. result = self.__logic.SendMessage(toID, message)
  93. if not result:
  94. self.__logger.warning(
  95. f"SendMessage: failed at {self.__GetTime()}ms")
  96. return result
  97. return self.__pool.submit(logSend)
  98. def HaveMessage(self) -> Future[bool]:
  99. self.__logger.info(
  100. f"HaveMessage: called at {self.__GetTime()}ms")
  101. def logHave() -> bool:
  102. result = self.__logic.HaveMessage()
  103. if not result:
  104. self.__logger.warning(
  105. f"HaveMessage: failed at {self.__GetTime()}ms")
  106. return result
  107. return self.__pool.submit(logHave)
  108. def GetMessage(self) -> Future[tuple[int, str]]:
  109. self.__logger.info(
  110. f"GetMessage: called at {self.__GetTime()}ms")
  111. def logGet() -> tuple[int, str]:
  112. result = self.__logic.GetMessage()
  113. if result[0] == -1:
  114. self.__logger.warning(
  115. f"GetMessage: failed at {self.__GetTime()}ms")
  116. return result
  117. return self.__pool.submit(logGet)
  118. # 等待下一帧
  119. def Wait(self) -> Future[bool]:
  120. self.__logger.info(
  121. f"Wait: called at {self.__GetTime()}ms")
  122. if self.__logic.GetCounter() == -1:
  123. return self.__pool.submit(lambda: False)
  124. else:
  125. return self.__pool.submit(self.__logic.WaitThread)
  126. # 获取各类游戏中的消息
  127. def GetFrameCount(self) -> int:
  128. return self.__logic.GetCounter()
  129. def GetPlayerGUIDs(self) -> List[int]:
  130. return self.__logic.GetPlayerGUIDs()
  131. def GetTrickers(self) -> List[THUAI6.Tricker]:
  132. return self.__logic.GetTrickers()
  133. def GetStudents(self) -> List[THUAI6.Student]:
  134. return self.__logic.GetStudents()
  135. def GetProps(self) -> List[THUAI6.Prop]:
  136. return self.__logic.GetProps()
  137. def GetSelfInfo(self) -> Union[THUAI6.Student, THUAI6.Tricker]:
  138. return self.__logic.GetSelfInfo()
  139. def GetFullMap(self) -> List[List[THUAI6.PlaceType]]:
  140. return self.__logic.GetFullMap()
  141. def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType:
  142. return self.__logic.GetPlaceType(cellX, cellY)
  143. # 用于DEBUG的输出函数,仅在DEBUG模式下有效
  144. def PrintStudent(self) -> None:
  145. for student in self.__logic.GetStudents():
  146. self.__logger.info("******Student Info******")
  147. self.__logger.info(
  148. f"playerID={student.playerID}, GUID={student.guid}, x={student.x}, y={student.y}")
  149. self.__logger.info(
  150. f"speed={student.speed}, view range={student.viewRange}, skill time={student.timeUntilSkillAvailable}, prop={student.prop.name}, place={student.place.name}")
  151. self.__logger.info(
  152. f"state={student.state.name}, determination={student.determination}, fail time={student.failTime}")
  153. self.__logger.info("buff=")
  154. studentBuff = ""
  155. for buff in student.buff:
  156. studentBuff += buff.name + ", "
  157. self.__logger.info(studentBuff)
  158. self.__logger.info("**********************")
  159. def PrintTricker(self) -> None:
  160. for tricker in self.__logic.GetTrickers():
  161. self.__logger.info("******Tricker Info******")
  162. self.__logger.info(
  163. f"playerID={tricker.playerID}, GUID={tricker.guid}, x={tricker.x}, y={tricker.y}")
  164. self.__logger.info(
  165. f"speed={tricker.speed}, view range={tricker.viewRange}, skill time={tricker.timeUntilSkillAvailable}, prop={tricker.prop.name}, place={tricker.place.name}")
  166. self.__logger.info(
  167. f"damage={tricker.damage}, movable={tricker.movable}")
  168. self.__logger.info("buff=")
  169. trickerBuff = ""
  170. for buff in tricker.buff:
  171. trickerBuff += buff.name + ", "
  172. self.__logger.info(trickerBuff)
  173. self.__logger.info("************************")
  174. def PrintProp(self) -> None:
  175. for prop in self.__logic.GetProps():
  176. self.__logger.info("******Prop Info******")
  177. self.__logger.info(
  178. f"GUID={prop.guid}, x={prop.x}, y={prop.y}, place={prop.place.name}, is moving={prop.isMoving}")
  179. self.__logger.info("*********************")
  180. def PrintSelfInfo(self) -> None:
  181. mySelf = self.__logic.GetSelfInfo()
  182. self.__logger.info("******Self Info******")
  183. self.__logger.info(
  184. f"playerID={mySelf.playerID}, GUID={mySelf.guid}, x={mySelf.x}, y={mySelf.y}")
  185. self.__logger.info(
  186. f"speed={mySelf.speed}, view range={mySelf.viewRange}, skill time={mySelf.timeUntilSkillAvailable}, prop={mySelf.prop.name}, place={mySelf.place.name}")
  187. if isinstance(mySelf, THUAI6.Student):
  188. self.__logger.info(
  189. f"state={mySelf.state.name}, determination={mySelf.determination},fail num={mySelf.failNum}, fail time={mySelf.failTime}, emo time={mySelf.emoTime}")
  190. else:
  191. self.__logger.info(
  192. f"damage={mySelf.damage}, movable={mySelf.movable}")
  193. self.__logger.info("buff=")
  194. mySelfBuff = ""
  195. for buff in mySelf.buff:
  196. mySelfBuff += buff.name + ", "
  197. self.__logger.info(mySelfBuff)
  198. self.__logger.info("*********************")
  199. # 人类阵营的特殊函数
  200. def Graduate(self) -> Future[bool]:
  201. self.__logger.info(
  202. f"Graduate: called at {self.__GetTime()}ms")
  203. def logGraduate() -> bool:
  204. result = self.__logic.Graduate()
  205. if not result:
  206. self.__logger.warning(
  207. f"Graduate: failed at {self.__GetTime()}ms")
  208. return result
  209. return self.__pool.submit(logGraduate)
  210. def StartLearning(self) -> Future[bool]:
  211. self.__logger.info(
  212. f"StartLearning: called at {self.__GetTime()}ms")
  213. def logStart() -> bool:
  214. result = self.__logic.StartLearning()
  215. if not result:
  216. self.__logger.warning(
  217. f"StartLearning: failed at {self.__GetTime()}ms")
  218. return result
  219. return self.__pool.submit(logStart)
  220. def EndLearning(self) -> Future[bool]:
  221. self.__logger.info(
  222. f"EndLearning: called at {self.__GetTime()}ms")
  223. def logEnd() -> bool:
  224. result = self.__logic.EndLearning()
  225. if not result:
  226. self.__logger.warning(
  227. f"EndLearning: failed at {self.__GetTime()}ms")
  228. return result
  229. return self.__pool.submit(logEnd)
  230. def StartHelpMate(self) -> Future[bool]:
  231. self.__logger.info(
  232. f"StartHelpMate: called at {self.__GetTime()}ms")
  233. def logStart() -> bool:
  234. result = self.__logic.StartHelpMate()
  235. if not result:
  236. self.__logger.warning(
  237. f"StartHelpMate: failed at {self.__GetTime()}ms")
  238. return result
  239. return self.__pool.submit(logStart)
  240. def EndHelpMate(self) -> Future[bool]:
  241. self.__logger.info(
  242. f"EndHelpMate: called at {self.__GetTime()}ms")
  243. def logEnd() -> bool:
  244. result = self.__logic.EndHelpMate()
  245. if not result:
  246. self.__logger.warning(
  247. f"EndHelpMate: failed at {self.__GetTime()}ms")
  248. return result
  249. return self.__pool.submit(logEnd)
  250. # Timer用
  251. def __GetTime(self) -> int:
  252. return int((datetime.datetime.now() - self.__startPoint).total_seconds() * 1000)
  253. def StartTimer(self) -> None:
  254. self.__startPoint = datetime.datetime.now()
  255. self.__logger.info("=== AI.play() ===")
  256. self.__logger.info(f"StartTimer: {self.__startPoint.time()}")
  257. def EndTimer(self) -> None:
  258. self.__logger.info(f"Time elapsed: {self.__GetTime()}ms")
  259. def Play(self, ai: IAI) -> None:
  260. ai.play(self)
  261. class TrickerDebugAPI(ITrickerAPI, IGameTimer):
  262. def __init__(self, logic: ILogic, file: bool, screen: bool, warnOnly: bool, playerID: int) -> None:
  263. self.__logic = logic
  264. self.__pool = ThreadPoolExecutor(20)
  265. self.__logger = logging.getLogger("api " + str(playerID))
  266. self.__logger.setLevel(logging.DEBUG)
  267. formatter = logging.Formatter(
  268. "[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s", "%H:%M:%S.%e")
  269. # 确保文件存在
  270. if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
  271. os.makedirs(os.path.dirname(os.path.dirname(
  272. os.path.realpath(__file__))) + "/logs")
  273. fileHandler = logging.FileHandler(os.path.dirname(
  274. os.path.dirname(os.path.realpath(__file__))) + "/logs/api-" + str(playerID) + "-log.txt")
  275. screenHandler = logging.StreamHandler()
  276. if file:
  277. fileHandler.setLevel(logging.DEBUG)
  278. fileHandler.setFormatter(formatter)
  279. self.__logger.addHandler(fileHandler)
  280. if screen:
  281. if warnOnly:
  282. screenHandler.setLevel(logging.WARNING)
  283. else:
  284. screenHandler.setLevel(logging.INFO)
  285. screenHandler.setFormatter(formatter)
  286. self.__logger.addHandler(screenHandler)
  287. # 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
  288. def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]:
  289. self.__logger.info(
  290. f"Move: timeInMilliseconds = {timeInMilliseconds}, angle = {angle}, called at {self.__GetTime()}ms")
  291. def logMove() -> bool:
  292. result = self.__logic.Move(timeInMilliseconds, angle)
  293. if not result:
  294. self.__logger.warning(
  295. f"Move: failed at {self.__GetTime()}ms")
  296. return result
  297. return self.__pool.submit(logMove)
  298. # 向特定方向移动
  299. def MoveRight(self, timeInMilliseconds: int) -> Future[bool]:
  300. return self.Move(timeInMilliseconds, pi * 0.5)
  301. def MoveLeft(self, timeInMilliseconds: int) -> Future[bool]:
  302. return self.Move(timeInMilliseconds, pi * 1.5)
  303. def MoveUp(self, timeInMilliseconds: int) -> Future[bool]:
  304. return self.Move(timeInMilliseconds, 0)
  305. def MoveDown(self, timeInMilliseconds: int) -> Future[bool]:
  306. return self.Move(timeInMilliseconds, pi)
  307. # 道具和技能相关
  308. def PickProp(self, propType: THUAI6.PropType) -> Future[bool]:
  309. self.__logger.info(
  310. f"PickProp: prop = {propType.name}, called at {self.__GetTime()}ms")
  311. def logPick() -> bool:
  312. result = self.__logic.PickProp(propType)
  313. if not result:
  314. self.__logger.warning(
  315. f"PickProp: failed at {self.__GetTime()}ms")
  316. return result
  317. return self.__pool.submit(logPick)
  318. def UseProp(self) -> Future[bool]:
  319. self.__logger.info(
  320. f"UseProp: called at {self.__GetTime()}ms")
  321. def logUse() -> bool:
  322. result = self.__logic.UseProp()
  323. if not result:
  324. self.__logger.warning(
  325. f"UseProp: failed at {self.__GetTime()}ms")
  326. return result
  327. return self.__pool.submit(logUse)
  328. def UseSkill(self) -> Future[bool]:
  329. self.__logger.info(
  330. f"UseSkill: called at {self.__GetTime()}ms")
  331. def logUse() -> bool:
  332. result = self.__logic.UseSkill()
  333. if not result:
  334. self.__logger.warning(
  335. f"UseSkill: failed at {self.__GetTime()}ms")
  336. return result
  337. return self.__pool.submit(logUse)
  338. # 消息相关,接收消息时无消息则返回(-1, '')
  339. def SendMessage(self, toID: int, message: str) -> Future[bool]:
  340. self.__logger.info(
  341. f"SendMessage: toID = {toID}, message = {message}, called at {self.__GetTime()}ms")
  342. def logSend() -> bool:
  343. result = self.__logic.SendMessage(toID, message)
  344. if not result:
  345. self.__logger.warning(
  346. f"SendMessage: failed at {self.__GetTime()}ms")
  347. return result
  348. return self.__pool.submit(logSend)
  349. def HaveMessage(self) -> Future[bool]:
  350. self.__logger.info(
  351. f"HaveMessage: called at {self.__GetTime()}ms")
  352. def logHave() -> bool:
  353. result = self.__logic.HaveMessage()
  354. if not result:
  355. self.__logger.warning(
  356. f"HaveMessage: failed at {self.__GetTime()}ms")
  357. return result
  358. return self.__pool.submit(logHave)
  359. def GetMessage(self) -> Future[tuple[int, str]]:
  360. self.__logger.info(
  361. f"GetMessage: called at {self.__GetTime()}ms")
  362. def logGet() -> tuple[int, str]:
  363. result = self.__logic.GetMessage()
  364. if result[0] == -1:
  365. self.__logger.warning(
  366. f"GetMessage: failed at {self.__GetTime()}ms")
  367. return result
  368. return self.__pool.submit(logGet)
  369. # 等待下一帧
  370. def Wait(self) -> Future[bool]:
  371. self.__logger.info(
  372. f"Wait: called at {self.__GetTime()}ms")
  373. if self.__logic.GetCounter() == -1:
  374. return self.__pool.submit(lambda: False)
  375. else:
  376. return self.__pool.submit(self.__logic.WaitThread)
  377. # 获取各类游戏中的消息
  378. def GetFrameCount(self) -> int:
  379. return self.__logic.GetCounter()
  380. def GetPlayerGUIDs(self) -> List[int]:
  381. return self.__logic.GetPlayerGUIDs()
  382. def GetTrickers(self) -> List[THUAI6.Tricker]:
  383. return self.__logic.GetTrickers()
  384. def GetStudents(self) -> List[THUAI6.Student]:
  385. return self.__logic.GetStudents()
  386. def GetProps(self) -> List[THUAI6.Prop]:
  387. return self.__logic.GetProps()
  388. def GetSelfInfo(self) -> Union[THUAI6.Student, THUAI6.Tricker]:
  389. return self.__logic.GetSelfInfo()
  390. def GetFullMap(self) -> List[List[THUAI6.PlaceType]]:
  391. return self.__logic.GetFullMap()
  392. def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType:
  393. return self.__logic.GetPlaceType(cellX, cellY)
  394. # 用于DEBUG的输出函数,仅在DEBUG模式下有效
  395. def PrintStudent(self) -> None:
  396. for student in self.__logic.GetStudents():
  397. self.__logger.info("******Student Info******")
  398. self.__logger.info(
  399. f"playerID={student.playerID}, GUID={student.guid}, x={student.x}, y={student.y}")
  400. self.__logger.info(
  401. f"speed={student.speed}, view range={student.viewRange}, skill time={student.timeUntilSkillAvailable}, prop={student.prop.name}, place={student.place.name}")
  402. self.__logger.info(
  403. f"state={student.state.name}, determination={student.determination}, fail num={student.failNum}, fail time={student.failTime}, emo time={student.emoTime}")
  404. self.__logger.info("buff=")
  405. studentBuff = ""
  406. for buff in student.buff:
  407. studentBuff += buff.name + ", "
  408. self.__logger.info(studentBuff)
  409. self.__logger.info("**********************")
  410. def PrintTricker(self) -> None:
  411. for tricker in self.__logic.GetTrickers():
  412. self.__logger.info("******Tricker Info******")
  413. self.__logger.info(
  414. f"playerID={tricker.playerID}, GUID={tricker.guid}, x={tricker.x}, y={tricker.y}")
  415. self.__logger.info(
  416. f"speed={tricker.speed}, view range={tricker.viewRange}, skill time={tricker.timeUntilSkillAvailable}, prop={tricker.prop.name}, place={tricker.place.name}")
  417. self.__logger.info(
  418. f"damage={tricker.damage}, movable={tricker.movable}")
  419. self.__logger.info("buff=")
  420. trickerBuff = ""
  421. for buff in tricker.buff:
  422. trickerBuff += buff.name + ", "
  423. self.__logger.info(trickerBuff)
  424. self.__logger.info("************************")
  425. def PrintProp(self) -> None:
  426. for prop in self.__logic.GetProps():
  427. self.__logger.info("******Prop Info******")
  428. self.__logger.info(
  429. f"GUID={prop.guid}, x={prop.x}, y={prop.y}, place={prop.place.name}, is moving={prop.isMoving}")
  430. self.__logger.info("*********************")
  431. def PrintSelfInfo(self) -> None:
  432. mySelf = self.__logic.GetSelfInfo()
  433. self.__logger.info("******Self Info******")
  434. self.__logger.info(
  435. f"playerID={mySelf.playerID}, GUID={mySelf.guid}, x={mySelf.x}, y={mySelf.y}")
  436. self.__logger.info(
  437. f"speed={mySelf.speed}, view range={mySelf.viewRange}, skill time={mySelf.timeUntilSkillAvailable}, prop={mySelf.prop.name}, place={mySelf.place.name}")
  438. if isinstance(mySelf, THUAI6.Student):
  439. self.__logger.info(
  440. f"state={mySelf.state.name}, determination={mySelf.determination}, fail time={mySelf.failTime}")
  441. else:
  442. self.__logger.info(
  443. f"damage={mySelf.damage}, movable={mySelf.movable}")
  444. self.__logger.info("buff=")
  445. mySelfBuff = ""
  446. for buff in mySelf.buff:
  447. mySelfBuff += buff.name + ", "
  448. self.__logger.info(mySelfBuff)
  449. self.__logger.info("*********************")
  450. # 屠夫阵营的特殊函数
  451. def Trick(self, angle: float) -> Future[bool]:
  452. self.__logger.info(
  453. f"Trick: angle = {angle}, called at {self.__GetTime()}ms")
  454. def logTrick() -> bool:
  455. result = self.__logic.Trick(angle)
  456. if not result:
  457. self.__logger.warning(
  458. f"Trick: failed at {self.__GetTime()}ms")
  459. return result
  460. return self.__pool.submit(logTrick)
  461. def StartExam(self) -> Future[bool]:
  462. self.__logger.info(
  463. f"StartExam: called at {self.__GetTime()}ms")
  464. def logCarry() -> bool:
  465. result = self.__logic.StartExam()
  466. if not result:
  467. self.__logger.warning(
  468. f"StartExam: failed at {self.__GetTime()}ms")
  469. return result
  470. return self.__pool.submit(logCarry)
  471. def EndExam(self) -> Future[bool]:
  472. self.__logger.info(
  473. f"EndExam: called at {self.__GetTime()}ms")
  474. def logRelease() -> bool:
  475. result = self.__logic.EndExam()
  476. if not result:
  477. self.__logger.warning(
  478. f"EndExam: failed at {self.__GetTime()}ms")
  479. return result
  480. return self.__pool.submit(logRelease)
  481. def MakeFail(self) -> Future[bool]:
  482. self.__logger.info(
  483. f"MakeFail: called at {self.__GetTime()}ms")
  484. def logHang() -> bool:
  485. result = self.__logic.MakeFail()
  486. if not result:
  487. self.__logger.warning(
  488. f"MakeFail: failed at {self.__GetTime()}ms")
  489. return result
  490. return self.__pool.submit(logHang)
  491. # Timer用
  492. def __GetTime(self) -> int:
  493. return int((datetime.datetime.now() - self.__startPoint).total_seconds() * 1000)
  494. def StartTimer(self) -> None:
  495. self.__startPoint = datetime.datetime.now()
  496. self.__logger.info("=== AI.play() ===")
  497. self.__logger.info(f"StartTimer: {self.__startPoint.time()}")
  498. def EndTimer(self) -> None:
  499. self.__logger.info(f"Time elapsed: {self.__GetTime()}ms")
  500. def Play(self, ai: IAI) -> None:
  501. ai.play(self)