Map Decorate( Map map ) { Map newmap(map); int bounds[4][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; for( int x = 0; x < map.Width(); x++ ) for( int y = 0; y < map.Height(); y++ ) { int hnb=0,vnb=0; for( int i = 0; i < 2; i++ ) hnb += (map.GetScroll( x + bounds[i][0], y + bounds[i][1] ) == Map::BLOCK_FREE ? 0 : 1); for( int i = 2; i < 4; i++ ) vnb += (map.GetScroll( x + bounds[i][0], y + bounds[i][1] ) == Map::BLOCK_FREE ? 0 : 1); if( (hnb - vnb == 0 || hnb + vnb == 1 ) && map.Get( x, y ) != Map::BLOCK_FREE ) newmap.Set(x, y, 2); } return newmap; }
Map Flatten( Map map ) { Map newmap(map); int bounds[8][2] = { { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, { -1, 0 }, { -1, -1 }, { 0, -1 }, { 1, -1 } }; for( int x = 0; x < map.Width(); x++ ) for( int y = 0; y < map.Height(); y++ ) { int nb=0; for( int i = 0; i < 8; i++ ) nb += (map.GetScroll(x + bounds[i][0], y + bounds[i][1]) == Map::BLOCK_FREE ? 0 : 1); if( nb == 8 ) newmap.Set(x, y, Map::BLOCK_FREE); } return newmap; }