Files
MultilevelAStarExt/src/MultilevelAStarEx.h
2024-06-06 00:02:18 +02:00

90 lines
1.7 KiB
C++

#ifndef MultilevelAStarEx_H
#define MultilevelAStarEx_H
#include <gdextension_interface.h>
#include <godot_cpp/classes/ref.hpp>
#include <godot_cpp/variant/array.hpp>
#include <godot_cpp/variant/vector2i.hpp>
#include <vector>
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<TerrainType> _terrain;
std::vector<bool> _units;
std::vector<Node> _nodes;
Rect2i _region;
Vector2i _trans;
int _width, _height;
bool can_move(const Node *current, int x, int y) const;
TypedArray<Vector2i> generate_path(const Node *current) const;
protected:
static void _bind_methods();
public:
MultilevelAStarEx();
~MultilevelAStarEx();
void init(const Rect2i &region);
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<Vector2i> find_path(const Vector2i &from, const Vector2i &to, bool return_closest);
};
}
VARIANT_ENUM_CAST(MultilevelAStarEx::TerrainType);
#endif