#include "World.hpp" #include "Game/SaveMap/SaveMap.hpp" World::World(GameInstance& game_instance) : game_instance_(game_instance) { } World::~World() { for (auto& i : actors_map) i.second->OnDestroy(); actors_map.clear(); } void World::BeginPlay() { for (auto& i : actors_map) i.second->BeginPlay(); } void World::Tick(double delta_time) { for (auto& i : actors_map) i.second->Tick(delta_time); } std::shared_ptr World::save() { std::shared_ptr save = std::make_shared("World"); std::vector ActorsIDs; ActorsIDs.reserve(actors_map.size()); std::list> actors; for (auto[it, flag] : actors_map) { ActorsIDs.push_back(it); actors.push_back(flag); } save->SaveVectorStrings("ActorsIDs", std::move(ActorsIDs)); save->SaveListObject("Actors", std::move(actors)); return save; } void World::load(std::shared_ptr save) { std::vector actors_IDs = save->GetVectorString("ActorsIDs"); std::list> act = std::move(reinterpret_cast>&>(save->GetListObject("Actors"))); size_t i_id = 0; for (auto& i : act) { auto[it, flag] = actors_map.try_emplace(actors_IDs[i_id], i); it->second->world_ = this; it->second->name_ = it->first; i_id++; } } void World::DestroyActor(std::weak_ptr ptr) { std::shared_ptr actor = ptr.lock(); if (actor.get() == nullptr) return; std::string name = actor->GetName(); actor->OnDestroy(); actors_map.erase(name); }