summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-10-07 23:48:21 +0200
committerStanislaw Halik <sthalik@misaki.pl>2023-10-07 23:48:21 +0200
commitef47c7d8bcf5c60d086ab24b5d2f9c31a65c57c0 (patch)
tree02d3ff558f1a92a99fef12dab83b69079d509a7e /src
parent823aeb462cd46114ac290c0a415879f96d69c18e (diff)
a
Diffstat (limited to 'src')
-rw-r--r--src/object.cpp2
-rw-r--r--src/object.hpp2
-rw-r--r--src/path-search-dijkstra.cpp12
3 files changed, 14 insertions, 2 deletions
diff --git a/src/object.cpp b/src/object.cpp
index 3c2be9ef..1d089bf6 100644
--- a/src/object.cpp
+++ b/src/object.cpp
@@ -112,7 +112,7 @@ void object::rotate(size_t, rotation new_r)
template <typename T> constexpr T sgn(T val) { return T(T(0) < val) - T(val < T(0)); }
-Pair<global_coords, Vector2b> object::normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i new_offset)
+point object::normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i new_offset)
{
auto off_tmp = Vector2i(cur_offset) + new_offset;
auto off_new = off_tmp % iTILE_SIZE2;
diff --git a/src/object.hpp b/src/object.hpp
index fca4640d..41ea1f97 100644
--- a/src/object.hpp
+++ b/src/object.hpp
@@ -75,7 +75,7 @@ struct object
virtual void set_bbox(Vector2b offset, Vector2b bbox_offset, Vector2ub bbox_size, pass_mode pass);
object_type type_of() const noexcept;
- static Pair<global_coords, Vector2b> normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i delta);
+ static point normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i delta);
virtual bool is_dynamic() const;
bool can_rotate(rotation new_r);
diff --git a/src/path-search-dijkstra.cpp b/src/path-search-dijkstra.cpp
index beb87ddd..2fbc11e0 100644
--- a/src/path-search-dijkstra.cpp
+++ b/src/path-search-dijkstra.cpp
@@ -124,6 +124,14 @@ size_t astar::edge_hash::operator()(const edge& e) const
#endif
}
+constexpr astar::edge make_edge(const point& a, const point& b)
+{
+ if (a < b)
+ return { a.coord, b.coord, a.offset, b.offset };
+ else
+ return { b.coord, a.coord, b.offset, a.offset };
+}
+
path_search_result path_search::Dijkstra(world& w, Vector2ub own_size, const object_id own_id,
const point from_, const point to_, const pred& p)
{
@@ -201,6 +209,10 @@ path_search_result path_search::Dijkstra(world& w, Vector2ub own_size, const obj
continue;
auto [new_coord, new_offset] = object::normalize_coords(node.coord, node.offset, vec);
+
+ if (!astar.edges.insert(make_edge({node.coord, node.offset}, {new_coord, new_offset})).second)
+ continue;
+
auto [it, found] = astar.indexes.try_emplace({.coord = new_coord, .offset = new_offset}, (uint32_t)-1);
if (!found)
{