void ProcessBitFields(EntityTemplate template)
        {
            int bitField = 0;

            foreach (BitFieldObject bitOb in template.BitField)
            {
                ElementProperty prop = Fields.Find(x => x.Name == bitOb.Name);

                int shiftedPropVal = (int)prop.Data << bitOb.BitShift;

                bitField = shiftedPropVal | bitField;
            }

            ElementProperty bitFieldProp = new ElementProperty();

            bitFieldProp.MakeProperty("Bit Field", FieldType.Integer, bitField);

            Fields.Insert(Fields.IndexOf(Fields.Find(x => x.Name == template.BitField[0].Name)), bitFieldProp);

            foreach (BitFieldObject bitOb in template.BitField)
            {
                ElementProperty prop = Fields.Find(x => x.Name == bitOb.Name);

                Fields.Remove(prop);
            }
        }
        public void ReadSpecialProcess(List<ElementProperty> fields, List<Chunk> mainListReference)
        {
            ChunkListReference = mainListReference;

            List<ElementProperty> tempFieldStorage = new List<ElementProperty>();

            foreach (ElementProperty field in fields)
            {
                switch (field.Name)
                {
                    case "Bit Field":
                        if (BitField.Count > 0)
                        {
                            int fieldValue = (int)field.Data;

                            for (int i = 0; i < BitField.Count; i++)
                            {
                                ElementProperty prop = new ElementProperty();

                                int propValue = (fieldValue & BitField[i].Mask) >> BitField[i].BitShift;

                                prop.MakeProperty(BitField[i].Name, FieldType.Integer, (int)propValue);

                                tempFieldStorage.Add(prop);
                            }
                        }
                        break;
                    case "Waypoint List":
                        int firstPointOffset = Convert.ToInt32(fields.Find(x => x.Name == "First Waypoint Offset").Data);

                        int firstWaypointIndex = firstPointOffset / 0x10;

                        int numPoints = Convert.ToInt32(fields.Find(x => x.Name == "Number of Waypoints").Data);

                        List<Chunk> chunkRPPNList = (List<Chunk>)field.Data;

                        List<IGrouping<string, Chunk>> query = ChunkListReference.GroupBy(x => x.ChunkType, x => x).ToList();

                        List<Chunk> rPPN = query.Find(x => x.Key == "RPPN").ToList();

                        for (int i = 0; i < numPoints; i++)
                        {
                            chunkRPPNList.Add(rPPN[firstWaypointIndex + i]);
                        }

                        break;
                }
            }

            if (tempFieldStorage.Count > 0)
            {
                fields.InsertRange(fields.IndexOf(fields.Find(x => x.Name == "Bit Field")), tempFieldStorage);

                fields.RemoveAt(fields.IndexOf(fields.Find(x => x.Name == "Bit Field")));
            }

            if (ChunkID == "RPAT" || ChunkID == "PATH")
            {
                int numberPointsIndex = fields.IndexOf(fields.Find(x => x.Name == "Number of Waypoints"));

                using (FileStream stream = new FileStream("C:\\consoleoutput.txt", FileMode.Create))
                {
                    EndianBinaryWriter writer = new EndianBinaryWriter(stream, Endian.Big);

                    writer.Write("Number of Points Index: " + numberPointsIndex + Environment.NewLine);
                    writer.Write("Collection count: " + fields.Count + Environment.NewLine);
                }

                if ((numberPointsIndex >= 0) && (numberPointsIndex <= fields.Count - 1))
                    fields.RemoveAt(numberPointsIndex);

                int firstPointOffsetIndex = fields.IndexOf(fields.Find(x => x.Name == "First Waypoint Offset"));

                if ((firstPointOffsetIndex >= 0) && (firstPointOffsetIndex <= fields.Count - 1))
                    fields.RemoveAt(firstPointOffsetIndex);
            }
        }