141 lines
3.3 KiB
Go
141 lines
3.3 KiB
Go
package gff
|
|
|
|
import "fmt"
|
|
|
|
type FieldType uint32
|
|
|
|
const (
|
|
TypeByte FieldType = iota
|
|
TypeChar
|
|
TypeWord
|
|
TypeShort
|
|
TypeDWord
|
|
TypeInt
|
|
TypeDWord64
|
|
TypeInt64
|
|
TypeFloat
|
|
TypeDouble
|
|
TypeCExoString
|
|
TypeResRef
|
|
TypeCExoLocString
|
|
TypeVoid
|
|
TypeStruct
|
|
TypeList
|
|
TypeOrientation
|
|
TypeVector
|
|
)
|
|
|
|
var fieldTypeNames = map[FieldType]string{
|
|
TypeByte: "Byte",
|
|
TypeChar: "Char",
|
|
TypeWord: "Word",
|
|
TypeShort: "Short",
|
|
TypeDWord: "DWord",
|
|
TypeInt: "Int",
|
|
TypeDWord64: "DWord64",
|
|
TypeInt64: "Int64",
|
|
TypeFloat: "Float",
|
|
TypeDouble: "Double",
|
|
TypeCExoString: "CExoString",
|
|
TypeResRef: "ResRef",
|
|
TypeCExoLocString: "CExoLocString",
|
|
TypeVoid: "Void",
|
|
TypeStruct: "Struct",
|
|
TypeList: "List",
|
|
TypeOrientation: "Orientation",
|
|
TypeVector: "Vector",
|
|
}
|
|
|
|
type Document struct {
|
|
FileType string `json:"file_type"`
|
|
FileVersion string `json:"file_version"`
|
|
Root Struct `json:"root"`
|
|
}
|
|
|
|
type Struct struct {
|
|
Type uint32 `json:"struct_type"`
|
|
Fields []Field `json:"fields"`
|
|
}
|
|
|
|
type Field struct {
|
|
Label string `json:"label"`
|
|
Type FieldType `json:"-"`
|
|
Value Value `json:"-"`
|
|
}
|
|
|
|
type Value interface {
|
|
fieldType() FieldType
|
|
}
|
|
|
|
type LocString struct {
|
|
StringRef uint32 `json:"string_ref"`
|
|
Entries []LocStringEntry `json:"entries"`
|
|
}
|
|
|
|
type LocStringEntry struct {
|
|
ID uint32 `json:"id"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
type Vector struct {
|
|
X float32 `json:"x"`
|
|
Y float32 `json:"y"`
|
|
Z float32 `json:"z"`
|
|
}
|
|
|
|
type Orientation struct {
|
|
X float32 `json:"x"`
|
|
Y float32 `json:"y"`
|
|
Z float32 `json:"z"`
|
|
W float32 `json:"w"`
|
|
}
|
|
|
|
type ByteValue uint8
|
|
type CharValue int8
|
|
type WordValue uint16
|
|
type ShortValue int16
|
|
type DWordValue uint32
|
|
type IntValue int32
|
|
type DWord64Value uint64
|
|
type Int64Value int64
|
|
type FloatValue float32
|
|
type DoubleValue float64
|
|
type StringValue string
|
|
type ResRefValue string
|
|
type VoidValue []byte
|
|
type ListValue []Struct
|
|
|
|
func (ByteValue) fieldType() FieldType { return TypeByte }
|
|
func (CharValue) fieldType() FieldType { return TypeChar }
|
|
func (WordValue) fieldType() FieldType { return TypeWord }
|
|
func (ShortValue) fieldType() FieldType { return TypeShort }
|
|
func (DWordValue) fieldType() FieldType { return TypeDWord }
|
|
func (IntValue) fieldType() FieldType { return TypeInt }
|
|
func (DWord64Value) fieldType() FieldType { return TypeDWord64 }
|
|
func (Int64Value) fieldType() FieldType { return TypeInt64 }
|
|
func (FloatValue) fieldType() FieldType { return TypeFloat }
|
|
func (DoubleValue) fieldType() FieldType { return TypeDouble }
|
|
func (StringValue) fieldType() FieldType { return TypeCExoString }
|
|
func (ResRefValue) fieldType() FieldType { return TypeResRef }
|
|
func (LocString) fieldType() FieldType { return TypeCExoLocString }
|
|
func (VoidValue) fieldType() FieldType { return TypeVoid }
|
|
func (Struct) fieldType() FieldType { return TypeStruct }
|
|
func (ListValue) fieldType() FieldType { return TypeList }
|
|
func (Orientation) fieldType() FieldType { return TypeOrientation }
|
|
func (Vector) fieldType() FieldType { return TypeVector }
|
|
|
|
func (t FieldType) String() string {
|
|
if name, ok := fieldTypeNames[t]; ok {
|
|
return name
|
|
}
|
|
return fmt.Sprintf("FieldType(%d)", t)
|
|
}
|
|
|
|
func NewField(label string, value Value) Field {
|
|
return Field{
|
|
Label: label,
|
|
Type: value.fieldType(),
|
|
Value: value,
|
|
}
|
|
}
|