package nori import ( "encoding/binary" "fmt" "io" ) type Nori struct { Version uint32 Params [5]uint32 AnimationCount uint32 SizeNoGawi uint32 TotalSize uint32 Gawi *GawiSection Animations []*Animation //AnimationByKey map[string]*Animation lastSignature [4]byte } func (n *Nori) Decode(r io.Reader) error { rd := reflectReader(r) n.Gawi = &GawiSection{} if _, err := io.ReadFull(rd, n.lastSignature[:]); err != nil { return err } if sig, target := string(n.lastSignature[:]), "NORI"; sig != target { return fmt.Errorf("expected header %s, got %s", target, sig) } if err := binary.Read(rd, end, &n.Version); err != nil { return err } if err := binary.Read(rd, end, n.Params[:]); err != nil { return err } if err := binary.Read(rd, end, &n.AnimationCount); err != nil { return err } if err := binary.Read(rd, end, &n.SizeNoGawi); err != nil { return err } if err := binary.Read(rd, end, &n.TotalSize); err != nil { return err } if err := n.Gawi.Decode(rd); err != nil { return err } if err := discardN(rd, 4*int(n.AnimationCount)); err != nil { return err } n.Animations = make([]*Animation, n.AnimationCount) for i := range n.Animations { n.Animations[i] = NewAnimation(int(n.Version)) if err := n.Animations[i].Decode(rd); err != nil { return err } } return nil }