diff --git a/CAPI/cpp/API/include/logic.h b/CAPI/cpp/API/include/logic.h index a496a2d..7bd8d1a 100644 --- a/CAPI/cpp/API/include/logic.h +++ b/CAPI/cpp/API/include/logic.h @@ -148,7 +148,9 @@ private: void ProcessMessage(); // 将信息加载到buffer - void LoadBuffer(protobuf::MessageToClient&); + void LoadBufferSelf(const protobuf::MessageToClient& message); + void LoadBufferCase(const protobuf::MessageOfObj& item); + void LoadBuffer(const protobuf::MessageToClient& message); // 解锁AI线程 void UnBlockAI(); diff --git a/CAPI/cpp/API/src/logic.cpp b/CAPI/cpp/API/src/logic.cpp index 41aa142..8baaee1 100644 --- a/CAPI/cpp/API/src/logic.cpp +++ b/CAPI/cpp/API/src/logic.cpp @@ -398,351 +398,233 @@ void Logic::ProcessMessage() 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 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 - 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 - 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 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 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 lock(mtxState); + std::swap(currentState, bufferState); + logger->info("Update State!"); } - else - bufferUpdated = true; - counterBuffer++; + freshed = true; } + else + bufferUpdated = true; + counterBuffer++; // 唤醒其他线程 cvBuffer.notify_one(); } diff --git a/CAPI/python/PyAPI/logic.py b/CAPI/python/PyAPI/logic.py index 9e81b1e..1907451 100644 --- a/CAPI/python/PyAPI/logic.py +++ b/CAPI/python/PyAPI/logic.py @@ -338,6 +338,127 @@ class Logic(ILogic): 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: with self.__cvBuffer: self.__bufferState.students.clear() @@ -346,193 +467,9 @@ class Logic(ILogic): self.__logger.debug("Buffer cleared!") self.__bufferState.gameInfo = Proto2THUAI6.Protobuf2THUAI6GameInfo( 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(): with self.__mtxState: self.__currentState, self.__bufferState = self.__bufferState, self.__currentState diff --git a/CAPI/python/run.sh b/CAPI/python/run.sh index ae82681..f41c458 100755 --- a/CAPI/python/run.sh +++ b/CAPI/python/run.sh @@ -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 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 4 -d & \ No newline at end of file +# python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 4 -d & \ No newline at end of file