public void Replace(Rectangle from, Point to)
{
for (int y = from.Height; y >= 0; y--)
{
int curY = y;
Window.SetTimeout(
() =>
{
for (int x = 0; x < from.Width; x++)
{
var toChunkX = (to.X + x) / 8;
var toChunkY = (to.Y + curY) / 8;
var tochunk = SonicLevel.GetChunkAt(toChunkX, toChunkY);
tochunk.ClearCache();
var totp = tochunk.TilePieces[(to.X + x) - toChunkX * 8][(to.Y + curY) - toChunkY * 8];
tochunk.IsOnlyBackground = null;
tochunk.IsOnlyForeground = null;
var fromChunkX = (from.X + x) / 8;
var fromChunkY = (from.Y + curY) / 8;
var fromchunk = SonicLevel.GetChunkAt(fromChunkX, fromChunkY);
fromchunk.ClearCache();
fromchunk.IsOnlyBackground = null;
fromchunk.IsOnlyForeground = null;
var fromtp = fromchunk.TilePieces[(from.X + x) - fromChunkX * 8][(from.Y + curY) - fromChunkY * 8];
tochunk.TilePieces[(to.X + x) - toChunkX * 8][(to.Y + curY) - toChunkY * 8] = fromtp;
fromchunk.TilePieces[(from.X + x) - fromChunkX * 8][(from.Y + curY) - fromChunkY * 8] = totp;
}
},
(from.Height - y) * 50
);
}
}