public override void Update(GameTime gameTime, int x, int y, int variation, int orientation)
        {
            ReadableOrientation readableOrientation = new ReadableOrientation(orientation);

            if (WorldGen.SolidTile(x - 1, y))
            {
                readableOrientation.Left = false;
            }
            if (WorldGen.SolidTile(x + 1, y))
            {
                readableOrientation.Right = false;
            }
            if (WorldGen.SolidTile(x, y - 1))
            {
                readableOrientation.Up = false;
            }
            if (WorldGen.SolidTile(x, y + 1))
            {
                readableOrientation.Down = false;
            }

            CoveringsManager.SetOrientation(x, y, (int)readableOrientation);
        }
        protected void DrawCoveringsOnTileVariations(SpriteBatch spriteBatch, int x, int y, Color clr, bool halfBrick, byte slope, int variation, int orientation)
        {
            Tile  tile  = Framing.GetTileSafely(x, y);
            Point frame = GetFrame(variation, orientation);
            ReadableOrientation readOri = (ReadableOrientation)orientation;

            // if this has an up/left orientation and so does the one to bottom left
            if ((readOri.Left || (tile.slope() == 2 && (readOri.Up || readOri.Left))) && ((ReadableOrientation)CoveringsManager.GetData(x - 1, y + 1).Orientation).Up)
            {
                DrawSpecificYFrame(spriteBatch, x, y + 1, frame, 20, clr);
                if (halfBrick)
                {
                    readOri.Left = true;
                }
            }

            // if this has an up orientation and so does the one to bottom right
            if ((readOri.Right || (tile.slope() == 1 && (readOri.Up || readOri.Right))) && ((ReadableOrientation)CoveringsManager.GetData(x + 1, y + 1).Orientation).Up)
            {
                DrawSpecificYFrame(spriteBatch, x, y + 1, frame, 20, clr, SpriteEffects.FlipHorizontally);
                if (halfBrick)
                {
                    readOri.Right = true;
                }
            }

            // if this has an down orientation and so does the one to bottom left
            if (readOri.Down && ((ReadableOrientation)CoveringsManager.GetData(x - 1, y + 1).Orientation).Down)
            {
                DrawSpecificYFrame(spriteBatch, x - 1, y, frame, 20, clr, SpriteEffects.FlipVertically);
            }

            // if this has an down orientation and so does the one to bottom left
            if (readOri.Down && ((ReadableOrientation)CoveringsManager.GetData(x + 1, y + 1).Orientation).Down)
            {
                DrawSpecificYFrame(spriteBatch, x + 1, y, frame, 20, clr, SpriteEffects.FlipHorizontally | SpriteEffects.FlipVertically);
            }

            // we do this so any changes made to the orientation from the above hacks take effect
            frame = GetFrame(variation, (int)readOri);

            if (halfBrick)
            {
                switch ((int)readOri)
                {
                case 4:
                    break;

                case 1:     // draw top half of texture moved down a bit
                case 2:
                case 3:
                case 8:
                case 9:
                case 10:
                case 11:
                    spriteBatch.Draw(Texture, new Vector2(x, y) * 16f - Main.screenPosition + Vector2.UnitY * 8f, new Rectangle(frame.X, frame.Y, 16, 8), clr, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                    return;

                case 5:
                case 7:
                case 13:
                case 15:
                    // draw bottom half first
                    spriteBatch.Draw(Texture, new Vector2(x, y) * 16f - Main.screenPosition + Vector2.UnitY * 8f, new Rectangle(frame.X, frame.Y + 8, 16, 8), clr, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                    // draw top half moved down a bit
                    spriteBatch.Draw(Texture, new Vector2(x, y) * 16f - Main.screenPosition + Vector2.UnitY * 8f, new Rectangle(frame.X, frame.Y, 16, 8), clr, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                    return;

                case 6:     // draw bottom half
                case 12:
                case 14:
                    spriteBatch.Draw(Texture, new Vector2(x, y) * 16f - Main.screenPosition + Vector2.UnitY * 8f, new Rectangle(frame.X, frame.Y + 8, 16, 8), clr, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                    return;
                }
            }

            if (slope > 0)
            {
                switch ((int)readOri)
                {
                case 1:
                    if (slope == 1)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);     // TR
                        return;
                    }
                    if (slope == 2)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);     // TL
                        return;
                    }
                    break;

                case 2:
                    if (slope == 1)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);     // TR
                        return;
                    }
                    if (slope == 3)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);     // BR
                        return;
                    }
                    break;

                case 3:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);
                        return;
                    }
                    break;

                case 4:
                    if (slope == 3)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);     // BR
                        return;
                    }
                    if (slope == 4)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);     // BL
                        return;
                    }
                    break;

                case 5:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);
                        return;
                    }
                    break;

                case 6:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;
                    }
                    break;

                case 7:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 6, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);        // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);         // BR
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 3, clr);
                        return;
                    }
                    break;

                case 8:
                    if (slope == 2)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);     // BR
                        return;
                    }
                    if (slope == 4)
                    {
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);     // BL
                        return;
                    }
                    break;

                case 9:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);
                        return;
                    }
                    break;

                case 10:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;
                    }
                    break;

                case 11:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 9, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 3, clr);
                        return;
                    }
                    break;

                case 12:
                    switch (slope)
                    {
                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        return;
                    }
                    break;

                case 13:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 12, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 4, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 9, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 1, clr);
                        return;
                    }
                    break;

                case 14:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 12, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 6, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 8, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 2, clr);
                        return;
                    }
                    break;

                case 15:
                    switch (slope)
                    {
                    case 1:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 17, clr);         // TR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 12, clr);
                        return;

                    case 2:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 16, clr);         // TL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 6, clr);
                        return;

                    case 3:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 18, clr);         // BR
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 9, clr);
                        return;

                    case 4:
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 19, clr);         // BL
                        DrawSpecificYFrame(spriteBatch, x, y, frame, 3, clr);
                        return;
                    }
                    break;
                }
            }

            spriteBatch.Draw(Texture, new Vector2(x, y) * 16f - Main.screenPosition, new Rectangle(frame.X, frame.Y, 16, 16), clr, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
        }