summaryrefslogtreecommitdiffhomepage
path: root/src/world.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-05-02 16:34:05 +0200
committerStanislaw Halik <sthalik@misaki.pl>2024-05-02 22:35:39 +0200
commit6abcd7d52cda334c58ec999d212491fc24f13c9d (patch)
tree86998508afe8eb7447ad70a2d5beebdbc9995a8f /src/world.cpp
parent03b67a512ec9ef1cf5c337aa5c47a5a76d4a8a61 (diff)
script lifecycle mostly implemented
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());