#pragma once
#include <memory>
#include <vector>
#include "object.hpp"
/**
* @file
* @brief Procedurally generate a maze for building a level scene with objects and lights.
*
* Bases on a pseudo-random generator with a seed that defines the whole level.
*/
/** @brief Container for the final results of generating a level. */
struct Level {
Level(PRNG&&, fcoord_t, res_t, vertex2_t<fcoord_t>);
TextureFactory texture_factory;
LightFactory light_factory;
std::vector<std::unique_ptr<const Object>> objects{};
std::vector<std::pair<vertex_t, const PointLight*>> lights{};
std::vector<vertex_t> rooms{}; ///< center of each level room (benchmark waypoints)
vertex2_t<fcoord_t> start{}; ///< where the player should initially start
vertex2_t<fcoord_t> end{}; ///< target position of level finish
};
/** @brief Reduced interface for the whole seed -> level startup process. */
std::unique_ptr<const Level> generate(PRNG::result_type seed, vertex2_t<dcoord_t> min, vertex2_t<dcoord_t> med,
vertex2_t<dcoord_t> max, vertex2_t<dcoord_t> dim, vertex_t tile_dim);