package ent import ( "bytes" "fmt" "github.com/jordanorelli/hyperstone/dota" ) type Field struct { _type Symbol // type of data held by the field name Symbol // name of the field sendNode Symbol // not sure what this is bits int // number of bits used to encode field? low *float32 // lower limit of field values high *float32 // upper limit of field values flags int // dunno what these flags do serializer *Symbol // class on which the field was defined serializerVersion *int32 // version of the class on which the field was defined class *Class // source class on which the field was originally defined encoder *Symbol // binary encoder, named explicitly in protobuf decoder // decodes field values from a bit stream } func (f Field) String() string { var buf bytes.Buffer fmt.Fprintf(&buf, "{type: %s name: %s send: %s", f._type, f.name, f.sendNode) if f.bits > 0 { fmt.Fprintf(&buf, " bits: %d", f.bits) } if f.flags > 0 { fmt.Fprintf(&buf, " flags: %d", f.flags) } if f.low != nil { fmt.Fprintf(&buf, " low: %f", *f.low) } if f.high != nil { fmt.Fprintf(&buf, " high: %f", *f.high) } if f.serializer != nil { fmt.Fprintf(&buf, " serializer: %s", *f.serializer) } if f.serializerVersion != nil { fmt.Fprintf(&buf, " serializer_v: %d", *f.serializerVersion) } if f.encoder != nil { fmt.Fprintf(&buf, " encoder: %s", *f.encoder) } fmt.Fprint(&buf, "}") return buf.String() } func (f *Field) fromProto(flat *dota.ProtoFlattenedSerializerFieldT, t *SymbolTable) { f._type = t.Symbol(int(flat.GetVarTypeSym())) f.name = t.Symbol(int(flat.GetVarNameSym())) f.bits = int(flat.GetBitCount()) f.flags = int(flat.GetEncodeFlags()) f.low = flat.LowValue f.high = flat.HighValue if flat.FieldSerializerNameSym == nil { f.serializer = nil } else { f.serializer = new(Symbol) *f.serializer = t.Symbol(int(flat.GetFieldSerializerNameSym())) } f.serializerVersion = flat.FieldSerializerVersion // panic if we don't have a send node cause that shit is corrupt yo f.sendNode = t.Symbol(int(*flat.SendNodeSym)) Debug.Printf("new field: %v", f) }