+static int map_tile_availible( int co[2] )
+{
+ // Extract 5x5 grid surrounding tile
+ u32 blob = 0x1000;
+ for( int y = vg_max( co[1]-2, 0 ); y < vg_min( map.y, co[1]+3 ); y ++ )
+ for( int x = vg_max( co[0]-2, 0 ); x < vg_min( map.x, co[0]+3 ); x ++ )
+ {
+ struct cell *cell = map_tile_at( (int[2]){ x, y } );
+
+ if( cell && (cell->flags & CELL_FLAG_WALKABLE) )
+ blob |= 0x1 << ((y-(co[1]-2))*5 + x-(co[0]-2));
+ }
+
+ // Run filter over center 3x3 grid to check for invalid configurations
+ int kernel[] = { 0, 1, 2, 5, 6, 7, 10, 11, 12 };
+ for( int i = 0; i < vg_list_size(kernel); i ++ )
+ {
+ if( blob & (0x1 << (6+kernel[i])) )
+ {
+ // (reference window: 0x1CE7) Illegal moves
+ // 0100011100010 ;
+ // 0000001100011 ;
+ // 0000011000110 ;
+ // 0110001100000 ;
+ // 1100011000000 ;
+ // 0100001100010 ;
+ // 0100011000010 ;
+
+ u32 invalid[] = { 0x8E2, 0x63, 0xC6, 0xC60, 0x18C0, 0x862, 0x8C2 };
+ u32 window = blob >> kernel[i];
+
+ for( int j = 0; j < vg_list_size(invalid); j ++ )
+ if((window & invalid[j]) == invalid[j])
+ return 0;
+ }
+ }
+
+ return 1;
+}
+