#pragma once #include #include #include #include #include #include #include "point.hpp" #include "tser.hpp" #include "lights.hpp" #include "pathing.hpp" #include "matrix.hpp" const int INV_WALL = 0; const int INV_SPACE = 1; const int WALL_VALUE = 1; const int SPACE_VALUE = 0; const int WALL_PATH_LIMIT = 1000; using lighting::LightSource; struct Room { int depth; size_t x = 0; size_t y = 0; size_t width = 0; size_t height = 0; Point entry; Point exit; DEFINE_SERIALIZABLE(Room, x, y, width, height); }; void dump_map(const std::string &msg, Matrix &map, int show_x=-1, int show_y=-1); class Map { public: int $limit; size_t $width; size_t $height; Matrix $walls; Pathing $paths; std::vector $rooms; Map(size_t width, size_t height); Map(Matrix &walls, Pathing &paths, int limit); // disable copying Map(Map &map) = delete; Matrix& paths() { return $paths.paths(); } Matrix& input_map() { return $paths.input(); } Matrix& walls() { return $walls; } int limit() { return $limit; } size_t width() { return $width; } size_t height() { return $height; } int distance(Point to) { return $paths.distance(to); } Room &room(size_t at) { return $rooms[at]; } size_t room_count() { return $rooms.size(); } Point place_entity(size_t room_index); bool inmap(size_t x, size_t y); bool iswall(size_t x, size_t y); bool can_move(Point move_to); bool neighbors(Point &out, bool random=false); void make_paths(); void set_target(const Point &at, int value=0); void clear_target(const Point &at); Point map_to_camera(const Point &loc, const Point &cam_orig); Point center_camera(const Point &around, size_t view_x, size_t view_y); void dump(int show_x=-1, int show_y=-1); bool INVARIANT(); };