raycaster/src/algos/maze.hpp
2026-03-15 03:20:29 -04:00

53 lines
1.7 KiB
C++

#pragma once
#include "algos/matrix.hpp"
#include "game/map.hpp"
#include "algos/pathing.hpp"
#include <functional>
namespace maze {
struct Builder {
size_t $width = 0;
size_t $height = 0;
Matrix& $walls;
std::vector<Room>& $rooms;
std::vector<Point>& $dead_ends;
std::unordered_map<Point, bool> $ends_map;
Room $no_rooms_region{0,0,0,0};
// BUG: instead of bool map it to the room?
std::unordered_map<Point, bool> $doors;
Pathing $pathing;
Builder(Map& map) :
$width(map.$width), $height(map.$height), $walls(map.$walls),
$rooms(map.$rooms), $dead_ends(map.$dead_ends), $pathing{$width, $height}
{
dbc::check($width % 2 == 1, "map width not an ODD number (perimter dead ends bug)");
dbc::check($height % 2 == 1, "map height not an ODD number (perimter dead ends bug)");
clear();
}
void clear();
void hunt_and_kill(Point on={1,1});
void place_rooms();
void enclose();
void randomize_rooms(size_t room_size);
void inner_donut(float outer_rad, float inner_rad);
void inner_box(size_t outer_size, size_t inner_size);
void divide(Point start, Point end);
void remove_dead_ends();
void dump(const std::string& msg, bool path_too=false);
void open_box(size_t outer_size);
void add_dead_end(Point at);
bool room_should_exist(Room& room, bool allow_dupes=false);
void place_doors();
bool validate();
bool repair();
void punch_dead_end(size_t at_x, size_t at_y, size_t x, size_t y);
bool space_available(size_t x, size_t y);
int compute_paths(size_t x, size_t y);
};
std::pair<Builder, bool> script(Map& map, nlohmann::json& config);
}