1 #ifndef LEVEL_SOLID_MAP_HPP_INCLUDED
2 #define LEVEL_SOLID_MAP_HPP_INCLUDED
3 
4 #include <bitset>
5 #include <map>
6 #include <vector>
7 
8 static const int TileSize = 32;
9 
10 typedef std::pair<int,int> tile_pos;
11 typedef std::bitset<TileSize*TileSize> tile_bitmap;
12 
13 struct surface_info {
surface_infosurface_info14 	surface_info() : friction(0), traction(0), damage(-1), info(0)
15 	{}
16 	int friction, traction, damage;
17 	const std::string* info;
18 	static const std::string* get_info_str(const std::string& key);
19 };
20 
21 struct tile_solid_info {
tile_solid_infotile_solid_info22 	tile_solid_info() : all_solid(false)
23 	{}
24 	tile_bitmap bitmap;
25 	surface_info info;
26 	bool all_solid;
27 };
28 
29 class level_solid_map {
30 public:
31 	level_solid_map();
32 	level_solid_map(const level_solid_map& m);
33 	level_solid_map& operator=(const level_solid_map& m);
34 	~level_solid_map();
35 	tile_solid_info& insert_or_find(const tile_pos& pos);
36 	const tile_solid_info* find(const tile_pos& pos) const;
37 	void erase(const tile_pos& pos);
38 	void clear();
39 
40 	void merge(const level_solid_map& m, int xoffset, int yoffset);
41 private:
42 
43 	tile_solid_info** insert_raw(const tile_pos& pos);
44 
45 	struct row {
46 		std::vector<tile_solid_info*> positive_cells, negative_cells;
47 	};
48 
49 	std::vector<row> positive_rows_, negative_rows_;
50 };
51 
52 #endif
53