internal static Property Read(IFieldReader reader) { var valueType = (ValueType)reader.ReadValueU8(); // & 7 reader.SkipBytes(3); var function = (FunctionType)reader.ReadValueU8(); // & 3 reader.SkipBytes(3); var index = reader.ReadValueU16(); // & 0x7FF reader.SkipBytes(2); var value = ReadValue(valueType, reader); var factor = reader.Version >= 88 ? reader.ReadValueF32() : 0; return(new Property(index, function, value, factor)); }
internal static ConditionData Read(IFieldReader reader) { ConditionData instance; instance.Unknown00 = reader.ReadValueU8(); reader.SkipBytes(3); instance.Unknown04 = reader.ReadValueU32(); instance.Unknown08 = reader.ReadValueU16(); reader.SkipBytes(2); instance.Unknown0C = reader.ReadValueU32(); instance.Unknown10 = reader.ReadValueU32(); instance.Unknown14 = reader.ReadValueU8(); reader.SkipBytes(3); instance.Unknown18 = reader.ReadValueU32(); instance.Unknown1C = reader.ReadValueU32(); return(instance); }
internal override void ReadField(uint type, IFieldReader reader) { var size = reader.Size; switch ((FieldType)type) { case FieldType.EDID: { this.MarkField(0); this._EditorId = reader.ReadString(size); break; } case FieldType.DESC: { this.MarkField(1); this._Description = reader.ReadLocalizedString(); break; } case FieldType.FVPA: { this.MarkField(2); Debug.Assert(size > 0 && (size % 8) == 0); var ingredients = new Ingredient[size / 8]; for (int i = 0; i < ingredients.Length; i++) { var inputId = reader.ReadValueU32(); var quantity = reader.ReadValueS32(); ingredients[i] = new Ingredient(inputId, quantity); } this._Ingredients.Clear(); this._Ingredients.AddRange(ingredients); break; } case FieldType.CTDA: { Debug.Assert(size == 32); this._Conditions.Add(ConditionData.Read(reader)); break; } case FieldType.CNAM: { this.MarkField(4); Debug.Assert(size == 4); this._OutputId = reader.ReadValueU32(); break; } case FieldType.INTV: { this.MarkField(5); if (size == 4) { this._OutputCount = reader.ReadValueU32(); } else if (size == 2) { this._OutputCount = reader.ReadValueU16(); } else { throw new FormatException(); } break; } case FieldType.BNAM: { this.MarkField(6); Debug.Assert(size == 4); this._BenchKeywordId = reader.ReadValueU32(); break; } case FieldType.FNAM: { this.MarkField(7); Debug.Assert(size > 0 && (size % 4) == 0); var ids = new uint[size / 4]; for (int i = 0; i < ids.Length; i++) { ids[i] = reader.ReadValueU32(); } this._FilterKeywordIds.Clear(); this._FilterKeywordIds.AddRange(ids); break; } case FieldType.YNAM: { this.MarkField(8); Debug.Assert(size == 4); this._PickupSoundId = reader.ReadValueU32(); break; } case FieldType.ZNAM: { this.MarkField(9); Debug.Assert(size == 4); this._PutdownSoundId = reader.ReadValueU32(); break; } case FieldType.ANAM: { this.MarkField(11); Debug.Assert(size == 4); this._ArtId = reader.ReadValueU32(); break; } case FieldType.NAM1: case FieldType.NAM2: case FieldType.NAM3: { // deprecated break; } default: { throw new NotSupportedException(); } } }