| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1976,20 +1976,23 @@ private:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return mi.isValid() && mi.material && ( mi.material->flags.is_set ( material_flags::IS_GEM ) || mi.material->flags.is_set ( material_flags::IS_STONE ) ) ;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    bool gem_other_mat_is_allowed(MaterialInfo &mi ) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return mi.isValid() && (mi.getToken() ==  "GLASS_GREEN" ||  mi.getToken() == "GLASS_CLEAR" || mi.getToken() ==  "GLASS_CRYSTAL");
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    void write_gems()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        StockpileSettings::GemsSet *gems = mBuffer.mutable_gems();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        MaterialInfo mi;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // rough mats
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::gem_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        serialize_list_material ( filter, [=] ( const std::string &token )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        FuncMaterialAllowed filter_rough = std::bind ( &StockpileSerializer::gem_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        serialize_list_material ( filter_rough, [=] ( const std::string &token )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            gems->add_rough_mats ( token );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        },  mPile->settings.gems.rough_mats );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // cut mats
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        filter = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        serialize_list_material ( filter, [=] ( const std::string &token )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        FuncMaterialAllowed filter_cut = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        serialize_list_material ( filter_cut, [=] ( const std::string &token )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            gems->add_cut_mats ( token );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        },  mPile->settings.gems.cut_mats );
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -1999,7 +2002,7 @@ private:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if ( mPile->settings.gems.rough_other_mats.at ( i ) )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                mi.decode ( i, -1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if ( !mi.isValid() ) continue;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if ( !gem_other_mat_is_allowed(mi) ) continue;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                debug() << "   gem rough_other mat" << i << " is " << mi.getToken() << endl;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                gems->add_rough_other_mats ( mi.getToken() );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2011,7 +2014,7 @@ private:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                mi.decode ( i, -1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if ( !mi.isValid() ) mi.decode ( 0, i );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if ( !mi.isValid() ) continue;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if ( !gem_other_mat_is_allowed(mi) ) continue;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                debug() << "   gem cut_other mat" << i << " is " << mi.getToken() << endl;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                gems->add_cut_other_mats ( mi.getToken() );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2026,18 +2029,18 @@ private:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const StockpileSettings::GemsSet gems = mBuffer.gems();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            debug() << "gems: " <<endl;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // rough
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            FuncMaterialAllowed filter = std::bind ( &StockpileSerializer::gem_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            unserialize_list_material ( filter, [=] ( const size_t & idx ) -> const std::string&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            FuncMaterialAllowed filter_rough = std::bind ( &StockpileSerializer::gem_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            unserialize_list_material ( filter_rough, [=] ( const size_t & idx ) -> const std::string&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                return gems.rough_mats ( idx );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            },  gems.rough_mats_size(),  &mPile->settings.gems.rough_mats );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // cut
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            filter = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            unserialize_list_material ( filter, [=] ( const size_t & idx ) -> const std::string&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            FuncMaterialAllowed filter_cut = std::bind ( &StockpileSerializer::gem_cut_mat_is_allowed, this,  _1 );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            unserialize_list_material ( filter_cut, [=] ( const size_t & idx ) -> const std::string&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                return gems.cut_mats ( idx );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            },  gems.cut_mats_size(), &mPile->settings.gems.rough_mats );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            },  gems.cut_mats_size(), &mPile->settings.gems.cut_mats );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const size_t builtin_size = std::extent<decltype ( world->raws.mat_table.builtin ) >::value;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // rough other
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2186,6 +2189,7 @@ private:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            finished_goods->add_quality_core ( token );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        },  mPile->settings.finished_goods.quality_core );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // quality total
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        serialize_list_quality ( [=] ( const std::string &token )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        {
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |