From debf151c46b1ca7e1ebe7d4adeb474b94cf3b4d3 Mon Sep 17 00:00:00 2001 From: "sigonasr2, Sig, Sigo" Date: Mon, 10 Jul 2023 14:38:31 +0000 Subject: [PATCH] Pathfinding now returns the nodes to reach a destination in preparation for use w/AI pathfinding Co-authored-by: sigonasr2 --- Crawler/Pathfinding.cpp | 13 ++++++++----- Crawler/Pathfinding.h | 4 ++-- Crawler/Player.cpp | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Crawler/Pathfinding.cpp b/Crawler/Pathfinding.cpp index 8ced2246..7229fcf3 100644 --- a/Crawler/Pathfinding.cpp +++ b/Crawler/Pathfinding.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 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::vectorfinalPath; 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 {}; } } \ No newline at end of file diff --git a/Crawler/Pathfinding.h b/Crawler/Pathfinding.h index c54fdca8..eae0f0d8 100644 --- a/Crawler/Pathfinding.h +++ b/Crawler/Pathfinding.h @@ -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 Solve_AStar(vf2d startPos,vf2d endPos,float maxRange=8,bool upperLevel=false); }; \ No newline at end of file diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index eb94ccf8..2d694e34 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -460,6 +460,6 @@ std::vectorPlayer::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::vectorpathing=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. } \ No newline at end of file