@ -8,19 +8,47 @@
 
		
	
		
			
				
 
		
	
		
			
				# include  "DataDefs.h"  
		
	
		
			
				# include  "df/world.h"  
		
	
		
			
				# include  "df/world_raws.h"  
		
	
		
			
				# include  "df/plant_raw.h"  
		
	
		
			
				
 
		
	
		
			
				# include  "df/map_block.h"  
		
	
		
			
				# include  "df/block_square_event.h"  
		
	
		
			
				//#include "df/block_square_event_type.h"
  
		
	
		
			
				# include  "df/block_square_event_grassst.h"  
		
	
		
			
				# include  "TileTypes.h"  
		
	
		
			
				
 
		
	
		
			
				using  std : : string ;  
		
	
		
			
				using  std : : vector ;  
		
	
		
			
				using  namespace  std ;  
		
	
		
			
				using  namespace  DFHack ;  
		
	
		
			
				
 
		
	
		
			
				using  df : : global : : world ;  
		
	
		
			
				
 
		
	
		
			
				DFHACK_PLUGIN ( " regrass " ) ;  
		
	
		
			
				
 
		
	
		
			
				command_result  df_regrass  ( color_ostream  & out ,  vector  < string >  &  parameters ) ;  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_init  ( color_ostream  & out ,  std : : vector < PluginCommand >  & commands )  
		
	
		
			
				{  
		
	
		
			
				    commands . push_back ( PluginCommand ( " regrass " ,  " Regrows surface grass. " ,  df_regrass ) ) ; 
 
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_shutdown  (  color_ostream  & out  )  
		
	
		
			
				{  
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				command_result  df_regrass  ( color_ostream  & out ,  vector  < string >  &  parameters )  
		
	
		
			
				{  
		
	
		
			
				    bool  max  =  false ; 
 
		
	
		
			
				    if  ( ! parameters . empty ( ) ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        if ( parameters [ 0 ]  = =  " max " ) 
 
		
	
		
			
				            max  =  true ; 
 
		
	
		
			
				        else 
 
		
	
		
			
				            return  CR_WRONG_USAGE ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    CoreSuspender  suspend ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -28,19 +56,62 @@ command_result df_regrass (color_ostream &out, vector <string> & parameters)
 
		
	
		
			
				    for  ( size_t  i  =  0 ;  i  <  world - > map . map_blocks . size ( ) ;  i + + ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        df : : map_block  * cur  =  world - > map . map_blocks [ i ] ; 
 
		
	
		
			
				        for  ( int  x  =  0 ;  x  <  16 ;  x + + ) 
 
		
	
		
			
				
 
		
	
		
			
				        // check block for grass events before looking at 16x16 tiles
 
 
		
	
		
			
				        df : : block_square_event_grassst  *  grev  =  NULL ; 
 
		
	
		
			
				        for ( size_t  e = 0 ;  e < cur - > block_events . size ( ) ;  e + + ) 
 
		
	
		
			
				        {             
 
		
	
		
			
				            for  ( int  y  =  0 ;  y  <  16 ;  y + + ) 
 
		
	
		
			
				            df : : block_square_event  *  blev  =  cur - > block_events [ e ] ; 
 
		
	
		
			
				            df : : block_square_event_type  blevtype  =  blev - > getType ( ) ; 
 
		
	
		
			
				            if ( blevtype  = =  df : : block_square_event_type : : grass ) 
 
		
	
		
			
				            { 
 
		
	
		
			
				                if  ( tileShape ( cur - > tiletype [ x ] [ y ] )  ! =  tiletype_shape : : FLOOR ) 
 
		
	
		
			
				                    continue ; 
 
		
	
		
			
				                if  ( tileMaterial ( cur - > tiletype [ x ] [ y ] )  ! =  tiletype_material : : SOIL ) 
 
		
	
		
			
				                grev  =  ( df : : block_square_event_grassst  * ) blev ; 
 
		
	
		
			
				                break ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				        } 
 
		
	
		
			
				        if ( ! grev ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            // in this worst case we should check other blocks, create a new event etc
 
 
		
	
		
			
				            // but looking at some maps that should happen very very rarely if at all
 
 
		
	
		
			
				            // a standard map block seems to always have up to 10 grass events we can refresh
 
 
		
	
		
			
				            continue ; 
 
		
	
		
			
				                if  ( cur - > designation [ x ] [ y ] . bits . subterranean ) 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        for  ( int  y  =  0 ;  y  <  16 ;  y + + ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            for  ( int  x  =  0 ;  x  <  16 ;  x + + ) 
 
		
	
		
			
				            { 
 
		
	
		
			
				                if  (    tileShape ( cur - > tiletype [ x ] [ y ] )  ! =  tiletype_shape : : FLOOR 
 
		
	
		
			
				                    | |  cur - > designation [ x ] [ y ] . bits . subterranean 
 
		
	
		
			
				                    | |  cur - > occupancy [ x ] [ y ] . bits . building ) 
 
		
	
		
			
				                    continue ; 
 
		
	
		
			
				                if  ( cur - > occupancy [ x ] [ y ] . bits . building ) 
 
		
	
		
			
				
 
		
	
		
			
				                int  mat  =  tileMaterial ( cur - > tiletype [ x ] [ y ] ) ; 
 
		
	
		
			
				                if  (    mat  ! =  tiletype_material : : SOIL 
 
		
	
		
			
				                    & &  mat  ! =  tiletype_material : : GRASS_DARK   // refill existing grass, too
 
 
		
	
		
			
				                    & &  mat  ! =  tiletype_material : : GRASS_LIGHT  // refill existing grass, too
 
 
		
	
		
			
				                    ) 
 
		
	
		
			
				                    continue ; 
 
		
	
		
			
				
 
		
	
		
			
				                // max = set amounts of all grass events on that tile to 100
 
 
		
	
		
			
				                if ( max ) 
 
		
	
		
			
				                { 
 
		
	
		
			
				                    for ( size_t  e = 0 ;  e < cur - > block_events . size ( ) ;  e + + ) 
 
		
	
		
			
				                    {             
 
		
	
		
			
				                        df : : block_square_event  *  blev  =  cur - > block_events [ e ] ; 
 
		
	
		
			
				                        df : : block_square_event_type  blevtype  =  blev - > getType ( ) ; 
 
		
	
		
			
				                        if ( blevtype  = =  df : : block_square_event_type : : grass ) 
 
		
	
		
			
				                        { 
 
		
	
		
			
				                            df : : block_square_event_grassst  *  gr_ev  =  ( df : : block_square_event_grassst  * ) blev ; 
 
		
	
		
			
				                            gr_ev - > amount [ x ] [ y ]  =  100 ; 
 
		
	
		
			
				                            break ; 
 
		
	
		
			
				                        } 
 
		
	
		
			
				                    } 
 
		
	
		
			
				                } 
 
		
	
		
			
				                else 
 
		
	
		
			
				                { 
 
		
	
		
			
				                    grev - > amount [ x ] [ y ] = 100 ; 
 
		
	
		
			
				                } 
 
		
	
		
			
				                cur - > tiletype [ x ] [ y ]  =  findRandomVariant ( ( rand ( )  &  1 )  ?  tiletype : : GrassLightFloor1  :  tiletype : : GrassDarkFloor1 ) ; 
 
		
	
		
			
				                count + + ; 
 
		
	
		
			
				            } 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -51,16 +122,3 @@ command_result df_regrass (color_ostream &out, vector <string> & parameters)
 
		
	
		
			
				        out . print ( " Regrew %d tiles of grass. \n " ,  count ) ; 
 
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				DFHACK_PLUGIN ( " regrass " ) ;  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_init  ( color_ostream  & out ,  std : : vector < PluginCommand >  & commands )  
		
	
		
			
				{  
		
	
		
			
				    commands . push_back ( PluginCommand ( " regrass " ,  " Regrows all surface grass, restoring outdoor plant growth for pre-0.31.19 worlds. " ,  df_regrass ) ) ; 
 
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_shutdown  (  color_ostream  & out  )  
		
	
		
			
				{  
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}