Browse Source

Merge pull request #439 from DragonAura/dev

fix(CAPI): 🐛 fix various of bugs
tags/0.1.0
Timothy Liu GitHub 2 years ago
parent
commit
eca1be3899
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 52 deletions
  1. +0
    -3
      CAPI/cpp/API/include/logic.h
  2. +8
    -21
      CAPI/cpp/API/src/logic.cpp
  3. +26
    -24
      CAPI/python/PyAPI/logic.py
  4. +2
    -2
      docs/CAPI接口(cpp).md
  5. +2
    -2
      docs/CAPI接口(python).md

+ 0
- 3
CAPI/cpp/API/include/logic.h View File

@@ -49,9 +49,6 @@ private:
THUAI6::TrickerType trickerType;
THUAI6::StudentType studentType;

// GUID信息
std::vector<int64_t> playerGUIDs;

std::unique_ptr<IGameTimer> timer;

std::thread tAI; // 用于运行AI的线程


+ 8
- 21
CAPI/cpp/API/src/logic.cpp View File

@@ -323,17 +323,6 @@ void Logic::ProcessMessage()
case THUAI6::GameState::GameStart:
logger->info("Game Start!");

// 重新读取玩家的guid,保证人类在前屠夫在后
playerGUIDs.clear();
for (const auto& obj : clientMsg.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
playerGUIDs.push_back(obj.student_message().guid());
for (const auto& obj : clientMsg.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
playerGUIDs.push_back(obj.tricker_message().guid());
currentState->guids = playerGUIDs;
bufferState->guids = playerGUIDs;

// 读取地图
for (const auto& item : clientMsg.obj_message())
if (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::MapMessage)
@@ -368,16 +357,6 @@ void Logic::ProcessMessage()

break;
case THUAI6::GameState::GameRunning:
// 重新读取玩家的guid,guid确保人类在前屠夫在后
playerGUIDs.clear();
for (const auto& obj : clientMsg.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
playerGUIDs.push_back(obj.student_message().guid());
for (const auto& obj : clientMsg.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
playerGUIDs.push_back(obj.tricker_message().guid());
currentState->guids = playerGUIDs;
bufferState->guids = playerGUIDs;

LoadBuffer(clientMsg);
break;
@@ -605,9 +584,16 @@ void Logic::LoadBuffer(const protobuf::MessageToClient& message)
bufferState->props.clear();
bufferState->bullets.clear();
bufferState->bombedBullets.clear();
bufferState->guids.clear();

logger->debug("Buffer cleared!");
// 读取新的信息
for (const auto& obj : message.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
bufferState->guids.push_back(obj.student_message().guid());
for (const auto& obj : message.obj_message())
if (Proto2THUAI6::messageOfObjDict[obj.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
bufferState->guids.push_back(obj.tricker_message().guid());
bufferState->gameInfo = Proto2THUAI6::Protobuf2THUAI6GameInfo(message.all_message());
LoadBufferSelf(message);
for (const auto& item : message.obj_message())
@@ -689,6 +675,7 @@ bool Logic::TryConnection()

bool Logic::HaveView(int gridX, int gridY, int selfX, int selfY, int viewRange) const
{
std::unique_lock<std::mutex> lock(mtxState);
return AssistFunction::HaveView(viewRange, selfX, selfY, gridX, gridY, currentState->gameMap);
}



+ 26
- 24
CAPI/python/PyAPI/logic.py View File

@@ -3,6 +3,7 @@ from typing import List, Union, Callable, Tuple
import threading
import logging
import copy
import platform
import proto.MessageType_pb2 as MessageType
import proto.Message2Server_pb2 as Message2Server
import proto.Message2Clients_pb2 as Message2Clients
@@ -22,7 +23,6 @@ class Logic(ILogic):

# ID
self.__playerID: int = playerID
self.__playerGUIDs: List[int] = []

self.__playerType: THUAI6.PlayerType = playerType

@@ -214,7 +214,7 @@ class Logic(ILogic):

def GetPlayerGUIDs(self) -> List[int]:
with self.__mtxState:
return copy.deepcopy(self.__playerGUIDs)
return copy.deepcopy(self.__currentState.guids)

# IStudentAPI使用的接口

@@ -263,7 +263,8 @@ class Logic(ILogic):
return self.__comm.EndAllAction(self.__playerID)

def HaveView(self, gridX: int, gridY: int, selfX: int, selfY: int, viewRange: int) -> bool:
return AssistFunction.HaveView(viewRange, selfX, selfY, gridX, gridY, self.__currentState.gameMap)
with self.__mtxState:
return AssistFunction.HaveView(viewRange, selfX, selfY, gridX, gridY, self.__currentState.gameMap)

# Logic内部逻辑
def __TryConnection(self) -> bool:
@@ -286,15 +287,6 @@ class Logic(ILogic):
if self.__gameState == THUAI6.GameState.GameStart:
# 读取玩家的GUID
self.__logger.info("Game start!")
self.__playerGUIDs.clear()
for obj in clientMsg.obj_message:
if obj.WhichOneof("message_of_obj") == "student_message":
self.__playerGUIDs.append(obj.student_message.guid)
for obj in clientMsg.obj_message:
if obj.WhichOneof("message_of_obj") == "tricker_message":
self.__playerGUIDs.append(obj.tricker_message.guid)
self.__currentState.guids = self.__playerGUIDs
self.__bufferState.guids = self.__playerGUIDs

for obj in clientMsg.obj_message:
if obj.WhichOneof("message_of_obj") == "map_message":
@@ -318,15 +310,6 @@ class Logic(ILogic):

elif self.__gameState == THUAI6.GameState.GameRunning:
# 读取玩家的GUID
self.__playerGUIDs.clear()
for obj in clientMsg.obj_message:
if obj.WhichOneof("message_of_obj") == "student_message":
self.__playerGUIDs.append(obj.student_message.guid)
for obj in clientMsg.obj_message:
if obj.WhichOneof("message_of_obj") == "tricker_message":
self.__playerGUIDs.append(obj.tricker_message.guid)
self.__currentState.guids = self.__playerGUIDs
self.__bufferState.guids = self.__playerGUIDs
self.__LoadBuffer(clientMsg)
else:
self.__logger.error("Unknown GameState!")
@@ -467,9 +450,21 @@ class Logic(ILogic):
self.__bufferState.students.clear()
self.__bufferState.trickers.clear()
self.__bufferState.props.clear()
self.__bufferState.bullets.clear()
self.__bufferState.bombedBullets.clear()
self.__bufferState.guids.clear()
self.__logger.debug("Buffer cleared!")

for obj in message.obj_message:
if obj.WhichOneof("message_of_obj") == "student_message":
self.__bufferState.guids.append(obj.student_message.guid)
for obj in message.obj_message:
if obj.WhichOneof("message_of_obj") == "tricker_message":
self.__bufferState.guids.append(obj.tricker_message.guid)

self.__bufferState.gameInfo = Proto2THUAI6.Protobuf2THUAI6GameInfo(
message.all_message)

self.__LoadBufferSelf(message)
for item in message.obj_message:
self.__LoadBufferCase(item)
@@ -511,9 +506,16 @@ class Logic(ILogic):
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")
# 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")

if platform.system().lower() == "windows":
os.system(
f"mkdir {os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + '/logs'}")
else:
os.system(
f"mkdir -p {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/logic" + str(self.__playerID) + "-log.txt", "w+", encoding="utf-8")


+ 2
- 2
docs/CAPI接口(cpp).md View File

@@ -59,13 +59,13 @@
下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。

- `THUAI6::PlaceType GetPlaceType(int32_t cellX, int32_t cellY)` :返回某一位置场地种类信息。场地种类详见 structure.h 。
- `bool IsDoorOpen(int32_t cellX, int32_t cellY) const`:查询特定位置门是否开启,没有门也返回false
- 以下指令,若查询物品当前在视野内,则返回最新进度;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。
- `int32_t GetChestProgress(int32_t cellX, int32_t cellY) const`:查询特定位置箱子开启进度
- `int32_t GetGateProgress(int32_t cellX, int32_t cellY) const`:查询特定位置校门开启进度
- `int32_t GetClassroomProgress(int32_t cellX, int32_t cellY) const`:查询特定位置教室作业完成进度
- `int32_t GetDoorProgress(int32_t cellX, int32_t cellY) const`:查询特定位置门开启状态
- `THUAI6::HiddenGateState GetHiddenGateState(int32_t cellX, int32_t cellY) const`::查询特定位置隐藏校门状态,没有隐藏校门返回THUAI6::HiddenGateState::Null
- `bool IsDoorOpen(int32_t cellX, int32_t cellY) const`:查询特定位置门是否开启,没有门/不在视野内也返回false
- `THUAI6::HiddenGateState GetHiddenGateState(int32_t cellX, int32_t cellY) const`::查询特定位置隐藏校门状态,没有隐藏校门/不在视野内返回THUAI6::HiddenGateState::Null

#### 其他
- `std::shared_ptr<const THUAI6::GameInfo> GetGameInfo() const`:查询当前游戏状态


+ 2
- 2
docs/CAPI接口(python).md View File

@@ -72,13 +72,13 @@
下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。

- `def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType` :返回某一位置场地种类信息。场地种类详见 structure.h 。
- `def IsDoorOpen(self, cellX: int, cellY: int) -> bool`:查询特定位置门是否开启,没有门也返回false
- 以下指令,若查询物品当前在视野内,则返回最新进度;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。
- `def GetChestProgress(self, cellX: int, cellY: int) -> int`:查询特定位置箱子开启进度
- `def GetGateProgress(self, cellX: int, cellY: int) -> int`:查询特定位置校门开启进度
- `def GetClassroomProgress(self, cellX: int, cellY: int) -> int`:查询特定位置教室作业完成进度
- `def GetDoorProgress(self, cellX: int, cellY: int) -> int`:查询特定位置门开启状态
- `def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState`::查询特定位置隐藏校门状态,没有隐藏校门返回THUAI6::HiddenGateState::Null
- `def IsDoorOpen(self, cellX: int, cellY: int) -> bool`:查询特定位置门是否开启,没有门/不在视野内也返回false
- `def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState`::查询特定位置隐藏校门状态,没有隐藏校门/不在视野内返回THUAI6::HiddenGateState::Null


#### 其他


Loading…
Cancel
Save