示例#1
0
        public MCNK(char[] magic, byte[] size, byte[] content) : base(magic, size)
        {
            using (BinaryReader reader = new BinaryReader(new MemoryStream(content)))
            {
                #region read MCNKhead
                mcHeader.Flags       = reader.ReadUInt32();
                mcHeader.IndexX      = reader.ReadUInt32();
                mcHeader.IndexY      = reader.ReadUInt32();
                mcHeader.NLayers     = reader.ReadUInt32();
                mcHeader.NDoodadRefs = reader.ReadUInt32();

                offset offset = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCVT = offset;

                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCNR = offset;
                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCLY = offset;
                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCRF = offset;
                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCAL = offset;

                mcHeader.SizeAlpha = reader.ReadUInt32();

                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCSH = offset;

                mcHeader.SizeShadow  = reader.ReadUInt32();
                mcHeader.Areaid      = reader.ReadUInt32();
                mcHeader.NMapObjRefs = reader.ReadUInt32();
                mcHeader.Holes       = reader.ReadUInt32();

                mcHeader.GroundEffectsMap = new byte[16];
                for (int x = 0; x < 16; x++)
                {
                    mcHeader.GroundEffectsMap[x] = reader.ReadByte();
                }

                mcHeader.PredTex        = reader.ReadUInt32();
                mcHeader.NoEffectDoodad = reader.ReadUInt32();

                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCSE = offset;

                mcHeader.NSndEmitters = reader.ReadUInt32();

                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCLQ = offset;

                mcHeader.SizeLiquid = reader.ReadUInt32();

                mcHeader.Pos    = new float[3];
                mcHeader.Pos[0] = reader.ReadSingle();
                mcHeader.Pos[1] = reader.ReadSingle();
                mcHeader.Pos[2] = reader.ReadSingle();

                offset           = new offset();
                offset.address   = reader.ReadUInt32();
                mcHeader.OfsMCCV = offset;

                mcHeader.Props    = reader.ReadUInt32();
                mcHeader.EffectId = reader.ReadUInt32();
                #endregion

                while (reader.BaseStream.Position < reader.BaseStream.Length)
                {
                    byte[] ChunkMagic   = reader.ReadBytes(4);
                    byte[] ChunkSize    = reader.ReadBytes(4);
                    byte[] ChunkContent = reader.ReadBytes(BitConverter.ToInt32(ChunkSize, 0));

                    string ChunkMagicString = ADT.MagicBytesToString(ChunkMagic);

                    switch (ChunkMagicString)
                    {
                    case "MCVT":
                        mcvt = new MCVT(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCCV":
                        mccv = new MCCV(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCNR":
                        mcnr = new MCNR(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent, reader.ReadBytes(13));
                        break;

                    case "MCLY":
                        mcly = new MCLY(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCRF":
                        mcrf = new MCRF(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCAL":
                        mcal = new MCAL(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCSE":
                        mcse = new MCSE(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCSH":
                        mcsh = new MCSH(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;

                    case "MCLQ":
                        mclq = new MCLQ(ADT.MagicBytesToChars(ChunkMagic), ChunkSize, ChunkContent);
                        break;
                    }

                    //Logger.log(ChunkMagicString, Logger.Direction.LEVEL2, ChunkContent.Length.ToString() + " byte");
                }
            }

            //Logger.log("---", Logger.Direction.LEVEL2);
        }