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

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
sigonasr2, Sig, Sigo 2023-07-10 14:38:31 +00:00
parent cb24484dfe
commit debf151c46
3 changed files with 12 additions and 9 deletions

View File

@ -45,9 +45,9 @@ void Pathfinding::Initialize(){
nodeEnd = &nodes[(game->WORLD_SIZE.y / 2) * game->WORLD_SIZE.x + game->WORLD_SIZE.x-2]; 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)); 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)]; 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)]; nodeEnd=&nodes[int(endPos.y/24)*game->WORLD_SIZE.x+int(endPos.x/24)];
@ -118,6 +118,7 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
{ {
int pathLength=INFINITE; int pathLength=INFINITE;
sNode *p = nodeEnd; sNode *p = nodeEnd;
std::vector<vf2d>finalPath;
while (p->parent != nullptr) while (p->parent != nullptr)
{ {
if(pathLength==INFINITE){ if(pathLength==INFINITE){
@ -125,10 +126,12 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
} else { } else {
pathLength++; pathLength++;
} }
finalPath.push_back({float((*p).x),float((*p).y)});
p = p->parent; p = p->parent;
} }
return pathLength; std::reverse(finalPath.begin(),finalPath.end());
return finalPath;
} else { } else {
return INFINITE; return {};
} }
} }

View File

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

View File

@ -460,6 +460,6 @@ std::vector<Buff>Player::GetBuffs(BuffType buff){
} }
bool Player::CanPathfindTo(vf2d pos,vf2d targetPos,float range){ bool Player::CanPathfindTo(vf2d pos,vf2d targetPos,float range){
int pathLength=path.Solve_AStar(pos,targetPos,8,upperLevel); std::vector<vf2d>pathing=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. 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.
} }