Beispiel #1
0
        public void SetBytes(byte[] data)
        {
            if (data.Length != OverlayTiles.Size)
            {
                throw new ArgumentException("Incorrect overlay tile data size", nameof(data));
            }

            this.Clear();
            for (int overlayTileIndex = 0; overlayTileIndex < OverlayTiles.MaxTileCount; overlayTileIndex++)
            {
                int index = overlayTileIndex * 3;
                if (data[index + 1] == 0xFF &&
                    data[index + 2] == 0xFF)
                {
                    break;
                }

                OverlayTileSize    size    = this.sizes[(data[index] & 0xC0) >> 6];
                OverlayTilePattern pattern = this.patterns[data[index] & 0x3F];

                if (pattern.Size != size)
                {
                    // The overlay tile size is different from the expected pattern size,
                    // ignore this overlay tile, the editor cannot handle it.
                    continue;
                }

                int   x        = (data[index + 1] & 0x7F);
                int   y        = ((data[index + 2] & 0x3F) << 1) + ((data[index + 1] & 0x80) >> 7);
                Point location = new Point(x, y);

                this.Add(new OverlayTile(pattern, location));
            }
        }
        public OverlayTilePattern(byte[] data, OverlayTileSize size)
        {
            if (data.Length != size.Width * size.Height)
            {
                throw new ArgumentException("Data does not match size.");
            }

            this.Size = size;
            this.SetBytes(data);
            this.Modified = false;
        }
 private OverlayTileSize[] LoadPatternSizes(OverlayTileSizes sizes)
 {
     // TODO: Get this from the ROM, if even possible.
     // It is unlikely that this information is available anywhere in the ROM since
     // each overlay tile indicates which size to use when displayed at runtime.
     // Maybe the size of each pattern should be saved in the epic zone when we start supporting updating the patterns.
     byte[]            sizeIndexes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1 };
     OverlayTileSize[] sizeArray   = new OverlayTileSize[this.Count];
     for (int i = 0; i < this.Count; i++)
     {
         sizeArray[i] = sizes[sizeIndexes[i]];
     }
     return(sizeArray);
 }