Beispiel #1
0
 private static Tile LoadSingleTile(byte x, byte y, byte layer, byte[] data)
 {
     var tile = new Tile {
         X = x,
         Y = y,
         Layer = layer,
         Shape = data[0],
         Edges = data[1],
         EndCaps = data[2],
         SpriteSet = (byte)(data[11] & 0xf),
         SpritePalette = (byte)(data[11] >> 4),
         SpriteTile = data[12],
         RawData = data.ToArray(),
     };
     Trace("tile {0:X2} {1:X2} {2:X2} | {3:X2} {4:X2} {5} {6} {7} | {8}",
         x, y, layer, tile.Shape, tile.Edges, tile.SpriteSet, tile.SpritePalette, tile.SpriteTile, Util.Hexify(data));
     return tile;
 }
Beispiel #2
0
        private void DrawTileTopEdge(Graphics canvas, Tile tile, TileShape shape, ImageAttributes attrs)
        {
            var drawEdge = (tile.Edges & 1) != 0;
            var drawLeftCap = (tile.EndCaps & 1) != 0;
            var drawRightCap = (tile.EndCaps & 2) != 0;

            if (shape.Top == null) {
                Debug.Assert(!drawEdge && !drawLeftCap && !drawRightCap);
                return;
            }

            var transform = new Matrix();
            transform.Translate(tile.X * App.PixelsPerTile + shape.Top.X1 + sliceOverdraw, tile.Y * App.PixelsPerTile + shape.Top.Y1 + sliceOverdraw);
            transform.Rotate(shape.Top.Angle);
            canvas.Transform = transform;
            var length = shape.Top.Length;

            if (drawEdge) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 17 + (tile.X / 2) % 3);
                var sx = (tile.X & 1) * 48;
                canvas.DrawImage(sprite.Image,
                    new Rectangle(0, sprite.Hitbox.Top, length, sprite.Hitbox.Height),
                    sx - sprite.Hitbox.Left, 0, 48, sprite.Hitbox.Height, GraphicsUnit.Pixel, attrs);
            }

            if (drawLeftCap) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 16);
                canvas.DrawImage(sprite.Image,
                    new Rectangle(sprite.Hitbox.Left, sprite.Hitbox.Top, sprite.Hitbox.Width, sprite.Hitbox.Height),
                    0, 0, sprite.Hitbox.Width, sprite.Hitbox.Height, GraphicsUnit.Pixel, attrs);
            }

            if (drawRightCap) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 20);
                canvas.DrawImage(sprite.Image,
                    new Rectangle(sprite.Hitbox.Left + length, sprite.Hitbox.Top, sprite.Hitbox.Width, sprite.Hitbox.Height),
                    0, 0, sprite.Hitbox.Width, sprite.Hitbox.Height, GraphicsUnit.Pixel, attrs);
            }

            canvas.ResetTransform();
        }
Beispiel #3
0
        private void DrawTileCenter(Graphics canvas, Tile tile, TileShape shape, ImageAttributes attrs)
        {
            var transform = new Matrix();
            transform.Translate(tile.X * App.PixelsPerTile + sliceOverdraw, tile.Y * App.PixelsPerTile + sliceOverdraw);
            canvas.Transform = transform;

            canvas.SetClip(new GraphicsPath(shape.Clip, shape.Clip.Select(p => (byte) 1).ToArray()));

            var chunk = (tile.X / 2) % 5 + ((tile.Y / 2) % 3) * 5 + 1;
            var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, chunk);
            var sx = (tile.X & 1) * 48;
            var sy = (tile.Y & 1) * 48;
            canvas.DrawImage(sprite.Image,
                new Rectangle(0, 0, 48, 48),
                sx - sprite.Hitbox.Left, sy - sprite.Hitbox.Top, 48, 48, GraphicsUnit.Pixel, attrs);

            canvas.ResetClip();
            canvas.ResetTransform();
        }
Beispiel #4
0
        private void DrawTileRightEdge(Graphics canvas, Tile tile, TileShape shape, ImageAttributes attrs)
        {
            var drawEdge = (tile.Edges & 8) != 0;
            var drawTopCap = (tile.EndCaps & 64) != 0;
            var drawBottomCap = (tile.EndCaps & 128) != 0;

            if (shape.Right == null) {
                Debug.Assert(!drawEdge && !drawTopCap && !drawBottomCap);
                return;
            }

            var transform = new Matrix();
            transform.Translate(tile.X * App.PixelsPerTile + shape.Right.X1 + sliceOverdraw, tile.Y * App.PixelsPerTile + shape.Right.Y1 + sliceOverdraw);
            transform.Rotate(shape.Right.Angle - 90);
            canvas.Transform = transform;
            var length = shape.Right.Length;

            if (drawEdge) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 27 + (tile.Y / 2) % 3);
                var sy = (tile.Y & 1) * 48;
                canvas.DrawImage(sprite.Image,
                    new Rectangle(sprite.Hitbox.Left, 0, sprite.Hitbox.Width, length),
                    0, sy - sprite.Hitbox.Top, sprite.Hitbox.Width, 48, GraphicsUnit.Pixel, attrs);
            }

            if (drawTopCap) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 26);
                canvas.DrawImage(sprite.Image,
                    new Rectangle(sprite.Hitbox.Left, sprite.Hitbox.Top, sprite.Hitbox.Width, sprite.Hitbox.Height),
                    0, 0, sprite.Hitbox.Width, sprite.Hitbox.Height, GraphicsUnit.Pixel, attrs);
            }

            if (drawBottomCap) {
                var sprite = sprites.LoadTile(tile.SpriteSet, tile.SpriteTile, tile.SpritePalette, 30);
                canvas.DrawImage(sprite.Image,
                    new Rectangle(sprite.Hitbox.Left, sprite.Hitbox.Top + length, sprite.Hitbox.Width, sprite.Hitbox.Height),
                    0, 0, sprite.Hitbox.Width, sprite.Hitbox.Height, GraphicsUnit.Pixel, attrs);
            }

            canvas.ResetTransform();
        }
Beispiel #5
0
        private void DrawFilth(Graphics canvas, Tile tile, TileEdge edge, int center, int caps)
        {
            if (center == 0 || edge == null)
                return;

            var transform = new Matrix();
            transform.Translate(tile.X * App.PixelsPerTile + edge.X1 + sliceOverdraw, tile.Y * App.PixelsPerTile + edge.Y1 + sliceOverdraw);
            transform.Rotate(edge.Angle);
            canvas.Transform = transform;
            var length = edge.Length;

            if (center != 0) {
                var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 2 + (tile.X + tile.Y) % 5);
                canvas.DrawImage(sprite.Image, new Rectangle(sprite.Hitbox.Left, sprite.Hitbox.Top, length, sprite.Hitbox.Height));
            }

            if ((caps & 1) != 0) {
                var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 1);
                canvas.DrawImage(sprite.Image, sprite.Hitbox);
            }

            if ((caps & 2) != 0) {
                var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 7);
                canvas.DrawImage(sprite.Image, new Rectangle(sprite.Hitbox.Left + length, sprite.Hitbox.Top, sprite.Hitbox.Width, sprite.Hitbox.Height));
            }

            canvas.ResetTransform();
        }