diff --git a/client/src/Core/Message/Parse/TurnMessage.cpp b/client/src/Core/Message/Parse/TurnMessage.cpp index 52e88bb..5a8e727 100644 --- a/client/src/Core/Message/Parse/TurnMessage.cpp +++ b/client/src/Core/Message/Parse/TurnMessage.cpp @@ -183,11 +183,18 @@ void TurnMessage::parse_units(json json_units, Game *game, bool is_dead) { int path_id = json_unit["pathId"]; unit_p->path_ = nullptr; - for (const Path *path : game->map_.paths_) + for (const Path *path : game->players_[unit_p->player_id_].getPathsFromPlayer()) if (path->getId() == path_id) { unit_p->path_ = path; break; } + if (unit_p->path_ == nullptr) { + for (const Path *path : game->players_[game->give_friends_id(unit_p->player_id_)].getPathsFromPlayer()) + if (path->getId() == path_id) { + unit_p->path_ = path; + break; + } + } int row = json_unit["cell"]["row"]; int col = json_unit["cell"]["col"]; diff --git a/client/src/Model/Game.cpp b/client/src/Model/Game.cpp index 9ef9fcd..11d0329 100644 --- a/client/src/Model/Game.cpp +++ b/client/src/Model/Game.cpp @@ -230,17 +230,14 @@ std::vector Game::getCellUnits(int row, int col) { } const Path *Game::getShortestPathToCell(const Player* from_player,const Cell* cell) { - int pathID = shortestPath2Cell[from_player->getPlayerId()][cell->getRow()][cell->getCol()]; - if(pathID == -1) - return nullptr; - return path_ptr_by_pathId(pathID); + return getShortestPathToCell(from_player, cell->getRow(), cell->getCol()); } const Path *Game::getShortestPathToCell(const Player* from_player, int row, int col) { int pathID = shortestPath2Cell[from_player->getPlayerId()][row][col]; if(pathID == -1) return nullptr; - return path_ptr_by_pathId(pathID); + return path_from_player_by_pathId(from_player->player_id_, pathID); } @@ -561,6 +558,20 @@ const Path *Game::path_ptr_by_pathId(int pathId) { assert(0); } +const Path *Game::path_from_player_by_pathId(int player_id, int path_id) { + for (const Path *path : players_[player_id].getPathsFromPlayer()) + if (path->getId() == path_id) + return path; + for (const Path *path : players_[give_friends_id(player_id)].getPathsFromPlayer()) + if (path->getId() == path_id) + return path; + for (const Path *path: map_.getPaths()) + if (path->getId() == path_id) + return path; + + Logger::Get(LogLevel_ERROR) << "Game::path_from_player_by_pathId:: Wrong pathId" << std::endl; + assert(0); +} const Spell *Game::give_spell_by_typeId(int spell_id) const { for(const Spell *_spell: this->spells_){ @@ -605,17 +616,9 @@ void Game::calcShortestPaths() { int Game::calcShortestPathToCell(const Player *from_player, int row, int col) { - //First check if it's on a friends path int friend_id = give_friends_id(from_player->player_id_); - for(int i = 0; i < from_player->path_to_friend->getCells().size(); i++){ - if(from_player->path_to_friend->getCells()[i]->getRow() == row && - from_player->path_to_friend->getCells()[i]->getCol() == col){ - //Find the players friend - return players_[friend_id].getPathsFromPlayer()[0]->getId(); - } - } - //Second check if it's on a enemies friends path + //First check if it's on a enemies friends path std::vector player_paths = from_player->getPathsFromPlayer(); std::vector friend_paths = players_[friend_id].getPathsFromPlayer(); size_t min = 0x7fffffff; @@ -667,7 +670,7 @@ int Game::calcShortestPathToCell(const Player *from_player, int row, int col) { } } - //Third check the paths form the player + //Second check the paths form the player for (const Path *path : player_paths) { for (size_t i = 0; i < path->getCells().size(); i++) { if (path->getCells()[i]->getRow() == row && @@ -680,6 +683,15 @@ int Game::calcShortestPathToCell(const Player *from_player, int row, int col) { } } + //Third check if it's on a friends path + for(int i = 0; i < from_player->path_to_friend->getCells().size(); i++){ + if(from_player->path_to_friend->getCells()[i]->getRow() == row && + from_player->path_to_friend->getCells()[i]->getCol() == col){ + //Find the players friend + return players_[friend_id].getPathsFromPlayer()[0]->getId(); + } + } + //Forth check the paths form the players friend for (const Path *path : friend_paths) { for (size_t i = 0; i < path->getCells().size(); i++) { diff --git a/client/src/Model/Game.h b/client/src/Model/Game.h index 7ecc66e..b315267 100644 --- a/client/src/Model/Game.h +++ b/client/src/Model/Game.h @@ -151,6 +151,7 @@ class Game final : public World { Unit * unit_ptr_by_Id(int unitId); const CastSpell* cast_spell_ptr_by_Id(int castSpellId); const Path* path_ptr_by_pathId(int pathId); + const Path* path_from_player_by_pathId(int player_id, int pathId); std::vector cast_spell_; //For us