diff --git a/.circleci/config.yml b/.circleci/config.yml index 67b9778b..66e53ff5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ version: 2 jobs: build: docker: - - image: circleci/golang:1.15.6 + - image: circleci/golang:1.16 working_directory: /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}} steps: - checkout diff --git a/build.sh b/build.sh index aee5c735..548319c7 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ # License: GNU GPLv3 version="0.0.8" -go_version="1.13.4" +go_version="1.16" echo "OpenDiablo 2 Build Script $version" #================================================= diff --git a/d2common/d2fileformats/d2animdata/record.go b/d2common/d2fileformats/d2animdata/record.go index 013981a2..ff843277 100644 --- a/d2common/d2fileformats/d2animdata/record.go +++ b/d2common/d2fileformats/d2animdata/record.go @@ -13,11 +13,21 @@ func (r *AnimationDataRecord) FramesPerDirection() int { return int(r.framesPerDirection) } +// SetFramesPerDirection sets frames per direction value +func (r *AnimationDataRecord) SetFramesPerDirection(fpd uint32) { + r.framesPerDirection = fpd +} + // Speed returns animation's speed func (r *AnimationDataRecord) Speed() int { return int(r.speed) } +// SetSpeed sets record's speed +func (r *AnimationDataRecord) SetSpeed(s uint16) { + r.speed = s +} + // FPS returns the frames per second for this animation record func (r *AnimationDataRecord) FPS() float64 { speedf := float64(r.speed) @@ -31,3 +41,23 @@ func (r *AnimationDataRecord) FPS() float64 { func (r *AnimationDataRecord) FrameDurationMS() float64 { return milliseconds / r.FPS() } + +// Events returns events map +func (r *AnimationDataRecord) Events() map[int]AnimationEvent { + return r.events +} + +// Event returns specific event +func (r *AnimationDataRecord) Event(idx int) AnimationEvent { + event, found := r.events[idx] + if found { + return event + } + + return AnimationEventNone +} + +// SetEvent sets event on specific index to given +func (r *AnimationDataRecord) SetEvent(index int, event AnimationEvent) { + r.events[index] = event +} diff --git a/d2common/d2fileformats/d2tbl/text_dictionary.go b/d2common/d2fileformats/d2tbl/text_dictionary.go index b0b8e51b..a31c67c6 100644 --- a/d2common/d2fileformats/d2tbl/text_dictionary.go +++ b/d2common/d2fileformats/d2tbl/text_dictionary.go @@ -185,7 +185,12 @@ func (td *TextDictionary) Marshal() []byte { sw.PushUint16(0) - sw.PushInt32(int32(len(*td))) + keys := make([]string, 0) + for key := range *td { + keys = append(keys, key) + } + + sw.PushInt32(int32(len(keys))) // version (always 0) sw.PushBytes(0) @@ -205,7 +210,8 @@ func (td *TextDictionary) Marshal() []byte { // dataPos is a position, when we're placing data stream dataPos := len(sw.GetBytes()) + 17*len(*td) - for key, value := range *td { + for _, key := range keys { + value := (*td)[key] // non-zero if record is used (for us, every record is used ;-) sw.PushBytes(1) @@ -218,7 +224,13 @@ func (td *TextDictionary) Marshal() []byte { sw.PushUint32(0) sw.PushUint32(uint32(dataPos)) - dataPos += len(key) + 1 + + if key[0] == '#' { + // 1 for X, and 1 for separator + dataPos += 2 + } else { + dataPos += len(key) + 1 + } sw.PushUint32(uint32(dataPos)) dataPos += len(value) + 1 @@ -227,7 +239,13 @@ func (td *TextDictionary) Marshal() []byte { } // data stream: put all data in appropriate order - for key, value := range *td { + for _, key := range keys { + value := (*td)[key] + + if key[0] == '#' { + key = "x" + } + for _, i := range key { sw.PushBytes(byte(i)) } diff --git a/d2common/d2fileformats/d2tbl/text_dictionary_test.go b/d2common/d2fileformats/d2tbl/text_dictionary_test.go index 26188cd5..aea1f7d2 100644 --- a/d2common/d2fileformats/d2tbl/text_dictionary_test.go +++ b/d2common/d2fileformats/d2tbl/text_dictionary_test.go @@ -8,7 +8,7 @@ func exampleData() *TextDictionary { result := &TextDictionary{ "abc": "def", "someStr": "Some long string", - "teststring": "TeSt", + "teststring": "TeStxwsas123 long strin122*8:wq", } return result @@ -27,7 +27,32 @@ func TestTBL_Marshal(t *testing.T) { newValue, ok := newTbl[key] if !ok { - t.Fatal("string wasn't encoded to table") + t.Fatalf("string %s wasn't encoded to table", key) + } + + if newValue != value { + t.Fatal("unexpected value set") + } + } +} + +func TestTBL_MarshalNoNameString(t *testing.T) { + tbl := &TextDictionary{ + "#0": "OKEY", + } + + data := tbl.Marshal() + + newTbl, err := LoadTextDictionary(data) + if err != nil { + t.Error(err) + } + + for key, value := range *tbl { + newValue, ok := newTbl[key] + + if !ok { + t.Fatalf("string %s wasn't encoded to table", key) } if newValue != value {