internal Container(FieldBase.Parameters common, IReadOnlyList <IField> fields) : base(common) { Size = base.Size; Fields = fields; Loadable = !Fields.Any(f => f is Container); fieldsByName = fields.ToDictionary(f => f.Name); }
internal Container ToContainer(ModuleSchema schema, ModuleJson module, string name, int offset, string description, FieldCondition?condition) { // TODO: This works and is pleasantly efficient, but it's pretty ugly. if (cachedFields == null) { // TODO: Check that all fields are either primitive or container, check the size etc. cachedFields = Fields .SelectMany(fieldJson => fieldJson.ToFields(schema, module)) .ToList() .AsReadOnly(); } var lastField = Fields.LastOrDefault(); int size = Size?.Value ?? lastField?.Offset?.Value ?? 0; var common = new FieldBase.Parameters(schema, name, offset, size, description, condition); return(new Container(common, cachedFields)); }
private protected NumericFieldBase(FieldBase.Parameters common, int min, int max, int @default) : base(common) => (Min, Max, Default) = (min, max, @default);
internal EnumField(FieldBase.Parameters common, IReadOnlyList <string> values, int min, int @default) : base(common, min, values.Count + min - 1, @default) =>
internal StringField(FieldBase.Parameters common, int length) : base(common) { Length = length; bytesPerChar = Size / length; }
internal DynamicOverlay(FieldBase.Parameters common, int switchContainerOffset, string switchField, IReadOnlyList <Container> containers) : base(common) { (SwitchContainerOffset, this.switchField, OverlaidContainers) = (switchContainerOffset, switchField, containers); }
internal BooleanField(FieldBase.Parameters common) : base(common, OffOnValues, 0, 0) { }