|  |  | @ -240,9 +240,9 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &) | 
			
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("ResetMapHashes", ResetMapHashes); |  |  |  |     svc->addFunction("ResetMapHashes", ResetMapHashes); | 
			
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("GetItemList", GetItemList); |  |  |  |     svc->addFunction("GetItemList", GetItemList); | 
			
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("GetBuildingDefList", GetBuildingDefList); |  |  |  |     svc->addFunction("GetBuildingDefList", GetBuildingDefList); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	svc->addFunction("GetWorldMap", GetWorldMap); |  |  |  |     svc->addFunction("GetWorldMap", GetWorldMap); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	svc->addFunction("GetWorldMapNew", GetWorldMapNew); |  |  |  |     svc->addFunction("GetWorldMapNew", GetWorldMapNew); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	svc->addFunction("GetRegionMaps", GetRegionMaps); |  |  |  |     svc->addFunction("GetRegionMaps", GetRegionMaps); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("GetRegionMapsNew", GetRegionMapsNew); |  |  |  |     svc->addFunction("GetRegionMapsNew", GetRegionMapsNew); | 
			
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("GetCreatureRaws", GetCreatureRaws); |  |  |  |     svc->addFunction("GetCreatureRaws", GetCreatureRaws); | 
			
		
	
		
		
			
				
					
					|  |  |  |     svc->addFunction("GetWorldMapCenter", GetWorldMapCenter); |  |  |  |     svc->addFunction("GetWorldMapCenter", GetWorldMapCenter); | 
			
		
	
	
		
		
			
				
					|  |  | @ -855,6 +855,22 @@ static command_result CheckHashes(color_ostream &stream, const EmptyMessage *in) | 
			
		
	
		
		
			
				
					
					|  |  |  |     return CR_OK; |  |  |  |     return CR_OK; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void CopyMat(RemoteFortressReader::MatPair * mat, int type, int index) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (type >= MaterialInfo::FIGURE_BASE && type < MaterialInfo::PLANT_BASE) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         df::historical_figure * figure = df::historical_figure::find(index); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (figure) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             type -= MaterialInfo::GROUP_SIZE; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             index = figure->race; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     mat->set_mat_type(type); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     mat->set_mat_index(index); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | map<DFCoord, uint16_t> hashes; |  |  |  | map<DFCoord, uint16_t> hashes; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | //check if the tiletypes have changed
 |  |  |  | //check if the tiletypes have changed
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -919,102 +935,102 @@ map<DFCoord, uint16_t> spatterHashes; | 
			
		
	
		
		
			
				
					
					|  |  |  | //check if map spatters have changed
 |  |  |  | //check if map spatters have changed
 | 
			
		
	
		
		
			
				
					
					|  |  |  | bool IsspatterChanged(DFCoord pos) |  |  |  | bool IsspatterChanged(DFCoord pos) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	df::map_block * block = Maps::getBlock(pos); |  |  |  |     df::map_block * block = Maps::getBlock(pos); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	bool changed = false; |  |  |  |     bool changed = false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	std::vector<df::block_square_event_material_spatterst *> materials; |  |  |  |     std::vector<df::block_square_event_material_spatterst *> materials; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	std::vector<df::block_square_event_item_spatterst *> items; |  |  |  |     std::vector<df::block_square_event_item_spatterst *> items; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!Maps::SortBlockEvents(block, NULL, NULL, &materials, NULL, NULL, NULL, &items)) |  |  |  |     if (!Maps::SortBlockEvents(block, NULL, NULL, &materials, NULL, NULL, NULL, &items)) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return false; |  |  |  |         return false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	uint16_t hash = 0; |  |  |  |     uint16_t hash = 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for each (auto mat in materials) |  |  |  |     for each (auto mat in materials) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		hash ^= fletcher16((uint8_t*)mat, sizeof(df::block_square_event_material_spatterst)); |  |  |  |         hash ^= fletcher16((uint8_t*)mat, sizeof(df::block_square_event_material_spatterst)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for each (auto mat in items) |  |  |  |     for each (auto mat in items) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		hash ^= fletcher16((uint8_t*)mat, sizeof(df::block_square_event_item_spatterst)); |  |  |  |         hash ^= fletcher16((uint8_t*)mat, sizeof(df::block_square_event_item_spatterst)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (spatterHashes[pos] != hash) |  |  |  |     if (spatterHashes[pos] != hash) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		spatterHashes[pos] = hash; |  |  |  |         spatterHashes[pos] = hash; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return true; |  |  |  |         return true; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return false; |  |  |  |     return false; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static command_result ResetMapHashes(color_ostream &stream, const EmptyMessage *in) |  |  |  | static command_result ResetMapHashes(color_ostream &stream, const EmptyMessage *in) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	hashes.clear(); |  |  |  |     hashes.clear(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	waterHashes.clear(); |  |  |  |     waterHashes.clear(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	buildingHashes.clear(); |  |  |  |     buildingHashes.clear(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	spatterHashes.clear(); |  |  |  |     spatterHashes.clear(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return CR_OK; |  |  |  |     return CR_OK; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | df::matter_state GetState(df::material * mat, uint16_t temp = 10015) |  |  |  | df::matter_state GetState(df::material * mat, uint16_t temp = 10015) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	df::matter_state state = matter_state::Solid; |  |  |  |     df::matter_state state = matter_state::Solid; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (temp >= mat->heat.melting_point) |  |  |  |     if (temp >= mat->heat.melting_point) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		state = df::matter_state::Liquid; |  |  |  |         state = df::matter_state::Liquid; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (temp >= mat->heat.boiling_point) |  |  |  |     if (temp >= mat->heat.boiling_point) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		state = matter_state::Gas; |  |  |  |         state = matter_state::Gas; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return state; |  |  |  |     return state; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static command_result GetMaterialList(color_ostream &stream, const EmptyMessage *in, MaterialList *out) |  |  |  | static command_result GetMaterialList(color_ostream &stream, const EmptyMessage *in, MaterialList *out) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!Core::getInstance().isWorldLoaded()) { |  |  |  |     if (!Core::getInstance().isWorldLoaded()) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		//out->set_available(false);
 |  |  |  |         //out->set_available(false);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return CR_OK; |  |  |  |         return CR_OK; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	df::world_raws *raws = &world->raws; |  |  |  |     df::world_raws *raws = &world->raws; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	df::world_history *history = &world->history; |  |  |  |     df::world_history *history = &world->history; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	MaterialInfo mat; |  |  |  |     MaterialInfo mat; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < raws->inorganics.size(); i++) |  |  |  |     for (int i = 0; i < raws->inorganics.size(); i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat.decode(0, i); |  |  |  |         mat.decode(0, i); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		MaterialDefinition *mat_def = out->add_material_list(); |  |  |  |         MaterialDefinition *mat_def = out->add_material_list(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat_def->mutable_mat_pair()->set_mat_type(0); |  |  |  |         mat_def->mutable_mat_pair()->set_mat_type(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat_def->mutable_mat_pair()->set_mat_index(i); |  |  |  |         mat_def->mutable_mat_pair()->set_mat_index(i); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat_def->set_id(mat.getToken()); |  |  |  |         mat_def->set_id(mat.getToken()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat_def->set_name(mat.toString()); //find the name at cave temperature;
 |  |  |  |         mat_def->set_name(mat.toString()); //find the name at cave temperature;
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)] < raws->language.colors.size()) |  |  |  |         if (raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)] < raws->language.colors.size()) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			df::descriptor_color *color = raws->language.colors[raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)]]; |  |  |  |             df::descriptor_color *color = raws->language.colors[raws->inorganics[i]->material.state_color[GetState(&raws->inorganics[i]->material)]]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_state_color()->set_red(color->red * 255); |  |  |  |             mat_def->mutable_state_color()->set_red(color->red * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_state_color()->set_green(color->green * 255); |  |  |  |             mat_def->mutable_state_color()->set_green(color->green * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_state_color()->set_blue(color->blue * 255); |  |  |  |             mat_def->mutable_state_color()->set_blue(color->blue * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < 19; i++) |  |  |  |     for (int i = 0; i < 19; i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		int k = -1; |  |  |  |         int k = -1; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (i == 7) |  |  |  |         if (i == 7) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			k = 1;// for coal.
 |  |  |  |             k = 1;// for coal.
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		for (int j = -1; j <= k; j++) |  |  |  |         for (int j = -1; j <= k; j++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat.decode(i, j); |  |  |  |             mat.decode(i, j); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			MaterialDefinition *mat_def = out->add_material_list(); |  |  |  |             MaterialDefinition *mat_def = out->add_material_list(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_mat_pair()->set_mat_type(i); |  |  |  |             mat_def->mutable_mat_pair()->set_mat_type(i); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_mat_pair()->set_mat_index(j); |  |  |  |             mat_def->mutable_mat_pair()->set_mat_index(j); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->set_id(mat.getToken()); |  |  |  |             mat_def->set_id(mat.getToken()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->set_name(mat.toString()); //find the name at cave temperature;
 |  |  |  |             mat_def->set_name(mat.toString()); //find the name at cave temperature;
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			if (raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])] < raws->language.colors.size()) |  |  |  |             if (raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])] < raws->language.colors.size()) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |             { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				df::descriptor_color *color = raws->language.colors[raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])]]; |  |  |  |                 df::descriptor_color *color = raws->language.colors[raws->mat_table.builtin[i]->state_color[GetState(raws->mat_table.builtin[i])]]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_red(color->red * 255); |  |  |  |                 mat_def->mutable_state_color()->set_red(color->red * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_green(color->green * 255); |  |  |  |                 mat_def->mutable_state_color()->set_green(color->green * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_blue(color->blue * 255); |  |  |  |                 mat_def->mutable_state_color()->set_blue(color->blue * 255); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < raws->creatures.all.size(); i++) |  |  |  |     for (int i = 0; i < raws->creatures.all.size(); i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         df::creature_raw * creature = raws->creatures.all[i]; |  |  |  |         df::creature_raw * creature = raws->creatures.all[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         for (int j = 0; j < creature->material.size(); j++) |  |  |  |         for (int j = 0; j < creature->material.size(); j++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1033,31 +1049,31 @@ static command_result GetMaterialList(color_ostream &stream, const EmptyMessage | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < history->figures.size(); i++) |  |  |  |     //for (int i = 0; i < history->figures.size(); i++)
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     //{
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		df::historical_figure * figure = history->figures[i]; |  |  |  |     //    df::historical_figure * figure = history->figures[i];
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (figure->race < 0) |  |  |  |     //    if (figure->race < 0)
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			continue; |  |  |  |     //        continue;
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		df::creature_raw * creature = raws->creatures.all[figure->race]; |  |  |  |     //    df::creature_raw * creature = raws->creatures.all[figure->race];
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		for (int j = 0; j < creature->material.size(); j++) |  |  |  |     //    for (int j = 0; j < creature->material.size(); j++)
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |     //    {
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat.decode(j + MaterialInfo::FIGURE_BASE, i); |  |  |  |     //        mat.decode(j + MaterialInfo::FIGURE_BASE, i);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			MaterialDefinition *mat_def = out->add_material_list(); |  |  |  |     //        MaterialDefinition *mat_def = out->add_material_list();
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_mat_pair()->set_mat_type(j + MaterialInfo::FIGURE_BASE); |  |  |  |     //        mat_def->mutable_mat_pair()->set_mat_type(j + MaterialInfo::FIGURE_BASE);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->mutable_mat_pair()->set_mat_index(i); |  |  |  |     //        mat_def->mutable_mat_pair()->set_mat_index(i);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			stringstream id; |  |  |  |     //        stringstream id;
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			id << "HF" << i << mat.getToken(); |  |  |  |     //        id << "HF" << i << mat.getToken();
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->set_id(id.str()); |  |  |  |     //        mat_def->set_id(id.str());
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat_def->set_name(mat.toString()); //find the name at cave temperature;
 |  |  |  |     //        mat_def->set_name(mat.toString()); //find the name at cave temperature;
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			if (creature->material[j]->state_color[GetState(creature->material[j])] < raws->language.colors.size()) |  |  |  |     //        if (creature->material[j]->state_color[GetState(creature->material[j])] < raws->language.colors.size())
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |     //        {
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				df::descriptor_color *color = raws->language.colors[creature->material[j]->state_color[GetState(creature->material[j])]]; |  |  |  |     //            df::descriptor_color *color = raws->language.colors[creature->material[j]->state_color[GetState(creature->material[j])]];
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_red(color->red * 255); |  |  |  |     //            mat_def->mutable_state_color()->set_red(color->red * 255);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_green(color->green * 255); |  |  |  |     //            mat_def->mutable_state_color()->set_green(color->green * 255);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				mat_def->mutable_state_color()->set_blue(color->blue * 255); |  |  |  |     //            mat_def->mutable_state_color()->set_blue(color->blue * 255);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |     //        }
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |     //    }
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     //}
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     for (int i = 0; i < raws->plants.all.size(); i++) |  |  |  |     for (int i = 0; i < raws->plants.all.size(); i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |     { |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |         df::plant_raw * plant = raws->plants.all[i]; |  |  |  |         df::plant_raw * plant = raws->plants.all[i]; | 
			
		
	
	
		
		
			
				
					|  |  | @ -1241,28 +1257,18 @@ void CopyBlock(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBloc | 
			
		
	
		
		
			
				
					
					|  |  |  |             default: |  |  |  |             default: | 
			
		
	
		
		
			
				
					
					|  |  |  |                 break; |  |  |  |                 break; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             RemoteFortressReader::MatPair * material = NetBlock->add_materials(); |  |  |  |             CopyMat(NetBlock->add_materials(), staticMat.mat_type, staticMat.mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             material->set_mat_type(staticMat.mat_type); |  |  |  |             CopyMat(NetBlock->add_layer_materials(), 0, block->layerMaterialAt(p)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             material->set_mat_index(staticMat.mat_index); |  |  |  |             CopyMat(NetBlock->add_vein_materials(), 0, block->veinMaterialAt(p)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             RemoteFortressReader::MatPair * layerMaterial = NetBlock->add_layer_materials(); |  |  |  |             CopyMat(NetBlock->add_base_materials(), baseMat.mat_type, baseMat.mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             layerMaterial->set_mat_type(0); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             layerMaterial->set_mat_index(block->layerMaterialAt(p)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             RemoteFortressReader::MatPair * veinMaterial = NetBlock->add_vein_materials(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             veinMaterial->set_mat_type(0); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             veinMaterial->set_mat_index(block->veinMaterialAt(p)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             RemoteFortressReader::MatPair * baseMaterial = NetBlock->add_base_materials(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             baseMaterial->set_mat_type(baseMat.mat_type); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             baseMaterial->set_mat_index(baseMat.mat_index); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             RemoteFortressReader::MatPair * constructionItem = NetBlock->add_construction_items(); |  |  |  |             RemoteFortressReader::MatPair * constructionItem = NetBlock->add_construction_items(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             constructionItem->set_mat_type(-1); |  |  |  |             CopyMat(constructionItem, -1, -1); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             constructionItem->set_mat_index(-1); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             if (tileMaterial(tile) == tiletype_material::CONSTRUCTION) |  |  |  |             if (tileMaterial(tile) == tiletype_material::CONSTRUCTION) | 
			
		
	
		
		
			
				
					
					|  |  |  |             { |  |  |  |             { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 df::construction *con = df::construction::find(DfBlock->map_pos + df::coord(xx, yy, 0)); |  |  |  |                 df::construction *con = df::construction::find(DfBlock->map_pos + df::coord(xx, yy, 0)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (con) |  |  |  |                 if (con) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     constructionItem->set_mat_type(con->item_type); |  |  |  |                     CopyMat(constructionItem, con->item_type, con->item_subtype); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     constructionItem->set_mat_index(con->item_subtype); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |             NetBlock->add_tree_percent(trunk_percent[xx][yy]); |  |  |  |             NetBlock->add_tree_percent(trunk_percent[xx][yy]); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1370,43 +1376,39 @@ void CopyBuildings(df::map_block * DfBlock, RemoteFortressReader::MapBlock * Net | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void Copyspatters(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBlock, MapExtras::MapCache * MC, DFCoord pos) |  |  |  | void Copyspatters(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBlock, MapExtras::MapCache * MC, DFCoord pos) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	NetBlock->set_map_x(DfBlock->map_pos.x); |  |  |  |     NetBlock->set_map_x(DfBlock->map_pos.x); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	NetBlock->set_map_y(DfBlock->map_pos.y); |  |  |  |     NetBlock->set_map_y(DfBlock->map_pos.y); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	NetBlock->set_map_z(DfBlock->map_pos.z); |  |  |  |     NetBlock->set_map_z(DfBlock->map_pos.z); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	std::vector<df::block_square_event_material_spatterst *> materials; |  |  |  |     std::vector<df::block_square_event_material_spatterst *> materials; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	std::vector<df::block_square_event_item_spatterst *> items; |  |  |  |     std::vector<df::block_square_event_item_spatterst *> items; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!Maps::SortBlockEvents(DfBlock, NULL, NULL, &materials, NULL, NULL, NULL, &items)) |  |  |  |     if (!Maps::SortBlockEvents(DfBlock, NULL, NULL, &materials, NULL, NULL, NULL, &items)) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  |         return; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int yy = 0; yy < 16; yy++) |  |  |  |     for (int yy = 0; yy < 16; yy++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		for (int xx = 0; xx < 16; xx++) |  |  |  |         for (int xx = 0; xx < 16; xx++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto send_pile = NetBlock->add_spatterpile(); |  |  |  |             auto send_pile = NetBlock->add_spatterpile(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			for each (auto mat in materials) |  |  |  |             for each (auto mat in materials) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |             { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if (mat->amount[xx][yy] == 0) |  |  |  |                 if (mat->amount[xx][yy] == 0) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					continue; |  |  |  |                     continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				auto send_spat = send_pile->add_spatters(); |  |  |  |                 auto send_spat = send_pile->add_spatters(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_spat->set_state((MatterState)mat->mat_state); |  |  |  |                 send_spat->set_state((MatterState)mat->mat_state); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				auto send_mat = send_spat->mutable_material(); |  |  |  |                 CopyMat(send_spat->mutable_material(), mat->mat_type, mat->mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_mat->set_mat_index(mat->mat_index); |  |  |  |                 send_spat->set_amount(mat->amount[xx][yy]); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_mat->set_mat_type(mat->mat_type); |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_spat->set_amount(mat->amount[xx][yy]); |  |  |  |             for each (auto item in items) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |             { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			for each (auto item in items) |  |  |  |                 if (item->amount[xx][yy] == 0) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |                     continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if (item->amount[xx][yy] == 0) |  |  |  |                 auto send_spat = send_pile->add_spatters(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					continue; |  |  |  |                 CopyMat(send_spat->mutable_material(), item->mattype, item->matindex); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				auto send_spat = send_pile->add_spatters(); |  |  |  |                 send_spat->set_amount(item->amount[xx][yy]); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				auto send_mat = send_spat->mutable_material(); |  |  |  |                 auto send_item = send_spat->mutable_item(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_mat->set_mat_index(item->matindex); |  |  |  |                 send_item->set_mat_type(item->item_type); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_mat->set_mat_type(item->mattype); |  |  |  |                 send_item->set_mat_index(item->item_subtype); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_spat->set_amount(item->amount[xx][yy]); |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				auto send_item = send_spat->mutable_item(); |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				send_item->set_mat_type(item->item_type); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				send_item->set_mat_index(item->item_subtype); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static command_result GetBlockList(color_ostream &stream, const BlockRequest *in, BlockList *out) |  |  |  | static command_result GetBlockList(color_ostream &stream, const BlockRequest *in, BlockList *out) | 
			
		
	
	
		
		
			
				
					|  |  | @ -1466,8 +1468,8 @@ static command_result GetBlockList(color_ostream &stream, const BlockRequest *in | 
			
		
	
		
		
			
				
					
					|  |  |  |                     { |  |  |  |                     { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         bool tileChanged = IsTiletypeChanged(pos); |  |  |  |                         bool tileChanged = IsTiletypeChanged(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         bool desChanged = IsDesignationChanged(pos); |  |  |  |                         bool desChanged = IsDesignationChanged(pos); | 
			
		
	
		
		
			
				
					
					|  |  |  | 						bool spatterChanged = IsspatterChanged(pos); |  |  |  |                         bool spatterChanged = IsspatterChanged(pos); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						bool buildingChanged = IsBuildingChanged(pos); |  |  |  |                         bool buildingChanged = IsBuildingChanged(pos); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         //bool bldChanged = IsBuildingChanged(pos);
 |  |  |  |                         //bool bldChanged = IsBuildingChanged(pos);
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                         RemoteFortressReader::MapBlock *net_block; |  |  |  |                         RemoteFortressReader::MapBlock *net_block; | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if (tileChanged || desChanged || spatterChanged || buildingChanged) |  |  |  |                         if (tileChanged || desChanged || spatterChanged || buildingChanged) | 
			
		
	
	
		
		
			
				
					|  |  | @ -1481,8 +1483,8 @@ static command_result GetBlockList(color_ostream &stream, const BlockRequest *in | 
			
		
	
		
		
			
				
					
					|  |  |  |                             CopyDesignation(block, net_block, &MC, pos); |  |  |  |                             CopyDesignation(block, net_block, &MC, pos); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if (buildingChanged) |  |  |  |                         if (buildingChanged) | 
			
		
	
		
		
			
				
					
					|  |  |  |                             CopyBuildings(block, net_block, &MC, pos); |  |  |  |                             CopyBuildings(block, net_block, &MC, pos); | 
			
		
	
		
		
			
				
					
					|  |  |  | 						if (spatterChanged) |  |  |  |                         if (spatterChanged) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 							Copyspatters(block, net_block, &MC, pos); |  |  |  |                             Copyspatters(block, net_block, &MC, pos); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
	
		
		
			
				
					|  |  | @ -2045,126 +2047,126 @@ static command_result GetWorldMap(color_ostream &stream, const EmptyMessage *in, | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void SetRegionTile(RegionTile * out, df::region_map_entry * e1) |  |  |  | static void SetRegionTile(RegionTile * out, df::region_map_entry * e1) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	df::world_region * region = df::world_region::find(e1->region_id); |  |  |  |     df::world_region * region = df::world_region::find(e1->region_id); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	df::world_geo_biome * geoBiome = df::world_geo_biome::find(e1->geo_index); |  |  |  |     df::world_geo_biome * geoBiome = df::world_geo_biome::find(e1->geo_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_rainfall(e1->rainfall); |  |  |  |     out->set_rainfall(e1->rainfall); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_vegetation(e1->vegetation); |  |  |  |     out->set_vegetation(e1->vegetation); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_temperature(e1->temperature); |  |  |  |     out->set_temperature(e1->temperature); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_evilness(e1->evilness); |  |  |  |     out->set_evilness(e1->evilness); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_drainage(e1->drainage); |  |  |  |     out->set_drainage(e1->drainage); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_volcanism(e1->volcanism); |  |  |  |     out->set_volcanism(e1->volcanism); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_savagery(e1->savagery); |  |  |  |     out->set_savagery(e1->savagery); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_salinity(e1->salinity); |  |  |  |     out->set_salinity(e1->salinity); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (region->type == world_region_type::Lake) |  |  |  |     if (region->type == world_region_type::Lake) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_water_elevation(region->lake_surface); |  |  |  |         out->set_water_elevation(region->lake_surface); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	else |  |  |  |     else | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_water_elevation(99); |  |  |  |         out->set_water_elevation(99); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	int topLayer = 0; |  |  |  |     int topLayer = 0; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < geoBiome->layers.size(); i++) |  |  |  |     for (int i = 0; i < geoBiome->layers.size(); i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		auto layer = geoBiome->layers[i]; |  |  |  |         auto layer = geoBiome->layers[i]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (layer->top_height == 0) |  |  |  |         if (layer->top_height == 0) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			topLayer = layer->mat_index; |  |  |  |             topLayer = layer->mat_index; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (layer->type != geo_layer_type::SOIL |  |  |  |         if (layer->type != geo_layer_type::SOIL | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			&& layer->type != geo_layer_type::SOIL_OCEAN |  |  |  |             && layer->type != geo_layer_type::SOIL_OCEAN | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			&& layer->type != geo_layer_type::SOIL_SAND) |  |  |  |             && layer->type != geo_layer_type::SOIL_SAND) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto mat = out->add_stone_materials(); |  |  |  |             auto mat = out->add_stone_materials(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat->set_mat_index(layer->mat_index); |  |  |  |             mat->set_mat_index(layer->mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			mat->set_mat_type(0); |  |  |  |             mat->set_mat_type(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	auto surfaceMat = out->mutable_surface_material(); |  |  |  |     auto surfaceMat = out->mutable_surface_material(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	surfaceMat->set_mat_index(topLayer); |  |  |  |     surfaceMat->set_mat_index(topLayer); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	surfaceMat->set_mat_type(0); |  |  |  |     surfaceMat->set_mat_type(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < region->population.size(); i++) |  |  |  |     for (int i = 0; i < region->population.size(); i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		auto pop = region->population[i]; |  |  |  |         auto pop = region->population[i]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (pop->type == world_population_type::Grass) |  |  |  |         if (pop->type == world_population_type::Grass) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto plantMat = out->add_plant_materials(); |  |  |  |             auto plantMat = out->add_plant_materials(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			plantMat->set_mat_index(pop->plant); |  |  |  |             plantMat->set_mat_index(pop->plant); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			plantMat->set_mat_type(419); |  |  |  |             plantMat->set_mat_type(419); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		else if (pop->type == world_population_type::Tree) |  |  |  |         else if (pop->type == world_population_type::Tree) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto plantMat = out->add_tree_materials(); |  |  |  |             auto plantMat = out->add_tree_materials(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			plantMat->set_mat_index(pop->plant); |  |  |  |             plantMat->set_mat_index(pop->plant); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			plantMat->set_mat_type(419); |  |  |  |             plantMat->set_mat_type(419); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static command_result GetWorldMapNew(color_ostream &stream, const EmptyMessage *in, WorldMap *out) |  |  |  | static command_result GetWorldMapNew(color_ostream &stream, const EmptyMessage *in, WorldMap *out) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!df::global::world->world_data) |  |  |  |     if (!df::global::world->world_data) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_width(0); |  |  |  |         out->set_world_width(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_height(0); |  |  |  |         out->set_world_height(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return CR_FAILURE; |  |  |  |         return CR_FAILURE; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	df::world_data * data = df::global::world->world_data; |  |  |  |     df::world_data * data = df::global::world->world_data; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!data->region_map) |  |  |  |     if (!data->region_map) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_width(0); |  |  |  |         out->set_world_width(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_height(0); |  |  |  |         out->set_world_height(0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return CR_FAILURE; |  |  |  |         return CR_FAILURE; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	int width = data->world_width; |  |  |  |     int width = data->world_width; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	int height = data->world_height; |  |  |  |     int height = data->world_height; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_world_width(width); |  |  |  |     out->set_world_width(width); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_world_height(height); |  |  |  |     out->set_world_height(height); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_name(Translation::TranslateName(&(data->name), false)); |  |  |  |     out->set_name(Translation::TranslateName(&(data->name), false)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_name_english(Translation::TranslateName(&(data->name), true)); |  |  |  |     out->set_name_english(Translation::TranslateName(&(data->name), true)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	auto poles = data->flip_latitude; |  |  |  |     auto poles = data->flip_latitude; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	switch (poles) |  |  |  |     switch (poles) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	case df::world_data::None: |  |  |  |     case df::world_data::None: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_poles(WorldPoles::NO_POLES); |  |  |  |         out->set_world_poles(WorldPoles::NO_POLES); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		break; |  |  |  |         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	case df::world_data::North: |  |  |  |     case df::world_data::North: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_poles(WorldPoles::NORTH_POLE); |  |  |  |         out->set_world_poles(WorldPoles::NORTH_POLE); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		break; |  |  |  |         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	case df::world_data::South: |  |  |  |     case df::world_data::South: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_poles(WorldPoles::SOUTH_POLE); |  |  |  |         out->set_world_poles(WorldPoles::SOUTH_POLE); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		break; |  |  |  |         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	case df::world_data::Both: |  |  |  |     case df::world_data::Both: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		out->set_world_poles(WorldPoles::BOTH_POLES); |  |  |  |         out->set_world_poles(WorldPoles::BOTH_POLES); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		break; |  |  |  |         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	default: |  |  |  |     default: | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		break; |  |  |  |         break; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int yy = 0; yy < height; yy++) |  |  |  |     for (int yy = 0; yy < height; yy++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		for (int xx = 0; xx < width; xx++) |  |  |  |         for (int xx = 0; xx < width; xx++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  |         { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			df::region_map_entry * map_entry = &data->region_map[xx][yy]; |  |  |  |             df::region_map_entry * map_entry = &data->region_map[xx][yy]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			df::world_region * region = data->regions[map_entry->region_id]; |  |  |  |             df::world_region * region = data->regions[map_entry->region_id]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto regionTile = out->add_region_tiles(); |  |  |  |             auto regionTile = out->add_region_tiles(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			regionTile->set_elevation(map_entry->elevation); |  |  |  |             regionTile->set_elevation(map_entry->elevation); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			SetRegionTile(regionTile, map_entry); |  |  |  |             SetRegionTile(regionTile, map_entry); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			auto clouds = out->add_clouds(); |  |  |  |             auto clouds = out->add_clouds(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			clouds->set_cirrus(map_entry->clouds.bits.cirrus); |  |  |  |             clouds->set_cirrus(map_entry->clouds.bits.cirrus); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			clouds->set_cumulus((RemoteFortressReader::CumulusType)map_entry->clouds.bits.cumulus); |  |  |  |             clouds->set_cumulus((RemoteFortressReader::CumulusType)map_entry->clouds.bits.cumulus); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			clouds->set_fog((RemoteFortressReader::FogType)map_entry->clouds.bits.fog); |  |  |  |             clouds->set_fog((RemoteFortressReader::FogType)map_entry->clouds.bits.fog); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			clouds->set_front((RemoteFortressReader::FrontType)map_entry->clouds.bits.front); |  |  |  |             clouds->set_front((RemoteFortressReader::FrontType)map_entry->clouds.bits.front); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			clouds->set_stratus((RemoteFortressReader::StratusType)map_entry->clouds.bits.stratus); |  |  |  |             clouds->set_stratus((RemoteFortressReader::StratusType)map_entry->clouds.bits.stratus); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	DFCoord pos = GetMapCenter(); |  |  |  |     DFCoord pos = GetMapCenter(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_center_x(pos.x); |  |  |  |     out->set_center_x(pos.x); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_center_y(pos.y); |  |  |  |     out->set_center_y(pos.y); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_center_z(pos.z); |  |  |  |     out->set_center_z(pos.z); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_cur_year(World::ReadCurrentYear()); |  |  |  |     out->set_cur_year(World::ReadCurrentYear()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	out->set_cur_year_tick(World::ReadCurrentTick()); |  |  |  |     out->set_cur_year_tick(World::ReadCurrentTick()); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return CR_OK; |  |  |  |     return CR_OK; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void AddRegionTiles(WorldMap * out, df::region_map_entry * e1, df::world_data * worldData) |  |  |  | static void AddRegionTiles(WorldMap * out, df::region_map_entry * e1, df::world_data * worldData) | 
			
		
	
	
		
		
			
				
					|  |  | @ -2208,7 +2210,7 @@ static void AddRegionTiles(RegionTile * out, df::coord2d pos, df::world_data * w | 
			
		
	
		
		
			
				
					
					|  |  |  |         pos.x = worldData->world_width - 1; |  |  |  |         pos.x = worldData->world_width - 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (pos.y >= worldData->world_height) |  |  |  |     if (pos.y >= worldData->world_height) | 
			
		
	
		
		
			
				
					
					|  |  |  |         pos.y = worldData->world_height - 1; |  |  |  |         pos.y = worldData->world_height - 1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	SetRegionTile(out, &worldData->region_map[pos.x][pos.y]); |  |  |  |     SetRegionTile(out, &worldData->region_map[pos.x][pos.y]); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static df::coord2d ShiftCoords(df::coord2d source, int direction) |  |  |  | static df::coord2d ShiftCoords(df::coord2d source, int direction) | 
			
		
	
	
		
		
			
				
					|  |  | @ -2371,13 +2373,13 @@ static void CopyLocalMap(df::world_data * worldData, df::world_region_details* w | 
			
		
	
		
		
			
				
					
					|  |  |  |             south = region; |  |  |  |             south = region; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	RegionTile* outputTiles[17][17]; |  |  |  |     RegionTile* outputTiles[17][17]; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (int yy = 0; yy < 17; yy++) |  |  |  |     for (int yy = 0; yy < 17; yy++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         for (int xx = 0; xx < 17; xx++) |  |  |  |         for (int xx = 0; xx < 17; xx++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |             auto tile = out->add_tiles(); |  |  |  |             auto tile = out->add_tiles(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			outputTiles[xx][yy] = tile; |  |  |  |             outputTiles[xx][yy] = tile; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             //This is because the bottom row doesn't line up.
 |  |  |  |             //This is because the bottom row doesn't line up.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (xx == 16 && yy == 16 && southEast != NULL) |  |  |  |             if (xx == 16 && yy == 16 && southEast != NULL) | 
			
		
	
		
		
			
				
					
					|  |  |  |             { |  |  |  |             { | 
			
		
	
	
		
		
			
				
					|  |  | @ -2427,82 +2429,78 @@ static void CopyLocalMap(df::world_data * worldData, df::world_region_details* w | 
			
		
	
		
		
			
				
					
					|  |  |  |             east->set_max_pos(worldRegionDetails->rivers_horizontal.y_max[xx + 1][yy]); |  |  |  |             east->set_max_pos(worldRegionDetails->rivers_horizontal.y_max[xx + 1][yy]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	auto regionMap = worldData->region_map[pos_x][pos_y]; |  |  |  |     auto regionMap = worldData->region_map[pos_x][pos_y]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	for (int i = 0; i < worldData->sites.size(); i++) |  |  |  |     for (int i = 0; i < worldData->sites.size(); i++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		df::world_site* site = worldData->sites[i]; |  |  |  |         df::world_site* site = worldData->sites[i]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (!site) |  |  |  |         if (!site) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			continue; |  |  |  |             continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		int region_min_x = pos_x * 16; |  |  |  |         int region_min_x = pos_x * 16; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		int region_min_y = pos_y * 16; |  |  |  |         int region_min_y = pos_y * 16; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if ((site->global_min_x > (region_min_x + 16)) || |  |  |  |         if ((site->global_min_x > (region_min_x + 16)) || | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			(site->global_min_y > (region_min_y + 16)) || |  |  |  |             (site->global_min_y > (region_min_y + 16)) || | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			(site->global_max_x < (region_min_x)) || |  |  |  |             (site->global_max_x < (region_min_x)) || | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			(site->global_max_y < (region_min_y))) |  |  |  |             (site->global_max_y < (region_min_y))) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			continue; |  |  |  |             continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if (site->realization == NULL) |  |  |  |         if (site->realization == NULL) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			continue; |  |  |  |             continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		auto realization = site->realization; |  |  |  |         auto realization = site->realization; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		for (int site_x = 0; site_x < 17; site_x++) |  |  |  |         for (int site_x = 0; site_x < 17; site_x++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			for (int site_y = 0; site_y < 17; site_y++) |  |  |  |             for (int site_y = 0; site_y < 17; site_y++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  |             { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				int region_x = site->global_min_x - region_min_x + site_x; |  |  |  |                 int region_x = site->global_min_x - region_min_x + site_x; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				int region_y = site->global_min_y - region_min_y + site_y; |  |  |  |                 int region_y = site->global_min_y - region_min_y + site_y; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				if (region_x < 0 || region_y < 0 || region_x >= 16 || region_y >= 16) |  |  |  |                 if (region_x < 0 || region_y < 0 || region_x >= 16 || region_y >= 16) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					continue; |  |  |  |                     continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				for (int j = 0; j < realization->building_map[site_x][site_y].buildings.size(); j++) |  |  |  |                 for (int j = 0; j < realization->building_map[site_x][site_y].buildings.size(); j++) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				{ |  |  |  |                 { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					auto in_building = realization->building_map[site_x][site_y].buildings[j]; |  |  |  |                     auto in_building = realization->building_map[site_x][site_y].buildings[j]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					auto out_building = outputTiles[region_x][region_y]->add_buildings(); |  |  |  |                     auto out_building = outputTiles[region_x][region_y]->add_buildings(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_id(in_building->id); |  |  |  |                     out_building->set_id(in_building->id); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_type((SiteRealizationBuildingType)in_building->type); |  |  |  |                     out_building->set_type((SiteRealizationBuildingType)in_building->type); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_min_x(in_building->min_x - (site_x * 48)); |  |  |  |                     out_building->set_min_x(in_building->min_x - (site_x * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_min_y(in_building->min_y - (site_y * 48)); |  |  |  |                     out_building->set_min_y(in_building->min_y - (site_y * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_max_x(in_building->max_x - (site_x * 48)); |  |  |  |                     out_building->set_max_x(in_building->max_x - (site_x * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					out_building->set_max_y(in_building->max_y - (site_y * 48)); |  |  |  |                     out_building->set_max_y(in_building->max_y - (site_y * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					auto mat = out_building->mutable_material(); |  |  |  |                     CopyMat(out_building->mutable_material(), in_building->item.mat_type, in_building->item.mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					mat->set_mat_type(in_building->item.mat_type); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					mat->set_mat_index(in_building->item.mat_index); |  |  |  |                     STRICT_VIRTUAL_CAST_VAR(tower_info, df::site_realization_building_info_castle_towerst, in_building->building_info); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                     if (tower_info) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					STRICT_VIRTUAL_CAST_VAR(tower_info, df::site_realization_building_info_castle_towerst, in_building->building_info); |  |  |  |                     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					if (tower_info) |  |  |  |                         CopyMat(out_building->mutable_material(), tower_info->wall_item.mat_type, tower_info->wall_item.mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					{ |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						mat->set_mat_index(tower_info->wall_item.mat_index); |  |  |  |                         auto out_tower = out_building->mutable_tower_info(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						mat->set_mat_type(tower_info->wall_item.mat_type); |  |  |  |                         out_tower->set_roof_z(tower_info->roof_z); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                         out_tower->set_round(tower_info->shape.bits.round); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						auto out_tower = out_building->mutable_tower_info(); |  |  |  |                         out_tower->set_goblin(tower_info->shape.bits.goblin); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_tower->set_roof_z(tower_info->roof_z); |  |  |  |                     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_tower->set_round(tower_info->shape.bits.round); |  |  |  |                     STRICT_VIRTUAL_CAST_VAR(wall_info, df::site_realization_building_info_castle_wallst, in_building->building_info); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_tower->set_goblin(tower_info->shape.bits.goblin); |  |  |  |                     if (wall_info) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					} |  |  |  |                     { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					STRICT_VIRTUAL_CAST_VAR(wall_info, df::site_realization_building_info_castle_wallst, in_building->building_info); |  |  |  |                         CopyMat(out_building->mutable_material(), wall_info->wall_item.mat_type, wall_info->wall_item.mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					if (wall_info) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					{ |  |  |  |                         auto out_wall = out_building->mutable_wall_info(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						mat->set_mat_index(wall_info->wall_item.mat_index); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						mat->set_mat_type(wall_info->wall_item.mat_type); |  |  |  |                         out_wall->set_start_x(wall_info->start_x - (site_x * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                         out_wall->set_start_y(wall_info->start_y - (site_y * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						auto out_wall = out_building->mutable_wall_info(); |  |  |  |                         out_wall->set_start_z(wall_info->start_z); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |                         out_wall->set_end_x(wall_info->end_x - (site_x * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_start_x(wall_info->start_x - (site_x * 48)); |  |  |  |                         out_wall->set_end_y(wall_info->end_y - (site_y * 48)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_start_y(wall_info->start_y - (site_y * 48)); |  |  |  |                         out_wall->set_end_z(wall_info->end_z); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_start_z(wall_info->start_z); |  |  |  |                     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_end_x(wall_info->end_x - (site_x * 48)); |  |  |  |                 } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_end_y(wall_info->end_y - (site_y * 48)); |  |  |  |                  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 						out_wall->set_end_z(wall_info->end_z); |  |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					} |  |  |  |     } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static command_result GetRegionMaps(color_ostream &stream, const EmptyMessage *in, RegionMaps *out) |  |  |  | static command_result GetRegionMaps(color_ostream &stream, const EmptyMessage *in, RegionMaps *out) | 
			
		
	
	
		
		
			
				
					|  |  | @ -2535,7 +2533,7 @@ static command_result GetRegionMapsNew(color_ostream &stream, const EmptyMessage | 
			
		
	
		
		
			
				
					
					|  |  |  |         df::world_region_details * region = data->region_details[i]; |  |  |  |         df::world_region_details * region = data->region_details[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!region) |  |  |  |         if (!region) | 
			
		
	
		
		
			
				
					
					|  |  |  |             continue; |  |  |  |             continue; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		RegionMap * regionMap = out->add_region_maps(); |  |  |  |         RegionMap * regionMap = out->add_region_maps(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         CopyLocalMap(data, region, regionMap); |  |  |  |         CopyLocalMap(data, region, regionMap); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     return CR_OK; |  |  |  |     return CR_OK; | 
			
		
	
	
		
		
			
				
					|  |  | @ -2720,10 +2718,7 @@ static command_result GetCreatureRaws(color_ostream &stream, const EmptyMessage | 
			
		
	
		
		
			
				
					
					|  |  |  |             send_tissue->set_name(orig_tissue->tissue_name_singular); |  |  |  |             send_tissue->set_name(orig_tissue->tissue_name_singular); | 
			
		
	
		
		
			
				
					
					|  |  |  |             send_tissue->set_subordinate_to_tissue(orig_tissue->subordinate_to_tissue); |  |  |  |             send_tissue->set_subordinate_to_tissue(orig_tissue->subordinate_to_tissue); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             auto send_mat = send_tissue->mutable_material(); |  |  |  |             CopyMat(send_tissue->mutable_material(), orig_tissue->mat_type, orig_tissue->mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             send_mat->set_mat_index(orig_tissue->mat_index); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             send_mat->set_mat_type(orig_tissue->mat_type); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -2779,9 +2774,7 @@ static command_result GetPlantRaws(color_ostream &stream, const EmptyMessage *in | 
			
		
	
		
		
			
				
					
					|  |  |  |             growth_remote->set_timing_end(growth_local->timing_2); |  |  |  |             growth_remote->set_timing_end(growth_local->timing_2); | 
			
		
	
		
		
			
				
					
					|  |  |  |             growth_remote->set_trunk_height_start(growth_local->trunk_height_perc_1); |  |  |  |             growth_remote->set_trunk_height_start(growth_local->trunk_height_perc_1); | 
			
		
	
		
		
			
				
					
					|  |  |  |             growth_remote->set_trunk_height_end(growth_local->trunk_height_perc_2); |  |  |  |             growth_remote->set_trunk_height_end(growth_local->trunk_height_perc_2); | 
			
		
	
		
		
			
				
					
					|  |  |  |             auto growthMat = growth_remote->mutable_mat(); |  |  |  |             CopyMat(growth_remote->mutable_mat(), growth_local->mat_type, growth_local->mat_index); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             growthMat->set_mat_index(growth_local->mat_index); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             growthMat->set_mat_type(growth_local->mat_type); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     return CR_OK; |  |  |  |     return CR_OK; | 
			
		
	
	
		
		
			
				
					|  |  | 
 |