Release 0.77
parent
d83c228e10
commit
594aae4221
|
@ -6,48 +6,17 @@
|
|||
|
||||
/** @addtogroup Types
|
||||
* @{ */
|
||||
/**
|
||||
* @brief A Counter can be used, well as a Counter. You construct it with MaxIterations, the counter is marked as finished whenever the current Iterations reach, or exceed MaxIterations.
|
||||
* You can use @ref Increment to increase, and @ref Reset to reset the current Iterations.
|
||||
* You can also use @ref IsFinished to check the current state of the Counter.
|
||||
*/
|
||||
class Counter
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Default Counter constructor with MaxIterations as 0
|
||||
*/
|
||||
|
||||
Counter();
|
||||
/**
|
||||
* @brief Constructs a Counter with
|
||||
* @param std::int32_t MaxIterations Maximum amount of Iterations before the counter is Finished
|
||||
*/
|
||||
Counter(std::int32_t MaxIterations);
|
||||
/**
|
||||
* @brief Resets the Counter's current Iterations to 0
|
||||
* @par Description
|
||||
* Resets the Counter's current Iterations to 0
|
||||
*/
|
||||
|
||||
void Reset();
|
||||
/**
|
||||
* @brief Increases the Counter's current Iterations by Amount, and returns true if the Counter isn't Finished
|
||||
* @return True if the Counter isn't Finished, after it increments the Counter's current Iterations
|
||||
*/
|
||||
bool Increment(std::int32_t Amount = 1);
|
||||
/**
|
||||
* @brief Returns True if the Counter's current Iterations equals the MaxIterations Paramater passed in the Constructor
|
||||
* @return True if the Counter's current Iterations equals the MaxIterations Paramater passed in the Constructor
|
||||
*/
|
||||
bool IsFinished() const;
|
||||
/**
|
||||
* @brief Returns the Counter's current Iterations
|
||||
* @return Returns the Counter's current Iterations
|
||||
*/
|
||||
std::int32_t GetIterations() const;
|
||||
/**
|
||||
* @brief Returns the Counter's maximum Iterations
|
||||
* @return Returns the Counter's maximum Iterations
|
||||
*/
|
||||
std::int32_t GetMaxIterations() const;
|
||||
friend std::ostream& operator<<(std::ostream& OS, const Counter& C);
|
||||
~Counter();
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
/**
|
||||
* @brief A class allowing easy pathfinding within the local region
|
||||
*/
|
||||
class Pathfinding
|
||||
{
|
||||
public:
|
||||
|
@ -26,67 +29,112 @@ class Pathfinding
|
|||
NORTHEAST = 0x4,
|
||||
SOUTHEAST = 0x10,
|
||||
SOUTHWEST = 0x40,
|
||||
NORTHWEST = 0x1,
|
||||
|
||||
BLOCKED_NORTH = 0x400,
|
||||
BLOCKED_EAST = 0x1000,
|
||||
BLOCKED_SOUTH = 0x4000,
|
||||
BLOCKED_WEST = 0x10000,
|
||||
|
||||
BLOCKED_NORTHEAST = 0x800,
|
||||
BLOCKED_SOUTHEAST = 0x2000,
|
||||
BLOCKED_NORTHWEST = 0x200,
|
||||
BLOCKED_SOUTHWEST = 0x8000,
|
||||
NORTHWEST = 0x1
|
||||
};
|
||||
|
||||
typedef enum PATHFINDER
|
||||
{
|
||||
/** <A HREF="https://en.wikipedia.org/wiki/Breadth-first_search">Breadth-first search algorithim</A> */
|
||||
BREADTH_FIRST_SEARCH
|
||||
} PATHFINDER;
|
||||
|
||||
enum PATHFIND_OPTION
|
||||
{
|
||||
/** Checks collision */
|
||||
CHECK_COLLISION = (1 << 1),
|
||||
/** Checks whitelist */
|
||||
CHECK_WHITELIST = (1 << 2),
|
||||
/** Checks blacklist */
|
||||
CHECK_BLACKLIST = (1 << 3),
|
||||
/** The passed goal is a local tile, the function won't normalize it */
|
||||
GOAL_IS_LOCAL = (1 << 4),
|
||||
/** Returns a path as local tiles */
|
||||
RETURN_LOCAL = (1 << 5)
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A subclass used to store information about tile nodes generated by the Pathfinding class
|
||||
*/
|
||||
class TileNode
|
||||
{
|
||||
public:
|
||||
/** @brief The local region X coordinate */
|
||||
std::int32_t X;
|
||||
/** @brief The local region Y coordinate */
|
||||
std::int32_t Y;
|
||||
/** @brief The collision flag associated with the node */
|
||||
std::int32_t Flag;
|
||||
/** @brief <B> For pathfinding use only </B> */
|
||||
bool Inspected;
|
||||
/** @brief True if this node matches the whitelisted tiles set in Pathfinding */
|
||||
bool MatchesWhitelist;
|
||||
/** @brief True if this node matches the blacklisted tiles set in Pathfinding */
|
||||
bool MatchesBlacklist;
|
||||
/** @brief <B> For pathfinding use only </B> */
|
||||
std::int32_t Parent[2];
|
||||
TileNode();
|
||||
TileNode(std::int32_t X, std::int32_t Y, std::int32_t Flag);
|
||||
bool IsBlocked(bool AllowOccupied = true) const;
|
||||
/** @brief True if the node is occupied or blocked according to its collision flag*/
|
||||
bool IsBlocked() const;
|
||||
/** @brief Adds ClientX/Y to the local X and Y coordinates of the node, returning a world tile */
|
||||
Tile ToWorldTile() const;
|
||||
bool operator==(const TileNode& N) const;
|
||||
operator bool() const;
|
||||
};
|
||||
|
||||
static void RegenerateNodes();
|
||||
/** @brief Clears the internal cached nodes, and generates new ones based on the local region */
|
||||
static void GenerateNodes();
|
||||
/**
|
||||
* @brief Sets the internal Whitelist tiles
|
||||
* @note This will set the internal Whitelist object to the one passed
|
||||
* */
|
||||
static void SetWhitelist(const std::vector<Tile>& W);
|
||||
/**
|
||||
* @brief Sets the internal Blacklist tiles
|
||||
* @note This will set the internal Blacklist object to the one passed
|
||||
* */
|
||||
static void SetBlacklist(const std::vector<Tile>& B);
|
||||
/** @brief Returns the internal TileNode cache generated by GenerateNodes() */
|
||||
static std::vector<std::vector<TileNode>> GetNodes();
|
||||
/** @brief Returns the internal Whitelist cache */
|
||||
static std::vector<Tile> GetWhitelist();
|
||||
/** @brief Returns the internal Blacklist cache */
|
||||
static std::vector<Tile> GetBlacklist();
|
||||
|
||||
static Tile FindWalkableTile(const Tile& T);
|
||||
static Tile FindWalkableTile(const Tile& T, const Tile& Min, const Tile& Max);
|
||||
static std::vector<Tile> FindWalkableTiles(const Tile& T);
|
||||
static std::vector<Tile> FindWalkableTiles(const Tile& T, const Tile& Min, const Tile& Max);
|
||||
|
||||
static std::vector<Tile> FindPathTo(const Tile& Goal, bool AllowOccupied = false, PATHFINDER Finder = BREADTH_FIRST_SEARCH);
|
||||
static std::vector<Tile> FindPathTo(const std::vector<Tile>& Goals, bool AllowOccupied = false, PATHFINDER Finder = BREADTH_FIRST_SEARCH);
|
||||
// Ignores collision
|
||||
static std::vector<Tile> FindDirectPathTo(const Tile& Goal, PATHFINDER Finder = BREADTH_FIRST_SEARCH);
|
||||
static std::vector<Tile> FindDirectPathTo(const std::vector<Tile>& Goals, PATHFINDER Finder = BREADTH_FIRST_SEARCH);
|
||||
static std::vector<Tile> FindPathTo( const Tile& Goal,
|
||||
std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST,
|
||||
PATHFINDER Finder = BREADTH_FIRST_SEARCH );
|
||||
|
||||
static std::vector<Tile> FindPathTo( const std::vector<Tile>& Goals,
|
||||
std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST,
|
||||
PATHFINDER Finder = BREADTH_FIRST_SEARCH );
|
||||
|
||||
static std::vector<Pathfinding::TileNode> FindNodePathTo( const Tile& Goal,
|
||||
std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST,
|
||||
PATHFINDER Finder = BREADTH_FIRST_SEARCH );
|
||||
|
||||
static bool IsInside(std::uint32_t X, std::uint32_t Y);
|
||||
static std::vector<Pathfinding::TileNode*> GetNeighborsTo(std::uint32_t X, std::uint32_t Y, bool AllowOccupied = false, bool CheckCollision = true);
|
||||
static std::vector<Pathfinding::TileNode> Finder_BFS( std::uint32_t StartX, std::uint32_t StartY,
|
||||
std::uint32_t EndX, std::uint32_t EndY,
|
||||
bool AllowOccupied = false, bool CheckCollision = true );
|
||||
|
||||
static std::vector<Pathfinding::TileNode> Finder_BFS( std::uint32_t StartX, std::uint32_t StartY,
|
||||
const std::vector<std::pair<std::uint32_t, std::uint32_t>>& Ends,
|
||||
bool AllowOccupied = false, bool CheckCollision = true );
|
||||
static std::vector<Pathfinding::TileNode> FindNodePathTo( const std::vector<Tile>& Goals,
|
||||
std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST,
|
||||
PATHFINDER Finder = BREADTH_FIRST_SEARCH );
|
||||
private:
|
||||
static std::vector<std::vector<TileNode>> Nodes;
|
||||
static std::vector<Tile> Whitelist;
|
||||
static std::vector<Tile> Blacklist;
|
||||
|
||||
static bool IsInside(std::uint32_t X, std::uint32_t Y);
|
||||
static std::vector<Pathfinding::TileNode*> GetNeighborsTo(std::uint32_t X, std::uint32_t Y, bool CheckCollision = true);
|
||||
|
||||
static std::vector<Pathfinding::TileNode> Finder_BFS( std::uint32_t StartX, std::uint32_t StartY,
|
||||
std::uint32_t EndX, std::uint32_t EndY,
|
||||
std::int32_t Options );
|
||||
static std::vector<Pathfinding::TileNode> Finder_BFS( std::uint32_t StartX, std::uint32_t StartY,
|
||||
const std::vector<std::pair<std::uint32_t, std::uint32_t>>& Ends,
|
||||
std::int32_t Options );
|
||||
};
|
||||
|
||||
#endif // PATHFINDING_HPP_INCLUDED
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue