Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///Scr_FloodFill( ds_grid , scan_xstart , scan_ystart , value_fill )
- var grid , grd_w , grd_h , val_r , val_f , scn_x , scn_y;
- grid = argument[ 0 ];
- grd_w = ds_grid_width( grid );
- grd_h = ds_grid_height( grid );
- scn_x = argument[ 1 ];
- scn_y = argument[ 2 ];
- val_f = argument[ 3 ];
- val_r = ds_grid_get( grid , scn_x , scn_y );
- var map_x , map_y;
- map_x = ds_map_create();
- map_y = ds_map_create();
- ds_map_add( map_x , ( scn_y * grd_w ) + scn_x , scn_x );
- ds_map_add( map_y , ( scn_y * grd_w ) + scn_x , scn_y );
- if ( val_f == val_r ) {
- ds_map_destroy( map_x );
- ds_map_destroy( map_y );
- return 0;
- };
- while( ds_map_size( map_x ) > 0 && ds_map_size( map_y ) > 0 ) {
- var cell , prg_y = scn_y , scn_m = 0;
- while( scn_m < 2 ) {
- switch( scn_m ) {
- case 0:
- prg_y = scn_y;
- while( true ) {
- cell = ( prg_y * grd_w ) + scn_x;
- if ( cell < 0 || cell >= ( grd_w * grd_h ) || ( ds_grid_get( grid , scn_x , prg_y ) != val_r ) ) { break; };
- cell = ( prg_y * grd_w ) + ( scn_x + 1 );
- if ( cell > 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x + 1 , prg_y ) == val_r ) {
- ds_map_add( map_x , cell , scn_x + 1 );
- ds_map_add( map_y , cell , prg_y );
- };
- cell = ( prg_y * grd_w ) + ( scn_x - 1 );
- if ( cell > 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x - 1 , prg_y ) == val_r ) {
- ds_map_add( map_x , cell , scn_x - 1 );
- ds_map_add( map_y , cell , prg_y );
- };
- cell = ( prg_y * grd_w ) + scn_x;
- if ( prg_y != scn_y ) {
- ds_map_delete( map_x , cell );
- ds_map_delete( map_y , cell );
- };
- ds_grid_set( grid , scn_x , prg_y , val_f );
- prg_y --;
- };
- scn_m = 1;
- break;
- case 1:
- prg_y = scn_y + 1;
- while( true ) {
- cell = ( prg_y * grd_w ) + scn_x;
- if ( ( cell < 0 ) || ( cell >= ( grd_w * grd_h ) ) || ( ds_grid_get( grid , scn_x , prg_y ) != val_r ) ) { break; };
- cell = ( prg_y * grd_w ) + ( scn_x + 1 );
- if ( cell >= 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x + 1 , prg_y ) == val_r ) {
- ds_map_add( map_x , cell , scn_x + 1 );
- ds_map_add( map_y , cell , prg_y );
- };
- cell = ( prg_y * grd_w ) + ( scn_x - 1 );
- if ( cell >= 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x - 1 , prg_y ) == val_r ) {
- ds_map_add( map_x , cell , scn_x - 1 );
- ds_map_add( map_y , cell , prg_y );
- };
- cell = ( prg_y * grd_w ) + scn_x;
- if ( prg_y != scn_y ) {
- ds_map_delete( map_x , cell );
- ds_map_delete( map_y , cell );
- };
- ds_grid_set( grid , scn_x , prg_y , val_f );
- prg_y ++;
- };
- scn_m = 2;
- break;
- default: break;
- };
- };
- cell = ( scn_y * grd_w ) + scn_x;
- if ( cell >= 0 && cell <= ( grd_w * grd_h ) ) {
- ds_map_delete( map_x , cell );
- ds_map_delete( map_y , cell );
- };
- scn_x = ds_map_find_value( map_x , ds_map_find_first( map_x ) );
- scn_y = ds_map_find_value( map_y , ds_map_find_first( map_x ) );
- };
- ds_map_destroy( map_x );
- ds_map_destroy( map_y );
- return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement