|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864 |
- from math import pi
- from concurrent.futures import ThreadPoolExecutor, Future
- from typing import List, cast, Tuple, Union
- import logging
- import os
- import datetime
-
- import PyAPI.structures as THUAI6
- from PyAPI.Interface import ILogic, IStudentAPI, ITrickerAPI, IGameTimer, IAI
-
-
- class StudentDebugAPI(IStudentAPI, IGameTimer):
-
- def __init__(self, logic: ILogic, file: bool, screen: bool, warnOnly: bool, playerID: int) -> None:
- self.__logic = logic
- self.__pool = ThreadPoolExecutor(20)
- self.__startPoint = datetime.datetime.now()
- self.__logger = logging.getLogger("api " + str(playerID))
- self.__logger.setLevel(logging.DEBUG)
- formatter = logging.Formatter(
- "[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s", '%H:%M:%S')
- # 确保文件存在
- if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
- os.makedirs(os.path.dirname(os.path.dirname(
- os.path.realpath(__file__))) + "/logs")
-
- fileHandler = logging.FileHandler(os.path.dirname(
- os.path.dirname(os.path.realpath(__file__))) + "/logs/api-" + str(playerID) + "-log.txt", mode="w+", encoding="utf-8")
- screenHandler = logging.StreamHandler()
- if file:
- fileHandler.setLevel(logging.DEBUG)
- fileHandler.setFormatter(formatter)
- self.__logger.addHandler(fileHandler)
- if screen:
- if warnOnly:
- screenHandler.setLevel(logging.WARNING)
- else:
- screenHandler.setLevel(logging.INFO)
- screenHandler.setFormatter(formatter)
- self.__logger.addHandler(screenHandler)
-
- # 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
-
- def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]:
- self.__logger.info(
- f"Move: timeInMilliseconds = {timeInMilliseconds}, angle = {angle}, called at {self.__GetTime()}ms")
-
- def logMove() -> bool:
- result = self.__logic.Move(timeInMilliseconds, angle)
- if not result:
- self.__logger.warning(
- f"Move: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logMove)
-
- # 向特定方向移动
-
- def MoveRight(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi * 0.5)
-
- def MoveLeft(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi * 1.5)
-
- def MoveUp(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi)
-
- def MoveDown(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, 0)
-
- def Attack(self, angle: float) -> Future[bool]:
- self.__logger.info(
- f"Attack: angle = {angle}, called at {self.__GetTime()}ms")
-
- def logAttack() -> bool:
- result = self.__logic.Attack(angle)
- if not result:
- self.__logger.warning(
- f"Attack: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logAttack)
-
- # 道具和技能相关
-
- def PickProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"PickProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logPick() -> bool:
- result = self.__logic.PickProp(propType)
- if not result:
- self.__logger.warning(
- f"PickProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logPick)
-
- def UseProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"UseProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logUse() -> bool:
- result = self.__logic.UseProp(propType)
- if not result:
- self.__logger.warning(
- f"UseProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logUse)
-
- def ThrowProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"ThrowProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logThrow() -> bool:
- result = self.__logic.ThrowProp(propType)
- if not result:
- self.__logger.warning(
- f"ThrowProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logThrow)
-
- def UseSkill(self, skillID: int) -> Future[bool]:
- self.__logger.info(
- f"UseSkill: skillID = {skillID}, called at {self.__GetTime()}ms")
-
- def logUse() -> bool:
- result = self.__logic.UseSkill(skillID)
- if not result:
- self.__logger.warning(
- f"UseSkill: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logUse)
-
- # 与地图交互相关
- def OpenDoor(self) -> Future[bool]:
- self.__logger.info(
- f"OpenDoor: called at {self.__GetTime()}ms")
-
- def logOpen() -> bool:
- result = self.__logic.OpenDoor()
- if not result:
- self.__logger.warning(
- f"OpenDoor: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logOpen)
-
- def CloseDoor(self) -> Future[bool]:
- self.__logger.info(
- f"CloseDoor: called at {self.__GetTime()}ms")
-
- def logClose() -> bool:
- result = self.__logic.CloseDoor()
- if not result:
- self.__logger.warning(
- f"CloseDoor: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logClose)
-
- def SkipWindow(self) -> Future[bool]:
- self.__logger.info(
- f"SkipWindow: called at {self.__GetTime()}ms")
-
- def logSkip() -> bool:
- result = self.__logic.SkipWindow()
- if not result:
- self.__logger.warning(
- f"SkipWindow: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logSkip)
-
- def StartOpenGate(self) -> Future[bool]:
- self.__logger.info(
- f"StartOpenGate: called at {self.__GetTime()}ms")
-
- def logStart() -> bool:
- result = self.__logic.StartOpenGate()
- if not result:
- self.__logger.warning(
- f"StartOpenGate: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStart)
-
- def StartOpenChest(self) -> Future[bool]:
- self.__logger.info(
- f"StartOpenChest: called at {self.__GetTime()}ms")
-
- def logStart() -> bool:
- result = self.__logic.StartOpenChest()
- if not result:
- self.__logger.warning(
- f"StartOpenChest: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStart)
-
- def EndAllAction(self) -> Future[bool]:
- self.__logger.info(
- f"EndAllAction: called at {self.__GetTime()}ms")
-
- def logEnd() -> bool:
- result = self.__logic.EndAllAction()
- if not result:
- self.__logger.warning(
- f"EndAllAction: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logEnd)
-
- # 消息相关,接收消息时无消息则返回(-1, '')
-
- def SendMessage(self, toID: int, message: Union[str, bytes]) -> Future[bool]:
- self.__logger.info(
- f"SendMessage: toID = {toID}, message = {message}, called at {self.__GetTime()}ms")
-
- def logSend() -> bool:
- result = self.__logic.SendMessage(toID, message)
- if not result:
- self.__logger.warning(
- f"SendMessage: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logSend)
-
- def HaveMessage(self) -> bool:
- self.__logger.info(
- f"HaveMessage: called at {self.__GetTime()}ms")
- result = self.__logic.HaveMessage()
- if not result:
- self.__logger.warning(
- f"HaveMessage: failed at {self.__GetTime()}ms")
- return result
-
- def GetMessage(self) -> Tuple[int, Union[str, bytes]]:
- self.__logger.info(
- f"GetMessage: called at {self.__GetTime()}ms")
- result = self.__logic.GetMessage()
- if result[0] == -1:
- self.__logger.warning(
- f"GetMessage: failed at {self.__GetTime()}ms")
- return result
-
- # 等待下一帧
-
- def Wait(self) -> bool:
- self.__logger.info(
- f"Wait: called at {self.__GetTime()}ms")
- if self.__logic.GetCounter() == -1:
- return False
- else:
- return self.__logic.WaitThread()
-
- # 获取各类游戏中的消息
-
- def GetFrameCount(self) -> int:
- return self.__logic.GetCounter()
-
- def GetPlayerGUIDs(self) -> List[int]:
- return self.__logic.GetPlayerGUIDs()
-
- def GetTrickers(self) -> List[THUAI6.Tricker]:
- return self.__logic.GetTrickers()
-
- def GetStudents(self) -> List[THUAI6.Student]:
- return self.__logic.GetStudents()
-
- def GetProps(self) -> List[THUAI6.Prop]:
- return self.__logic.GetProps()
-
- def GetBullets(self) -> List[THUAI6.Bullet]:
- return self.__logic.GetBullets()
-
- def GetFullMap(self) -> List[List[THUAI6.PlaceType]]:
- return self.__logic.GetFullMap()
-
- def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType:
- return self.__logic.GetPlaceType(cellX, cellY)
-
- def IsDoorOpen(self, cellX: int, cellY: int) -> bool:
- return self.__logic.IsDoorOpen(cellX, cellY)
-
- def GetChestProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetChestProgress(cellX, cellY)
-
- def GetGateProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetGateProgress(cellX, cellY)
-
- def GetClassroomProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetClassroomProgress(cellX, cellY)
-
- def GetDoorProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetDoorProgress(cellX, cellY)
-
- def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState:
- return self.__logic.GetHiddenGateState(cellX, cellY)
-
- def GetGameInfo(self) -> THUAI6.GameInfo:
- return self.__logic.GetGameInfo()
-
- def HaveView(self, gridX: int, gridY: int) -> bool:
- return self.__logic.HaveView(gridX, gridY, self.GetSelfInfo().x, self.GetSelfInfo().y, self.GetSelfInfo().viewRange)
-
- # 用于DEBUG的输出函数,仅在DEBUG模式下有效
-
- def Print(self, cont: str) -> None:
- self.__logger.info(cont)
-
- def PrintStudent(self) -> None:
- for student in self.__logic.GetStudents():
- self.__logger.info("******Student Info******")
- self.__logger.info(
- f"playerID={student.playerID}, GUID={student.guid}, x={student.x}, y={student.y}")
- self.__logger.info(
- f"speed={student.speed}, view range={student.viewRange}, radius={student.radius}")
- self.__logger.info(
- f"score={student.score}, facing direction={student.facingDirection}, skill time={student.timeUntilSkillAvailable}")
- studentProp = ""
- for prop in student.prop:
- studentProp += prop.name + ", "
- self.__logger.info(
- f"state={student.playerState.name}, bullet={student.bulletType.name}, prop={studentProp}")
- self.__logger.info(
- f"type={student.studentType.name}, determination={student.determination}, addiction={student.addiction}, danger alert={student.dangerAlert}")
- self.__logger.info(
- f"learning speed={student.learningSpeed}, encourage speed={student.encourageSpeed}, encourage progress={student.encourageProgress}, rouse progress={student.rouseProgress}")
- studentBuff = ""
- for buff in student.buff:
- studentBuff += buff.name + ", "
- self.__logger.info(f"buff={studentBuff}")
- self.__logger.info("************************\n")
-
- def PrintTricker(self) -> None:
- for tricker in self.__logic.GetTrickers():
- self.__logger.info("******Tricker Info******")
- self.__logger.info(
- f"playerID={tricker.playerID}, GUID={tricker.guid}, x={tricker.x}, y={tricker.y}")
- self.__logger.info(
- f"speed={tricker.speed}, view range={tricker.viewRange}, radius={tricker.radius}")
- self.__logger.info(
- f"score={tricker.score}, facing direction={tricker.facingDirection}, skill time={tricker.timeUntilSkillAvailable}")
- trickerProp = ""
- for prop in tricker.prop:
- trickerProp += prop.name + ", "
- self.__logger.info(
- f"state={tricker.playerState.name}, bullet={tricker.bulletType.name}, prop={trickerProp}")
- self.__logger.info(
- f"type={tricker.trickerType.name}, trick desire={tricker.trickDesire}, class volume={tricker.classVolume}")
- trickerBuff = ""
- for buff in tricker.buff:
- trickerBuff += buff.name + ", "
- self.__logger.info(f"buff={trickerBuff}")
- self.__logger.info("************************\n")
-
- def PrintProp(self) -> None:
- for prop in self.__logic.GetProps():
- self.__logger.info("******Prop Info******")
- self.__logger.info(
- f"GUID={prop.guid}, x={prop.x}, y={prop.y}, facing direction={prop.facingDirection}")
- self.__logger.info("*********************")
-
- def PrintSelfInfo(self) -> None:
- student = cast(THUAI6.Student, self.__logic.GetSelfInfo())
- self.__logger.info("******Student Info******")
- self.__logger.info(
- f"playerID={student.playerID}, GUID={student.guid}, x={student.x}, y={student.y}")
- self.__logger.info(
- f"speed={student.speed}, view range={student.viewRange}, radius={student.radius}")
- self.__logger.info(
- f"score={student.score}, facing direction={student.facingDirection}, skill time={student.timeUntilSkillAvailable}")
- studentProp = ""
- for prop in student.prop:
- studentProp += prop.name + ", "
- self.__logger.info(
- f"state={student.playerState.name}, bullet={student.bulletType.name}, prop={studentProp}")
- self.__logger.info(
- f"type={student.studentType.name}, determination={student.determination}, addiction={student.addiction}, danger alert={student.dangerAlert}")
- self.__logger.info(
- f"learning speed={student.learningSpeed}, encourage speed={student.encourageSpeed}, encourage progress={student.encourageProgress}, rouse progress={student.rouseProgress}")
- studentBuff = ""
- for buff in student.buff:
- studentBuff += buff.name + ", "
- self.__logger.info(f"buff={studentBuff}")
- self.__logger.info("************************\n")
-
- # 人类阵营的特殊函数
-
- def Graduate(self) -> Future[bool]:
- self.__logger.info(
- f"Graduate: called at {self.__GetTime()}ms")
-
- def logGraduate() -> bool:
- result = self.__logic.Graduate()
- if not result:
- self.__logger.warning(
- f"Graduate: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logGraduate)
-
- def StartLearning(self) -> Future[bool]:
- self.__logger.info(
- f"StartLearning: called at {self.__GetTime()}ms")
-
- def logStart() -> bool:
- result = self.__logic.StartLearning()
- if not result:
- self.__logger.warning(
- f"StartLearning: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStart)
-
- def StartEncourageMate(self, mateID: int) -> Future[bool]:
- self.__logger.info(
- f"StartEncourageMate: called at {self.__GetTime()}ms")
-
- def logStartEncourageMate() -> bool:
- result = self.__logic.StartEncourageMate(mateID)
- if not result:
- self.__logger.warning(
- f"StartEncourageMate: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStartEncourageMate)
-
- def StartRouseMate(self, mateID: int) -> Future[bool]:
- self.__logger.info(
- f"StartRouseMate: called at {self.__GetTime()}ms")
-
- def logStartRouseMate() -> bool:
- result = self.__logic.StartRouseMate(mateID)
- if not result:
- self.__logger.warning(
- f"StartRouseMate: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStartRouseMate)
-
- def GetSelfInfo(self) -> THUAI6.Student:
- return cast(THUAI6.Student, self.__logic.GetSelfInfo())
-
- # Timer用
-
- def __GetTime(self) -> float:
- return (datetime.datetime.now() - self.__startPoint) / datetime.timedelta(milliseconds=1)
-
- def StartTimer(self) -> None:
- self.__startPoint = datetime.datetime.now()
- self.__logger.info("=== AI.play() ===")
- self.__logger.info(f"StartTimer: {self.__startPoint.time()}")
-
- def EndTimer(self) -> None:
- self.__logger.info(f"Time elapsed: {self.__GetTime()}ms")
-
- def Play(self, ai: IAI) -> None:
- ai.StudentPlay(self)
-
-
- class TrickerDebugAPI(ITrickerAPI, IGameTimer):
-
- def __init__(self, logic: ILogic, file: bool, screen: bool, warnOnly: bool, playerID: int) -> None:
- self.__logic = logic
- self.__pool = ThreadPoolExecutor(20)
- self.__logger = logging.getLogger("api " + str(playerID))
- self.__logger.setLevel(logging.DEBUG)
- formatter = logging.Formatter(
- "[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s", '%H:%M:%S')
- # 确保文件存在
- if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
- os.makedirs(os.path.dirname(os.path.dirname(
- os.path.realpath(__file__))) + "/logs")
-
- fileHandler = logging.FileHandler(os.path.dirname(
- os.path.dirname(os.path.realpath(__file__))) + "/logs/api-" + str(playerID) + "-log.txt", mode="w+", encoding="utf-8")
- screenHandler = logging.StreamHandler()
- if file:
- fileHandler.setLevel(logging.DEBUG)
- fileHandler.setFormatter(formatter)
- self.__logger.addHandler(fileHandler)
- if screen:
- if warnOnly:
- screenHandler.setLevel(logging.WARNING)
- else:
- screenHandler.setLevel(logging.INFO)
- screenHandler.setFormatter(formatter)
- self.__logger.addHandler(screenHandler)
-
- # 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
-
- def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]:
- self.__logger.info(
- f"Move: timeInMilliseconds = {timeInMilliseconds}, angle = {angle}, called at {self.__GetTime()}ms")
-
- def logMove() -> bool:
- result = self.__logic.Move(timeInMilliseconds, angle)
- if not result:
- self.__logger.warning(
- f"Move: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logMove)
-
- # 向特定方向移动
-
- def MoveRight(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi * 0.5)
-
- def MoveLeft(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi * 1.5)
-
- def MoveUp(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, pi)
-
- def MoveDown(self, timeInMilliseconds: int) -> Future[bool]:
- return self.Move(timeInMilliseconds, 0)
-
- # 道具和技能相关
-
- def Attack(self, angle: float) -> Future[bool]:
- self.__logger.info(
- f"Attack: angle = {angle}, called at {self.__GetTime()}ms")
-
- def logAttack() -> bool:
- result = self.__logic.Attack(angle)
- if not result:
- self.__logger.warning(
- f"Attack: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logAttack)
-
- # 道具和技能相关
-
- def PickProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"PickProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logPick() -> bool:
- result = self.__logic.PickProp(propType)
- if not result:
- self.__logger.warning(
- f"PickProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logPick)
-
- def UseProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"UseProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logUse() -> bool:
- result = self.__logic.UseProp(propType)
- if not result:
- self.__logger.warning(
- f"UseProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logUse)
-
- def ThrowProp(self, propType: THUAI6.PropType) -> Future[bool]:
- self.__logger.info(
- f"ThrowProp: prop = {propType.name}, called at {self.__GetTime()}ms")
-
- def logThrow() -> bool:
- result = self.__logic.ThrowProp(propType)
- if not result:
- self.__logger.warning(
- f"ThrowProp: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logThrow)
-
- def UseSkill(self, skillID: int) -> Future[bool]:
- self.__logger.info(
- f"UseSkill: skillID = {skillID}, called at {self.__GetTime()}ms")
-
- def logUse() -> bool:
- result = self.__logic.UseSkill(skillID)
- if not result:
- self.__logger.warning(
- f"UseSkill: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logUse)
-
- # 与地图交互相关
- def OpenDoor(self) -> Future[bool]:
- self.__logger.info(
- f"OpenDoor: called at {self.__GetTime()}ms")
-
- def logOpen() -> bool:
- result = self.__logic.OpenDoor()
- if not result:
- self.__logger.warning(
- f"OpenDoor: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logOpen)
-
- def CloseDoor(self) -> Future[bool]:
- self.__logger.info(
- f"CloseDoor: called at {self.__GetTime()}ms")
-
- def logClose() -> bool:
- result = self.__logic.CloseDoor()
- if not result:
- self.__logger.warning(
- f"CloseDoor: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logClose)
-
- def SkipWindow(self) -> Future[bool]:
- self.__logger.info(
- f"SkipWindow: called at {self.__GetTime()}ms")
-
- def logSkip() -> bool:
- result = self.__logic.SkipWindow()
- if not result:
- self.__logger.warning(
- f"SkipWindow: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logSkip)
-
- def StartOpenGate(self) -> Future[bool]:
- self.__logger.info(
- f"StartOpenGate: called at {self.__GetTime()}ms")
-
- def logStart() -> bool:
- result = self.__logic.StartOpenGate()
- if not result:
- self.__logger.warning(
- f"StartOpenGate: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStart)
-
- def StartOpenChest(self) -> Future[bool]:
- self.__logger.info(
- f"StartOpenChest: called at {self.__GetTime()}ms")
-
- def logStart() -> bool:
- result = self.__logic.StartOpenChest()
- if not result:
- self.__logger.warning(
- f"StartOpenChest: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logStart)
-
- def EndAllAction(self) -> Future[bool]:
- self.__logger.info(
- f"EndAllAction: called at {self.__GetTime()}ms")
-
- def logEnd() -> bool:
- result = self.__logic.EndAllAction()
- if not result:
- self.__logger.warning(
- f"EndAllAction: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logEnd)
-
- # 消息相关,接收消息时无消息则返回(-1, '')
-
- def SendMessage(self, toID: int, message: Union[str, bytes]) -> Future[bool]:
- self.__logger.info(
- f"SendMessage: toID = {toID}, message = {message}, called at {self.__GetTime()}ms")
-
- def logSend() -> bool:
- result = self.__logic.SendMessage(toID, message)
- if not result:
- self.__logger.warning(
- f"SendMessage: failed at {self.__GetTime()}ms")
- return result
-
- return self.__pool.submit(logSend)
-
- def HaveMessage(self) -> bool:
- self.__logger.info(
- f"HaveMessage: called at {self.__GetTime()}ms")
- result = self.__logic.HaveMessage()
- if not result:
- self.__logger.warning(
- f"HaveMessage: failed at {self.__GetTime()}ms")
- return result
-
- def GetMessage(self) -> Tuple[int, Union[str, bytes]]:
- self.__logger.info(
- f"GetMessage: called at {self.__GetTime()}ms")
- result = self.__logic.GetMessage()
- if result[0] == -1:
- self.__logger.warning(
- f"GetMessage: failed at {self.__GetTime()}ms")
- return result
-
- # 等待下一帧
-
- def Wait(self) -> bool:
- self.__logger.info(
- f"Wait: called at {self.__GetTime()}ms")
- if self.__logic.GetCounter() == -1:
- return False
- else:
- return self.__logic.WaitThread()
-
- # 获取各类游戏中的消息
-
- def GetFrameCount(self) -> int:
- return self.__logic.GetCounter()
-
- def GetPlayerGUIDs(self) -> List[int]:
- return self.__logic.GetPlayerGUIDs()
-
- def GetTrickers(self) -> List[THUAI6.Tricker]:
- return self.__logic.GetTrickers()
-
- def GetStudents(self) -> List[THUAI6.Student]:
- return self.__logic.GetStudents()
-
- def GetProps(self) -> List[THUAI6.Prop]:
- return self.__logic.GetProps()
-
- def GetBullets(self) -> List[THUAI6.Bullet]:
- return self.__logic.GetBullets()
-
- def GetFullMap(self) -> List[List[THUAI6.PlaceType]]:
- return self.__logic.GetFullMap()
-
- def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType:
- return self.__logic.GetPlaceType(cellX, cellY)
-
- def IsDoorOpen(self, cellX: int, cellY: int) -> bool:
- return self.__logic.IsDoorOpen(cellX, cellY)
-
- def GetChestProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetChestProgress(cellX, cellY)
-
- def GetGateProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetGateProgress(cellX, cellY)
-
- def GetClassroomProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetClassroomProgress(cellX, cellY)
-
- def GetDoorProgress(self, cellX: int, cellY: int) -> int:
- return self.__logic.GetDoorProgress(cellX, cellY)
-
- def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState:
- return self.__logic.GetHiddenGateState(cellX, cellY)
-
- def GetGameInfo(self) -> THUAI6.GameInfo:
- return self.__logic.GetGameInfo()
-
- def HaveView(self, gridX: int, gridY: int) -> bool:
- return self.__logic.HaveView(gridX, gridY, self.GetSelfInfo().x, self.GetSelfInfo().y, self.GetSelfInfo().viewRange)
-
- # 用于DEBUG的输出函数,仅在DEBUG模式下有效
-
- def Print(self, cont: str) -> None:
- self.__logger.info(cont)
-
- def PrintStudent(self) -> None:
- for student in self.__logic.GetStudents():
- self.__logger.info("******Student Info******")
- self.__logger.info(
- f"playerID={student.playerID}, GUID={student.guid}, x={student.x}, y={student.y}")
- self.__logger.info(
- f"speed={student.speed}, view range={student.viewRange}, radius={student.radius}")
- self.__logger.info(
- f"score={student.score}, facing direction={student.facingDirection}, skill time={student.timeUntilSkillAvailable}")
- studentProp = ""
- for prop in student.prop:
- studentProp += prop.name + ", "
- self.__logger.info(
- f"state={student.playerState.name}, bullet={student.bulletType.name}, prop={studentProp}")
- self.__logger.info(
- f"type={student.studentType.name}, determination={student.determination}, addiction={student.addiction}, danger alert={student.dangerAlert}")
- self.__logger.info(
- f"learning speed={student.learningSpeed}, encourage speed={student.encourageSpeed}, encourage progress={student.encourageProgress}, rouse progress={student.rouseProgress}")
- studentBuff = ""
- for buff in student.buff:
- studentBuff += buff.name + ", "
- self.__logger.info(f"buff={studentBuff}")
- self.__logger.info("************************\n")
-
- def PrintTricker(self) -> None:
- for tricker in self.__logic.GetTrickers():
- self.__logger.info("******Tricker Info******")
- self.__logger.info(
- f"playerID={tricker.playerID}, GUID={tricker.guid}, x={tricker.x}, y={tricker.y}")
- self.__logger.info(
- f"speed={tricker.speed}, view range={tricker.viewRange}, radius={tricker.radius}")
- self.__logger.info(
- f"score={tricker.score}, facing direction={tricker.facingDirection}, skill time={tricker.timeUntilSkillAvailable}")
- trickerProp = ""
- for prop in tricker.prop:
- trickerProp += prop.name + ", "
- self.__logger.info(
- f"state={tricker.playerState.name}, bullet={tricker.bulletType.name}, prop={trickerProp}")
- self.__logger.info(
- f"type={tricker.trickerType.name}, trick desire={tricker.trickDesire}, class volume={tricker.classVolume}")
- trickerBuff = ""
- for buff in tricker.buff:
- trickerBuff += buff.name + ", "
- self.__logger.info(f"buff={trickerBuff}")
- self.__logger.info("************************\n")
-
- def PrintProp(self) -> None:
- for prop in self.__logic.GetProps():
- self.__logger.info("******Prop Info******")
- self.__logger.info(
- f"GUID={prop.guid}, x={prop.x}, y={prop.y}, facing direction={prop.facingDirection}")
- self.__logger.info("*********************")
-
- def PrintSelfInfo(self) -> None:
- tricker = cast(THUAI6.Tricker, self.__logic.GetSelfInfo())
- self.__logger.info("******Tricker Info******")
- self.__logger.info(
- f"playerID={tricker.playerID}, GUID={tricker.guid}, x={tricker.x}, y={tricker.y}")
- self.__logger.info(
- f"speed={tricker.speed}, view range={tricker.viewRange}, radius={tricker.radius}")
- self.__logger.info(
- f"score={tricker.score}, facing direction={tricker.facingDirection}, skill time={tricker.timeUntilSkillAvailable}")
- trickerProp = ""
- for prop in tricker.prop:
- trickerProp += prop.name + ", "
- self.__logger.info(
- f"state={tricker.playerState.name}, bullet={tricker.bulletType.name}, prop={trickerProp}")
- self.__logger.info(
- f"type={tricker.trickerType.name}, trick desire={tricker.trickDesire}, class volume={tricker.classVolume}")
- trickerBuff = ""
- for buff in tricker.buff:
- trickerBuff += buff.name + ", "
- self.__logger.info(f"buff={trickerBuff}")
- self.__logger.info("************************\n")
-
- # 屠夫阵营的特殊函数
-
- def GetSelfInfo(self) -> THUAI6.Tricker:
- return cast(THUAI6.Tricker, self.__logic.GetSelfInfo())
-
- # Timer用
-
- def __GetTime(self) -> float:
- return (datetime.datetime.now() - self.__startPoint) / datetime.timedelta(milliseconds=1)
-
- def StartTimer(self) -> None:
- self.__startPoint = datetime.datetime.now()
- self.__logger.info("=== AI.play() ===")
- self.__logger.info(f"StartTimer: {self.__startPoint.time()}")
-
- def EndTimer(self) -> None:
- self.__logger.info(f"Time elapsed: {self.__GetTime()}ms")
-
- def Play(self, ai: IAI) -> None:
- ai.TrickerPlay(self)
|