From 594aae4221240eaf8d69ce9522a970efec071f89 Mon Sep 17 00:00:00 2001 From: Kasi Date: Wed, 25 Jul 2018 03:46:17 +0100 Subject: [PATCH] Release 0.77 --- Include/Core/Types/Counter.hpp | 35 +--------- Include/Game/Tools/Pathfinding.hpp | 102 +++++++++++++++++++++-------- Library/libAlpacaLibrary.a | Bin 5599486 -> 5604654 bytes 3 files changed, 77 insertions(+), 60 deletions(-) diff --git a/Include/Core/Types/Counter.hpp b/Include/Core/Types/Counter.hpp index 6ae960d..8323f1b 100644 --- a/Include/Core/Types/Counter.hpp +++ b/Include/Core/Types/Counter.hpp @@ -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(); diff --git a/Include/Game/Tools/Pathfinding.hpp b/Include/Game/Tools/Pathfinding.hpp index 266c3fe..1c122d9 100644 --- a/Include/Game/Tools/Pathfinding.hpp +++ b/Include/Game/Tools/Pathfinding.hpp @@ -5,6 +5,9 @@ #include #include +/** + * @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 { + /** Breadth-first search algorithim */ 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 For pathfinding use only */ 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 For pathfinding use only */ 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& 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& B); + /** @brief Returns the internal TileNode cache generated by GenerateNodes() */ static std::vector> GetNodes(); + /** @brief Returns the internal Whitelist cache */ + static std::vector GetWhitelist(); + /** @brief Returns the internal Blacklist cache */ + static std::vector GetBlacklist(); static Tile FindWalkableTile(const Tile& T); static Tile FindWalkableTile(const Tile& T, const Tile& Min, const Tile& Max); static std::vector FindWalkableTiles(const Tile& T); static std::vector FindWalkableTiles(const Tile& T, const Tile& Min, const Tile& Max); - static std::vector FindPathTo(const Tile& Goal, bool AllowOccupied = false, PATHFINDER Finder = BREADTH_FIRST_SEARCH); - static std::vector FindPathTo(const std::vector& Goals, bool AllowOccupied = false, PATHFINDER Finder = BREADTH_FIRST_SEARCH); - // Ignores collision - static std::vector FindDirectPathTo(const Tile& Goal, PATHFINDER Finder = BREADTH_FIRST_SEARCH); - static std::vector FindDirectPathTo(const std::vector& Goals, PATHFINDER Finder = BREADTH_FIRST_SEARCH); + static std::vector FindPathTo( const Tile& Goal, + std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST, + PATHFINDER Finder = BREADTH_FIRST_SEARCH ); + static std::vector FindPathTo( const std::vector& Goals, + std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST, + PATHFINDER Finder = BREADTH_FIRST_SEARCH ); + static std::vector 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 GetNeighborsTo(std::uint32_t X, std::uint32_t Y, bool AllowOccupied = false, bool CheckCollision = true); - static std::vector 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 Finder_BFS( std::uint32_t StartX, std::uint32_t StartY, - const std::vector>& Ends, - bool AllowOccupied = false, bool CheckCollision = true ); + static std::vector FindNodePathTo( const std::vector& Goals, + std::int32_t Options = CHECK_COLLISION | CHECK_WHITELIST | CHECK_BLACKLIST, + PATHFINDER Finder = BREADTH_FIRST_SEARCH ); private: static std::vector> Nodes; + static std::vector Whitelist; + static std::vector Blacklist; + + static bool IsInside(std::uint32_t X, std::uint32_t Y); + static std::vector GetNeighborsTo(std::uint32_t X, std::uint32_t Y, bool CheckCollision = true); + + static std::vector 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 Finder_BFS( std::uint32_t StartX, std::uint32_t StartY, + const std::vector>& Ends, + std::int32_t Options ); }; #endif // PATHFINDING_HPP_INCLUDED diff --git a/Library/libAlpacaLibrary.a b/Library/libAlpacaLibrary.a index 7c6788f09f920a7d658cb44270a0fc854dc096df..ff6d38ead6817d7f862be3db7f3cc09482a1a55a 100644 GIT binary patch delta 46795 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 A9RL6T delta 43644 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 Wu0?aiyQw+s