Browse Source

Merge pull request #366 from DragonAura/dev

refactor(CAPI): 💩 remake load buffer
tags/0.1.0
Timothy Liu GitHub 2 years ago
parent
commit
c39bccd4fb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 330 additions and 509 deletions
  1. +3
    -1
      CAPI/cpp/API/include/logic.h
  2. +202
    -320
      CAPI/cpp/API/src/logic.cpp
  3. +124
    -187
      CAPI/python/PyAPI/logic.py
  4. +1
    -1
      CAPI/python/run.sh

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

@@ -148,7 +148,9 @@ private:
void ProcessMessage(); void ProcessMessage();


// 将信息加载到buffer // 将信息加载到buffer
void LoadBuffer(protobuf::MessageToClient&);
void LoadBufferSelf(const protobuf::MessageToClient& message);
void LoadBufferCase(const protobuf::MessageOfObj& item);
void LoadBuffer(const protobuf::MessageToClient& message);


// 解锁AI线程 // 解锁AI线程
void UnBlockAI(); void UnBlockAI();


+ 202
- 320
CAPI/cpp/API/src/logic.cpp View File

@@ -398,351 +398,233 @@ void Logic::ProcessMessage()
std::thread(messageThread).detach(); std::thread(messageThread).detach();
} }


void Logic::LoadBuffer(protobuf::MessageToClient& message)
void Logic::LoadBufferSelf(const protobuf::MessageToClient& message)
{ {
// 将消息读入到buffer中
if (playerType == THUAI6::PlayerType::StudentPlayer)
{ {
std::lock_guard<std::mutex> lock(mtxBuffer);
for (const auto& item : message.obj_message())
if (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
{
if (item.student_message().player_id() == playerID)
{
bufferState->studentSelf = Proto2THUAI6::Protobuf2THUAI6Student(item.student_message());
bufferState->students.push_back(bufferState->studentSelf);
}
else
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
}
}
else
{
for (const auto& item : message.obj_message())
if (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
{
if (item.tricker_message().player_id() == playerID)
{
bufferState->trickerSelf = Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message());
bufferState->trickers.push_back(bufferState->trickerSelf);
}
else
bufferState->trickers.push_back(Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message()));
logger->debug("Add Tricker!");
}
}
}


// 清空原有信息
bufferState->students.clear();
bufferState->trickers.clear();
bufferState->props.clear();
bufferState->bullets.clear();
bufferState->bombedBullets.clear();
void Logic::LoadBufferCase(const protobuf::MessageOfObj& item)
{
int32_t x, y, viewRange;
if (playerType == THUAI6::PlayerType::StudentPlayer)
x = bufferState->studentSelf->x, y = bufferState->studentSelf->y, viewRange = bufferState->studentSelf->viewRange;
else
x = bufferState->trickerSelf->x, y = bufferState->trickerSelf->y, viewRange = bufferState->trickerSelf->viewRange;


logger->debug("Buffer cleared!");
// 读取新的信息
bufferState->gameInfo = Proto2THUAI6::Protobuf2THUAI6GameInfo(message.all_message());
if (playerType == THUAI6::PlayerType::StudentPlayer)
if (playerType == THUAI6::PlayerType::StudentPlayer && Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
{
for (int i = 0; i < item.tricker_message().buff_size(); i++)
if (Proto2THUAI6::trickerBuffTypeDict[item.tricker_message().buff(i)] == THUAI6::TrickerBuffType::Invisible)
return;
if (AssistFunction::HaveView(viewRange, x, y, item.tricker_message().x(), item.tricker_message().y(), bufferState->gameMap))
{
bufferState->trickers.push_back(Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message()));
logger->debug("Add Tricker!");
}
return;
}
else if (playerType == THUAI6::PlayerType::TrickerPlayer && Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
{
for (const auto& buff : bufferState->trickerSelf->buff)
if (buff == THUAI6::TrickerBuffType::Clairaudience)
{
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
return;
}
for (int i = 0; i < item.student_message().buff_size(); i++)
if (Proto2THUAI6::studentBuffTypeDict[item.student_message().buff(i)] == THUAI6::StudentBuffType::Invisible)
return;
if (AssistFunction::HaveView(viewRange, x, y, item.student_message().x(), item.student_message().y(), bufferState->gameMap))
{ {
for (const auto& item : message.obj_message())
if (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::StudentMessage)
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
}
return;
}

switch (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()])
{
case THUAI6::MessageOfObj::PropMessage:
if (AssistFunction::HaveView(viewRange, x, y, item.prop_message().x(), item.prop_message().y(), bufferState->gameMap))
{
bufferState->props.push_back(Proto2THUAI6::Protobuf2THUAI6Prop(item.prop_message()));
logger->debug("Add Prop!");
}
break;
case THUAI6::MessageOfObj::BulletMessage:
if (AssistFunction::HaveView(viewRange, x, y, item.prop_message().x(), item.prop_message().y(), bufferState->gameMap))
{
bufferState->bullets.push_back(Proto2THUAI6::Protobuf2THUAI6Bullet(item.bullet_message()));
logger->debug("Add Bullet!");
}
break;
case THUAI6::MessageOfObj::ClassroomMessage:
{
if (AssistFunction::HaveView(viewRange, x, y, item.classroom_message().x(), item.classroom_message().y(), bufferState->gameMap))
{ {
if (item.student_message().player_id() == playerID)
auto pos = std::make_pair(AssistFunction::GridToCell(item.classroom_message().x()), AssistFunction::GridToCell(item.classroom_message().y()));
if (bufferState->mapInfo->classRoomState.count(pos) == 0)
{ {
bufferState->studentSelf = Proto2THUAI6::Protobuf2THUAI6Student(item.student_message());
bufferState->students.push_back(bufferState->studentSelf);
bufferState->mapInfo->classRoomState.emplace(pos, item.classroom_message().progress());
logger->debug("Add Classroom!");
} }
else else
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
{
bufferState->mapInfo->classRoomState[pos] = item.classroom_message().progress();
logger->debug("Update Classroom!");
}
} }
for (const auto& item : message.obj_message())
switch (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()])
break;
}
case THUAI6::MessageOfObj::ChestMessage:
{
if (AssistFunction::HaveView(viewRange, x, y, item.chest_message().x(), item.chest_message().y(), bufferState->gameMap))
{ {
case THUAI6::MessageOfObj::PropMessage:
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->gameMap))
{
bufferState->props.push_back(Proto2THUAI6::Protobuf2THUAI6Prop(item.prop_message()));
logger->debug("Add Prop!");
}
break;
case THUAI6::MessageOfObj::BulletMessage:
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->gameMap))
{
bufferState->bullets.push_back(Proto2THUAI6::Protobuf2THUAI6Bullet(item.bullet_message()));
logger->debug("Add Bullet!");
}
break;
case THUAI6::MessageOfObj::ClassroomMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.classroom_message().x(), item.classroom_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.classroom_message().x()), AssistFunction::GridToCell(item.classroom_message().y()));
if (bufferState->mapInfo->classRoomState.count(pos) == 0)
{
bufferState->mapInfo->classRoomState.emplace(pos, item.classroom_message().progress());
logger->debug("Add Classroom!");
}
else
{
bufferState->mapInfo->classRoomState[pos] = item.classroom_message().progress();
logger->debug("Update Classroom!");
}
}
break;
}
case THUAI6::MessageOfObj::ChestMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.chest_message().x(), item.chest_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.chest_message().x()), AssistFunction::GridToCell(item.chest_message().y()));
if (bufferState->mapInfo->chestState.count(pos) == 0)
{
bufferState->mapInfo->chestState.emplace(pos, item.chest_message().progress());
logger->debug("Add Chest!");
}
else
{
bufferState->mapInfo->chestState[pos] = item.chest_message().progress();
logger->debug("Update Chest!");
}
}
break;
}
case THUAI6::MessageOfObj::DoorMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.door_message().x(), item.door_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.door_message().x()), AssistFunction::GridToCell(item.door_message().y()));
if (bufferState->mapInfo->doorState.count(pos) == 0)
{
bufferState->mapInfo->doorState.emplace(pos, item.door_message().is_open());
bufferState->mapInfo->doorProgress.emplace(pos, item.door_message().progress());
logger->debug("Add Door!");
}
else
{
bufferState->mapInfo->doorState[pos] = item.door_message().is_open();
bufferState->mapInfo->doorProgress[pos] = item.door_message().progress();
logger->debug("Update Door!");
}
}
break;
}
case THUAI6::MessageOfObj::HiddenGateMessage:
{
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.hidden_gate_message().x()), AssistFunction::GridToCell(item.hidden_gate_message().y()));
if (bufferState->mapInfo->hiddenGateState.count(pos) == 0)
{
bufferState->mapInfo->hiddenGateState.emplace(pos, Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened()));
logger->debug("Add HiddenGate!");
}
else
{
bufferState->mapInfo->hiddenGateState[pos] = Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened());
logger->debug("Update HiddenGate!");
}
}
break;
}
case THUAI6::MessageOfObj::GateMessage:
{
if (!AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.gate_message().x(), item.gate_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.gate_message().x()), AssistFunction::GridToCell(item.gate_message().y()));
if (bufferState->mapInfo->gateState.count(pos) == 0)
{
bufferState->mapInfo->gateState.emplace(pos, item.gate_message().progress());
logger->debug("Add Gate!");
}
else
{
bufferState->mapInfo->gateState[pos] = item.gate_message().progress();
logger->debug("Update Gate!");
}
}
break;
}
case THUAI6::MessageOfObj::TrickerMessage:
{
bool flag = false;
for (int i = 0; i < item.tricker_message().buff_size(); i++)
if (Proto2THUAI6::trickerBuffTypeDict[item.tricker_message().buff(i)] == THUAI6::TrickerBuffType::Invisible)
{
flag = true;
break;
}
if (flag)
break;
if (AssistFunction::HaveView(bufferState->studentSelf->viewRange, bufferState->studentSelf->x, bufferState->studentSelf->y, item.tricker_message().x(), item.tricker_message().y(), bufferState->gameMap))
{
bufferState->trickers.push_back(Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message()));
logger->debug("Add Tricker!");
}
break;
}
case THUAI6::MessageOfObj::NewsMessage:
{
auto news = item.news_message();
if (news.to_id() == playerID)
messageQueue.emplace(std::make_pair(news.from_id(), news.news()));
break;
}
case THUAI6::MessageOfObj::NullMessageOfObj:
default:
break;
auto pos = std::make_pair(AssistFunction::GridToCell(item.chest_message().x()), AssistFunction::GridToCell(item.chest_message().y()));
if (bufferState->mapInfo->chestState.count(pos) == 0)
{
bufferState->mapInfo->chestState.emplace(pos, item.chest_message().progress());
logger->debug("Add Chest!");
}
else
{
bufferState->mapInfo->chestState[pos] = item.chest_message().progress();
logger->debug("Update Chest!");
}
} }
}
else
{
for (const auto& item : message.obj_message())
break;
}
case THUAI6::MessageOfObj::DoorMessage:
{ {
if (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()] == THUAI6::MessageOfObj::TrickerMessage)
if (AssistFunction::HaveView(viewRange, x, y, item.door_message().x(), item.door_message().y(), bufferState->gameMap))
{ {
if (item.tricker_message().player_id() == playerID)
auto pos = std::make_pair(AssistFunction::GridToCell(item.door_message().x()), AssistFunction::GridToCell(item.door_message().y()));
if (bufferState->mapInfo->doorState.count(pos) == 0)
{ {
bufferState->trickerSelf = Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message());
bufferState->trickers.push_back(bufferState->trickerSelf);
bufferState->mapInfo->doorState.emplace(pos, item.door_message().is_open());
bufferState->mapInfo->doorProgress.emplace(pos, item.door_message().progress());
logger->debug("Add Door!");
} }
else else
bufferState->trickers.push_back(Proto2THUAI6::Protobuf2THUAI6Tricker(item.tricker_message()));
logger->debug("Add Tricker!");
{
bufferState->mapInfo->doorState[pos] = item.door_message().is_open();
bufferState->mapInfo->doorProgress[pos] = item.door_message().progress();
logger->debug("Update Door!");
}
} }
break;
} }
for (const auto& item : message.obj_message())
switch (Proto2THUAI6::messageOfObjDict[item.message_of_obj_case()])
case THUAI6::MessageOfObj::HiddenGateMessage:
{
if (AssistFunction::HaveView(viewRange, x, y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), bufferState->gameMap))
{ {
case THUAI6::MessageOfObj::PropMessage:
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), bufferState->gameMap))
{
bufferState->props.push_back(Proto2THUAI6::Protobuf2THUAI6Prop(item.prop_message()));
logger->debug("Add Prop!");
}
break;
case THUAI6::MessageOfObj::BulletMessage:
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.prop_message().x(), item.prop_message().y(), currentState->gameMap))
{
bufferState->bullets.push_back(Proto2THUAI6::Protobuf2THUAI6Bullet(item.bullet_message()));
logger->debug("Add Bullet!");
}
break;
case THUAI6::MessageOfObj::ClassroomMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.classroom_message().x(), item.classroom_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.classroom_message().x()), AssistFunction::GridToCell(item.classroom_message().y()));
if (bufferState->mapInfo->classRoomState.count(pos) == 0)
{
bufferState->mapInfo->classRoomState.emplace(pos, item.classroom_message().progress());
logger->debug("Add Classroom!");
}
else
{
bufferState->mapInfo->classRoomState[pos] = item.classroom_message().progress();
logger->debug("Update Classroom!");
}
}
break;
}
case THUAI6::MessageOfObj::ChestMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.chest_message().x(), item.chest_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.chest_message().x()), AssistFunction::GridToCell(item.chest_message().y()));
if (bufferState->mapInfo->chestState.count(pos) == 0)
{
bufferState->mapInfo->chestState.emplace(pos, item.chest_message().progress());
logger->debug("Add Chest!");
}
else
{
bufferState->mapInfo->chestState[pos] = item.chest_message().progress();
logger->debug("Update Chest!");
}
}
break;
}
case THUAI6::MessageOfObj::DoorMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.door_message().x(), item.door_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.door_message().x()), AssistFunction::GridToCell(item.door_message().y()));
if (bufferState->mapInfo->doorState.count(pos) == 0)
{
bufferState->mapInfo->doorState.emplace(pos, item.door_message().is_open());
bufferState->mapInfo->doorProgress.emplace(pos, item.door_message().progress());
logger->debug("Add Door!");
}
else
{
bufferState->mapInfo->doorState[pos] = item.door_message().is_open();
bufferState->mapInfo->doorProgress[pos] = item.door_message().progress();
logger->debug("Update Door!");
}
}
break;
}
case THUAI6::MessageOfObj::HiddenGateMessage:
{
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.hidden_gate_message().x(), item.hidden_gate_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.hidden_gate_message().x()), AssistFunction::GridToCell(item.hidden_gate_message().y()));
if (bufferState->mapInfo->hiddenGateState.count(pos) == 0)
{
bufferState->mapInfo->hiddenGateState.emplace(pos, Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened()));
logger->debug("Add HiddenGate!");
}
else
{
bufferState->mapInfo->hiddenGateState[pos] = Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened());
logger->debug("Update HiddenGate!");
}
}
break;
}
case THUAI6::MessageOfObj::GateMessage:
{
if (!AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.gate_message().x(), item.gate_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.gate_message().x()), AssistFunction::GridToCell(item.gate_message().y()));
if (bufferState->mapInfo->gateState.count(pos) == 0)
{
bufferState->mapInfo->gateState.emplace(pos, item.gate_message().progress());
logger->debug("Add Gate!");
}
else
{
bufferState->mapInfo->gateState[pos] = item.gate_message().progress();
logger->debug("Update Gate!");
}
}
break;
}
case THUAI6::MessageOfObj::StudentMessage:
{
bool flag = false;
for (const auto& buff : bufferState->trickerSelf->buff)
if (buff == THUAI6::TrickerBuffType::Clairaudience)
{
flag = true;
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
break;
}
for (int i = 0; i < item.student_message().buff_size(); i++)
if (Proto2THUAI6::studentBuffTypeDict[item.student_message().buff(i)] == THUAI6::StudentBuffType::Invisible)
{
flag = true;
break;
}
if (flag)
break;
if (AssistFunction::HaveView(bufferState->trickerSelf->viewRange, bufferState->trickerSelf->x, bufferState->trickerSelf->y, item.student_message().x(), item.student_message().y(), bufferState->gameMap))
{
bufferState->students.push_back(Proto2THUAI6::Protobuf2THUAI6Student(item.student_message()));
logger->debug("Add Student!");
}
break;
}
case THUAI6::MessageOfObj::NewsMessage:
{
auto news = item.news_message();
if (news.to_id() == playerID)
messageQueue.emplace(std::make_pair(news.from_id(), news.news()));
break;
}
case THUAI6::MessageOfObj::NullMessageOfObj:
default:
break;
auto pos = std::make_pair(AssistFunction::GridToCell(item.hidden_gate_message().x()), AssistFunction::GridToCell(item.hidden_gate_message().y()));
if (bufferState->mapInfo->hiddenGateState.count(pos) == 0)
{
bufferState->mapInfo->hiddenGateState.emplace(pos, Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened()));
logger->debug("Add HiddenGate!");
}
else
{
bufferState->mapInfo->hiddenGateState[pos] = Proto2THUAI6::Bool2HiddenGateState(item.hidden_gate_message().opened());
logger->debug("Update HiddenGate!");
}
} }
}
if (asynchronous)
{
break;
}
case THUAI6::MessageOfObj::GateMessage:
{
if (!AssistFunction::HaveView(viewRange, x, y, item.gate_message().x(), item.gate_message().y(), bufferState->gameMap))
{
auto pos = std::make_pair(AssistFunction::GridToCell(item.gate_message().x()), AssistFunction::GridToCell(item.gate_message().y()));
if (bufferState->mapInfo->gateState.count(pos) == 0)
{
bufferState->mapInfo->gateState.emplace(pos, item.gate_message().progress());
logger->debug("Add Gate!");
}
else
{
bufferState->mapInfo->gateState[pos] = item.gate_message().progress();
logger->debug("Update Gate!");
}
}
break;
}
case THUAI6::MessageOfObj::NewsMessage:
{ {
std::lock_guard<std::mutex> lock(mtxState);
std::swap(currentState, bufferState);
logger->info("Update State!");
auto news = item.news_message();
if (news.to_id() == playerID)
messageQueue.emplace(std::make_pair(news.from_id(), news.news()));
break;
} }
freshed = true;
case THUAI6::MessageOfObj::NullMessageOfObj:
default:
break;
}
}

void Logic::LoadBuffer(const protobuf::MessageToClient& message)
{
// 将消息读入到buffer中
{
std::lock_guard<std::mutex> lock(mtxBuffer);

// 清空原有信息
bufferState->students.clear();
bufferState->trickers.clear();
bufferState->props.clear();
bufferState->bullets.clear();
bufferState->bombedBullets.clear();

logger->debug("Buffer cleared!");
// 读取新的信息
bufferState->gameInfo = Proto2THUAI6::Protobuf2THUAI6GameInfo(message.all_message());
LoadBufferSelf(message);
for (const auto& item : message.obj_message())
LoadBufferCase(item);
}
if (asynchronous)
{
{
std::lock_guard<std::mutex> lock(mtxState);
std::swap(currentState, bufferState);
logger->info("Update State!");
} }
else
bufferUpdated = true;
counterBuffer++;
freshed = true;
} }
else
bufferUpdated = true;
counterBuffer++;
// 唤醒其他线程 // 唤醒其他线程
cvBuffer.notify_one(); cvBuffer.notify_one();
} }


+ 124
- 187
CAPI/python/PyAPI/logic.py View File

@@ -338,6 +338,127 @@ class Logic(ILogic):


threading.Thread(target=messageThread).start() threading.Thread(target=messageThread).start()


