Pathfinding now returns the nodes to reach a destination in preparation for use w/AI pathfinding

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
pull/28/head
sigonasr2, Sig, Sigo 2 years ago
parent cb24484dfe
commit debf151c46
  1. 13
      Crawler/Pathfinding.cpp
  2. 4
      Crawler/Pathfinding.h
  3. 4
      Crawler/Player.cpp

@ -45,9 +45,9 @@ void Pathfinding::Initialize(){
nodeEnd = &nodes[(game->WORLD_SIZE.y / 2) * game->WORLD_SIZE.x + game->WORLD_SIZE.x-2];
}
int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upperLevel){
std::vector<vf2d> Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upperLevel){
float dist=sqrt(pow(endPos.x-startPos.x,2)+pow(endPos.y-startPos.y,2));
if(dist>maxRange*24)return maxRange;
if(dist>maxRange*24)return {};
nodeStart=&nodes[int(startPos.y/24)*game->WORLD_SIZE.x+int(startPos.x/24)];
nodeEnd=&nodes[int(endPos.y/24)*game->WORLD_SIZE.x+int(endPos.x/24)];
@ -112,12 +112,13 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
nodeNeighbour->fGlobalGoal = nodeNeighbour->fLocalGoal + heuristic(nodeNeighbour, nodeEnd);
}
}
}
}
if (nodeEnd != nullptr)
{
int pathLength=INFINITE;
sNode *p = nodeEnd;
std::vector<vf2d>finalPath;
while (p->parent != nullptr)
{
if(pathLength==INFINITE){
@ -125,10 +126,12 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
} else {
pathLength++;
}
finalPath.push_back({float((*p).x),float((*p).y)});
p = p->parent;
}
return pathLength;
std::reverse(finalPath.begin(),finalPath.end());
return finalPath;
} else {
return INFINITE;
return {};
}
}

@ -21,6 +21,6 @@ struct Pathfinding{
sNode *nodeEnd = nullptr;
void Initialize();
//maxRange in tiles.
int Solve_AStar(vf2d startPos,vf2d endPos,float maxRange=8,bool upperLevel=false);
//maxRange in tiles. Returns the path as points.
std::vector<vf2d> Solve_AStar(vf2d startPos,vf2d endPos,float maxRange=8,bool upperLevel=false);
};

@ -460,6 +460,6 @@ std::vector<Buff>Player::GetBuffs(BuffType buff){
}
bool Player::CanPathfindTo(vf2d pos,vf2d targetPos,float range){
int pathLength=path.Solve_AStar(pos,targetPos,8,upperLevel);
return pathLength<8;//We'll say 7 tiles or less is close enough to 650 range. Have a little bit of wiggle room.
std::vector<vf2d>pathing=path.Solve_AStar(pos,targetPos,8,upperLevel);
return pathing.size()>0&&pathing.size()<8;//We'll say 7 tiles or less is close enough to 650 range. Have a little bit of wiggle room.
}
Loading…
Cancel
Save