Ejemplo n.º 1
0
        public void TagStruct(ref TSFReader sr, ref MemoryStream FI, ref MemoryStream FO, uint Count, ushort uName)
        {
            long MapPosSave;

            TabReplace += (char)TabByte;
            Name        = sr.GetUName();
            Size        = sr.GetSOC();
            TagBuff     = new byte[Size * Count];
            FI.Read(TagBuff, 0, TagBuff.Length);
            long StructPosition = FO.Position;

            FO.Write(TagBuff, 0, TagBuff.Length);
            uint StartOfStruct = sr.Position;
            uint sc            = 0;
            bool ExitStruct    = false;

            do
            {
                do
                {
                    sr.Read();
                    switch (sr.GetCMD())
                    {
                    case TSFReader.TSFStruct:                                    // 0xA0: //Struct
                        #region Structure
                        uint ChildCount = CompUtil.GetUInt(TagBuff, (uint)(sr.GetOIP()) + (sc * Size));
                        if (sr.GetUName() == 0xffff)
                        {
                            ChildCount = 0;
                            CompUtil.PutUInt(ref TagBuff, (uint)(sr.GetOIP()) + (sc * Size), 0);
                        }
                        if (ChildCount != 0)
                        {
                            Converter Child = new Converter();
                            Child.TagStruct(ref sr, ref FI, ref FO, ChildCount, sr.GetUName());
                        }
                        else
                        {
                            sr.SeekAheadTo(0xA7, sr.GetUName());
                        }
                        break;

                        #endregion
                    case TSFReader.TSFBSPTagRef:                                 // 0xA8: //BSPTagRef
                    case TSFReader.TSFTagRef:                                    // 0xA1: //TagRef
                        #region TagRef
                        int StringSize = (int)CompUtil.GetUInt(TagBuff, (uint)(sr.GetOIP() + (sc * Size)) + 0x08);
                        if (StringSize != 0)
                        {
                            byte[] tmpstr = new byte[StringSize + 1];
                            FI.Read(tmpstr, 0, tmpstr.Length);
                            FO.Write(tmpstr, 0, tmpstr.Length);
                        }
                        break;

                        #endregion
                    case TSFReader.TSFInternalRaw:                               // 0xA3: //InternalRaw
                        #region InternalRaw
                        uint   RawSize = CompUtil.GetUInt(TagBuff, (uint)(sr.GetOIP() + (sc * Size)));
                        byte[] tmp     = new byte[RawSize];
                        FI.Read(tmp, 0, tmp.Length);
                        FO.Write(tmp, 0, tmp.Length);
                        tmp = null;
                        break;

                        #endregion
                    case TSFReader.TSFIntSwap:
                        #region IntSwap
                        uint is_Offset = (uint)sr.GetOIP();
                        CompUtil.SwapInt(ref TagBuff, is_Offset + (sc * Size));

                        break;

                        #endregion
                    case TSFReader.TSFIntSwapRange:
                        #region IntSwapRange
                        uint StartOffset = (uint)sr.GetOIP();
                        uint EndOffset   = (uint)sr.GetUName();
                        for (uint i = StartOffset; i < EndOffset; i += 4)
                        {
                            CompUtil.SwapInt(ref TagBuff, i + (sc * Size));
                        }
                        break;

                        #endregion
                    case TSFReader.TSFLongSwap:
                        #region ShortSwap
                        uint Offset = (uint)sr.GetOIP();
                        CompUtil.SwapShort(ref TagBuff, Offset + (sc * Size));
                        break;

                        #endregion
                    case TSFReader.TSFLongSwapRange:
                        #region ShortSwapRange
                        uint lsr_StartOffset = (uint)sr.GetOIP();
                        uint lsr_EndOffset   = (uint)sr.GetUName();
                        for (uint i = lsr_StartOffset; i < lsr_EndOffset; i += 2)
                        {
                            CompUtil.SwapShort(ref TagBuff, i + (sc * Size));
                        }
                        break;

                        #endregion
                    case TSFReader.TSFBitmapRaw:                                 // 0xA9: //Bitmapraw
                        #region BitmapRaw

                        /*
                         * uint BitMapStructCount;
                         * uint BitMapStructOffset;
                         * uint TiffSize=0;
                         * byte[] tmpBMS;
                         * long sv = 0;
                         *
                         #region grenbitmap
                         * if(Info.IndexItems[Info.CurrentIndex].RawTypeID != 0)
                         * {
                         *      //Trace.WriteLine("extern ce bitmap:  " + Prometheus.Core.Compiler.Decompiler.CurrentTagName);
                         *      CeBitmapIndex.Read(br);
                         *      //meta header for bitmaps for extern ce files is actually in the bitmaps.map file
                         *      //so we need to get the header from there.
                         *
                         *      //fix the index offset, it doesn't use magic
                         *      int bitmap_hdr_offset = (int)CeBitmapIndex.Locator[Info.IndexItems[Info.CurrentIndex].MetaOffset + Info.TagMagic].offset;
                         *      Info.BitmapsFile.Position = bitmap_hdr_offset;
                         *      TagBuff = br.ReadBytes(TagBuff.Length);
                         *      PutUInt(ref TagBuff,0x54,0);
                         *      //get bitmap header(s) offset/count
                         *      BitMapStructCount=GetUInt(TagBuff,0x60);
                         *      BitMapStructOffset=GetUInt(TagBuff,0x64);
                         *
                         *      //copy bitmap header(s) from CE shared to output tag
                         *      br.BaseStream.Position += (BitMapStructOffset-Size);
                         *      tmpBMS = new byte[BitMapStructCount * 0x30];
                         *      tmpBMS = br.ReadBytes(tmpBMS.Length);
                         *
                         *      GetUInt(TagBuff,0x1C,ref TiffSize);
                         *
                         *      bw.BaseStream.Position = 0;
                         *      bw.Write(TagBuff);
                         *      bw.BaseStream.Position +=  (BitMapStructOffset-Size);
                         *      //bw.Write(tmpBMS);
                         *      //FO.Write(tmpBMS, (int)FO.Position, tmpBMS.Length);
                         *
                         *      //skip over TIFF area in output tag
                         *      GetUInt(TagBuff,0x1C,ref TiffSize);
                         *      byte[] TiffBuffer = new byte[TiffSize];
                         *      bw.Write(TiffBuffer);
                         *      //FO.Write(TiffBuffer,0,TiffBuffer.Length);
                         *
                         *      //copy bitmap data from CE shared to output tag
                         *      uint accum = (uint)bw.BaseStream.Position;
                         *      for(int i = 0;i<BitMapStructCount;i++)
                         *      {
                         *              uint BitMapDataOffset = GetUInt(tmpBMS,(uint)(0x18 + (i * 0x30)));
                         *              uint BitMapDataSize = GetUInt(tmpBMS,(uint)(0x1C + (i * 0x30)));
                         *              uint CurrentSize = GetUInt(TagBuff,(uint)0x30);
                         *              PutUInt(ref TagBuff,0x30,CurrentSize + BitMapDataSize);
                         *              byte[] tmpBitmapData = new byte[BitMapDataSize];
                         *              tmpBitmapData = br.ReadBytes((int)BitMapDataSize);
                         *              bw.Write(tmpBitmapData);
                         *              PutUInt(ref tmpBMS,(uint)(0x18 + (i * 0x30)), accum);
                         *              accum += BitMapDataSize;
                         *      }
                         *
                         *      //go to the image header offsets
                         *      //bw.BaseStream.Position = TagBuff.Length + TiffSize +
                         *      bw.BaseStream.Position += 0x40;
                         *      bw.Write(tmpBMS);
                         *      long eof = bw.BaseStream.Position;
                         *
                         *      //fix the offsets
                         *      bw.BaseStream.Position = 0x74;
                         *      bw.Write(accum);
                         *      bw.BaseStream.Position = eof;
                         *
                         *      fuckThisShitHack = true;
                         *      //FO.Write(tmpBitmapData, (int)FO.Position, tmpBitmapData.Length);
                         * }
                         * else
                         * {
                         *      GetUInt(TagBuff,0x1C,ref TiffSize);
                         *      byte[] TiffBuffer = new byte[TiffSize];
                         *      FO.Write(TiffBuffer,0,TiffBuffer.Length);
                         *      BitMapStructCount=GetUInt(TagBuff,0x60);
                         *      BitMapStructOffset=GetUInt(TagBuff,0x64) - Info.MapMagic;
                         *      sv = fs.Position;
                         *      fs.Seek((long)BitMapStructOffset,SeekOrigin.Begin);
                         *      tmpBMS = new byte[BitMapStructCount * 0x30];
                         *      fs.Read(tmpBMS,0,tmpBMS.Length);
                         *
                         *      for(int i = 0;i<BitMapStructCount;i++)
                         *      {
                         *              uint BitMapDataOffset = GetUInt(tmpBMS,(uint)(0x18 + (i * 0x30)));
                         *              uint BitMapDataSize = GetUInt(tmpBMS,(uint)(0x1C + (i * 0x30)));
                         *              uint CurrentSize = GetUInt(TagBuff,(uint)0x30);
                         *              PutUInt(ref TagBuff,0x30,CurrentSize + BitMapDataSize);
                         *              byte[] tmpBitmapData = new byte[BitMapDataSize];
                         *              switch (Info.MapVersion)
                         *              {
                         *                      case 5:
                         *                              fs.Seek((long)BitMapDataOffset,SeekOrigin.Begin);
                         *                              fs.Read(tmpBitmapData,0,tmpBitmapData.Length);
                         *                              FO.Write(tmpBitmapData,0,tmpBitmapData.Length);
                         *                              break;
                         *                      case 7:
                         *                              Info.BitmapsFile.Seek((long)BitMapDataOffset,SeekOrigin.Begin);
                         *                              Info.BitmapsFile.Read(tmpBitmapData,0,tmpBitmapData.Length);
                         *                              FO.Write(tmpBitmapData,0,tmpBitmapData.Length);
                         *                              break;
                         *                      case 0x261:
                         *                              if (Info.IndexItems[Info.CurrentIndex].RawTypeID == 0)
                         *                              {
                         *                                      fs.Seek((long)BitMapDataOffset,SeekOrigin.Begin);
                         *                                      fs.Read(tmpBitmapData,0,tmpBitmapData.Length);
                         *                                      FO.Write(tmpBitmapData,0,tmpBitmapData.Length);
                         *                              }
                         *                              else
                         *                              {
                         *                                      //CE_Bitmap_File CEBF = new CE_Bitmap_File();
                         *                                      //CEBF.HDR.Read(ref Info.BitmapsFile);
                         *                                      //uint Current_offset = CEBF.Locator[Info.IndexItems[Info.CurrentIndex].MetaOffset].offset;
                         *                              }
                         *                              break;
                         *              }
                         *      }
                         *      fs.Seek(sv,SeekOrigin.Begin);
                         * }
                         *
                         #endregion
                         */
                        break;

                        #endregion
                    case TSFReader.TSFSoundData:                                 // 0xAA: //SoundData
                        #region SoundData

                        /*
                         * uint DataSizeOffset = sr.GetOIP();
                         * uint NormalDataOffset = sr.GetUName();
                         * uint SndDataSize = GetUInt(TagBuff,(uint)(DataSizeOffset + (sc * Size)));
                         * uint TrueOffset = GetUInt(TagBuff,(uint)(NormalDataOffset + 4 + (sc * Size)));
                         * byte[] SoundData = new byte[SndDataSize];
                         * switch (Info.MapVersion)
                         * {
                         * case 5:
                         *      long fssv = fs.Position;
                         *      fs.Seek((long)TrueOffset,SeekOrigin.Begin);
                         *      fs.Read(SoundData,0,SoundData.Length);
                         *      fs.Seek(fssv,SeekOrigin.Begin);
                         *      FO.Write(SoundData,0,SoundData.Length);
                         *      break;
                         * case 7:
                         *      Info.SoundsFile.Seek(TrueOffset,System.IO.SeekOrigin.Begin);
                         *      Info.SoundsFile.Read(SoundData,0,SoundData.Length);
                         *      FO.Write(SoundData,0,SoundData.Length);
                         *      SoundData = null;
                         *      break;
                         * }
                         */
                        break;

                        #endregion
                    case TSFReader.TSFRawXModelData:                             // 0xB0: //XModelData
                        #region XModelData

                        /*
                         * uint XTrueVerticesSize = (GetUInt(TagBuff,88 + (sc * Size))) * 32;
                         * uint XTrueIndicesSize =(((GetUInt(TagBuff,72 + (sc * Size))) / 3) + 1 ) * 6;
                         * uint XNewIndicesDataSize = (GetUInt(TagBuff,72 + (sc * Size)) / 3) + 1;
                         * uint XTrueVerticesOffset = GetUInt(TagBuff,100 + (sc * Size)) - Info.MapMagic;
                         * uint XSaveMapFilePos = (uint)fs.Position;//MapFile.Position;
                         * byte[] XModelHeader = new byte[16];
                         * fs.Seek((long)XTrueVerticesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(XModelHeader,0,XModelHeader.Length);
                         * fs.Seek(XSaveMapFilePos,System.IO.SeekOrigin.Begin);
                         * XTrueVerticesOffset = GetUInt(XModelHeader,4) - Info.MapMagic;
                         *
                         * XSaveMapFilePos = (uint)fs.Position;
                         * byte[] RawXModelBuffer = new byte[XTrueVerticesSize];
                         * fs.Seek((long)XTrueVerticesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(RawXModelBuffer,0,(int)XTrueVerticesSize);
                         * FO.Write(RawXModelBuffer,0,(int)XTrueVerticesSize);
                         *
                         * byte[] XTestBuffer = new byte[6];
                         * uint XTrueIndicesOffset = GetUInt(TagBuff, 80+ (sc * Size)) - Info.MapMagic;
                         * RawXModelBuffer = new byte[XTrueIndicesSize];
                         * fs.Seek((long)XTrueIndicesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(XModelHeader,0,XModelHeader.Length);
                         * XTrueIndicesOffset = GetUInt(XModelHeader,0x04) - Info.MapMagic;
                         * fs.Seek((long)XTrueIndicesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(RawXModelBuffer,0,RawXModelBuffer.Length);
                         * FO.Write(RawXModelBuffer,0,RawXModelBuffer.Length);
                         * fs.Read(XTestBuffer,0,6);
                         * if (XTestBuffer[4] == 0xff)
                         * {
                         *      FO.Write(XTestBuffer,0,6);
                         *      XTrueIndicesSize += 6;
                         * }
                         */
                        break;

                        #endregion
                    case TSFReader.TSFModelData:                                 // 0xAB: //Modeldata
                        #region ModelData

                        /*
                         * long SaveMapFilePos = (uint)fs.Position;
                         * uint TrueVerticesSize = (GetUInt(TagBuff,(uint)(88 + (sc * Size)))) * 68;
                         * uint TrueIndicesSize =(((GetUInt(TagBuff,(uint)(72 + (sc * Size)))) / 3) + 1 ) * 6;
                         * uint NewIndicesDataSize = (GetUInt(TagBuff,(uint)(72 + (sc * Size))) / 3) + 1;
                         * uint TrueVerticesOffset = GetUInt(TagBuff,(uint)(100+ (sc * Size))) + Info.VerticesOffset;  //80
                         * uint TrueIndicesOffset = GetUInt(TagBuff,(uint)(80+ (sc * Size))) +  Info.IndicesOffset;  //100
                         * //PutUInt(ref TagBuff,GetUInt(TagBuff,(uint)(88 + (i * Size))),(uint)(32 +(i * Size)));
                         * //PutUInt(ref TagBuff,NewIndicesDataSize,(uint)(56 + (i * Size)));
                         * uint CurrentStructSize = (uint)TagBuff.Length;
                         * byte[] RawModelBuffer = new byte[TrueVerticesSize];
                         * fs.Seek((long)TrueVerticesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(RawModelBuffer,0,RawModelBuffer.Length);
                         * FO.Write(RawModelBuffer,0,RawModelBuffer.Length);
                         *
                         * RawModelBuffer = new byte[TrueIndicesSize];
                         * fs.Seek((long)TrueIndicesOffset,System.IO.SeekOrigin.Begin);
                         * fs.Read(RawModelBuffer,0,RawModelBuffer.Length);
                         * FO.Write(RawModelBuffer,0,RawModelBuffer.Length);
                         * fs.Seek(fs.Position,System.IO.SeekOrigin.Begin);
                         * byte[] TestBuffer = new byte[6];
                         * fs.Read(TestBuffer,0,6);
                         * if (TestBuffer[4] == 0xff)
                         * {
                         *      //PutUInt(StructBuffer,GetUInt(StructBuffer,56 + (StructSize * cc)) + 1,56 + (StructSize * cc));
                         *      FO.Write(TestBuffer,0,TestBuffer.Length);
                         *      TrueIndicesSize += 6;
                         * }
                         * fs.Seek(SaveMapFilePos,SeekOrigin.Begin);
                         */
                        break;

                        #endregion
                    case TSFReader.TSFBSPModel:                                                  // 0xAC: //BSPMODEL
                        #region BSPModel
                        uint VOOffset = 0xB4;
                        uint LOOffset = 0xC8;

                        uint UnCompVertsSize = CompUtil.GetUInt(TagBuff, VOOffset + (sc * Size)) * 56;
                        uint CompVertsSize   = CompUtil.GetUInt(TagBuff, VOOffset + (sc * Size)) * 32;
                        uint UnCompLMUVSize  = CompUtil.GetUInt(TagBuff, LOOffset + (sc * Size)) * 20;
                        uint CompLMUVSize    = CompUtil.GetUInt(TagBuff, LOOffset + (sc * Size)) * 8;

                        byte[] ba_UnCompVerts = new byte[UnCompVertsSize];
                        byte[] ba_CompVerts   = new byte[CompVertsSize];
                        byte[] ba_UnCompLMUV  = new byte[UnCompLMUVSize];
                        byte[] ba_CompLMUV    = new byte[CompLMUVSize];

                        FI.Read(ba_UnCompVerts, 0, ba_UnCompVerts.Length);
                        FI.Read(ba_UnCompLMUV, 0, ba_UnCompLMUV.Length);
                        FI.Read(ba_CompVerts, 0, ba_CompVerts.Length);
                        FI.Read(ba_CompLMUV, 0, ba_CompLMUV.Length);

                        FO.Write(ba_UnCompVerts, 0, ba_UnCompVerts.Length);
                        FO.Write(ba_UnCompLMUV, 0, ba_UnCompLMUV.Length);
                        FO.Write(ba_CompVerts, 0, ba_CompVerts.Length);
                        FO.Write(ba_CompLMUV, 0, ba_CompLMUV.Length);
                        break;

                        #endregion
                    case TSFReader.TSFResource:                             // 0xAD: //Resource
                        #region Resource

                        /*
                         * ushort BitmapSoundFlag = GetUShort(TagBuff,0x00 + (sc * Size));
                         * ushort Index = GetUShort(TagBuff,0x02 + (sc * Size));
                         * ushort ID1 = GetUShort(TagBuff,0x04 + (sc * Size));
                         * ushort ID2 = GetUShort(TagBuff,0x06 + (sc * Size));
                         * MapPosSave = fs.Position;
                         * uint Offset = Info.IndexItems[ID1].OffsetToString; ///  fileData.stringOffset.UInt - Info.MapMagic;
                         * fs.Seek((long)Offset,SeekOrigin.Begin);
                         * byte[] rscstr = new byte[256];
                         * fs.Read(rscstr,0,rscstr.Length);
                         * fs.Seek(MapPosSave,SeekOrigin.Begin);
                         * uint rscsize = 0;
                         * do
                         * {
                         *      rscsize +=1;
                         * }while (rscstr[rscsize] != 0);
                         * byte[] rscOutString = new byte[rscsize + 1];
                         * uint rsccount = 0;
                         * do
                         * {
                         *      rscOutString[rsccount] = rscstr[rsccount];
                         *      rsccount +=1;
                         * }while (rsccount != rscsize);
                         * PutUShort(ref TagBuff,(uint)(0x06 + (sc * Size)),(ushort)(rscOutString.Length - 1));
                         * FO.Write(rscOutString,0,rscOutString.Length);
                         */
                        break;

                        #endregion
                    case TSFReader.TSFEnd:                             // 0xA7: //End
                        #region StructEnd
                        if (sr.GetOIP() == Name)
                        {
                            ExitStruct = true;
                        }
                        else
                        {
                            ExitStruct = false;
                        }
                        break;
                        #endregion
                    }
                }while(ExitStruct == false);
                if (Count != 0)
                {
                    sc += 1;
                    if (sc != Count)
                    {
                        sr.Seek(StartOfStruct);
                        ExitStruct = false;
                    }
                }
            }while (sc != Count);
            long tmpPosSave = FO.Position;
            FO.Seek(StructPosition, SeekOrigin.Begin);
            FO.Write(TagBuff, 0, TagBuff.Length);
            FO.Seek(tmpPosSave, SeekOrigin.Begin);
        }