def __LoadBufferSelf(self, message: Message2Clients.MessageToClient) -> None:
if self.__playerType == THUAI6.PlayerType.StudentPlayer:
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "student_message":
if item.student_message.player_id == self.__playerID:
self.__bufferState.self = Proto2THUAI6.Protobuf2THUAI6Student(
item.student_message)
self.__bufferState.students.append(
self.__bufferState.self)
else:
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
else:
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "tricker_message":
if item.tricker_message.player_id == self.__playerID:
self.__bufferState.self = Proto2THUAI6.Protobuf2THUAI6Tricker(
item.tricker_message)
self.__bufferState.trickers.append(
self.__bufferState.self)
else:
self.__bufferState.trickers.append(
Proto2THUAI6.Protobuf2THUAI6Tricker(item.tricker_message))
self.__logger.debug("Add Tricker!")

def __LoadBufferCase(self, item: Message2Clients.MessageOfObj) -> None:
if self.__playerType == THUAI6.PlayerType.StudentPlayer and item.WhichOneof("message_of_obj") == "tricker_message":
if MessageType.TRICKER_INVISIBLE in item.tricker_message.buff:
return
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.tricker_message.x, item.tricker_message.y, self.__bufferState.gameMap):
self.__bufferState.trickers.append(
Proto2THUAI6.Protobuf2THUAI6Tricker(item.tricker_message))
self.__logger.debug("Add Tricker!")
elif self.__playerType == THUAI6.PlayerType.TrickerPlayer and item.WhichOneof("message_of_obj") == "student_message":
if THUAI6.TrickerBuffType.Clairaudience in self.__bufferState.self.buff:
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
return
if MessageType.STUDENT_INVISIBLE in item.student_message.buff:
return
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.student_message.x, item.student_message.y, self.__bufferState.gameMap):
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
elif item.WhichOneof("message_of_obj") == "prop_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.prop_message.x, item.prop_message.y, self.__bufferState.gameMap):
self.__bufferState.props.append(
Proto2THUAI6.Protobuf2THUAI6Prop(item.prop_message))
self.__logger.debug("Add Prop!")
elif item.WhichOneof("message_of_obj") == "bullet_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.bullet_message.x, item.bullet_message.y, self.__bufferState.gameMap):
self.__bufferState.bullets.append(
Proto2THUAI6.Protobuf2THUAI6Bullet(item.bullet_message))
self.__logger.debug("Add Bullet!")
elif item.WhichOneof("message_of_obj") == "classroom_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.classroom_message.x, item.classroom_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.classroom_message.x), AssistFunction.GridToCell(item.classroom_message.y))
if pos not in self.__bufferState.mapInfo.classroomState:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Add Classroom!")
else:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Update Classroom!")
elif item.WhichOneof("message_of_obj") == "chest_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.chest_message.x, item.chest_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.chest_message.x), AssistFunction.GridToCell(item.chest_message.y))
if pos not in self.__bufferState.mapInfo.chestState:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Add Chest at {pos[0]}, {pos[1]}")
else:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Update Chest at {pos[0]}, {pos[1]}")
elif item.WhichOneof("message_of_obj") == "door_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.door_message.x, item.door_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.door_message.x), AssistFunction.GridToCell(item.door_message.y))
if pos not in self.__bufferState.mapInfo.doorState:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Add Door!")
else:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Update Door!")
elif item.WhichOneof("message_of_obj") == "hidden_gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.hidden_gate_message.x, item.hidden_gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.hidden_gate_message.x), AssistFunction.GridToCell(item.hidden_gate_message.y))
if pos not in self.__bufferState.mapInfo.hiddenGateState:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Add HiddenGate!")
else:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Update HiddenGate!")
elif item.WhichOneof("message_of_obj") == "gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.gate_message.x, item.gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.gate_message.x), AssistFunction.GridToCell(item.gate_message.y))
if pos not in self.__bufferState.mapInfo.gateState:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Add Gate!")
else:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Update Gate!")
elif item.WhichOneof("message_of_obj") == "news_message":
if item.news_message.to_id == self.__playerID:
self.__messageQueue.put(
(item.news_message.from_id, item.news_message.news))
self.__logger.debug("Add News!")
else:
self.__logger.debug(
"Unknown Message!")

