/// <summary> /// Erstellt ein Tile mit Daten aus dem angegebenen Rom Objekt an der angegebenen Stelle /// </summary> /// <param name="rom">Rom Objekt, welches die Tile Daten enthält</param> /// <param name="offset">Position der Daten</param> /// <param name="is8Bpp">Wenn true: Es wird versucht ein 8bpp Tile zu laden</param> /// <returns></returns> public static Tile FromRomOffset(Rom rom, UInt32 offset, bool is8Bpp = false) { rom.SetStreamOffset(offset); if (!is8Bpp) { return new Tile(rom.ReadByteArray(32)); } return new Tile(rom.ReadByteArray(64), true); }
/// <summary> /// Erstellt eine Tilemap mit Daten vom angegebenen Rom Objekt /// </summary> /// <param name="input">Rom Objekt in welchem die Tilemap Daten liegen</param> /// <param name="offset">Position der Daten</param> /// <param name="entrycount">Länge der Tilemap in Tiles</param> public Tilemap(Rom input, UInt32 offset, uint entrycount) { _isRepointable = true; Entries = new List<TilemapEntry>(); input.SetStreamOffset(offset); for (int i = 0; i < entrycount; ++i) { Entries.Add(new TilemapEntry(input.ReadUInt16())); } _origSize = GetSize(); }
/// <summary> /// Scant das angegebene Rom auf LZ77 komprimierte Daten /// </summary> /// <param name="input">Zu verwendendes Rom</param> /// <returns></returns> public static List<uint> Scan(Rom input) { var ms = new MemoryStream(input.RawData); var output = new List<uint>(); while (ms.Position < ms.Length - 4) { var position = (UInt32) ms.Position; if (CanBeUnCompressed(ms, (int) ms.Position)) output.Add(position); ms.Position = position + SCAN_DEEPNESS; } return output; }
/// <summary> /// Erstellt eine neue Pointer Tabelle aus dem Kontext eines Rom Objekts /// </summary> /// <param name="context">Rom Objekt, welches die Tabelle beinhaltet</param> /// <param name="offset">Offset der Tabelle</param> /// <param name="count">Anzahl der Pointer</param> public PointerTable(Rom context, UInt32 offset, int count) { _entries = new List<UInt32>(); _offset = offset; context.SetStreamOffset(offset); for (int i = 0; i < count; ++i) { UInt32 pointer = context.ReadUInt32(); if (((pointer & 0x1FFFFFF) >> 24) > 0) { throw new Exception(String.Format("An dieser Stelle wurde kein Pointer gefunden: {0}", pointer.ToString("X"))); } _entries.Add(pointer); _origSize = (_entries.Count*4); } }
/// <summary> /// Erstellt eine Tilemap mit Daten vom angegebenen Rom Objekt und dekomprimiert die Daten vorher /// </summary> /// <param name="input">Rom Objekt in welchem die komprimierten Tilemap Daten liegen</param> /// <param name="offset">Position der Daten</param> public Tilemap(Rom input, uint offset) { long origSize; byte[] data = RomDecode.LzUncompress(input, offset, out origSize); var ms = new MemoryStream(data); var br = new BinaryReader(ms); var tmap = new List<UInt16>(); if (data.Length%2 != 0) { throw new Exception("An der angegebenen Stelle befindet sich keine komprimierte Tilemap"); } for (int i = 0; i < data.Length/2; ++i) { tmap.Add(br.ReadUInt16()); } Initialize(tmap.ToArray()); _origSize = (int)origSize; }
/// <summary> /// Erstellt eine Palette aus den Werten an der angegebenen Romadresse /// </summary> /// <param name="input">Rom Objekt, welches die Palettendaten enthält</param> /// <param name="offset">Offset der Daten</param> /// <param name="isEncoded">Wenn true: Die Daten werden zuerst dekomprimiert(LZ77)</param> /// <param name="is256Pal">Wenn true: Lädt 256 Einträge anstatt 16</param> public Palette(Rom input, UInt32 offset, bool isEncoded, bool is256Pal = false) { IsEncoded = isEncoded; _isRepointable = true; _currentOffset = offset; short cols = 16; if (is256Pal) { cols = 256; } _entries = new PaletteEntry[cols]; var entryList = new List<UInt16>(); if (!isEncoded) { { input.SetStreamOffset(offset); entryList = input.ReadUShortArray(cols); } } else { long origSize; byte[] unlz = RomDecode.LzUncompress(input, offset, out origSize); for (int i = 0; i < unlz.Length / 2; i++) { UInt16 temp = unlz[(2*i)]; temp |= (UInt16) ((unlz[1 + (i*2)]) << 8); entryList.Add(temp); } } for (int i = 0; i < cols; i++) { _entries[i] = new PaletteEntry(entryList[i]); } if (_entries.Length != cols) { throw new Exception("Die angegebene Palette hat nicht die angegebene Anzahl an Farben"); } _lenght = GetRawData().Length; _origSize = GetSize(); }
public static byte[] UnlzFromOffset(Rom input, UInt32 offset) { var ms = new MemoryStream(input.RawData) {Position = offset}; return Unlz(ms); }
public static byte[] LzUncompress(Rom input, uint offset, out long length) { input.SetStreamOffset(offset); return LzUncompress(input.Stream, out length); }