summaryrefslogtreecommitdiffhomepage
path: root/src/world.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/world.cpp')
-rw-r--r--src/world.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/world.cpp b/src/world.cpp
index e3fae3c3..975181c0 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -44,6 +44,11 @@ world::world(std::unordered_map<chunk_coords_, chunk>&& chunks) :
world& world::operator=(world&& w) noexcept
{
fm_debug_assert(&w != this);
+ fm_assert(!w._script_initialized);
+ fm_assert(!w._script_finalized);
+ fm_assert(!_script_initialized || _script_finalized);
+ _script_initialized = false;
+ _script_finalized = false;
fm_assert(!w._teardown);
fm_assert(!_teardown);
fm_assert(w._unique_id);
@@ -69,6 +74,7 @@ world::world() : world{initial_capacity}
world::~world() noexcept
{
+ fm_assert(_script_finalized || !_script_initialized);
for (auto& [k, c] : _chunks)
c.on_teardown();
_teardown = true;
@@ -231,6 +237,31 @@ critter_proto world::make_player_proto()
return cproto;
}
+bool world::is_teardown() const { return _teardown; }
+
+void world::init_scripts()
+{
+ fm_assert(!_script_initialized);
+ _script_initialized = true;
+ for (auto& [k, c] : _chunks)
+ for (const auto& obj : c.objects())
+ obj->init_script(obj);
+}
+
+void world::finish_scripts()
+{
+ fm_assert(_script_initialized);
+ fm_assert(!_script_finalized);
+ _script_finalized = true;
+
+ for (auto& [k, c] : _chunks)
+ for (const auto& obj : c.objects())
+ obj->destroy_script_pre(obj, script_destroy_reason::quit);
+ for (auto& [k, c] : _chunks)
+ for (const auto& obj : c.objects())
+ obj->destroy_script_post();
+}
+
shared_ptr_wrapper<critter> world::ensure_player_character(object_id& id)
{
return ensure_player_character(id, make_player_proto());