summaryrefslogtreecommitdiffhomepage
path: root/src/object.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-03-02 11:52:53 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-03-02 11:52:53 +0100
commita6481a7065852cb01846a5dc8a92fd415ba745fb (patch)
tree68321663f06ca3d3b54774e6a649283ef944df81 /src/object.cpp
parent9ff017f1d4c1502fca9797aa4b38351c97e57982 (diff)
w
Diffstat (limited to 'src/object.cpp')
-rw-r--r--src/object.cpp42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/object.cpp b/src/object.cpp
index 041a6d48..208f4fe2 100644
--- a/src/object.cpp
+++ b/src/object.cpp
@@ -213,18 +213,25 @@ bool object::can_move_to(Vector2i delta)
return can_move_to(delta, coord, offset, bbox_offset, bbox_size);
}
-void object::move_to(size_t& i, Vector2i delta, rotation new_r)
+void object::teleport_to(size_t& i, point pt, rotation new_r)
{
- if (!can_rotate(new_r))
- return;
+ return teleport_to(i, pt.coord(), pt.offset(), new_r);
+}
- auto& es = c->_objects;
- fm_debug_assert(i < es.size());
- auto e_ = es[i];
+void object::teleport_to(size_t& i, global_coords coord_, Vector2b offset_, rotation new_r)
+{
+ if (new_r == rotation_COUNT)
+ new_r = r;
+ else if (!atlas->check_rotation(new_r) || true)
+ {
+ const auto& info = atlas->info();
+ const auto *obj = info.object_name.data(), *anim = info.anim_name.data();
+ fm_abort("wrong rotation %d for %s/%s!", (int)new_r, obj, anim);
+ }
+ fm_assert(i < c->_objects.size());
+ const auto e_ = c->_objects[i];
fm_assert(&*e_ == this);
- auto& w = *c->_world;
- const auto [coord_, offset_] = normalize_coords(coord, offset, delta);
if (coord_ == coord && offset_ == offset)
return;
@@ -247,26 +254,37 @@ void object::move_to(size_t& i, Vector2i delta, rotation new_r)
}
else
{
+ auto& w = *c->_world;
+
auto& c2 = w[coord_.chunk3()];
if (!is_dynamic())
c2.mark_scenery_modified();
c2._add_bbox(bb1);
c->remove_object(i);
auto& es = c2._objects;
- auto it = std::lower_bound(es.cbegin(), es.cend(), e_, object_id_lessp);
const_cast<global_coords&>(coord) = coord_;
set_bbox_(offset_, bb_offset, bb_size, pass);
const_cast<rotation&>(r) = new_r;
const_cast<class chunk*&>(c) = &c2;
- i = (size_t)std::distance(es.cbegin(), it);
+ i = (size_t)std::distance(es.cbegin(), std::lower_bound(es.cbegin(), es.cend(), e_, object_id_lessp));
arrayInsert(es, i, move(e_));
}
}
-void object::move_to(Magnum::Vector2i delta)
+
+bool object::move_to(size_t& i, Vector2i delta, rotation new_r)
+{
+ if (!can_rotate(new_r))
+ return false;
+ const auto [coord_, offset_] = normalize_coords(coord, offset, delta);
+ teleport_to(i, coord_, offset_, new_r);
+ return true;
+}
+
+bool object::move_to(Magnum::Vector2i delta)
{
auto i = index();
- move_to(i, delta, r);
+ return move_to(i, delta, r);
}
uint32_t object::allocate_frame_time(Ns dt, uint16_t& accum, uint32_t hz, float speed)