85 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| #include <vector>
 | |
| #include <utility>
 | |
| #include <string>
 | |
| #include <random>
 | |
| 
 | |
| #define INV_WALL 0
 | |
| #define INV_SPACE 1
 | |
| 
 | |
| #define WALL_VALUE 1
 | |
| #define SPACE_VALUE 0
 | |
| 
 | |
| struct Point {
 | |
|   size_t x = 0;
 | |
|   size_t y = 0;
 | |
| };
 | |
| 
 | |
| struct Room;
 | |
| 
 | |
| struct Room {
 | |
|   size_t x = 0;
 | |
|   size_t y = 0;
 | |
|   size_t width = 0;
 | |
|   size_t height = 0;
 | |
|   Point entry;
 | |
|   Point exit;
 | |
| };
 | |
| 
 | |
| typedef std::vector<Point> PointList;
 | |
| typedef std::vector<int> MatrixRow;
 | |
| typedef std::vector<MatrixRow> Matrix;
 | |
| 
 | |
| void dump_map(const std::string &msg, Matrix &map);
 | |
| void add_neighbors(Matrix &closed, size_t j, size_t i);
 | |
| 
 | |
| class Map {
 | |
|   Matrix m_input_map;
 | |
|   Matrix m_walls;
 | |
|   Matrix m_paths;
 | |
|   std::vector<Room> m_rooms;
 | |
|   int m_limit = 0;
 | |
| public:
 | |
| 
 | |
|   // 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; }
 | |
|   Matrix& walls() { return m_walls; }
 | |
|   int limit() { return m_limit; }
 | |
|   size_t width() { return m_walls[0].size(); }
 | |
|   size_t height() { return m_walls.size(); }
 | |
|   Room &room(size_t at) {
 | |
|     return m_rooms[at];
 | |
|   }
 | |
| 
 | |
|   size_t room_count() {
 | |
|     return m_rooms.size();
 | |
|   }
 | |
| 
 | |
|   void make_room(size_t origin_y, size_t origin_x, size_t width, size_t height);
 | |
| 
 | |
|   void add_door(Room &room);
 | |
|   bool inmap(size_t x, size_t y);
 | |
|   bool iswall(size_t x, size_t y);
 | |
|   bool neighbors(Point &out, bool up);
 | |
|   void generate();
 | |
|   void place_rooms(Room &root);
 | |
|   void make_paths();
 | |
|   void partition_map(Room &cur, int depth);
 | |
|   void set_target(Point &at, int value=0);
 | |
|   void clear_target(Point &at);
 | |
|   bool walk(Point &src, Point &target);
 | |
|   void set_door(Room &room, int value);
 | |
|   void dump();
 | |
| };
 | 
