|  |  | @ -217,12 +217,16 @@ static void clean_ramps(MapExtras::MapCache &map, const DFCoord &pos) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     clean_ramp(map, DFCoord(pos.x, pos.y+1, pos.z)); |  |  |  |     clean_ramp(map, DFCoord(pos.x, pos.y+1, pos.z)); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | // returns material type of walls at the given position, or -1 if not a wall
 |  |  |  | // returns material type of prospective boulders generated by the wall tile at
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | static int16_t get_wall_mat(MapExtras::MapCache &map, const DFCoord &pos) { |  |  |  | // the given position, or -1 if not a boulderable wall
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static int16_t get_boulder_mat(MapExtras::MapCache &map, const DFCoord &pos) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     df::tiletype tt = map.tiletypeAt(pos); |  |  |  |     df::tiletype tt = map.tiletypeAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |     df::tiletype_shape shape = tileShape(tt); |  |  |  |     df::tiletype_shape shape = tileShape(tt); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     df::tiletype_material tmat = tileMaterial(tt); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (shape != df::tiletype_shape::WALL) |  |  |  |     if (shape != df::tiletype_shape::WALL | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             || (tmat != df::tiletype_material::STONE | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 && tmat != df::tiletype_material::MINERAL)) | 
			
		
	
		
		
			
				
					
					|  |  |  |         return -1; |  |  |  |         return -1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     t_matpair matpair; |  |  |  |     t_matpair matpair; | 
			
		
	
	
		
		
			
				
					|  |  | @ -235,7 +239,7 @@ static int16_t get_wall_mat(MapExtras::MapCache &map, const DFCoord &pos) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, |  |  |  | static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |                      const DFCoord &pos, df::tile_dig_designation designation, |  |  |  |                      const DFCoord &pos, df::tile_dig_designation designation, | 
			
		
	
		
		
			
				
					
					|  |  |  |                      int16_t *wall_mat) { |  |  |  |                      int16_t *boulder_mat) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     df::tiletype tt = map.tiletypeAt(pos); |  |  |  |     df::tiletype tt = map.tiletypeAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // TODO: handle tree trunks, roots, and surface tiles
 |  |  |  |     // TODO: handle tree trunks, roots, and surface tiles
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -243,7 +247,7 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (!isGroundMaterial(tile_mat)) |  |  |  |     if (!isGroundMaterial(tile_mat)) | 
			
		
	
		
		
			
				
					
					|  |  |  |         return false; |  |  |  |         return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     *wall_mat = get_wall_mat(map, pos); |  |  |  |     *boulder_mat = get_boulder_mat(map, pos); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     df::tiletype target_type = df::tiletype::Void; |  |  |  |     df::tiletype target_type = df::tiletype::Void; | 
			
		
	
		
		
			
				
					
					|  |  |  |     switch(designation) { |  |  |  |     switch(designation) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -265,7 +269,7 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |                 DFCoord pos_below(pos.x, pos.y, pos.z-1); |  |  |  |                 DFCoord pos_below(pos.x, pos.y, pos.z-1); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (map.ensureBlockAt(pos_below) && |  |  |  |                 if (map.ensureBlockAt(pos_below) && | 
			
		
	
		
		
			
				
					
					|  |  |  |                         dig_tile(out, map, pos_below, |  |  |  |                         dig_tile(out, map, pos_below, | 
			
		
	
		
		
			
				
					
					|  |  |  |                                  df::tile_dig_designation::Ramp, wall_mat)) { |  |  |  |                                  df::tile_dig_designation::Ramp, boulder_mat)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     clean_ramps(map, pos_below); |  |  |  |                     clean_ramps(map, pos_below); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     // if we successfully dug out the ramp below, that took care
 |  |  |  |                     // if we successfully dug out the ramp below, that took care
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     // of the ramp top here
 |  |  |  |                     // of the ramp top here
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -297,7 +301,7 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (can_dig_ramp(tt)) { |  |  |  |             if (can_dig_ramp(tt)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 target_type = findSimilarTileType(tt, df::tiletype_shape::RAMP); |  |  |  |                 target_type = findSimilarTileType(tt, df::tiletype_shape::RAMP); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 DFCoord pos_above(pos.x, pos.y, pos.z+1); |  |  |  |                 DFCoord pos_above(pos.x, pos.y, pos.z+1); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 wall_mat[1] = get_wall_mat(map, pos_above); |  |  |  |                 boulder_mat[1] = get_boulder_mat(map, pos_above); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 if (target_type != tt && map.ensureBlockAt(pos_above)) { |  |  |  |                 if (target_type != tt && map.ensureBlockAt(pos_above)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     // set tile type directly instead of calling dig_shape
 |  |  |  |                     // set tile type directly instead of calling dig_shape
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                     // because we need to use *this* tile's material, not the
 |  |  |  |                     // because we need to use *this* tile's material, not the
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -327,12 +331,60 @@ static bool dig_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |     return true; |  |  |  |     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // connects adjacent smooth walls to our new smooth wall
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static bool adjust_smooth_wall_dir(MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                    const DFCoord &pos, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                    TileDirection adjacent_tdir) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     df::tiletype tt = map.tiletypeAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (tileSpecial(tt) != df::tiletype_special::SMOOTH | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 || tileShape(tt) != df::tiletype_shape::WALL) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     TileDirection tdir = tileDirection(tt); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     tdir.whole |= adjacent_tdir.whole; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     tt = findTileType(tileShape(tt), tileMaterial(tt), tileVariant(tt), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                       tileSpecial(tt), tdir); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (tt == df::tiletype::Void) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     map.setTiletypeAt(pos, tt); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // assumes that if the game let you designate a tile for smoothing, it must be
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // valid to do so.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static bool smooth_tile(color_ostream &out, MapExtras::MapCache &map, |  |  |  | static bool smooth_tile(color_ostream &out, MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |                         const DFCoord &pos) { |  |  |  |                         const DFCoord &pos) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     // TODO
 |  |  |  |     df::tiletype tt = map.tiletypeAt(pos); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     TileDirection tdir; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (tileShape(tt) == df::tiletype_shape::WALL) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (adjust_smooth_wall_dir(map, DFCoord(pos.x, pos.y-1, pos.z), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                 TileDirection(1, 1, 0, 0))) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             tdir.north = tdir.south = 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (adjust_smooth_wall_dir(map, DFCoord(pos.x, pos.y+1, pos.z), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                 TileDirection(1, 1, 0, 0))) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             tdir.north = tdir.south = 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (adjust_smooth_wall_dir(map, DFCoord(pos.x-1, pos.y, pos.z), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                 TileDirection(0, 0, 1, 1))) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             tdir.east = tdir.west = 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (adjust_smooth_wall_dir(map, DFCoord(pos.x+1, pos.y, pos.z), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                 TileDirection(0, 0, 1, 1))) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             tdir.east = tdir.west = 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     tt = findTileType(tileShape(tt), tileMaterial(tt), tileVariant(tt), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                       df::tiletype_special::SMOOTH, tdir); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (tt == df::tiletype::Void) | 
			
		
	
		
		
			
				
					
					|  |  |  |         return false; |  |  |  |         return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     map.setTiletypeAt(pos, tt); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // assumes that if the game let you designate a tile for track carving, it must
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // be valid to do so.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static bool carve_tile(MapExtras::MapCache &map, |  |  |  | static bool carve_tile(MapExtras::MapCache &map, | 
			
		
	
		
		
			
				
					
					|  |  |  |                        const DFCoord &pos, df::tile_occupancy &to) { |  |  |  |                        const DFCoord &pos, df::tile_occupancy &to) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     df::tiletype tt = map.tiletypeAt(pos); |  |  |  |     df::tiletype tt = map.tiletypeAt(pos); | 
			
		
	
	
		
		
			
				
					|  |  | @ -397,19 +449,19 @@ static void do_dig(color_ostream &out, std::vector<DFCoord> &dug_coords, | 
			
		
	
		
		
			
				
					
					|  |  |  |                 df::tile_designation td = map.designationAt(pos); |  |  |  |                 df::tile_designation td = map.designationAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 df::tile_occupancy to = map.occupancyAt(pos); |  |  |  |                 df::tile_occupancy to = map.occupancyAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (td.bits.dig != df::tile_dig_designation::No) { |  |  |  |                 if (td.bits.dig != df::tile_dig_designation::No) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     int16_t wall_mat[2]; |  |  |  |                     int16_t boulder_mat[2]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     memset(wall_mat, -1, sizeof(wall_mat)); |  |  |  |                     memset(boulder_mat, -1, sizeof(boulder_mat)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if (dig_tile(out, map, pos, td.bits.dig, wall_mat)) { |  |  |  |                     if (dig_tile(out, map, pos, td.bits.dig, boulder_mat)) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         td = map.designationAt(pos); |  |  |  |                         td = map.designationAt(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         td.bits.dig = df::tile_dig_designation::No; |  |  |  |                         td.bits.dig = df::tile_dig_designation::No; | 
			
		
	
		
		
			
				
					
					|  |  |  |                         map.setDesignationAt(pos, td); |  |  |  |                         map.setDesignationAt(pos, td); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         dug_coords.push_back(pos); |  |  |  |                         dug_coords.push_back(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         for (size_t i = 0; i < 2; ++i) { |  |  |  |                         for (size_t i = 0; i < 2; ++i) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                             if (wall_mat[i] < 0) |  |  |  |                             if (boulder_mat[i] < 0) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                                 continue; |  |  |  |                                 continue; | 
			
		
	
		
		
			
				
					
					|  |  |  |                             if (produces_boulder(options, rng, |  |  |  |                             if (produces_boulder(options, rng, | 
			
		
	
		
		
			
				
					
					|  |  |  |                                     map.BlockAtTile(pos)->veinTypeAt(pos))) { |  |  |  |                                     map.BlockAtTile(pos)->veinTypeAt(pos))) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 boulder_coords[wall_mat[i]].push_back(pos); |  |  |  |                                 boulder_coords[boulder_mat[i]].push_back(pos); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                             } |  |  |  |                             } | 
			
		
	
		
		
			
				
					
					|  |  |  |                         } |  |  |  |                         } | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |