mirror of
https://github.com/devZoGok/PlanetFleet.git
synced 2026-08-26 19:43:29 +00:00
vehicles find paths according to the map regions they occupy
This commit is contained in:
@@ -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<Edge> 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::Cell::Type, vector<Map::Cell&>>& 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;
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace battleship{
|
||||
struct Cell{
|
||||
enum Type{LAND, WATER};
|
||||
|
||||
int id;
|
||||
Type type;
|
||||
vb01::Vector3 pos;
|
||||
std::vector<Edge> edges;
|
||||
@@ -45,7 +46,7 @@ namespace battleship{
|
||||
std::vector<int> underWaterCellIds;
|
||||
|
||||
Cell(){}
|
||||
Cell(vb01::Vector3 p, Type t, std::vector<Edge> e = std::vector<Edge>{}, std::vector<int> uc = std::vector<int>{}): pos(p), type(t), edges(e), underWaterCellIds(uc){}
|
||||
Cell(vb01::Vector3 p, Type t, std::vector<Edge> e = std::vector<Edge>{}, std::vector<int> uc = std::vector<int>{}) : pos(p), type(t), edges(e), underWaterCellIds(uc){}
|
||||
};
|
||||
|
||||
class Minimap{
|
||||
@@ -83,7 +84,9 @@ namespace battleship{
|
||||
std::vector<int> getSurroundingCells(vb01::Vector3, int);
|
||||
void blockCells(Unit*);
|
||||
void unblockCells(Unit*);
|
||||
//const std::pair<Cell::Type, std::vector<Cell*>>& getRegionByCellId(int);
|
||||
bool regionContainsCell(int, int);
|
||||
inline std::pair<Cell::Type, std::vector<Cell*>>& 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;}
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
+8
-8
@@ -18,7 +18,7 @@ namespace battleship{
|
||||
for(int i = 0; i < numCellsOnSide; i++)
|
||||
for(int j = 0; j < numCellsOnSide; j++){
|
||||
vector<Map::Edge> 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>{
|
||||
Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector<Map::Edge>{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>{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>{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>{Map::Edge(0, 3, 3), Map::Edge(1, 3, 6)}),
|
||||
Map::Cell(Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector<Map::Edge>{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>{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>{Map::Edge(0, 6, 6)})
|
||||
Map::Cell(0, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector<Map::Edge>{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>{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>{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>{Map::Edge(0, 3, 3), Map::Edge(1, 3, 6)}),
|
||||
Map::Cell(4, Vector3::VEC_ZERO, Map::Cell::Type::LAND, vector<Map::Edge>{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>{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>{Map::Edge(0, 6, 6)})
|
||||
};
|
||||
|
||||
int src = 0, dest = cells.size() - 1;
|
||||
|
||||
+31
-6
@@ -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<Map::Cell> &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<Map::Cell::Type, vector<Map::Cell*>> 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<int> 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<Map::Cell> &cells = Map::getSingleton()->getCells();
|
||||
int source, dest;
|
||||
Map *map = Map::getSingleton();
|
||||
vector<Map::Cell> &cells = map->getCells(), regionCells;
|
||||
int regionId = -1, source, dest;
|
||||
|
||||
if(!canReachTarget(destPos, source, dest)) return;
|
||||
if(!adjustDest(destPos, regionId, source, dest)) return;
|
||||
|
||||
vector<float> heurs;
|
||||
Pathfinder *pf = Pathfinder::getSingleton();
|
||||
|
||||
@@ -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<int>&, vb01::Vector3, bool);
|
||||
void startCurrentOrder();
|
||||
bool validateGarrisonOrder(Order);
|
||||
|
||||
Reference in New Issue
Block a user