#pragma once #include #include #include #include "Game/SaveMap/SaveMap.h" class GameInstance; class World; struct WorldFactory { const char* world_name; World*(*factory)(GameInstance&); }; // Создаёт ассоцеативный список // В нём соспоставляются имина уровней и фабрики их классов #define WORLDS_LIST std::vector world_factories = // Генерирует элемент списка #define GENERATE_WORLD_FACTORY(Class, WorldName) WorldFactory{#WorldName,\ [](GameInstance& game_insance)->World* {\ Class* world = new Class(game_insance);\ std::ifstream config_file("./Worlds/" #WorldName ".world");\ if (config_file.fail())\ throw std::runtime_error("Can't open world file");\ std::string data;\ std::getline(config_file, data);\ world->load(std::make_shared(data));\ return world;\ }}, /* * Пример использования: WORLDS_LIST { GENERATE_WORLD_FACTORY(Sometime_class_world_One, WorldName_One) GENERATE_WORLD_FACTORY(Sometime_class_world_Two, WorldName_Two) }; */