def __LoadBuffer(self, message: Message2Clients.MessageToClient) -> None: def __LoadBuffer(self, message: Message2Clients.MessageToClient) -> None:
with self.__cvBuffer: with self.__cvBuffer:
self.__bufferState.students.clear() self.__bufferState.students.clear()
@@ -346,193 +467,9 @@ class Logic(ILogic):
self.__logger.debug("Buffer cleared!") self.__logger.debug("Buffer cleared!")
self.__bufferState.gameInfo = Proto2THUAI6.Protobuf2THUAI6GameInfo( self.__bufferState.gameInfo = Proto2THUAI6.Protobuf2THUAI6GameInfo(
message.all_message) message.all_message)
if self.__playerType == THUAI6.PlayerType.StudentPlayer:
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "student_message":
if item.student_message.player_id == self.__playerID:
self.__bufferState.self = Proto2THUAI6.Protobuf2THUAI6Student(
item.student_message)
self.__bufferState.students.append(
self.__bufferState.self)
else:
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "tricker_message":
if MessageType.TRICKER_INVISIBLE in item.tricker_message.buff:
continue
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.tricker_message.x, item.tricker_message.y, self.__bufferState.gameMap):
self.__bufferState.trickers.append(
Proto2THUAI6.Protobuf2THUAI6Tricker(item.tricker_message))
self.__logger.debug("Add Tricker!")
elif item.WhichOneof("message_of_obj") == "prop_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.prop_message.x, item.prop_message.y, self.__bufferState.gameMap):
self.__bufferState.props.append(
Proto2THUAI6.Protobuf2THUAI6Prop(item.prop_message))
self.__logger.debug("Add Prop!")
elif item.WhichOneof("message_of_obj") == "bullet_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.bullet_message.x, item.bullet_message.y, self.__bufferState.gameMap):
self.__bufferState.bullets.append(
Proto2THUAI6.Protobuf2THUAI6Bullet(item.bullet_message))
self.__logger.debug("Add Bullet!")
elif item.WhichOneof("message_of_obj") == "classroom_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.classroom_message.x, item.classroom_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.classroom_message.x), AssistFunction.GridToCell(item.classroom_message.y))
if pos not in self.__bufferState.mapInfo.classroomState:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Add Classroom!")
else:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Update Classroom!")
elif item.WhichOneof("message_of_obj") == "chest_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.chest_message.x, item.chest_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.chest_message.x), AssistFunction.GridToCell(item.chest_message.y))
if pos not in self.__bufferState.mapInfo.chestState:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Add Chest at {pos[0]}, {pos[1]}")
else:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Update Chest at {pos[0]}, {pos[1]}")
elif item.WhichOneof("message_of_obj") == "door_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.door_message.x, item.door_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.door_message.x), AssistFunction.GridToCell(item.door_message.y))
if pos not in self.__bufferState.mapInfo.doorState:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Add Door!")
else:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Update Door!")
elif item.WhichOneof("message_of_obj") == "hidden_gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.hidden_gate_message.x, item.hidden_gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.hidden_gate_message.x), AssistFunction.GridToCell(item.hidden_gate_message.y))
if pos not in self.__bufferState.mapInfo.hiddenGateState:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Add HiddenGate!")
else:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Update HiddenGate!")
elif item.WhichOneof("message_of_obj") == "gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.gate_message.x, item.gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.gate_message.x), AssistFunction.GridToCell(item.gate_message.y))
if pos not in self.__bufferState.mapInfo.gateState:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Add Gate!")
else:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Update Gate!")
elif item.WhichOneof("message_of_obj") == "news_message":
if item.news_message.to_id == self.__playerID:
self.__messageQueue.put(
(item.news_message.from_id, item.news_message.news))
self.__logger.debug("Add News!")
else:
self.__logger.debug(
"Unknown Message!")
else:
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "tricker_message":
if item.tricker_message.player_id == self.__playerID:
self.__bufferState.self = Proto2THUAI6.Protobuf2THUAI6Tricker(
item.tricker_message)
self.__bufferState.trickers.append(
self.__bufferState.self)
else:
self.__bufferState.trickers.append(
Proto2THUAI6.Protobuf2THUAI6Tricker(item.tricker_message))
self.__logger.debug("Add Tricker!")
for item in message.obj_message:
if item.WhichOneof("message_of_obj") == "student_message":
if THUAI6.TrickerBuffType.Clairaudience in self.__bufferState.self.buff:
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
continue
if MessageType.STUDENT_INVISIBLE in item.student_message.buff:
continue
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.student_message.x, item.student_message.y, self.__bufferState.gameMap):
self.__bufferState.students.append(
Proto2THUAI6.Protobuf2THUAI6Student(item.student_message))
self.__logger.debug("Add Student!")
elif item.WhichOneof("message_of_obj") == "prop_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.prop_message.x, item.prop_message.y, self.__bufferState.gameMap):
self.__bufferState.props.append(
Proto2THUAI6.Protobuf2THUAI6Prop(item.prop_message))
self.__logger.debug("Add Prop!")
elif item.WhichOneof("message_of_obj") == "bullet_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.bullet_message.x, item.bullet_message.y, self.__bufferState.gameMap):
self.__bufferState.bullets.append(
Proto2THUAI6.Protobuf2THUAI6Bullet(item.bullet_message))
self.__logger.debug("Add Bullet!")
elif item.WhichOneof("message_of_obj") == "classroom_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.classroom_message.x, item.classroom_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.classroom_message.x), AssistFunction.GridToCell(item.classroom_message.y))
if pos not in self.__bufferState.mapInfo.classroomState:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Add Classroom!")
else:
self.__bufferState.mapInfo.classroomState[pos] = item.classroom_message.progress
self.__logger.debug("Update Classroom!")
elif item.WhichOneof("message_of_obj") == "chest_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.chest_message.x, item.chest_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.chest_message.x), AssistFunction.GridToCell(item.chest_message.y))
if pos not in self.__bufferState.mapInfo.chestState:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Add Chest at {pos[0]}, {pos[1]}")
else:
self.__bufferState.mapInfo.chestState[pos] = item.chest_message.progress
self.__logger.debug(
f"Update Chest at {pos[0]}, {pos[1]}")
elif item.WhichOneof("message_of_obj") == "door_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.door_message.x, item.door_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.door_message.x), AssistFunction.GridToCell(item.door_message.y))
if pos not in self.__bufferState.mapInfo.doorState:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Add Door!")
else:
self.__bufferState.mapInfo.doorState[pos] = item.door_message.is_open
self.__bufferState.mapInfo.doorProgress[pos] = item.door_message.progress
self.__logger.debug("Update Door!")
elif item.WhichOneof("message_of_obj") == "hidden_gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.hidden_gate_message.x, item.hidden_gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.hidden_gate_message.x), AssistFunction.GridToCell(item.hidden_gate_message.y))
if pos not in self.__bufferState.mapInfo.hiddenGateState:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Add HiddenGate!")
else:
self.__bufferState.mapInfo.hiddenGateState[pos] = Proto2THUAI6.Bool2HiddenGateState(
item.hidden_gate_message.opened)
self.__logger.debug("Update HiddenGate!")
elif item.WhichOneof("message_of_obj") == "gate_message":
if AssistFunction.HaveView(self.__bufferState.self.viewRange, self.__bufferState.self.x, self.__bufferState.self.y, item.gate_message.x, item.gate_message.y, self.__bufferState.gameMap):
pos = (AssistFunction.GridToCell(
item.gate_message.x), AssistFunction.GridToCell(item.gate_message.y))
if pos not in self.__bufferState.mapInfo.gateState:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Add Gate!")
else:
self.__bufferState.mapInfo.gateState[pos] = item.gate_message.progress
self.__logger.debug("Update Gate!")
else:
self.__logger.debug("Unknown Message!")
self.__LoadBufferSelf(message)
for item in message.obj_message:
self.__LoadBufferCase(item)
if Setting.asynchronous(): if Setting.asynchronous():
with self.__mtxState: with self.__mtxState:
self.__currentState, self.__bufferState = self.__bufferState, self.__currentState self.__currentState, self.__bufferState = self.__bufferState, self.__currentState


+ 1
- 1
CAPI/python/run.sh View File

@@ -4,4 +4,4 @@ python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 0 -d -o &
python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 1 -d & python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 1 -d &
python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 2 -d & python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 2 -d &
python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 3 -d & python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 3 -d &
python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 4 -d &
# python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 4 -d &

Loading…
Cancel
Save