Beispiel #1
0
 /// <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);
 }
Beispiel #2
0
 /// <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();
 }
Beispiel #3
0
 /// <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);
     }
 }
Beispiel #5
0
        /// <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;
        }
Beispiel #6
0
 /// <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();
 }
Beispiel #7
0
 public static byte[] UnlzFromOffset(Rom input, UInt32 offset)
 {
     var ms = new MemoryStream(input.RawData) {Position = offset};
     return Unlz(ms);
 }
Beispiel #8
0
 public static byte[] LzUncompress(Rom input, uint offset, out long length)
 {
     input.SetStreamOffset(offset);
     return LzUncompress(input.Stream, out length);
 }