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); }