示例#1
0
        public static void DeleteField(Record root, uint recordId, B4S fieldType)
        {
            var q = from record in FindRecords(root).AsParallel()
                    where record.Id == recordId
                    from field in record.Fields
                    where field.FieldType == fieldType
                    select(record, field);

            var(foundRecord, foundField) = q.First();
            foundRecord.Fields.Remove(foundField);
            foundRecord.CompressedFieldData = null;
        }
示例#2
0
        private static bool FieldsAreIdentical(B4S recordType, Field f1, Field f2)
        {
            // clear out unused bytes before doing the check.
            switch (f1.FieldType)
            {
            case _CTDA:
                if (recordType != IDLE)
                {
                    goto default;
                }

                f1 = new Field(f1);
                f2 = new Field(f2);
                MBitConverter.Set(f1.Payload, 0, (uint)f1.Payload[0]);
                MBitConverter.Set(f2.Payload, 0, (uint)f2.Payload[0]);

                MBitConverter.Set(f1.Payload, 10, (ushort)0);
                MBitConverter.Set(f2.Payload, 10, (ushort)0);

                // TODO: ugh, [IDLE:00013344]'s field is apparently allowed
                // to differ non-trivially.
                goto default;

            case _ENAM:
                if (f1.Payload.LongLength != f2.Payload.LongLength)
                {
                    return(false);
                }

                if (recordType != IDLE)
                {
                    goto default;
                }

                // ENAM is apparently case-insensitive, according to xEdit.
                f1 = new Field(f1);
                f2 = new Field(f2);

                for (long i = 0; i < f1.Payload.LongLength; i++)
                {
                    f1.Payload[i] = unchecked ((byte)(f1.Payload[i] & 0xDF));
                    f2.Payload[i] = unchecked ((byte)(f1.Payload[i] & 0xDF));
                }

                goto default;

            default:
                return(f1.Payload.SequenceEqual(f2.Payload));
            }
        }