| @@ -183,7 +183,6 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message) | |||||
| bufferState->props.clear(); | bufferState->props.clear(); | ||||
| std::cout << "Buffer clear!" << std::endl; | std::cout << "Buffer clear!" << std::endl; | ||||
| // 读取新的信息 | // 读取新的信息 | ||||
| // 读取消息的选择待补充,之后需要另外判断;具体做法应该是先读到自己,然后按照自己的视野做处理。此处暂时全部读了进来 | // 读取消息的选择待补充,之后需要另外判断;具体做法应该是先读到自己,然后按照自己的视野做处理。此处暂时全部读了进来 | ||||
| for (auto itr = message.human_message().begin(); itr != message.human_message().end(); itr++) | for (auto itr = message.human_message().begin(); itr != message.human_message().end(); itr++) | ||||
| @@ -195,8 +194,94 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| bufferState->humans.push_back(Proto2THUAI6::Protobuf2THUAI6Human(*itr)); | |||||
| std::cout << "Add Human!" << std::endl; | |||||
| // here program should decide whether this human can be seen by AI | |||||
| if (playerType == THUAI6::PlayerType::HumanPlayer) | |||||
| { | |||||
| bufferState->humans.push_back(Proto2THUAI6::Protobuf2THUAI6Human(*itr)); | |||||
| std::cout << "Add Human!" << std::endl; | |||||
| } | |||||
| else | |||||
| { | |||||
| int vr = this->currentState->butcherSelf->viewRange; | |||||
| int deltaX = itr->x() - this->currentState->butcherSelf->x; | |||||
| int deltaY = itr->y() - this->currentState->butcherSelf->y; | |||||
| double distance = deltaX * deltaX + deltaY * deltaY; | |||||
| if (distance > vr * vr) | |||||
| continue; | |||||
| else | |||||
| { | |||||
| int divide = abs(deltaX) > abs(deltaY) ? abs(deltaX) : abs(deltaY); | |||||
| int dx = deltaX / divide; | |||||
| int dy = deltaY / divide; | |||||
| bool barrier = false; | |||||
| if (deltaX > 0) | |||||
| { | |||||
| if (deltaY > 0) | |||||
| { | |||||
| for (int i = this->currentState->butcherSelf->x; i < itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->butcherSelf->y; j < itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| for (int i = this->currentState->butcherSelf->x; i < itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->butcherSelf->y; j > itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if (deltaY > 0) | |||||
| { | |||||
| for (int i = this->currentState->butcherSelf->x; i > itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->butcherSelf->y; j < itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| for (int i = this->currentState->butcherSelf->x; i > itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->butcherSelf->y; j > itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| if (barrier) | |||||
| continue; | |||||
| bufferState->humans.push_back(Proto2THUAI6::Protobuf2THUAI6Human(*itr)); | |||||
| std::cout << "Add Human!" << std::endl; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| for (auto itr = message.butcher_message().begin(); itr != message.butcher_message().end(); itr++) | for (auto itr = message.butcher_message().begin(); itr != message.butcher_message().end(); itr++) | ||||
| @@ -207,7 +292,96 @@ void Logic::LoadBuffer(protobuf::MessageToClient& message) | |||||
| bufferState->butchers.push_back(Proto2THUAI6::Protobuf2THUAI6Butcher(*itr)); | bufferState->butchers.push_back(Proto2THUAI6::Protobuf2THUAI6Butcher(*itr)); | ||||
| } | } | ||||
| else | else | ||||
| bufferState->butchers.push_back(Proto2THUAI6::Protobuf2THUAI6Butcher(*itr)); | |||||
| { | |||||
| // here program should decide whether this human can be seen by AI | |||||
| if (playerType == THUAI6::PlayerType::ButcherPlayer) | |||||
| { | |||||
| bufferState->butchers.push_back(Proto2THUAI6::Protobuf2THUAI6Butcher(*itr)); | |||||
| std::cout << "Add Butcher!" << std::endl; | |||||
| } | |||||
| else | |||||
| { | |||||
| int vr = this->currentState->humanSelf->viewRange; | |||||
| int deltaX = itr->x() - this->currentState->humanSelf->x; | |||||
| int deltaY = itr->y() - this->currentState->humanSelf->y; | |||||
| double distance = deltaX * deltaX + deltaY * deltaY; | |||||
| if (distance > vr * vr) | |||||
| continue; | |||||
| else | |||||
| { | |||||
| int divide = abs(deltaX) > abs(deltaY) ? abs(deltaX) : abs(deltaY); | |||||
| int dx = deltaX / divide; | |||||
| int dy = deltaY / divide; | |||||
| bool barrier = false; | |||||
| if (deltaX > 0) | |||||
| { | |||||
| if (deltaY > 0) | |||||
| { | |||||
| for (int i = this->currentState->humanSelf->x; i < itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->humanSelf->y; j < itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| for (int i = this->currentState->humanSelf->x; i < itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->humanSelf->y; j > itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if (deltaY > 0) | |||||
| { | |||||
| for (int i = this->currentState->humanSelf->x; i > itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->humanSelf->y; j < itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| for (int i = this->currentState->humanSelf->x; i > itr->x() && !barrier; i += dx) | |||||
| for (int j = this->currentState->humanSelf->y; j > itr->y(); j += dy) | |||||
| { | |||||
| int x_cell = IAPI::GridToCell(i); | |||||
| int y_cell = IAPI::GridToCell(j); | |||||
| if (this->currentState->gamemap[x_cell][y_cell] == THUAI6::PlaceType::Wall) | |||||
| { | |||||
| barrier = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| if (barrier) | |||||
| continue; | |||||
| bufferState->butchers.push_back(Proto2THUAI6::Protobuf2THUAI6Butcher(*itr)); | |||||
| std::cout << "Add Butcher!" << std::endl; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| bufferState->gamemap = Proto2THUAI6::Protobuf2THUAI6Map(message.map_message()); | bufferState->gamemap = Proto2THUAI6::Protobuf2THUAI6Map(message.map_message()); | ||||