diff --git a/map.cpp b/map.cpp index 1872dfe..fe11a27 100644 --- a/map.cpp +++ b/map.cpp @@ -105,18 +105,7 @@ void Map::make_room(size_t origin_x, size_t origin_y, size_t w, size_t h) { } } -struct Partition; - -struct Partition { - size_t x = 0; - size_t y = 0; - size_t width = 0; - size_t height = 0; - - std::vector next; -}; - -inline int make_split(std::mt19937 &gen, Partition &cur, bool horiz) { +inline int make_split(std::mt19937 &gen, Room &cur, bool horiz) { println("MAKE SPLIT horiz={}, y={}, w={}, h={}", horiz, cur.y, cur.width, cur.height); size_t dimension = horiz ? cur.height : cur.width; @@ -127,13 +116,13 @@ inline int make_split(std::mt19937 &gen, Partition &cur, bool horiz) { return rand_dim(gen); } -void partition_map(std::mt19937 &gen, Partition &cur, int depth) { +void Map::partition_map(std::mt19937 &gen, Room &cur, int depth) { println(">>>> DEPTH: {}", depth); std::uniform_int_distribution rsplit(0, 1); bool horiz = cur.width > cur.height ? false : true; int split = make_split(gen, cur, horiz); - Partition left; - Partition right; + Room left; + Room right; if(horiz) { println("HORIZ split={}, x={}, y={}, w={}, h={}", @@ -193,23 +182,23 @@ void partition_map(std::mt19937 &gen, Partition &cur, int depth) { } } -void draw_map(Map *map, Partition &cur) { - if(cur.x + cur.width <= map->width() - && cur.y + cur.height <= map->height()) +void Map::draw_map(Room &cur) { + if(cur.x + cur.width <= width() + && cur.y + cur.height <= height()) { println("CUR NEXT SIZE: {}", cur.next.size()); if(cur.next.size() == 1) { - draw_map(map, cur.next[0]); // left + draw_map(cur.next[0]); // left } else if(cur.next.size() == 2) { - draw_map(map, cur.next[0]); // left - draw_map(map, cur.next[1]); // right + draw_map(cur.next[0]); // left + draw_map(cur.next[1]); // right } else { println("LEAF NODE NO CHILDREN x={}, y={}, w={}, h={}", cur.x, cur.y, cur.width, cur.height); - map->make_room(cur.x+1, cur.y+1, cur.width-2, cur.height-2); + make_room(cur.x+1, cur.y+1, cur.width-2, cur.height-2); } } else { println("ABORT in draw_map, x={}, y={}, w={}, h={}, map.w={}, map.h={}", - cur.x, cur.y, cur.width, cur.height, map->width(), map->height()); + cur.x, cur.y, cur.width, cur.height, width(), height()); } } @@ -217,7 +206,7 @@ void Map::generate() { std::random_device rd; std::mt19937 gen(rd()); - Partition root{ + Room root{ .x = 0, .y = 0, .width = width(), @@ -225,5 +214,5 @@ void Map::generate() { }; partition_map(gen, root, 6); - draw_map(this, root); // left + draw_map(root); // left } diff --git a/map.hpp b/map.hpp index d927d5b..0dedc4d 100644 --- a/map.hpp +++ b/map.hpp @@ -2,12 +2,24 @@ #include #include #include +#include struct Pair { size_t j = 0; size_t i = 0; }; +struct Room; + +struct Room { + size_t x = 0; + size_t y = 0; + size_t width = 0; + size_t height = 0; + + std::vector next; +}; + typedef std::vector PairList; typedef std::vector MatrixRow; typedef std::vector Matrix; @@ -22,7 +34,17 @@ class Map { int m_limit = 0; public: - void make_paths(); + // make explicit + Map(Matrix input_map, Matrix walls_map, int limit) : + m_input_map(input_map), + m_walls(walls_map), m_limit(limit) { + } + + // make random + Map(size_t width, size_t height); + + // disable copying + Map(Map &map) = delete; Matrix& paths() { return m_paths; } Matrix& input_map() { return m_input_map; } @@ -33,20 +55,14 @@ public: void make_room(size_t origin_y, size_t origin_x, size_t width, size_t height); + void generate(); + void draw_map(Room &root); + void make_paths(); + void partition_map(std::mt19937 &gen, Room &cur, int depth); + void dump() { dump_map("PATHS", m_paths); dump_map("WALLS", m_walls); dump_map("INPUT", m_input_map); } - - void generate(); - - Map(Matrix input_map, Matrix walls_map, int limit) : - m_input_map(input_map), - m_walls(walls_map), m_limit(limit) { - } - - Map(size_t width, size_t height); - - Map(Map &map) = delete; };