From 954670da5f859e8ae60376fbf012015193479783 Mon Sep 17 00:00:00 2001 From: Tim Sarbin Date: Wed, 24 Jun 2020 10:13:11 -0400 Subject: [PATCH] Fixed linting issues (#438) --- d2common/d2data/d2compression/huffman.go | 234 ++++++------ d2common/d2data/d2datadict/object_lookup.go | 1 + d2common/d2fileformats/d2dcc/dcc.go | 4 +- d2common/d2fileformats/d2dcc/dcc_direction.go | 4 +- .../d2dcc/dcc_direction_frame.go | 4 +- d2common/d2fileformats/d2ds1/common_data.go | 7 - d2common/d2fileformats/d2ds1/ds1.go | 346 ++++++++++-------- .../d2ds1/floor_shadow_record.go | 1 + .../d2fileformats/d2ds1/substitution_group.go | 1 + .../d2ds1/substitution_record.go | 1 + d2common/d2fileformats/d2ds1/tile_record.go | 16 + d2common/d2fileformats/d2ds1/tilerecord.go | 15 - .../d2ds1/{wallrecord.go => wall_record.go} | 0 d2common/d2fileformats/d2dt1/dt1.go | 52 ++- d2common/d2fileformats/d2mpq/mpq.go | 10 +- d2common/d2fileformats/d2mpq/mpq_stream.go | 10 +- d2core/d2config/d2config.go | 17 +- d2core/d2gui/manager.go | 8 +- d2core/d2map/d2mapentity/animated_entity.go | 2 +- 19 files changed, 418 insertions(+), 315 deletions(-) delete mode 100644 d2common/d2fileformats/d2ds1/common_data.go create mode 100644 d2common/d2fileformats/d2ds1/tile_record.go delete mode 100644 d2common/d2fileformats/d2ds1/tilerecord.go rename d2common/d2fileformats/d2ds1/{wallrecord.go => wall_record.go} (100%) diff --git a/d2common/d2data/d2compression/huffman.go b/d2common/d2data/d2compression/huffman.go index ebd12a8c..28e5d421 100644 --- a/d2common/d2data/d2compression/huffman.go +++ b/d2common/d2data/d2compression/huffman.go @@ -65,10 +65,14 @@ func (v *linkedNode) Insert(other *linkedNode) *linkedNode { v.Next.Prev = other other.Next = v.Next } + v.Next = other + other.Prev = v + return other } + if v.Prev == nil { // Insert after other.Prev = nil @@ -81,105 +85,112 @@ func (v *linkedNode) Insert(other *linkedNode) *linkedNode { return v } -var sPrime = [][]byte{ - { // Compression type 0 - 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - }, { // Compression type 1 - 0x54, 0x16, 0x16, 0x0D, 0x0C, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x03, 0x05, - 0x0E, 0x0B, 0x14, 0x13, 0x13, 0x09, 0x0B, 0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, - 0x0D, 0x07, 0x09, 0x06, 0x06, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, - 0x09, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, - 0x08, 0x03, 0x04, 0x07, 0x09, 0x05, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, - 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, - 0x06, 0x0A, 0x08, 0x08, 0x06, 0x07, 0x04, 0x03, 0x04, 0x04, 0x02, 0x02, 0x04, 0x02, 0x03, 0x03, - 0x04, 0x03, 0x07, 0x07, 0x09, 0x06, 0x04, 0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x0A, 0x02, 0x02, 0x03, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x03, 0x05, 0x02, 0x03, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x09, 0x08, 0x0C, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, - 0x04, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x4B, - }, { // Compression type 2 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00, 0x23, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x06, 0x0E, 0x10, 0x04, - 0x06, 0x08, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x01, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x04, 0x01, 0x01, 0x02, 0x03, 0x03, 0x02, - 0x03, 0x01, 0x03, 0x06, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, - 0x01, 0x29, 0x07, 0x16, 0x12, 0x40, 0x0A, 0x0A, 0x11, 0x25, 0x01, 0x03, 0x17, 0x10, 0x26, 0x2A, - 0x10, 0x01, 0x23, 0x23, 0x2F, 0x10, 0x06, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, - }, { // Compression type 3 - 0xFF, 0x0B, 0x07, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x03, - 0x09, 0x01, 0x01, 0x01, 0x03, 0x04, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x05, 0x01, 0x01, 0x01, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x0A, 0x04, 0x02, 0x01, 0x06, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, - 0x05, 0x02, 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, - 0x01, 0x03, 0x01, 0x01, 0x02, 0x05, 0x01, 0x01, 0x04, 0x03, 0x05, 0x01, 0x03, 0x01, 0x03, 0x03, - 0x02, 0x01, 0x04, 0x03, 0x0A, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x0A, 0x02, 0x05, 0x01, 0x01, 0x02, 0x07, 0x02, 0x17, 0x01, 0x05, 0x01, 0x01, - 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x06, 0x02, 0x01, 0x04, 0x05, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11, - }, { // Compression type 4 - 0xFF, 0xFB, 0x98, 0x9A, 0x84, 0x85, 0x63, 0x64, 0x3E, 0x3E, 0x22, 0x22, 0x13, 0x13, 0x18, 0x17, - }, { // Compression type 5 - 0xFF, 0xF1, 0x9D, 0x9E, 0x9A, 0x9B, 0x9A, 0x97, 0x93, 0x93, 0x8C, 0x8E, 0x86, 0x88, 0x80, 0x82, - 0x7C, 0x7C, 0x72, 0x73, 0x69, 0x6B, 0x5F, 0x60, 0x55, 0x56, 0x4A, 0x4B, 0x40, 0x41, 0x37, 0x37, - 0x2F, 0x2F, 0x27, 0x27, 0x21, 0x21, 0x1B, 0x1C, 0x17, 0x17, 0x13, 0x13, 0x10, 0x10, 0x0D, 0x0D, - 0x0B, 0x0B, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x19, 0x18, - }, { // Compression type 6 - 0xC3, 0xCB, 0xF5, 0x41, 0xFF, 0x7B, 0xF7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xBF, 0xCC, 0xF2, 0x40, 0xFD, 0x7C, 0xF7, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7A, 0x46, - }, { // Compression type 7 - 0xC3, 0xD9, 0xEF, 0x3D, 0xF9, 0x7C, 0xE9, 0x1E, 0xFD, 0xAB, 0xF1, 0x2C, 0xFC, 0x5B, 0xFE, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xBD, 0xD9, 0xEC, 0x3D, 0xF5, 0x7D, 0xE8, 0x1D, 0xFB, 0xAE, 0xF0, 0x2C, 0xFB, 0x5C, 0xFF, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x6C, - }, { // Compression type 8 - 0xBA, 0xC5, 0xDA, 0x33, 0xE3, 0x6D, 0xD8, 0x18, 0xE5, 0x94, 0xDA, 0x23, 0xDF, 0x4A, 0xD1, 0x10, - 0xEE, 0xAF, 0xE4, 0x2C, 0xEA, 0x5A, 0xDE, 0x15, 0xF4, 0x87, 0xE9, 0x21, 0xF6, 0x43, 0xFC, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xB0, 0xC7, 0xD8, 0x33, 0xE3, 0x6B, 0xD6, 0x18, 0xE7, 0x95, 0xD8, 0x23, 0xDB, 0x49, 0xD0, 0x11, - 0xE9, 0xB2, 0xE2, 0x2B, 0xE8, 0x5C, 0xDD, 0x15, 0xF1, 0x87, 0xE7, 0x20, 0xF7, 0x44, 0xFF, 0x13, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5F, 0x9E, - }, +func getPrimes() [][]byte { + return [][]byte{ + { + // Compression type 0 + 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + { + // Compression type 1 + 0x54, 0x16, 0x16, 0x0D, 0x0C, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x03, 0x05, + 0x0E, 0x0B, 0x14, 0x13, 0x13, 0x09, 0x0B, 0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, + 0x0D, 0x07, 0x09, 0x06, 0x06, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x09, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, + 0x08, 0x03, 0x04, 0x07, 0x09, 0x05, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, + 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, + 0x06, 0x0A, 0x08, 0x08, 0x06, 0x07, 0x04, 0x03, 0x04, 0x04, 0x02, 0x02, 0x04, 0x02, 0x03, 0x03, + 0x04, 0x03, 0x07, 0x07, 0x09, 0x06, 0x04, 0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x0A, 0x02, 0x02, 0x03, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x03, 0x05, 0x02, 0x03, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x09, 0x08, 0x0C, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, + 0x04, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x4B, + }, { + // Compression type 2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x06, 0x0E, 0x10, 0x04, + 0x06, 0x08, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01, + 0x01, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x04, 0x01, 0x01, 0x02, 0x03, 0x03, 0x02, + 0x03, 0x01, 0x03, 0x06, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, + 0x01, 0x29, 0x07, 0x16, 0x12, 0x40, 0x0A, 0x0A, 0x11, 0x25, 0x01, 0x03, 0x17, 0x10, 0x26, 0x2A, + 0x10, 0x01, 0x23, 0x23, 0x2F, 0x10, 0x06, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, + }, { + // Compression type 3 + 0xFF, 0x0B, 0x07, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x03, + 0x09, 0x01, 0x01, 0x01, 0x03, 0x04, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, + 0x05, 0x01, 0x01, 0x01, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x0A, 0x04, 0x02, 0x01, 0x06, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, + 0x05, 0x02, 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, + 0x01, 0x03, 0x01, 0x01, 0x02, 0x05, 0x01, 0x01, 0x04, 0x03, 0x05, 0x01, 0x03, 0x01, 0x03, 0x03, + 0x02, 0x01, 0x04, 0x03, 0x0A, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x01, 0x0A, 0x02, 0x05, 0x01, 0x01, 0x02, 0x07, 0x02, 0x17, 0x01, 0x05, 0x01, 0x01, + 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x06, 0x02, 0x01, 0x04, 0x05, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11, + }, { // Compression type 4 + 0xFF, 0xFB, 0x98, 0x9A, 0x84, 0x85, 0x63, 0x64, 0x3E, 0x3E, 0x22, 0x22, 0x13, 0x13, 0x18, 0x17, + }, { // Compression type 5 + 0xFF, 0xF1, 0x9D, 0x9E, 0x9A, 0x9B, 0x9A, 0x97, 0x93, 0x93, 0x8C, 0x8E, 0x86, 0x88, 0x80, 0x82, + 0x7C, 0x7C, 0x72, 0x73, 0x69, 0x6B, 0x5F, 0x60, 0x55, 0x56, 0x4A, 0x4B, 0x40, 0x41, 0x37, 0x37, + 0x2F, 0x2F, 0x27, 0x27, 0x21, 0x21, 0x1B, 0x1C, 0x17, 0x17, 0x13, 0x13, 0x10, 0x10, 0x0D, 0x0D, + 0x0B, 0x0B, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x19, 0x18, + }, { // Compression type 6 + 0xC3, 0xCB, 0xF5, 0x41, 0xFF, 0x7B, 0xF7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0xCC, 0xF2, 0x40, 0xFD, 0x7C, 0xF7, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7A, 0x46, + }, { // Compression type 7 + 0xC3, 0xD9, 0xEF, 0x3D, 0xF9, 0x7C, 0xE9, 0x1E, 0xFD, 0xAB, 0xF1, 0x2C, 0xFC, 0x5B, 0xFE, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0xD9, 0xEC, 0x3D, 0xF5, 0x7D, 0xE8, 0x1D, 0xFB, 0xAE, 0xF0, 0x2C, 0xFB, 0x5C, 0xFF, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x6C, + }, { // Compression type 8 + 0xBA, 0xC5, 0xDA, 0x33, 0xE3, 0x6D, 0xD8, 0x18, 0xE5, 0x94, 0xDA, 0x23, 0xDF, 0x4A, 0xD1, 0x10, + 0xEE, 0xAF, 0xE4, 0x2C, 0xEA, 0x5A, 0xDE, 0x15, 0xF4, 0x87, 0xE9, 0x21, 0xF6, 0x43, 0xFC, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB0, 0xC7, 0xD8, 0x33, 0xE3, 0x6B, 0xD6, 0x18, 0xE7, 0x95, 0xD8, 0x23, 0xDB, 0x49, 0xD0, 0x11, + 0xE9, 0xB2, 0xE2, 0x2B, 0xE8, 0x5C, 0xDD, 0x15, 0xF1, 0x87, 0xE7, 0x20, 0xF7, 0x44, 0xFF, 0x13, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x9E, + }, + } } func decode(input *d2common.BitStream, head *linkedNode) *linkedNode { @@ -190,12 +201,15 @@ func decode(input *d2common.BitStream, head *linkedNode) *linkedNode { if bit == -1 { log.Fatal("unexpected end of file") } + if bit == 0 { node = node.Child0 continue } + node = node.GetChild1() } + return node } @@ -208,6 +222,7 @@ func buildList(primeData []byte) *linkedNode { root = root.Insert(CreateLinkedNode(i, int(primeData[i]))) } } + return root } @@ -229,9 +244,10 @@ func insertNode(tail *linkedNode, decomp int) *linkedNode { temp.Next = newnode adjustTree(newnode) - // TODO: For compression type 0, AdjustTree should be called - // once for every value written and only once here + + // TODO: For compression type 0, AdjustTree should be called once for every value written and only once here adjustTree(newnode) + return result } @@ -242,18 +258,24 @@ func adjustTree(newNode *linkedNode) { for current != nil { current.Weight++ + var insertpoint *linkedNode + var prev *linkedNode + // Go backwards thru the list looking for the insertion point insertpoint = current + for { prev = insertpoint.Prev if prev == nil { break } + if prev.Weight >= current.Weight { break } + insertpoint = prev } @@ -269,14 +291,17 @@ func adjustTree(newNode *linkedNode) { if insertpoint.Prev != nil { insertpoint.Prev.Next = insertpoint.Next } + insertpoint.Next.Prev = insertpoint.Prev // Insert insertpoint after current insertpoint.Next = current.Next insertpoint.Prev = current + if current.Next != nil { current.Next.Prev = insertpoint } + current.Next = insertpoint // remove current @@ -319,6 +344,7 @@ func buildTree(tail *linkedNode) *linkedNode { for current != nil { child0 := current child1 := current.Prev + if child1 == nil { break } @@ -331,22 +357,26 @@ func buildTree(tail *linkedNode) *linkedNode { current.Insert(parent) current = current.Prev.Prev } + return current } func HuffmanDecompress(data []byte) []byte { comptype := data[0] + primes := getPrimes() if comptype == 0 { log.Panic("compression type 0 is not currently supported") } - tail := buildList(sPrime[comptype]) + tail := buildList(primes[comptype]) head := buildTree(tail) outputstream := d2common.CreateStreamWriter() bitstream := d2common.CreateBitStream(data[1:]) + var decoded int + Loop: for { node := decode(bitstream, head) diff --git a/d2common/d2data/d2datadict/object_lookup.go b/d2common/d2data/d2datadict/object_lookup.go index d1f57683..fcc5e82c 100644 --- a/d2common/d2data/d2datadict/object_lookup.go +++ b/d2common/d2data/d2datadict/object_lookup.go @@ -1,5 +1,6 @@ package d2datadict +//nolint // This is a data dump file. var objectLookups = []ObjectLookupRecord{ {Act: 1, Type: ObjectTypeCharacter, Id: 0, Description: "gheed-ACT 1 TABLE", ObjectsTxtId: -1, MonstatsTxtId: -1, Direction: -1, Base: "/Data/Global/Monsters", Token: "GH", Mode: "NU", Class: "HTH", TR: "LIT", Index: -1}, {Act: 1, Type: ObjectTypeCharacter, Id: 1, Description: "cain1-ACT 1 TABLE", ObjectsTxtId: -1, MonstatsTxtId: -1, Direction: -1, Base: "/Data/Global/Monsters", Token: "DC", Mode: "NU", Class: "HTH", TR: "LIT", Index: -1}, diff --git a/d2common/d2fileformats/d2dcc/dcc.go b/d2common/d2fileformats/d2dcc/dcc.go index 9fe0d0ab..0ae9837e 100644 --- a/d2common/d2fileformats/d2dcc/dcc.go +++ b/d2common/d2fileformats/d2dcc/dcc.go @@ -11,7 +11,7 @@ type DCC struct { Version int NumberOfDirections int FramesPerDirection int - Directions []DCCDirection + Directions []*DCCDirection } func LoadDCC(fileData []byte) (*DCC, error) { @@ -32,7 +32,7 @@ func LoadDCC(fileData []byte) (*DCC, error) { for i := 0; i < result.NumberOfDirections; i++ { directionOffsets[i] = int(bm.GetInt32()) } - result.Directions = make([]DCCDirection, result.NumberOfDirections) + result.Directions = make([]*DCCDirection, result.NumberOfDirections) for i := 0; i < result.NumberOfDirections; i++ { result.Directions[i] = CreateDCCDirection(d2common.CreateBitMuncher(fileData, directionOffsets[i]*8), *result) } diff --git a/d2common/d2fileformats/d2dcc/dcc_direction.go b/d2common/d2fileformats/d2dcc/dcc_direction.go index 60e7264d..1735f35d 100644 --- a/d2common/d2fileformats/d2dcc/dcc_direction.go +++ b/d2common/d2fileformats/d2dcc/dcc_direction.go @@ -30,8 +30,8 @@ type DCCDirection struct { PixelBuffer []DCCPixelBufferEntry } -func CreateDCCDirection(bm *d2common.BitMuncher, file DCC) DCCDirection { - result := DCCDirection{} +func CreateDCCDirection(bm *d2common.BitMuncher, file DCC) *DCCDirection { + result := &DCCDirection{} result.OutSizeCoded = int(bm.GetUInt32()) result.CompressionFlags = int(bm.GetBits(2)) result.Variable0Bits = int(crazyBitTable[bm.GetBits(4)]) diff --git a/d2common/d2fileformats/d2dcc/dcc_direction_frame.go b/d2common/d2fileformats/d2dcc/dcc_direction_frame.go index eeafd45d..b3ec5cc7 100644 --- a/d2common/d2fileformats/d2dcc/dcc_direction_frame.go +++ b/d2common/d2fileformats/d2dcc/dcc_direction_frame.go @@ -22,7 +22,7 @@ type DCCDirectionFrame struct { valid bool } -func CreateDCCDirectionFrame(bits *d2common.BitMuncher, direction DCCDirection) *DCCDirectionFrame { +func CreateDCCDirectionFrame(bits *d2common.BitMuncher, direction *DCCDirection) *DCCDirectionFrame { result := &DCCDirectionFrame{} bits.GetBits(direction.Variable0Bits) // Variable0 result.Width = int(bits.GetBits(direction.WidthBits)) @@ -46,7 +46,7 @@ func CreateDCCDirectionFrame(bits *d2common.BitMuncher, direction DCCDirection) return result } -func (v *DCCDirectionFrame) CalculateCells(direction DCCDirection) { +func (v *DCCDirectionFrame) CalculateCells(direction *DCCDirection) { var w = 4 - ((v.Box.Left - direction.Box.Left) % 4) // Width of the first column (in pixels) if (v.Width - w) <= 1 { v.HorizontalCellCount = 1 diff --git a/d2common/d2fileformats/d2ds1/common_data.go b/d2common/d2fileformats/d2ds1/common_data.go deleted file mode 100644 index 06a58a9d..00000000 --- a/d2common/d2fileformats/d2ds1/common_data.go +++ /dev/null @@ -1,7 +0,0 @@ -package d2ds1 - -var dirLookup = []int32{ - 0x00, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, - 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, - 0x0F, 0x10, 0x11, 0x12, 0x14, -} diff --git a/d2common/d2fileformats/d2ds1/ds1.go b/d2common/d2fileformats/d2ds1/ds1.go index 2e5f5362..fcc8f9ac 100644 --- a/d2common/d2fileformats/d2ds1/ds1.go +++ b/d2common/d2fileformats/d2ds1/ds1.go @@ -1,3 +1,4 @@ +// Package d2ds1 provides functionality for loading/processing DS1 files package d2ds1 import ( @@ -7,23 +8,27 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" ) +const maxActNumber = 5 + +// DS1 represents the "stamp" data that is used to build up maps. type DS1 struct { - Version int32 // The version of the DS1 - Width int32 // Width of map, in # of tiles - Height int32 // Height of map, in # of tiles - Act int32 // Act, from 1 to 5. This tells which act table to use for the Objects list - SubstitutionType int32 // SubstitutionType (layer type): 0 if no layer, else type 1 or type 2 - Files []string // FilePtr table of file string pointers - NumberOfWalls int32 // WallNum number of wall & orientation layers used - NumberOfFloors int32 // number of floor layers used - NumberOfShadowLayers int32 // ShadowNum number of shadow layer used - NumberOfSubstitutionLayers int32 // SubstitutionNum number of substitution layer used - SubstitutionGroupsNum int32 // SubstitutionGroupsNum number of substitution groups, datas between objects & NPC paths - Objects []d2data.Object // Objects - Tiles [][]TileRecord - SubstitutionGroups []SubstitutionGroup + Files []string // FilePtr table of file string pointers + Objects []d2data.Object // Objects + Tiles [][]TileRecord // The tile data for the DS1 + SubstitutionGroups []SubstitutionGroup // Substitution groups for the DS1 + Version int32 // The version of the DS1 + Width int32 // Width of map, in # of tiles + Height int32 // Height of map, in # of tiles + Act int32 // Act, from 1 to 5. This tells which act table to use for the Objects list + SubstitutionType int32 // SubstitutionType (layer type): 0 if no layer, else type 1 or type 2 + NumberOfWalls int32 // WallNum number of wall & orientation layers used + NumberOfFloors int32 // number of floor layers used + NumberOfShadowLayers int32 // ShadowNum number of shadow layer used + NumberOfSubstitutionLayers int32 // SubstitutionNum number of substitution layer used + SubstitutionGroupsNum int32 // SubstitutionGroupsNum number of substitution groups, datas between objects & NPC paths } +// LoadDS1 loads the specified DS1 file func LoadDS1(fileData []byte) (*DS1, error) { ds1 := &DS1{ Act: 1, @@ -36,44 +41,126 @@ func LoadDS1(fileData []byte) (*DS1, error) { ds1.Version = br.GetInt32() ds1.Width = br.GetInt32() + 1 ds1.Height = br.GetInt32() + 1 - if ds1.Version >= 8 { - ds1.Act = d2common.MinInt32(5, br.GetInt32()+1) + + if ds1.Version >= 8 { //nolint:gomnd // Version number + ds1.Act = d2common.MinInt32(maxActNumber, br.GetInt32()+1) } - if ds1.Version >= 10 { + + if ds1.Version >= 10 { //nolint:gomnd // Version number ds1.SubstitutionType = br.GetInt32() if ds1.SubstitutionType == 1 || ds1.SubstitutionType == 2 { ds1.NumberOfSubstitutionLayers = 1 } } - if ds1.Version >= 3 { + + if ds1.Version >= 3 { //nolint:gomnd // Version number // These files reference things that don't exist anymore :-? numberOfFiles := br.GetInt32() ds1.Files = make([]string, numberOfFiles) + for i := 0; i < int(numberOfFiles); i++ { ds1.Files[i] = "" + for { ch := br.GetByte() if ch == 0 { break } + ds1.Files[i] += string(ch) } } } + if ds1.Version >= 9 && ds1.Version <= 13 { // Skipping two dwords because they are "meaningless"? - br.SkipBytes(8) + br.SkipBytes(8) //nolint:gomnd // We don't know what's here } - if ds1.Version >= 4 { + + if ds1.Version >= 4 { //nolint:gomnd // Version number ds1.NumberOfWalls = br.GetInt32() - if ds1.Version >= 16 { + if ds1.Version >= 16 { //nolint:gomnd // Version number ds1.NumberOfFloors = br.GetInt32() } else { ds1.NumberOfFloors = 1 } } + + layerStream := ds1.setupStreamLayerTypes() + + ds1.Tiles = make([][]TileRecord, ds1.Height) + + for y := range ds1.Tiles { + ds1.Tiles[y] = make([]TileRecord, ds1.Width) + for x := 0; x < int(ds1.Width); x++ { + ds1.Tiles[y][x].Walls = make([]WallRecord, ds1.NumberOfWalls) + ds1.Tiles[y][x].Floors = make([]FloorShadowRecord, ds1.NumberOfFloors) + ds1.Tiles[y][x].Shadows = make([]FloorShadowRecord, ds1.NumberOfShadowLayers) + ds1.Tiles[y][x].Substitutions = make([]SubstitutionRecord, ds1.NumberOfSubstitutionLayers) + } + } + + ds1.loadLayerStreams(br, layerStream) + ds1.loadObjects(br) + ds1.loadSubstitutions(br) + ds1.loadNPCs(br) + + return ds1, nil +} + +func (ds1 *DS1) loadObjects(br *d2common.StreamReader) { + if ds1.Version >= 2 { //nolint:gomnd // Version number + numberOfObjects := br.GetInt32() + ds1.Objects = make([]d2data.Object, numberOfObjects) + + for objIdx := 0; objIdx < int(numberOfObjects); objIdx++ { + newObject := d2data.Object{} + newObject.Type = int(br.GetInt32()) + newObject.Id = int(br.GetInt32()) + newObject.X = int(br.GetInt32()) + newObject.Y = int(br.GetInt32()) + newObject.Flags = int(br.GetInt32()) + newObject.Lookup = d2datadict.LookupObject(int(ds1.Act), newObject.Type, newObject.Id) + + if newObject.Lookup != nil && newObject.Lookup.ObjectsTxtId != -1 { + newObject.ObjectInfo = d2datadict.Objects[newObject.Lookup.ObjectsTxtId] + } + + ds1.Objects[objIdx] = newObject + } + } else { + ds1.Objects = make([]d2data.Object, 0) + } +} + +func (ds1 *DS1) loadSubstitutions(br *d2common.StreamReader) { + if ds1.Version >= 12 && (ds1.SubstitutionType == 1 || ds1.SubstitutionType == 2) { + if ds1.Version >= 18 { //nolint:gomnd // Version number + br.GetUInt32() + } + + numberOfSubGroups := br.GetInt32() + ds1.SubstitutionGroups = make([]SubstitutionGroup, numberOfSubGroups) + + for subIdx := 0; subIdx < int(numberOfSubGroups); subIdx++ { + newSub := SubstitutionGroup{} + newSub.TileX = br.GetInt32() + newSub.TileY = br.GetInt32() + newSub.WidthInTiles = br.GetInt32() + newSub.HeightInTiles = br.GetInt32() + newSub.Unknown = br.GetInt32() + + ds1.SubstitutionGroups[subIdx] = newSub + } + } else { + ds1.SubstitutionGroups = make([]SubstitutionGroup, 0) + } +} + +func (ds1 *DS1) setupStreamLayerTypes() []d2enum.LayerStreamType { var layerStream []d2enum.LayerStreamType - if ds1.Version < 4 { + + if ds1.Version < 4 { //nolint:gomnd // Version number layerStream = []d2enum.LayerStreamType{ d2enum.LayerStreamWall1, d2enum.LayerStreamFloor1, @@ -82,7 +169,9 @@ func LoadDS1(fileData []byte) (*DS1, error) { d2enum.LayerStreamShadow, } } else { - layerStream = make([]d2enum.LayerStreamType, (ds1.NumberOfWalls*2)+ds1.NumberOfFloors+ds1.NumberOfShadowLayers+ds1.NumberOfSubstitutionLayers) + layerStream = make([]d2enum.LayerStreamType, + (ds1.NumberOfWalls*2)+ds1.NumberOfFloors+ds1.NumberOfShadowLayers+ds1.NumberOfSubstitutionLayers) + layerIdx := 0 for i := 0; i < int(ds1.NumberOfWalls); i++ { layerStream[layerIdx] = d2enum.LayerStreamType(int(d2enum.LayerStreamWall1) + i) @@ -99,149 +188,114 @@ func LoadDS1(fileData []byte) (*DS1, error) { } if ds1.NumberOfSubstitutionLayers > 0 { layerStream[layerIdx] = d2enum.LayerStreamSubstitute - layerIdx++ } } - ds1.Tiles = make([][]TileRecord, ds1.Height) - for y := range ds1.Tiles { - ds1.Tiles[y] = make([]TileRecord, ds1.Width) - for x := 0; x < int(ds1.Width); x++ { - ds1.Tiles[y][x].Walls = make([]WallRecord, ds1.NumberOfWalls) - ds1.Tiles[y][x].Floors = make([]FloorShadowRecord, ds1.NumberOfFloors) - ds1.Tiles[y][x].Shadows = make([]FloorShadowRecord, ds1.NumberOfShadowLayers) - ds1.Tiles[y][x].Substitutions = make([]SubstitutionRecord, ds1.NumberOfSubstitutionLayers) - } - } - for _, layerStreamType := range layerStream { - for y := 0; y < int(ds1.Height); y++ { - for x := 0; x < int(ds1.Width); x++ { - dw := br.GetUInt32() - switch layerStreamType { - case d2enum.LayerStreamWall1: - fallthrough - case d2enum.LayerStreamWall2: - fallthrough - case d2enum.LayerStreamWall3: - fallthrough - case d2enum.LayerStreamWall4: - wallIndex := int(layerStreamType) - int(d2enum.LayerStreamWall1) - ds1.Tiles[y][x].Walls[wallIndex].Prop1 = byte(dw & 0x000000FF) - ds1.Tiles[y][x].Walls[wallIndex].Sequence = byte((dw & 0x00003F00) >> 8) - ds1.Tiles[y][x].Walls[wallIndex].Unknown1 = byte((dw & 0x000FC000) >> 14) - ds1.Tiles[y][x].Walls[wallIndex].Style = byte((dw & 0x03F00000) >> 20) - ds1.Tiles[y][x].Walls[wallIndex].Unknown2 = byte((dw & 0x7C000000) >> 26) - ds1.Tiles[y][x].Walls[wallIndex].Hidden = byte((dw&0x80000000)>>31) > 0 - case d2enum.LayerStreamOrientation1: - fallthrough - case d2enum.LayerStreamOrientation2: - fallthrough - case d2enum.LayerStreamOrientation3: - fallthrough - case d2enum.LayerStreamOrientation4: - wallIndex := int(layerStreamType) - int(d2enum.LayerStreamOrientation1) - c := int32(dw & 0x000000FF) - if ds1.Version < 7 { - if c < 25 { - c = dirLookup[c] - } - } - ds1.Tiles[y][x].Walls[wallIndex].Type = d2enum.TileType(c) - ds1.Tiles[y][x].Walls[wallIndex].Zero = byte((dw & 0xFFFFFF00) >> 8) - case d2enum.LayerStreamFloor1: - fallthrough - case d2enum.LayerStreamFloor2: - floorIndex := int(layerStreamType) - int(d2enum.LayerStreamFloor1) - ds1.Tiles[y][x].Floors[floorIndex].Prop1 = byte(dw & 0x000000FF) - ds1.Tiles[y][x].Floors[floorIndex].Sequence = byte((dw & 0x00003F00) >> 8) - ds1.Tiles[y][x].Floors[floorIndex].Unknown1 = byte((dw & 0x000FC000) >> 14) - ds1.Tiles[y][x].Floors[floorIndex].Style = byte((dw & 0x03F00000) >> 20) - ds1.Tiles[y][x].Floors[floorIndex].Unknown2 = byte((dw & 0x7C000000) >> 26) - ds1.Tiles[y][x].Floors[floorIndex].Hidden = byte((dw&0x80000000)>>31) > 0 - case d2enum.LayerStreamShadow: - ds1.Tiles[y][x].Shadows[0].Prop1 = byte(dw & 0x000000FF) - ds1.Tiles[y][x].Shadows[0].Sequence = byte((dw & 0x00003F00) >> 8) - ds1.Tiles[y][x].Shadows[0].Unknown1 = byte((dw & 0x000FC000) >> 14) - ds1.Tiles[y][x].Shadows[0].Style = byte((dw & 0x03F00000) >> 20) - ds1.Tiles[y][x].Shadows[0].Unknown2 = byte((dw & 0x7C000000) >> 26) - ds1.Tiles[y][x].Shadows[0].Hidden = byte((dw&0x80000000)>>31) > 0 - case d2enum.LayerStreamSubstitute: - ds1.Tiles[y][x].Substitutions[0].Unknown = dw - } - } - } - } - if ds1.Version >= 2 { - numberOfObjects := br.GetInt32() - ds1.Objects = make([]d2data.Object, numberOfObjects) - for objIdx := 0; objIdx < int(numberOfObjects); objIdx++ { - newObject := d2data.Object{} - newObject.Type = int(br.GetInt32()) - newObject.Id = int(br.GetInt32()) - newObject.X = int(br.GetInt32()) - newObject.Y = int(br.GetInt32()) - newObject.Flags = int(br.GetInt32()) - newObject.Lookup = d2datadict.LookupObject(int(ds1.Act), newObject.Type, newObject.Id) - if newObject.Lookup != nil && newObject.Lookup.ObjectsTxtId != -1 { - newObject.ObjectInfo = d2datadict.Objects[newObject.Lookup.ObjectsTxtId] - } - ds1.Objects[objIdx] = newObject - } - } else { - ds1.Objects = make([]d2data.Object, 0) - } - if ds1.Version >= 12 && (ds1.SubstitutionType == 1 || ds1.SubstitutionType == 2) { - if ds1.Version >= 18 { - br.GetUInt32() - } - numberOfSubGroups := br.GetInt32() - ds1.SubstitutionGroups = make([]SubstitutionGroup, numberOfSubGroups) - for subIdx := 0; subIdx < int(numberOfSubGroups); subIdx++ { - newSub := SubstitutionGroup{} - newSub.TileX = br.GetInt32() - newSub.TileY = br.GetInt32() - newSub.WidthInTiles = br.GetInt32() - newSub.HeightInTiles = br.GetInt32() - newSub.Unknown = br.GetInt32() - ds1.SubstitutionGroups[subIdx] = newSub - } - } else { - ds1.SubstitutionGroups = make([]SubstitutionGroup, 0) - } - if ds1.Version >= 14 { + return layerStream +} + +func (ds1 *DS1) loadNPCs(br *d2common.StreamReader) { + if ds1.Version >= 14 { //nolint:gomnd // Version number numberOfNpcs := br.GetInt32() for npcIdx := 0; npcIdx < int(numberOfNpcs); npcIdx++ { numPaths := br.GetInt32() npcX := int(br.GetInt32()) npcY := int(br.GetInt32()) objIdx := -1 + for idx, ds1Obj := range ds1.Objects { if ds1Obj.X == npcX && ds1Obj.Y == npcY { objIdx = idx break } } + if objIdx > -1 { - if ds1.Objects[objIdx].Paths == nil { - ds1.Objects[objIdx].Paths = make([]d2common.Path, numPaths) - } - for pathIdx := 0; pathIdx < int(numPaths); pathIdx++ { - newPath := d2common.Path{} - newPath.X = int(br.GetInt32()) - newPath.Y = int(br.GetInt32()) - if ds1.Version >= 15 { - newPath.Action = int(br.GetInt32()) - } - ds1.Objects[objIdx].Paths[pathIdx] = newPath - } + ds1.loadNpcPaths(br, objIdx, int(numPaths)) } else { - if ds1.Version >= 15 { - br.SkipBytes(int(numPaths) * 3) + if ds1.Version >= 15 { //nolint:gomnd // Version number + br.SkipBytes(int(numPaths) * 3) //nolint:gomnd // Unknown data } else { - br.SkipBytes(int(numPaths) * 2) + br.SkipBytes(int(numPaths) * 2) //nolint:gomnd // Unknown data + } + } + } + } +} + +func (ds1 *DS1) loadNpcPaths(br *d2common.StreamReader, objIdx, numPaths int) { + if ds1.Objects[objIdx].Paths == nil { + ds1.Objects[objIdx].Paths = make([]d2common.Path, numPaths) + } + + for pathIdx := 0; pathIdx < numPaths; pathIdx++ { + newPath := d2common.Path{} + newPath.X = int(br.GetInt32()) + newPath.Y = int(br.GetInt32()) + + if ds1.Version >= 15 { //nolint:gomnd // Version number + newPath.Action = int(br.GetInt32()) + } + + ds1.Objects[objIdx].Paths[pathIdx] = newPath + } +} + +func (ds1 *DS1) loadLayerStreams(br *d2common.StreamReader, layerStream []d2enum.LayerStreamType) { + var dirLookup = []int32{ + 0x00, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, + 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x14, + } + + for lIdx := range layerStream { + layerStreamType := layerStream[lIdx] + + for y := 0; y < int(ds1.Height); y++ { + for x := 0; x < int(ds1.Width); x++ { + dw := br.GetUInt32() + + switch layerStreamType { + case d2enum.LayerStreamWall1, d2enum.LayerStreamWall2, d2enum.LayerStreamWall3, d2enum.LayerStreamWall4: + wallIndex := int(layerStreamType) - int(d2enum.LayerStreamWall1) + ds1.Tiles[y][x].Walls[wallIndex].Prop1 = byte(dw & 0x000000FF) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Walls[wallIndex].Sequence = byte((dw & 0x00003F00) >> 8) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Walls[wallIndex].Unknown1 = byte((dw & 0x000FC000) >> 14) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Walls[wallIndex].Style = byte((dw & 0x03F00000) >> 20) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Walls[wallIndex].Unknown2 = byte((dw & 0x7C000000) >> 26) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Walls[wallIndex].Hidden = byte((dw&0x80000000)>>31) > 0 //nolint:gomnd // Bitmask + case d2enum.LayerStreamOrientation1, d2enum.LayerStreamOrientation2, + d2enum.LayerStreamOrientation3, d2enum.LayerStreamOrientation4: + wallIndex := int(layerStreamType) - int(d2enum.LayerStreamOrientation1) + c := int32(dw & 0x000000FF) //nolint:gomnd // Bitmask + + if ds1.Version < 7 { //nolint:gomnd // Version number + if c < int32(len(dirLookup)) { + c = dirLookup[c] + } + } + + ds1.Tiles[y][x].Walls[wallIndex].Type = d2enum.TileType(c) + ds1.Tiles[y][x].Walls[wallIndex].Zero = byte((dw & 0xFFFFFF00) >> 8) //nolint:gomnd // Bitmask + case d2enum.LayerStreamFloor1, d2enum.LayerStreamFloor2: + floorIndex := int(layerStreamType) - int(d2enum.LayerStreamFloor1) + ds1.Tiles[y][x].Floors[floorIndex].Prop1 = byte(dw & 0x000000FF) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Floors[floorIndex].Sequence = byte((dw & 0x00003F00) >> 8) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Floors[floorIndex].Unknown1 = byte((dw & 0x000FC000) >> 14) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Floors[floorIndex].Style = byte((dw & 0x03F00000) >> 20) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Floors[floorIndex].Unknown2 = byte((dw & 0x7C000000) >> 26) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Floors[floorIndex].Hidden = byte((dw&0x80000000)>>31) > 0 //nolint:gomnd // Bitmask + case d2enum.LayerStreamShadow: + ds1.Tiles[y][x].Shadows[0].Prop1 = byte(dw & 0x000000FF) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Shadows[0].Sequence = byte((dw & 0x00003F00) >> 8) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Shadows[0].Unknown1 = byte((dw & 0x000FC000) >> 14) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Shadows[0].Style = byte((dw & 0x03F00000) >> 20) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Shadows[0].Unknown2 = byte((dw & 0x7C000000) >> 26) //nolint:gomnd // Bitmask + ds1.Tiles[y][x].Shadows[0].Hidden = byte((dw&0x80000000)>>31) > 0 //nolint:gomnd // Bitmask + case d2enum.LayerStreamSubstitute: + ds1.Tiles[y][x].Substitutions[0].Unknown = dw } } } } - return ds1, nil } diff --git a/d2common/d2fileformats/d2ds1/floor_shadow_record.go b/d2common/d2fileformats/d2ds1/floor_shadow_record.go index d56076a9..0b569457 100644 --- a/d2common/d2fileformats/d2ds1/floor_shadow_record.go +++ b/d2common/d2fileformats/d2ds1/floor_shadow_record.go @@ -1,5 +1,6 @@ package d2ds1 +// FloorShadowRecord represents a floor or shadow record in a DS1 file. type FloorShadowRecord struct { Prop1 byte Sequence byte diff --git a/d2common/d2fileformats/d2ds1/substitution_group.go b/d2common/d2fileformats/d2ds1/substitution_group.go index 7abadc7b..a8eae192 100644 --- a/d2common/d2fileformats/d2ds1/substitution_group.go +++ b/d2common/d2fileformats/d2ds1/substitution_group.go @@ -1,5 +1,6 @@ package d2ds1 +// SubstitutionGroup represents a substitution group in a DS1 file. type SubstitutionGroup struct { TileX int32 TileY int32 diff --git a/d2common/d2fileformats/d2ds1/substitution_record.go b/d2common/d2fileformats/d2ds1/substitution_record.go index 4bc49aa5..fa379e27 100644 --- a/d2common/d2fileformats/d2ds1/substitution_record.go +++ b/d2common/d2fileformats/d2ds1/substitution_record.go @@ -1,5 +1,6 @@ package d2ds1 +// SubstitutionRecord represents a substitution record in a DS1 file. type SubstitutionRecord struct { Unknown uint32 } diff --git a/d2common/d2fileformats/d2ds1/tile_record.go b/d2common/d2fileformats/d2ds1/tile_record.go new file mode 100644 index 00000000..e8699f8e --- /dev/null +++ b/d2common/d2fileformats/d2ds1/tile_record.go @@ -0,0 +1,16 @@ +package d2ds1 + +import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" +) + +// TileRecord represents a tile record in a DS1 file. +type TileRecord struct { + Floors []FloorShadowRecord // Collection of floor records + Walls []WallRecord // Collection of wall records + Shadows []FloorShadowRecord // Collection of shadow records + Substitutions []SubstitutionRecord // Collection of substitutions + + // This is set and used internally by the engine to determine what region this map is from + RegionType d2enum.RegionIdType +} diff --git a/d2common/d2fileformats/d2ds1/tilerecord.go b/d2common/d2fileformats/d2ds1/tilerecord.go deleted file mode 100644 index fb5b8ed5..00000000 --- a/d2common/d2fileformats/d2ds1/tilerecord.go +++ /dev/null @@ -1,15 +0,0 @@ -package d2ds1 - -import ( - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" -) - -type TileRecord struct { - Floors []FloorShadowRecord - Walls []WallRecord - Shadows []FloorShadowRecord - Substitutions []SubstitutionRecord - - // This is set and used internally by the engine to determine what region this map is from - RegionType d2enum.RegionIdType -} diff --git a/d2common/d2fileformats/d2ds1/wallrecord.go b/d2common/d2fileformats/d2ds1/wall_record.go similarity index 100% rename from d2common/d2fileformats/d2ds1/wallrecord.go rename to d2common/d2fileformats/d2ds1/wall_record.go diff --git a/d2common/d2fileformats/d2dt1/dt1.go b/d2common/d2fileformats/d2dt1/dt1.go index 82bc487d..276e7143 100644 --- a/d2common/d2fileformats/d2dt1/dt1.go +++ b/d2common/d2fileformats/d2dt1/dt1.go @@ -1,3 +1,5 @@ +// Package d2dt1 provides functionality for loading/processing DT1 files. +// https://d2mods.info/forum/viewtopic.php?t=65163 package d2dt1 import ( @@ -6,31 +8,39 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common" ) -// https://d2mods.info/forum/viewtopic.php?t=65163 + +// DT1 type DT1 struct { Tiles []Tile } +// BlockDataFormat represents the format of the block data type BlockDataFormat int16 const ( - BlockFormatRLE BlockDataFormat = 0 // Not 1 - BlockFormatIsometric BlockDataFormat = 1 + BlockFormatRLE BlockDataFormat = 0 // Specifies the block format is RLE encoded + BlockFormatIsometric BlockDataFormat = 1 // Specifies the block format isometrically encoded ) +// LoadDT1 loads a DT1 record func LoadDT1(fileData []byte) (*DT1, error) { result := &DT1{} br := d2common.CreateStreamReader(fileData) ver1 := br.GetInt32() ver2 := br.GetInt32() + if ver1 != 7 || ver2 != 6 { return nil, fmt.Errorf("expected to have a version of 7.6, but got %d.%d instead", ver1, ver2) } - br.SkipBytes(260) + + br.SkipBytes(260) //nolint:gomnd // Unknown data + numberOfTiles := br.GetInt32() br.SetPosition(uint64(br.GetInt32())) + result.Tiles = make([]Tile, numberOfTiles) + for tileIdx := range result.Tiles { newTile := Tile{} newTile.Direction = br.GetInt32() @@ -38,46 +48,64 @@ func LoadDT1(fileData []byte) (*DT1, error) { newTile.MaterialFlags = NewMaterialFlags(br.GetUInt16()) newTile.Height = br.GetInt32() newTile.Width = br.GetInt32() - br.SkipBytes(4) + + br.SkipBytes(4) //nolint:gomnd // Unknown data + newTile.Type = br.GetInt32() newTile.Style = br.GetInt32() newTile.Sequence = br.GetInt32() newTile.RarityFrameIndex = br.GetInt32() - br.SkipBytes(4) + + br.SkipBytes(4) //nolint:gomnd // Unknown data + for i := range newTile.SubTileFlags { newTile.SubTileFlags[i] = NewSubTileFlags(br.GetByte()) } - br.SkipBytes(7) + + br.SkipBytes(7) //nolint:gomnd // Unknown data + newTile.blockHeaderPointer = br.GetInt32() newTile.blockHeaderSize = br.GetInt32() newTile.Blocks = make([]Block, br.GetInt32()) - br.SkipBytes(12) + + br.SkipBytes(12) //nolint:gomnd // Unknown data + result.Tiles[tileIdx] = newTile } - for tileIdx, tile := range result.Tiles { + + for tileIdx := range result.Tiles { + tile := &result.Tiles[tileIdx] br.SetPosition(uint64(tile.blockHeaderPointer)) + for blockIdx := range tile.Blocks { result.Tiles[tileIdx].Blocks[blockIdx].X = br.GetInt16() result.Tiles[tileIdx].Blocks[blockIdx].Y = br.GetInt16() - br.SkipBytes(2) + + br.SkipBytes(2) //nolint:gomnd // Unknown data + result.Tiles[tileIdx].Blocks[blockIdx].GridX = br.GetByte() result.Tiles[tileIdx].Blocks[blockIdx].GridY = br.GetByte() formatValue := br.GetInt16() + if formatValue == 1 { result.Tiles[tileIdx].Blocks[blockIdx].Format = BlockFormatIsometric } else { result.Tiles[tileIdx].Blocks[blockIdx].Format = BlockFormatRLE } + result.Tiles[tileIdx].Blocks[blockIdx].Length = br.GetInt32() - br.SkipBytes(2) + + br.SkipBytes(2) //nolint:gomnd // Unknown data + result.Tiles[tileIdx].Blocks[blockIdx].FileOffset = br.GetInt32() } + for blockIndex, block := range tile.Blocks { br.SetPosition(uint64(tile.blockHeaderPointer + block.FileOffset)) encodedData := br.ReadBytes(int(block.Length)) tile.Blocks[blockIndex].EncodedData = encodedData } - } + return result, nil } diff --git a/d2common/d2fileformats/d2mpq/mpq.go b/d2common/d2fileformats/d2mpq/mpq.go index 69da5e8d..622fe32c 100644 --- a/d2common/d2fileformats/d2mpq/mpq.go +++ b/d2common/d2fileformats/d2mpq/mpq.go @@ -247,7 +247,7 @@ func hashString(key string, hashType uint32) uint32 { } // GetFileBlockData gets a block table entry -func (v MPQ) getFileBlockData(fileName string) (BlockTableEntry, error) { +func (v *MPQ) getFileBlockData(fileName string) (BlockTableEntry, error) { fileEntry, found := v.HashEntryMap.Find(fileName) if !found || fileEntry.BlockIndex >= uint32(len(v.BlockTableEntries)) { return BlockTableEntry{}, errors.New("file not found") @@ -263,12 +263,12 @@ func (v *MPQ) Close() { } } -func (v MPQ) FileExists(fileName string) bool { +func (v *MPQ) FileExists(fileName string) bool { return v.HashEntryMap.Contains(fileName) } // ReadFile reads a file from the MPQ and returns a memory stream -func (v MPQ) ReadFile(fileName string) ([]byte, error) { +func (v *MPQ) ReadFile(fileName string) ([]byte, error) { fileBlockData, err := v.getFileBlockData(fileName) if err != nil { return []byte{}, err @@ -285,7 +285,7 @@ func (v MPQ) ReadFile(fileName string) ([]byte, error) { } // ReadTextFile reads a file and returns it as a string -func (v MPQ) ReadTextFile(fileName string) (string, error) { +func (v *MPQ) ReadTextFile(fileName string) (string, error) { data, err := v.ReadFile(fileName) if err != nil { return "", err @@ -303,7 +303,7 @@ func (v *BlockTableEntry) calculateEncryptionSeed() { } // GetFileList returns the list of files in this MPQ -func (v MPQ) GetFileList() ([]string, error) { +func (v * MPQ) GetFileList() ([]string, error) { data, err := v.ReadFile("(listfile)") if err != nil { return nil, err diff --git a/d2common/d2fileformats/d2mpq/mpq_stream.go b/d2common/d2fileformats/d2mpq/mpq_stream.go index 24ebc295..3ca720e8 100644 --- a/d2common/d2fileformats/d2mpq/mpq_stream.go +++ b/d2common/d2fileformats/d2mpq/mpq_stream.go @@ -17,19 +17,19 @@ import ( // Stream represents a stream of data in an MPQ archive type Stream struct { - MPQData MPQ BlockTableEntry BlockTableEntry - FileName string - EncryptionSeed uint32 BlockPositions []uint32 - CurrentPosition uint32 CurrentData []byte + FileName string + MPQData *MPQ + EncryptionSeed uint32 + CurrentPosition uint32 CurrentBlockIndex uint32 BlockSize uint32 } // CreateStream creates an MPQ stream -func CreateStream(mpq MPQ, blockTableEntry BlockTableEntry, fileName string) (*Stream, error) { +func CreateStream(mpq *MPQ, blockTableEntry BlockTableEntry, fileName string) (*Stream, error) { result := &Stream{ MPQData: mpq, BlockTableEntry: blockTableEntry, diff --git a/d2core/d2config/d2config.go b/d2core/d2config/d2config.go index 1bea9887..665f6ad6 100644 --- a/d2core/d2config/d2config.go +++ b/d2core/d2config/d2config.go @@ -6,19 +6,19 @@ import ( // Configuration defines the configuration for the engine, loaded from config.json type Configuration struct { + MpqLoadOrder []string Language string - FullScreen bool - RunInBackground bool + MpqPath string TicksPerSecond int FpsCap int - VsyncEnabled bool - MpqPath string - MpqLoadOrder []string SfxVolume float64 BgmVolume float64 + FullScreen bool + RunInBackground bool + VsyncEnabled bool } -var singleton *Configuration = getDefaultConfig() +var singleton = getDefaultConfig() func Load() error { configPaths := []string{ @@ -57,11 +57,6 @@ func Save() error { return err } -func Set(config Configuration) { - temp := config - singleton = &temp -} - func Get() Configuration { if singleton == nil { panic("configuration is not initialized") diff --git a/d2core/d2gui/manager.go b/d2core/d2gui/manager.go index 9b95d114..535f2d8d 100644 --- a/d2core/d2gui/manager.go +++ b/d2core/d2gui/manager.go @@ -11,15 +11,13 @@ import ( ) type manager struct { - layout *Layout - + layout *Layout cursorAnim *d2asset.Animation cursorX int cursorY int + loadingAnim *d2asset.Animation cursorVisible bool - - loadingAnim *d2asset.Animation - loading bool + loading bool } func createGuiManager() (*manager, error) { diff --git a/d2core/d2map/d2mapentity/animated_entity.go b/d2core/d2map/d2mapentity/animated_entity.go index e9bd8ef3..022ef9d8 100644 --- a/d2core/d2map/d2mapentity/animated_entity.go +++ b/d2core/d2map/d2mapentity/animated_entity.go @@ -35,7 +35,7 @@ func (ae *AnimatedEntity) Render(target d2render.Surface) { ae.animation.Render(target) } -func (ae AnimatedEntity) GetDirection() int { +func (ae *AnimatedEntity) GetDirection() int { return ae.direction }