Esempio n. 1
0
 public static long FindOffset(byte[] input, string tag)
 {
     using (var ms = new MemoryStream(input))
     {
         var reader = new BinaryReader(ms);
         var it     = new ChunkIterator5(reader, input.Length);
         while (it.MoveNext())
         {
             if (it.Current.Tag == tag)
             {
                 return(reader.BaseStream.Position);
             }
         }
     }
     return(-1);
 }
Esempio n. 2
0
 public static byte[] ReadData(byte[] input, string tag)
 {
     using (var ms = new MemoryStream(input))
     {
         var reader = new BinaryReader(ms);
         var it     = new ChunkIterator5(reader, input.Length);
         while (it.MoveNext())
         {
             if (it.Current.Tag == tag)
             {
                 return(reader.ReadBytes((int)(it.Current.Size - 8)));
             }
         }
     }
     return(new byte[0]);
 }
Esempio n. 3
0
        Room ReadRoomCore(long offset, long chunkSize)
        {
            var room = new Room {
                Size = (int)chunkSize
            };
            var it       = new ChunkIterator5(_reader, chunkSize);
            var images   = new Dictionary <ushort, ObjectData>();
            var objCodes = new Dictionary <ushort, ObjectData>();

            while (it.MoveNext())
            {
                switch (it.Current.Tag)
                {
                case "TRNS":
                {
                    // transparent color
                    room.TransparentColor = _reader.ReadByte();
                    var unknown = _reader.ReadByte();
                }
                break;

                case "RMHD":
                    // ROOM Header
                    room.Header = ReadRMHD();
                    break;

                case "RMIM":
                    // room image
                    ReadRoomImage(room);
                    break;

                case "IMAG":
                    ReadRoomImages(room);
                    break;

                case "CYCL":
                    // CYCL
                    room.ColorCycle = ReadCYCL();
                    break;

                case "EPAL":
                    // EPAL
                    ReadEPAL();
                    break;

                case "BOXD":
                    // box data
                {
                    var numBoxes = ReadNumBoxes();
                    for (int i = 0; i < numBoxes; i++)
                    {
                        var box = ReadBox();
                        room.Boxes.Add(box);
                    }
                }
                break;

                case "BOXM":
                    // box matrix
                {
                    var size = (int)(it.Current.Size - 8);
                    room.BoxMatrix.Clear();
                    room.BoxMatrix.AddRange(_reader.ReadBytes(size));
                }
                break;

                case "PALS":
                {
                    room.HasPalette = true;
                    var palettes = ReadPalettes().ToArray();
                    room.Palettes.Clear();
                    room.Palettes.AddRange(palettes);
                }
                break;

                case "SCAL":
                    // SCAL
                    if (it.Current.Size > 8)
                    {
                        room.Scales = ReadSCAL();
                    }
                    break;

                case "ENCD":
                {
                    // Entry script
                    room.EntryScript.Data = _reader.ReadBytes((int)(it.Current.Size - 8));
                }
                break;

                case "EXCD":
                {
                    // exit script
                    room.ExitScript.Data = _reader.ReadBytes((int)(it.Current.Size - 8));
                }
                break;

                case "NLSC":
                {
                    // number of local scripts
                    var numLocalScripts = _reader.ReadUInt16();
                }
                break;

                case "LSCR":
                {
                    // local script
                    var pos   = _reader.BaseStream.Position;
                    var index = ReadScriptIndex();
                    var size  = 8 + _reader.BaseStream.Position - pos;
                    room.LocalScripts[index - GetNumGlobalScripts()] = new ScriptData
                    {
                        Data = _reader.ReadBytes((int)(it.Current.Size - size))
                    };
                }
                break;

                case "OBIM":
                {
                    // Object Image
                    var obj = ReadObjectImages(it.Current.Size - 8);
                    images[obj.Number] = obj;
                }
                break;

                case "OBCD":
                {
                    // object script
                    var obj = ReadObjectCode(it.Current.Size - 8);
                    objCodes[obj.Number] = obj;
                }
                break;

                default:
                    UnknownChunk(it.Current);
                    break;
                }
            }

            var objIds = objCodes.Values.Concat(images.Values).Select(o => o.Number).Distinct().ToList();

            foreach (var objId in objIds)
            {
                if (images.ContainsKey(objId))
                {
                    if (objCodes.ContainsKey(objId))
                    {
                        room.Objects.Add(Merge(images[objId], objCodes[objId]));
                    }
                    else
                    {
                        room.Objects.Add(images[objId]);
                    }
                }
                else
                {
                    room.Objects.Add(objCodes[objId]);
                }
            }

            return(room);
        }