From 8b180181d213c9a77594229801a271f4fad57433 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 26 Apr 2026 17:38:21 +0300 Subject: [PATCH] vehicles find paths according to the map regions they occupy --- map.cpp | 12 +++++++----- map.h | 7 +++++-- pathfinder.cpp | 2 +- pathfinderTest.cpp | 16 ++++++++-------- vehicle.cpp | 37 +++++++++++++++++++++++++++++++------ vehicle.h | 2 +- 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/map.cpp b/map.cpp index d85123f..f36e554 100755 --- a/map.cpp +++ b/map.cpp @@ -522,6 +522,7 @@ namespace battleship{ } //TODO implement toggleable cell rendering + //TODO remove srcCellId from the Edge struct void Map::loadCells(){ sol::state_view SOL_LUA_VIEW = generateView(); sol::table cellsTable = SOL_LUA_VIEW["cells"]; @@ -531,10 +532,13 @@ namespace battleship{ sol::table cellTable = cellsTable[i + 1], posTable = cellTable["pos"]; int numEdges = cellTable["numEdges"]; vector edges; + int id = -1; for(int j = 0; j < numEdges; j++){ sol::table edgeTable = cellTable["edges"][j + 1]; edges.push_back(Edge(edgeTable["weight"], edgeTable["srcCellId"], edgeTable["destCellId"])); + + if(id == -1) id = edgeTable["srcCellId"]; } int numUnderWaterCells = cellTable["numUnderWaterCells"]; @@ -556,7 +560,6 @@ namespace battleship{ */ cells.push_back(Cell(cellPos, cellType, edges, underWaterCellIds)); - } } @@ -626,11 +629,10 @@ namespace battleship{ reg.second.push_back(&cells[ucId]); } } - /* - pair>& Map::getRegionByCellId(int id){ - return regions[0]; + + bool Map::regionContainsCell(int regId, int cellId){ + return find(regions[regId].second.begin(), regions[regId].second.end(), &cells[cellId]) != regions[regId].second.end(); } - */ void Map::load(string mapName){ this->mapName = mapName; diff --git a/map.h b/map.h index b748cc7..4f73819 100755 --- a/map.h +++ b/map.h @@ -38,6 +38,7 @@ namespace battleship{ struct Cell{ enum Type{LAND, WATER}; + int id; Type type; vb01::Vector3 pos; std::vector edges; @@ -45,7 +46,7 @@ namespace battleship{ std::vector underWaterCellIds; Cell(){} - Cell(vb01::Vector3 p, Type t, std::vector e = std::vector{}, std::vector uc = std::vector{}): pos(p), type(t), edges(e), underWaterCellIds(uc){} + Cell(vb01::Vector3 p, Type t, std::vector e = std::vector{}, std::vector uc = std::vector{}) : pos(p), type(t), edges(e), underWaterCellIds(uc){} }; class Minimap{ @@ -83,7 +84,9 @@ namespace battleship{ std::vector getSurroundingCells(vb01::Vector3, int); void blockCells(Unit*); void unblockCells(Unit*); - //const std::pair>& getRegionByCellId(int); + bool regionContainsCell(int, int); + inline std::pair>& getRegion(int i){return regions[i];} + inline int getNumRegions(){return regions.size();} inline Map::Cell getCell(int i){return cells[i];} inline std::string getMapName(){return mapName;} inline vb01::Node* getNodeParent(){return terrainNode;} diff --git a/pathfinder.cpp b/pathfinder.cpp index 7054230..cd8671a 100644 --- a/pathfinder.cpp +++ b/pathfinder.cpp @@ -95,7 +95,7 @@ namespace battleship{ int weightMult = 1; if((ut == UnitType::LAND && ct == Map::Cell::WATER) || (ship && ct == Map::Cell::LAND)) - weightMult = 10; + continue; /* if(vehicleType != -1){ UnitType unitType = vehicle->getType(); diff --git a/pathfinderTest.cpp b/pathfinderTest.cpp index 362fc75..14761f3 100644 --- a/pathfinderTest.cpp +++ b/pathfinderTest.cpp @@ -18,7 +18,7 @@ namespace battleship{ for(int i = 0; i < numCellsOnSide; i++) for(int j = 0; j < numCellsOnSide; j++){ vector edges = Map::generateAdjacentNodeEdges(numCellsOnSide, i, numCellsOnSide, j, 1000); - cells.push_back(Map::Cell(Vector3(j * cellSize, 0, i * cellSize), Map::Cell::Type::LAND, edges)); + cells.push_back(Map::Cell(i * numCellsOnSide + j, Vector3(j * cellSize, 0, i * cellSize), Map::Cell::Type::LAND, edges)); } return cells; @@ -53,13 +53,13 @@ namespace battleship{ void PathfinderTest::testFindPath(){ cells = vector{ - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 0, 0), Map::Edge(2, 0, 1), Map::Edge(4, 0, 2)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 1, 1), Map::Edge(1, 1, 2), Map::Edge(9, 1, 3), Map::Edge(13, 1, 4)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 2, 2), Map::Edge(2, 2, 1), Map::Edge(4, 2, 4), Map::Edge(5, 2, 5)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 3, 3), Map::Edge(1, 3, 6)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 4, 4), Map::Edge(1, 4, 1), Map::Edge(1, 4, 3), Map::Edge(2, 4, 5), Map::Edge(3, 4, 6)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 5, 5), Map::Edge(9, 5, 4), Map::Edge(2, 5, 6)}), - Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 6, 6)}) + Map::Cell(0, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 0, 0), Map::Edge(2, 0, 1), Map::Edge(4, 0, 2)}), + Map::Cell(1, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 1, 1), Map::Edge(1, 1, 2), Map::Edge(9, 1, 3), Map::Edge(13, 1, 4)}), + Map::Cell(2, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 2, 2), Map::Edge(2, 2, 1), Map::Edge(4, 2, 4), Map::Edge(5, 2, 5)}), + Map::Cell(3, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 3, 3), Map::Edge(1, 3, 6)}), + Map::Cell(4, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 4, 4), Map::Edge(1, 4, 1), Map::Edge(1, 4, 3), Map::Edge(2, 4, 5), Map::Edge(3, 4, 6)}), + Map::Cell(5, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 5, 5), Map::Edge(9, 5, 4), Map::Edge(2, 5, 6)}), + Map::Cell(6, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector{Map::Edge(0, 6, 6)}) }; int src = 0, dest = cells.size() - 1; diff --git a/vehicle.cpp b/vehicle.cpp index adeebf5..e143981 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -319,11 +319,11 @@ namespace battleship{ //TODO allow ships to attack land targets and vice versa //TODO recursively search for vacant dest cell neibourghss - bool Vehicle::canReachTarget(Vector3 destPos, int &source, int &dest){ + bool Vehicle::adjustDest(Vector3 destPos, int ®ionId, int &source, int &dest){ Map *map = Map::getSingleton(); vector &cells = map->getCells(); - source = map->getCellId(pos); + bool ship = (type == UnitType::UNDERWATER || type == UnitType::SEA_LEVEL); bool waterVehCanMove = (ship && cells[source].type == Map::Cell::WATER); bool landVehCanMove = (type == UnitType::LAND && cells[source].type == Map::Cell::LAND); @@ -332,7 +332,30 @@ namespace battleship{ dest = map->getCellId(destPos); - if(type != UnitType::UNDERWATER && type == UnitType::SEA_LEVEL && fabs(destPos.y - cells[dest].pos.y) > .1) return false; + if(type == UnitType::SEA_LEVEL && fabs(destPos.y - cells[dest].pos.y) > .1) return false; + + if(type != UnitType::HOVER){ + pair> srcRegion; + + for(int i = 0; i < map->getNumRegions(); i++) + if(map->regionContainsCell(i, source)){ + srcRegion = map->getRegion(i); + regionId = i; + } + + if(find(srcRegion.second.begin(), srcRegion.second.end(), &cells[dest]) == srcRegion.second.end()){ + int minDistId = 0; + + for(int i = 0; i < srcRegion.second.size(); i++){ + float currDist = cells[dest].pos.getDistanceFrom(srcRegion.second[i]->pos); + float minDist = cells[dest].pos.getDistanceFrom(srcRegion.second[minDistId]->pos); + + if(currDist < minDist) minDistId = i; + } + + dest = map->getCellId(srcRegion.second[minDistId]->pos); + } + } if(cells[dest].blockedBy){ vector surrCellIds = map->getSurroundingCells(cells[dest].pos, 1); @@ -361,6 +384,7 @@ namespace battleship{ return false; } + else return true; } @@ -434,10 +458,11 @@ namespace battleship{ void Vehicle::preparePathpoints(Order &order, Vector3 destPos, bool appendDestPos){ removeAllPathpoints(); - vector &cells = Map::getSingleton()->getCells(); - int source, dest; + Map *map = Map::getSingleton(); + vector &cells = map->getCells(), regionCells; + int regionId = -1, source, dest; - if(!canReachTarget(destPos, source, dest)) return; + if(!adjustDest(destPos, regionId, source, dest)) return; vector heurs; Pathfinder *pf = Pathfinder::getSingleton(); diff --git a/vehicle.h b/vehicle.h index 9b5bf64..6d59808 100644 --- a/vehicle.h +++ b/vehicle.h @@ -25,7 +25,7 @@ namespace battleship{ vb01::s64 lastBuildTime = 0; inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} - bool canReachTarget(vb01::Vector3, int&, int&); + bool adjustDest(vb01::Vector3, int&, int&, int&); bool truncatePath(Order&, std::vector&, vb01::Vector3, bool); void startCurrentOrder(); bool validateGarrisonOrder(Order);