public void SetTileData(IntVector3 p, TileData data)
{
int oldLevel = GetSurfaceLevel(p.X, p.Y);
if (data.IsWall && oldLevel <= p.Z)
{
// Surface level has risen
Debug.Assert(p.Z >= 0 && p.Z < 256);
SetSurfaceLevel(p.X, p.Y, p.Z + 1);
}
else if (data.IsWall == false && oldLevel == p.Z + 1)
{
// Surface level has possibly lowered
if (p.Z == 0)
throw new Exception();
for (int z = p.Z - 1; z >= 0; --z)
{
if (GetTileData(p.X, p.Y, z).IsWall)
{
Debug.Assert(z >= 0 && z < 256);
SetSurfaceLevel(p.X, p.Y, z + 1);
break;
}
}
}
SetTileDataNoHeight(p, data);
}