1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-11-17 01:51:14 -05:00
OpenDiablo2/d2data/animation_data.go

53 lines
1.8 KiB
Go
Raw Normal View History

2019-11-10 03:36:53 -05:00
package d2data
import (
"log"
"strings"
2019-11-10 08:51:02 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
2019-11-10 03:36:53 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common"
)
2019-11-06 22:12:15 -05:00
// AnimationDataRecord represents a single entry in the animation data dictionary file
type AnimationDataRecord struct {
2019-11-06 22:12:15 -05:00
// COFName is the name of the COF file used for this animation
COFName string
// FramesPerDirection specifies how many frames are in each direction
FramesPerDirection int
2019-11-06 22:12:15 -05:00
// AnimationSpeed represents a value of X where the rate is a ration of (x/255) at 25FPS
AnimationSpeed int
// Flags are used in keyframe triggers
Flags []byte
}
2019-11-06 22:12:15 -05:00
// AnimationData represents all of the animation data records, mapped by the COF index
var AnimationData map[string][]*AnimationDataRecord
2019-11-06 22:12:15 -05:00
// LoadAnimationData loads the animation data table into the global AnimationData dictionary
2019-11-10 03:36:53 -05:00
func LoadAnimationData(fileProvider d2interface.FileProvider) {
AnimationData = make(map[string][]*AnimationDataRecord)
2019-11-10 08:51:02 -05:00
rawData := fileProvider.LoadFile(d2resource.AnimationData)
2019-11-10 03:36:53 -05:00
streamReader := d2common.CreateStreamReader(rawData)
for !streamReader.Eof() {
dataCount := int(streamReader.GetInt32())
for i := 0; i < dataCount; i++ {
cofNameBytes, _ := streamReader.ReadBytes(8)
data := &AnimationDataRecord{
COFName: strings.ReplaceAll(string(cofNameBytes), string(0), ""),
FramesPerDirection: int(streamReader.GetInt32()),
AnimationSpeed: int(streamReader.GetInt32()),
}
data.Flags, _ = streamReader.ReadBytes(144)
cofIndex := strings.ToLower(data.COFName)
if _, found := AnimationData[cofIndex]; !found {
AnimationData[cofIndex] = make([]*AnimationDataRecord, 0)
}
AnimationData[cofIndex] = append(AnimationData[cofIndex], data)
}
}
log.Printf("Loaded %d animation data records", len(AnimationData))
}