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); } }