From b4cd34e351176bdcec7d5cab0e5966ba4bcd5fa3 Mon Sep 17 00:00:00 2001 From: "M. Sz" Date: Thu, 25 Feb 2021 09:28:11 +0100 Subject: [PATCH 1/5] cof: splited long Marshal method to avoid nolint:funlen --- d2common/d2fileformats/d2cof/cof.go | 70 ++++++++++++++++++----------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/d2common/d2fileformats/d2cof/cof.go b/d2common/d2fileformats/d2cof/cof.go index ceb9ab11..f80809ae 100644 --- a/d2common/d2fileformats/d2cof/cof.go +++ b/d2common/d2fileformats/d2cof/cof.go @@ -80,24 +80,17 @@ type COF struct { } // Unmarshal a byte slice to this COF -// nolint:funlen // no need to change func (c *COF) Unmarshal(fileData []byte) error { - streamReader := d2datautils.CreateStreamReader(fileData) - - var b []byte - var err error - b, err = streamReader.ReadBytes(numHeaderBytes) + streamReader := d2datautils.CreateStreamReader(fileData) + + headerBytes, err := streamReader.ReadBytes(numHeaderBytes) if err != nil { return err } - c.NumberOfLayers = int(b[headerNumLayers]) - c.FramesPerDirection = int(b[headerFramesPerDir]) - c.NumberOfDirections = int(b[headerNumDirs]) - c.unknownHeaderBytes = b[headerNumDirs+1 : headerSpeed] - c.Speed = int(b[headerSpeed]) + c.loadHeader(headerBytes) c.unknownBodyBytes, err = streamReader.ReadBytes(numUnknownBodyBytes) if err != nil { @@ -107,10 +100,44 @@ func (c *COF) Unmarshal(fileData []byte) error { c.CofLayers = make([]CofLayer, c.NumberOfLayers) c.CompositeLayers = make(map[d2enum.CompositeType]int) + err = c.loadCOFLayers(streamReader) + if err != nil { + return err + } + + animationFramesData, err := streamReader.ReadBytes(c.FramesPerDirection) + if err != nil { + return err + } + + c.loadAnimationFrames(animationFramesData) + + priorityLen := c.FramesPerDirection * c.NumberOfDirections * c.NumberOfLayers + c.Priority = make([][][]d2enum.CompositeType, c.NumberOfDirections) + + priorityBytes, err := streamReader.ReadBytes(priorityLen) + if err != nil { + return err + } + + c.loadPriority(priorityBytes) + + return nil +} + +func (c *COF) loadHeader(b []byte) { + c.NumberOfLayers = int(b[headerNumLayers]) + c.FramesPerDirection = int(b[headerFramesPerDir]) + c.NumberOfDirections = int(b[headerNumDirs]) + c.unknownHeaderBytes = b[headerNumDirs+1 : headerSpeed] + c.Speed = int(b[headerSpeed]) +} + +func (c *COF) loadCOFLayers(streamReader *d2datautils.StreamReader) error { for i := 0; i < c.NumberOfLayers; i++ { layer := CofLayer{} - b, err = streamReader.ReadBytes(numLayerBytes) + b, err := streamReader.ReadBytes(numLayerBytes) if err != nil { return err } @@ -128,25 +155,18 @@ func (c *COF) Unmarshal(fileData []byte) error { c.CompositeLayers[layer.Type] = i } - b, err = streamReader.ReadBytes(c.FramesPerDirection) - if err != nil { - return err - } + return nil +} +func (c *COF) loadAnimationFrames(b []byte) { c.AnimationFrames = make([]d2enum.AnimationFrame, c.FramesPerDirection) for i := range b { c.AnimationFrames[i] = d2enum.AnimationFrame(b[i]) } +} - priorityLen := c.FramesPerDirection * c.NumberOfDirections * c.NumberOfLayers - c.Priority = make([][][]d2enum.CompositeType, c.NumberOfDirections) - - priorityBytes, err := streamReader.ReadBytes(priorityLen) - if err != nil { - return err - } - +func (c *COF) loadPriority(priorityBytes []byte) { priorityIndex := 0 for direction := 0; direction < c.NumberOfDirections; direction++ { @@ -159,8 +179,6 @@ func (c *COF) Unmarshal(fileData []byte) error { } } } - - return nil } // Marshal this COF to a byte slice From e7c5efe8e4216dc00068c54658aadbba5b1e4556 Mon Sep 17 00:00:00 2001 From: "M. Sz" Date: Thu, 25 Feb 2021 09:30:59 +0100 Subject: [PATCH 2/5] cof: added SpeedToFPS method --- d2common/d2fileformats/d2cof/helpers.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 d2common/d2fileformats/d2cof/helpers.go diff --git a/d2common/d2fileformats/d2cof/helpers.go b/d2common/d2fileformats/d2cof/helpers.go new file mode 100644 index 00000000..0cc7f73b --- /dev/null +++ b/d2common/d2fileformats/d2cof/helpers.go @@ -0,0 +1,16 @@ +package d2cof + +// SpeedToFPS returns FPS value basing on cof's speed +func (c *COF) SpeedToFPS() float64 { + const ( + baseFPS = 25 + speedDivisor = 256 + ) + + fps := baseFPS * (float64(c.Speed) / speedDivisor) + if fps == 0 { + fps = baseFPS + } + + return fps +} From 78404ed56c12a0c57af9c40ef2150023991a146b Mon Sep 17 00:00:00 2001 From: "M. Sz" Date: Thu, 25 Feb 2021 09:33:47 +0100 Subject: [PATCH 3/5] cof: added Duration method --- d2common/d2fileformats/d2cof/helpers.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/d2common/d2fileformats/d2cof/helpers.go b/d2common/d2fileformats/d2cof/helpers.go index 0cc7f73b..0b3b7fb2 100644 --- a/d2common/d2fileformats/d2cof/helpers.go +++ b/d2common/d2fileformats/d2cof/helpers.go @@ -14,3 +14,14 @@ func (c *COF) SpeedToFPS() float64 { return fps } + +// Duration returns animation's duration +func (c *COF) Duration() float64 { + const ( + milliseconds = 1000 + ) + + frameDelay := milliseconds / c.SpeedToFPS() + + return float64(c.FramesPerDirection) * frameDelay +} From 15d30ffcce6d8d1e8362e9793bfde27de1c912a1 Mon Sep 17 00:00:00 2001 From: "M. Sz" Date: Thu, 25 Feb 2021 20:21:44 +0100 Subject: [PATCH 4/5] cof: rename SpeedToFPS -> FPS --- d2common/d2fileformats/d2cof/helpers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/d2common/d2fileformats/d2cof/helpers.go b/d2common/d2fileformats/d2cof/helpers.go index 0b3b7fb2..293719cb 100644 --- a/d2common/d2fileformats/d2cof/helpers.go +++ b/d2common/d2fileformats/d2cof/helpers.go @@ -1,7 +1,7 @@ package d2cof -// SpeedToFPS returns FPS value basing on cof's speed -func (c *COF) SpeedToFPS() float64 { +// FPS returns FPS value basing on cof's speed +func (c *COF) FPS() float64 { const ( baseFPS = 25 speedDivisor = 256 From b5fa6e77eb67917c1ceb97d9a34185b622151038 Mon Sep 17 00:00:00 2001 From: "M. Sz" Date: Thu, 25 Feb 2021 20:25:39 +0100 Subject: [PATCH 5/5] cof: buildfix --- d2common/d2fileformats/d2cof/helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/d2common/d2fileformats/d2cof/helpers.go b/d2common/d2fileformats/d2cof/helpers.go index 293719cb..9e1b9c5d 100644 --- a/d2common/d2fileformats/d2cof/helpers.go +++ b/d2common/d2fileformats/d2cof/helpers.go @@ -21,7 +21,7 @@ func (c *COF) Duration() float64 { milliseconds = 1000 ) - frameDelay := milliseconds / c.SpeedToFPS() + frameDelay := milliseconds / c.FPS() return float64(c.FramesPerDirection) * frameDelay }