Example #1
0
 public static IEnumerable <SMChunkFlags> GetMCNKFlags(this SMChunkFlags flags)
 {
     for (int i = 0; i < 4; i++)
     {
         SMChunkFlags flag = (SMChunkFlags)(1 << (2 + i));
         if (flags.HasFlag(flag))
         {
             yield return(flag);
         }
     }
 }
        List <SWFlowv> Flowvs = new List <SWFlowv>(); // 2

        public MCLQSubChunk(BinaryReader reader, SMChunkFlags flag)
        {
            Range = new CRange(reader);

            switch (flag)
            {
            case SMChunkFlags.FLAG_LQ_OCEAN:
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Verts[i, j] = new SOVert(reader);     // Ocean Vert
                    }
                }
                break;

            case SMChunkFlags.FLAG_LQ_MAGMA:
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Verts[i, j] = new SMVert(reader);     // Magma Vert
                    }
                }
                break;

            default:
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Verts[i, j] = new SWVert(reader);     // Water Vert
                    }
                }
                break;
            }

            SLTiles = new SLTiles(reader);
            NFlowVS = reader.ReadUInt32();

            for (int i = 0; i < 2; i++)
            {
                Flowvs.Add(new SWFlowv(reader));
            }
        }
Example #3
0
        public SMChunk(BinaryReader reader)
        {
            Flags           = (SMChunkFlags)reader.ReadUInt32();
            HasLiquids      = (Flags & SMChunkFlags.HasLiquid) != 0;
            indexX          = reader.ReadUInt32();
            indexY          = reader.ReadUInt32();
            radius          = reader.ReadSingle();
            nLayers         = reader.ReadUInt32();
            nDoodadRefs     = reader.ReadUInt32();
            offsHeight      = reader.ReadUInt32(); // MCVT
            offsNormal      = reader.ReadUInt32(); // MCNR
            offsLayer       = reader.ReadUInt32(); // MCLY
            offsRefs        = reader.ReadUInt32(); // MCRF
            offsAlpha       = reader.ReadUInt32(); // MCAL
            sizeAlpha       = reader.ReadUInt32();
            offsShadow      = reader.ReadUInt32(); // MCSH
            sizeShadow      = reader.ReadUInt32();
            area            = reader.ReadUInt32(); // in alpha: zone id (4) sub zone id (4)
            nMapObjRefs     = reader.ReadUInt32();
            holes_low_res   = reader.ReadUInt16();
            padding         = reader.ReadUInt16();
            predTex         = reader.ReadBytes(16); //It is used to determine which detail doodads to show. 2 bit 8*8 arr unsigned integers naming the layer.
            noEffectDoodad  = reader.ReadBytes(8);  // 1 bit 8*8 arr, doodads disabled if 1
            offsSndEmitters = reader.ReadUInt32();  // MCSE
            nSndEmitters    = reader.ReadUInt32();
            offsLiquid      = reader.ReadUInt32();  // MCLQ

            unused = reader.ReadBytes(24);          //Padding

            HeaderOffsetEnd = reader.BaseStream.Position;

            // MCVT begin right after header.
            BuildSubMCVT(reader, offsHeight);

            //Has MCNR SubChunk
            if (offsNormal > 0)
            {
                BuildSubMCNR(reader, offsNormal);
            }

            if (offsLayer > 0)
            {
                BuildMCLY(reader, offsLayer);
            }

            if (offsRefs > 0)
            {
                BuildMCRF(reader, offsRefs);
            }

            if (offsAlpha > 0)
            {
                BuildMCAL(reader, offsAlpha, (int)sizeAlpha);
            }

            if (offsShadow > 0)
            {
                BuildMCSH(reader, offsShadow, (int)sizeShadow);
            }

            if (offsSndEmitters > 0)
            {
                BuildMCSE(reader, offsSndEmitters, (int)nSndEmitters);
            }

            if (offsLiquid > 0 && HasLiquids)
            {
                BuildSubMCLQ(reader, offsLiquid);
            }
        }