#ifndef MultilevelAStarEx_H #define MultilevelAStarEx_H #include #include #include #include #include namespace godot { class Node { friend class MultilevelAStarEx; public: enum NodeState { UNUSED, OPEN, CLOSED }; private: int openPass, closedPass; int x, y; Node *parent; int distanceFromStart; int distanceToEnd; int distanceToEndForClosest; static bool compare_nodes(const Node *left, const Node *right); Node(int x, int y); void open(int pass, Node *parent, int distanceFromStart, const Vector2i &end); void close(int pass); NodeState state(int pass) const; int total_cost() const; public: Node(); }; class MultilevelAStarEx : public RefCounted { GDCLASS(MultilevelAStarEx, RefCounted) public: enum TerrainType { STAIRS = -1, BLOCKED = 0, GROUND = 1, }; private: bool _init; int _pass; std::vector _terrain; std::vector _units; std::vector _nodes; Rect2i _region; Vector2i _trans; int _width, _height; bool can_move(const Node *current, int x, int y) const; TypedArray generate_path(const Node *current) const; protected: static void _bind_methods(); public: MultilevelAStarEx(); ~MultilevelAStarEx(); void init(const Rect2i ®ion); Rect2i get_region() const; void set_terrain(const Vector2i &cell, TerrainType type); TerrainType get_terrain(const Vector2i &cell) const; void set_unit(const Vector2i &cell, bool blocked); bool get_unit(const Vector2i &cell) const; TypedArray find_path(const Vector2i &from, const Vector2i &to, bool return_closest); }; } VARIANT_ENUM_CAST(MultilevelAStarEx::TerrainType); #endif