nori/nori.go

62 lines
1.3 KiB
Go

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
}