mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-06-19 21:55:24 +00:00
Various lint error fixes and suppressions (#846)
* suppressing the magic number lint errors in mapgen, it will get a heavy refactor soon, hopefully... * adding string token constants for SkillClass * adding panic on error to left/right skill select render * fixed cuddle lint error * fixed unnecessary conversion, unused func param lint errors in dcc_animation.go * adding comment for skill class tokens * fixed typo in comment * removed unused parameter in dcc/dc6 animations * supress warning about Object.setMode always being passed direction value of 0 * fixed all invalid golint directives * fixed a couple gocritic lint errors
This commit is contained in:
parent
622186e350
commit
6f8b43f8d6
|
@ -6,7 +6,7 @@ import (
|
||||||
|
|
||||||
// WavDecompress decompresses wav files
|
// WavDecompress decompresses wav files
|
||||||
//nolint:gomnd // binary decode magic
|
//nolint:gomnd // binary decode magic
|
||||||
func WavDecompress(data []byte, channelCount int) []byte { //nolint:funlen doesn't make sense to split
|
func WavDecompress(data []byte, channelCount int) []byte { //nolint:funlen // can't reduce
|
||||||
Array1 := []int{0x2c, 0x2c}
|
Array1 := []int{0x2c, 0x2c}
|
||||||
Array2 := make([]int, channelCount)
|
Array2 := make([]int, channelCount)
|
||||||
|
|
||||||
|
|
|
@ -17,26 +17,38 @@ const (
|
||||||
SkillClassDruid
|
SkillClassDruid
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Skill class tokens
|
||||||
|
const (
|
||||||
|
SkillClassTokenGeneric = ""
|
||||||
|
SkillClassTokenBarbarian = "bar"
|
||||||
|
SkillClassTokenNecromancer = "nec"
|
||||||
|
SkillClassTokenPaladin = "pal"
|
||||||
|
SkillClassTokenAssassin = "ass"
|
||||||
|
SkillClassTokenSorceress = "sor"
|
||||||
|
SkillClassTokenAmazon = "ama"
|
||||||
|
SkillClassTokenDruid = "dru"
|
||||||
|
)
|
||||||
|
|
||||||
// FromToken returns the enum which corresponds to the given class token
|
// FromToken returns the enum which corresponds to the given class token
|
||||||
func (sc *SkillClass) FromToken(classToken string) SkillClass {
|
func (sc *SkillClass) FromToken(classToken string) SkillClass {
|
||||||
resource := SkillClassGeneric
|
resource := SkillClassGeneric
|
||||||
|
|
||||||
switch classToken {
|
switch classToken {
|
||||||
case "":
|
case SkillClassTokenGeneric:
|
||||||
return SkillClassGeneric
|
return SkillClassGeneric
|
||||||
case "bar":
|
case SkillClassTokenBarbarian:
|
||||||
return SkillClassBarbarian
|
return SkillClassBarbarian
|
||||||
case "nec":
|
case SkillClassTokenNecromancer:
|
||||||
return SkillClassNecromancer
|
return SkillClassNecromancer
|
||||||
case "pal":
|
case SkillClassTokenPaladin:
|
||||||
return SkillClassPaladin
|
return SkillClassPaladin
|
||||||
case "ass":
|
case SkillClassTokenAssassin:
|
||||||
return SkillClassAssassin
|
return SkillClassAssassin
|
||||||
case "sor":
|
case SkillClassTokenSorceress:
|
||||||
return SkillClassSorceress
|
return SkillClassSorceress
|
||||||
case "ama":
|
case SkillClassTokenAmazon:
|
||||||
return SkillClassAmazon
|
return SkillClassAmazon
|
||||||
case "dru":
|
case SkillClassTokenDruid:
|
||||||
return SkillClassDruid
|
return SkillClassDruid
|
||||||
default:
|
default:
|
||||||
log.Fatalf("Unknown skill class token: '%s'", classToken)
|
log.Fatalf("Unknown skill class token: '%s'", classToken)
|
||||||
|
|
|
@ -162,7 +162,7 @@ func (v *DCCDirection) verify(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gocognit nolint:gocyclo // Can't reduce
|
// nolint:gocognit,gocyclo // Can't reduce
|
||||||
func (v *DCCDirection) generateFrames(pcd *d2datautils.BitMuncher) {
|
func (v *DCCDirection) generateFrames(pcd *d2datautils.BitMuncher) {
|
||||||
pbIdx := 0
|
pbIdx := 0
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ func (v *DCCDirection) generateFrames(pcd *d2datautils.BitMuncher) {
|
||||||
v.PixelBuffer = nil
|
v.PixelBuffer = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:funlen nolint:gocognit // can't reduce
|
//nolint:funlen,gocognit // can't reduce
|
||||||
func (v *DCCDirection) fillPixelBuffer(pcd, ec, pm, et, rp *d2datautils.BitMuncher) {
|
func (v *DCCDirection) fillPixelBuffer(pcd, ec, pm, et, rp *d2datautils.BitMuncher) {
|
||||||
var pixelMaskLookup = []int{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}
|
var pixelMaskLookup = []int{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}
|
||||||
|
|
||||||
|
|
|
@ -61,20 +61,20 @@ func (v *DCCDirectionFrame) recalculateCells(direction *DCCDirection) {
|
||||||
v.HorizontalCellCount = 1
|
v.HorizontalCellCount = 1
|
||||||
} else {
|
} else {
|
||||||
tmp := v.Width - w - 1
|
tmp := v.Width - w - 1
|
||||||
v.HorizontalCellCount = 2 + (tmp / 4) //nolint:gomnd magic math
|
v.HorizontalCellCount = 2 + (tmp / 4) //nolint:gomnd // magic math
|
||||||
if (tmp % 4) == 0 {
|
if (tmp % 4) == 0 {
|
||||||
v.HorizontalCellCount--
|
v.HorizontalCellCount--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Height of the first column (in pixels)
|
// Height of the first column (in pixels)
|
||||||
h := 4 - ((v.Box.Top - direction.Box.Top) % 4) //nolint:gomnd data decode
|
h := 4 - ((v.Box.Top - direction.Box.Top) % 4) //nolint:gomnd // data decode
|
||||||
|
|
||||||
if (v.Height - h) <= 1 {
|
if (v.Height - h) <= 1 {
|
||||||
v.VerticalCellCount = 1
|
v.VerticalCellCount = 1
|
||||||
} else {
|
} else {
|
||||||
tmp := v.Height - h - 1
|
tmp := v.Height - h - 1
|
||||||
v.VerticalCellCount = 2 + (tmp / 4) //nolint:gomnd data decode
|
v.VerticalCellCount = 2 + (tmp / 4) //nolint:gomnd // data decode
|
||||||
if (tmp % 4) == 0 {
|
if (tmp % 4) == 0 {
|
||||||
v.VerticalCellCount--
|
v.VerticalCellCount--
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// LoadDT1 loads a DT1 record
|
// LoadDT1 loads a DT1 record
|
||||||
//nolint:funlen Can't reduce
|
//nolint:funlen // Can't reduce
|
||||||
func LoadDT1(fileData []byte) (*DT1, error) {
|
func LoadDT1(fileData []byte) (*DT1, error) {
|
||||||
result := &DT1{}
|
result := &DT1{}
|
||||||
br := d2datautils.CreateStreamReader(fileData)
|
br := d2datautils.CreateStreamReader(fileData)
|
||||||
|
|
|
@ -15,7 +15,7 @@ type MaterialFlags struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMaterialFlags represents the material flags
|
// NewMaterialFlags represents the material flags
|
||||||
// nolint:gomnd Binary values
|
// nolint:gomnd // Binary values
|
||||||
func NewMaterialFlags(data uint16) MaterialFlags {
|
func NewMaterialFlags(data uint16) MaterialFlags {
|
||||||
return MaterialFlags{
|
return MaterialFlags{
|
||||||
Other: data&0x0001 == 0x0001,
|
Other: data&0x0001 == 0x0001,
|
||||||
|
|
|
@ -64,7 +64,7 @@ func (s *SubTileFlags) DebugString() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSubTileFlags returns a list of new subtile flags
|
// NewSubTileFlags returns a list of new subtile flags
|
||||||
//nolint:gomnd binary flags
|
//nolint:gomnd // binary flags
|
||||||
func NewSubTileFlags(data byte) SubTileFlags {
|
func NewSubTileFlags(data byte) SubTileFlags {
|
||||||
return SubTileFlags{
|
return SubTileFlags{
|
||||||
BlockWalk: data&1 == 1,
|
BlockWalk: data&1 == 1,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package d2mpq
|
package d2mpq
|
||||||
|
|
||||||
var cryptoBuffer [0x500]uint32 //nolint:gochecknoglobals will fix later..
|
var cryptoBuffer [0x500]uint32 //nolint:gochecknoglobals // will fix later..
|
||||||
var cryptoBufferReady bool //nolint:gochecknoglobals will fix later..
|
var cryptoBufferReady bool //nolint:gochecknoglobals // will fix later..
|
||||||
|
|
||||||
func cryptoLookup(index uint32) uint32 {
|
func cryptoLookup(index uint32) uint32 {
|
||||||
if !cryptoBufferReady {
|
if !cryptoBufferReady {
|
||||||
|
@ -13,7 +13,7 @@ func cryptoLookup(index uint32) uint32 {
|
||||||
return cryptoBuffer[index]
|
return cryptoBuffer[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gomnd magic cryptographic stuff here...
|
//nolint:gomnd // magic cryptographic stuff here...
|
||||||
func cryptoInitialize() {
|
func cryptoInitialize() {
|
||||||
seed := uint32(0x00100001)
|
seed := uint32(0x00100001)
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ func Load(fileName string) (d2interface.Archive, error) {
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
result.file, err = openIgnoreCase(fileName)
|
result.file, err = openIgnoreCase(fileName)
|
||||||
} else {
|
} else {
|
||||||
result.file, err = os.Open(fileName) //nolint:gosec Will fix later
|
result.file, err = os.Open(fileName) //nolint:gosec // Will fix later
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -122,7 +122,7 @@ func Load(fileName string) (d2interface.Archive, error) {
|
||||||
|
|
||||||
func openIgnoreCase(mpqPath string) (*os.File, error) {
|
func openIgnoreCase(mpqPath string) (*os.File, error) {
|
||||||
// First see if file exists with specified case
|
// First see if file exists with specified case
|
||||||
mpqFile, err := os.Open(mpqPath) //nolint:gosec Will fix later
|
mpqFile, err := os.Open(mpqPath) //nolint:gosec // Will fix later
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return mpqFile, err
|
return mpqFile, err
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ func openIgnoreCase(mpqPath string) (*os.File, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.Open(path.Join(mpqDir, mpqName)) //nolint:gosec Will fix later
|
file, err := os.Open(path.Join(mpqDir, mpqName)) //nolint:gosec // Will fix later
|
||||||
|
|
||||||
return file, err
|
return file, err
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ func (v *MPQ) loadHashTable() error {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hashData := make([]uint32, v.data.HashTableEntries*4) //nolint:gomnd Decryption magic
|
hashData := make([]uint32, v.data.HashTableEntries*4) //nolint:gomnd // // Decryption magic
|
||||||
hash := make([]byte, 4)
|
hash := make([]byte, 4)
|
||||||
|
|
||||||
for i := range hashData {
|
for i := range hashData {
|
||||||
|
@ -193,8 +193,8 @@ func (v *MPQ) loadHashTable() error {
|
||||||
NamePartA: hashData[i*4],
|
NamePartA: hashData[i*4],
|
||||||
NamePartB: hashData[(i*4)+1],
|
NamePartB: hashData[(i*4)+1],
|
||||||
// https://github.com/OpenDiablo2/OpenDiablo2/issues/812
|
// https://github.com/OpenDiablo2/OpenDiablo2/issues/812
|
||||||
Locale: uint16(hashData[(i*4)+2] >> 16), //nolint:gomnd binary data
|
Locale: uint16(hashData[(i*4)+2] >> 16), //nolint:gomnd // // binary data
|
||||||
Platform: uint16(hashData[(i*4)+2] & 0xFFFF), //nolint:gomnd binary data
|
Platform: uint16(hashData[(i*4)+2] & 0xFFFF), //nolint:gomnd // // binary data
|
||||||
BlockIndex: hashData[(i*4)+3],
|
BlockIndex: hashData[(i*4)+3],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -208,11 +208,11 @@ func (v *MPQ) loadBlockTable() {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
blockData := make([]uint32, v.data.BlockTableEntries*4) //nolint:gomnd binary data
|
blockData := make([]uint32, v.data.BlockTableEntries*4) //nolint:gomnd // // binary data
|
||||||
hash := make([]byte, 4)
|
hash := make([]byte, 4)
|
||||||
|
|
||||||
for i := range blockData {
|
for i := range blockData {
|
||||||
_, err = v.file.Read(hash[:]) //nolint:errcheck Will fix later
|
_, err = v.file.Read(hash) //nolint:errcheck // Will fix later
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
}
|
}
|
||||||
|
@ -233,43 +233,43 @@ func (v *MPQ) loadBlockTable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func decrypt(data []uint32, seed uint32) {
|
func decrypt(data []uint32, seed uint32) {
|
||||||
seed2 := uint32(0xeeeeeeee) //nolint:gomnd Decryption magic
|
seed2 := uint32(0xeeeeeeee) //nolint:gomnd // Decryption magic
|
||||||
|
|
||||||
for i := 0; i < len(data); i++ {
|
for i := 0; i < len(data); i++ {
|
||||||
seed2 += cryptoLookup(0x400 + (seed & 0xff)) //nolint:gomnd Decryption magic
|
seed2 += cryptoLookup(0x400 + (seed & 0xff)) //nolint:gomnd // Decryption magic
|
||||||
result := data[i]
|
result := data[i]
|
||||||
result ^= seed + seed2
|
result ^= seed + seed2
|
||||||
|
|
||||||
seed = ((^seed << 21) + 0x11111111) | (seed >> 11)
|
seed = ((^seed << 21) + 0x11111111) | (seed >> 11)
|
||||||
seed2 = result + seed2 + (seed2 << 5) + 3 //nolint:gomnd Decryption magic
|
seed2 = result + seed2 + (seed2 << 5) + 3 //nolint:gomnd // Decryption magic
|
||||||
data[i] = result
|
data[i] = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func decryptBytes(data []byte, seed uint32) {
|
func decryptBytes(data []byte, seed uint32) {
|
||||||
seed2 := uint32(0xEEEEEEEE) //nolint:gomnd Decryption magic
|
seed2 := uint32(0xEEEEEEEE) //nolint:gomnd // Decryption magic
|
||||||
for i := 0; i < len(data)-3; i += 4 {
|
for i := 0; i < len(data)-3; i += 4 {
|
||||||
seed2 += cryptoLookup(0x400 + (seed & 0xFF)) //nolint:gomnd Decryption magic
|
seed2 += cryptoLookup(0x400 + (seed & 0xFF)) //nolint:gomnd // Decryption magic
|
||||||
result := binary.LittleEndian.Uint32(data[i : i+4])
|
result := binary.LittleEndian.Uint32(data[i : i+4])
|
||||||
result ^= seed + seed2
|
result ^= seed + seed2
|
||||||
seed = ((^seed << 21) + 0x11111111) | (seed >> 11)
|
seed = ((^seed << 21) + 0x11111111) | (seed >> 11)
|
||||||
seed2 = result + seed2 + (seed2 << 5) + 3 //nolint:gomnd Decryption magic
|
seed2 = result + seed2 + (seed2 << 5) + 3 //nolint:gomnd // Decryption magic
|
||||||
|
|
||||||
data[i+0] = uint8(result & 0xff) //nolint:gomnd Decryption magic
|
data[i+0] = uint8(result & 0xff) //nolint:gomnd // Decryption magic
|
||||||
data[i+1] = uint8((result >> 8) & 0xff) //nolint:gomnd Decryption magic
|
data[i+1] = uint8((result >> 8) & 0xff) //nolint:gomnd // Decryption magic
|
||||||
data[i+2] = uint8((result >> 16) & 0xff) //nolint:gomnd Decryption magic
|
data[i+2] = uint8((result >> 16) & 0xff) //nolint:gomnd // Decryption magic
|
||||||
data[i+3] = uint8((result >> 24) & 0xff) //nolint:gomnd Decryption magic
|
data[i+3] = uint8((result >> 24) & 0xff) //nolint:gomnd // Decryption magic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func hashString(key string, hashType uint32) uint32 {
|
func hashString(key string, hashType uint32) uint32 {
|
||||||
seed1 := uint32(0x7FED7FED) //nolint:gomnd Decryption magic
|
seed1 := uint32(0x7FED7FED) //nolint:gomnd // Decryption magic
|
||||||
seed2 := uint32(0xEEEEEEEE) //nolint:gomnd Decryption magic
|
seed2 := uint32(0xEEEEEEEE) //nolint:gomnd // Decryption magic
|
||||||
|
|
||||||
/* prepare seeds. */
|
/* prepare seeds. */
|
||||||
for _, char := range strings.ToUpper(key) {
|
for _, char := range strings.ToUpper(key) {
|
||||||
seed1 = cryptoLookup((hashType*0x100)+uint32(char)) ^ (seed1 + seed2)
|
seed1 = cryptoLookup((hashType*0x100)+uint32(char)) ^ (seed1 + seed2)
|
||||||
seed2 = uint32(char) + seed1 + seed2 + (seed2 << 5) + 3 //nolint:gomnd Decryption magic
|
seed2 = uint32(char) + seed1 + seed2 + (seed2 << 5) + 3 //nolint:gomnd // Decryption magic
|
||||||
}
|
}
|
||||||
|
|
||||||
return seed1
|
return seed1
|
||||||
|
|
|
@ -33,7 +33,7 @@ func CreateStream(mpq *MPQ, blockTableEntry BlockTableEntry, fileName string) (*
|
||||||
result := &Stream{
|
result := &Stream{
|
||||||
MPQData: mpq,
|
MPQData: mpq,
|
||||||
BlockTableEntry: blockTableEntry,
|
BlockTableEntry: blockTableEntry,
|
||||||
CurrentBlockIndex: 0xFFFFFFFF, //nolint:gomnd MPQ magic
|
CurrentBlockIndex: 0xFFFFFFFF, //nolint:gomnd // MPQ magic
|
||||||
}
|
}
|
||||||
fileSegs := strings.Split(fileName, `\`)
|
fileSegs := strings.Split(fileName, `\`)
|
||||||
result.EncryptionSeed = hashString(fileSegs[len(fileSegs)-1], 3)
|
result.EncryptionSeed = hashString(fileSegs[len(fileSegs)-1], 3)
|
||||||
|
@ -42,7 +42,7 @@ func CreateStream(mpq *MPQ, blockTableEntry BlockTableEntry, fileName string) (*
|
||||||
result.EncryptionSeed = (result.EncryptionSeed + result.BlockTableEntry.FilePosition) ^ result.BlockTableEntry.UncompressedFileSize
|
result.EncryptionSeed = (result.EncryptionSeed + result.BlockTableEntry.FilePosition) ^ result.BlockTableEntry.UncompressedFileSize
|
||||||
}
|
}
|
||||||
|
|
||||||
result.BlockSize = 0x200 << result.MPQData.data.BlockSize //nolint:gomnd MPQ magic
|
result.BlockSize = 0x200 << result.MPQData.data.BlockSize //nolint:gomnd // MPQ magic
|
||||||
|
|
||||||
if result.BlockTableEntry.HasFlag(FilePatchFile) {
|
if result.BlockTableEntry.HasFlag(FilePatchFile) {
|
||||||
log.Fatal("Patching is not supported")
|
log.Fatal("Patching is not supported")
|
||||||
|
@ -67,7 +67,7 @@ func (v *Stream) loadBlockOffsets() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mpqBytes := make([]byte, blockPositionCount*4) //nolint:gomnd MPQ magic
|
mpqBytes := make([]byte, blockPositionCount*4) //nolint:gomnd // MPQ magic
|
||||||
|
|
||||||
_, err = v.MPQData.file.Read(mpqBytes)
|
_, err = v.MPQData.file.Read(mpqBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -75,11 +75,11 @@ func (v *Stream) loadBlockOffsets() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range v.BlockPositions {
|
for i := range v.BlockPositions {
|
||||||
idx := i * 4 //nolint:gomnd MPQ magic
|
idx := i * 4 //nolint:gomnd // MPQ magic
|
||||||
v.BlockPositions[i] = binary.LittleEndian.Uint32(mpqBytes[idx : idx+4])
|
v.BlockPositions[i] = binary.LittleEndian.Uint32(mpqBytes[idx : idx+4])
|
||||||
}
|
}
|
||||||
|
|
||||||
blockPosSize := blockPositionCount << 2 //nolint:gomnd MPQ magic
|
blockPosSize := blockPositionCount << 2 //nolint:gomnd // MPQ magic
|
||||||
|
|
||||||
if v.BlockTableEntry.HasFlag(FileEncrypted) {
|
if v.BlockTableEntry.HasFlag(FileEncrypted) {
|
||||||
decrypt(v.BlockPositions, v.EncryptionSeed-1)
|
decrypt(v.BlockPositions, v.EncryptionSeed-1)
|
||||||
|
@ -235,7 +235,7 @@ func (v *Stream) loadBlock(blockIndex, expectedLength uint32) []byte {
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gomnd Will fix enum values later
|
//nolint:gomnd // Will fix enum values later
|
||||||
func decompressMulti(data []byte /*expectedLength*/, _ uint32) []byte {
|
func decompressMulti(data []byte /*expectedLength*/, _ uint32) []byte {
|
||||||
compressionType := data[0]
|
compressionType := data[0]
|
||||||
|
|
||||||
|
@ -278,6 +278,7 @@ func decompressMulti(data []byte /*expectedLength*/, _ uint32) []byte {
|
||||||
sinput = d2compression.WavDecompress(sinput, 2)
|
sinput = d2compression.WavDecompress(sinput, 2)
|
||||||
tmp := make([]byte, len(sinput))
|
tmp := make([]byte, len(sinput))
|
||||||
copy(tmp, sinput)
|
copy(tmp, sinput)
|
||||||
|
|
||||||
return tmp
|
return tmp
|
||||||
case 0x88:
|
case 0x88:
|
||||||
// byte[] result = PKDecompress(sinput, outputLength);
|
// byte[] result = PKDecompress(sinput, outputLength);
|
||||||
|
|
|
@ -202,7 +202,7 @@ func (a *Animation) RenderFromOrigin(target d2interface.Surface, shadow bool) er
|
||||||
if shadow && !a.effect.Transparent() && a.hasShadow {
|
if shadow && !a.effect.Transparent() && a.hasShadow {
|
||||||
_, height := a.GetFrameBounds()
|
_, height := a.GetFrameBounds()
|
||||||
height = int(math.Abs(float64(height)))
|
height = int(math.Abs(float64(height)))
|
||||||
halfHeight := height / 2 //nolint:mnd // this ain't rocket surgery...
|
halfHeight := height / 2 //nolint:gomnd // this ain't rocket surgery...
|
||||||
|
|
||||||
target.PushTranslation(-halfHeight, 0)
|
target.PushTranslation(-halfHeight, 0)
|
||||||
defer target.Pop()
|
defer target.Pop()
|
||||||
|
|
|
@ -150,7 +150,7 @@ func (c *Composite) Equip(equipment *[d2enum.CompositeTypeMax]string) error {
|
||||||
|
|
||||||
// SetAnimSpeed sets the speed at which the Composite's animation should advance through its frames
|
// SetAnimSpeed sets the speed at which the Composite's animation should advance through its frames
|
||||||
func (c *Composite) SetAnimSpeed(speed int) {
|
func (c *Composite) SetAnimSpeed(speed int) {
|
||||||
c.mode.animationSpeed = 1.0 / (float64(speed) * speedUnit) // nolint:mnd inverse of freq is time
|
c.mode.animationSpeed = 1.0 / (float64(speed) * speedUnit) //nolint:gomnd // taking inverse
|
||||||
for layerIdx := range c.mode.layers {
|
for layerIdx := range c.mode.layers {
|
||||||
layer := c.mode.layers[layerIdx]
|
layer := c.mode.layers[layerIdx]
|
||||||
if layer != nil {
|
if layer != nil {
|
||||||
|
@ -270,7 +270,7 @@ func (c *Composite) createMode(animationMode animationMode, weaponClass string)
|
||||||
weaponClass: weaponClass,
|
weaponClass: weaponClass,
|
||||||
layers: make([]d2interface.Animation, d2enum.CompositeTypeMax),
|
layers: make([]d2interface.Animation, d2enum.CompositeTypeMax),
|
||||||
frameCount: animationData[0].FramesPerDirection,
|
frameCount: animationData[0].FramesPerDirection,
|
||||||
animationSpeed: 1.0 / (float64(animationData[0].AnimationSpeed) * speedUnit), // nolint:mnd inverse of freq is time
|
animationSpeed: 1.0 / (float64(animationData[0].AnimationSpeed) * speedUnit), //nolint:gomnd // taking inverse
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cofLayer := range cof.CofLayers {
|
for _, cofLayer := range cof.CofLayers {
|
||||||
|
|
|
@ -102,11 +102,7 @@ func (a *DC6Animation) decode() error {
|
||||||
|
|
||||||
func (a *DC6Animation) decodeDirection(directionIndex int) error {
|
func (a *DC6Animation) decodeDirection(directionIndex int) error {
|
||||||
for frameIndex := 0; frameIndex < int(a.dc6.FramesPerDirection); frameIndex++ {
|
for frameIndex := 0; frameIndex < int(a.dc6.FramesPerDirection); frameIndex++ {
|
||||||
frame, err := a.decodeFrame(directionIndex, frameIndex)
|
frame := a.decodeFrame(directionIndex, frameIndex)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.directions[directionIndex].frames[frameIndex] = frame
|
a.directions[directionIndex].frames[frameIndex] = frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +111,7 @@ func (a *DC6Animation) decodeDirection(directionIndex int) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DC6Animation) decodeFrame(directionIndex, frameIndex int) (animationFrame, error) {
|
func (a *DC6Animation) decodeFrame(directionIndex, frameIndex int) animationFrame {
|
||||||
startFrame := directionIndex * int(a.dc6.FramesPerDirection)
|
startFrame := directionIndex * int(a.dc6.FramesPerDirection)
|
||||||
|
|
||||||
dc6Frame := a.dc6.Frames[startFrame+frameIndex]
|
dc6Frame := a.dc6.Frames[startFrame+frameIndex]
|
||||||
|
@ -129,7 +125,7 @@ func (a *DC6Animation) decodeFrame(directionIndex, frameIndex int) (animationFra
|
||||||
|
|
||||||
a.directions[directionIndex].frames[frameIndex].decoded = true
|
a.directions[directionIndex].frames[frameIndex].decoded = true
|
||||||
|
|
||||||
return frame, nil
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DC6Animation) createSurfaces() error {
|
func (a *DC6Animation) createSurfaces() error {
|
||||||
|
@ -165,11 +161,7 @@ func (a *DC6Animation) createDirectionSurfaces(directionIndex int) error {
|
||||||
|
|
||||||
func (a *DC6Animation) createFrameSurface(directionIndex, frameIndex int) (d2interface.Surface, error) {
|
func (a *DC6Animation) createFrameSurface(directionIndex, frameIndex int) (d2interface.Surface, error) {
|
||||||
if !a.directions[directionIndex].frames[frameIndex].decoded {
|
if !a.directions[directionIndex].frames[frameIndex].decoded {
|
||||||
frame, err := a.decodeFrame(directionIndex, frameIndex)
|
frame := a.decodeFrame(directionIndex, frameIndex)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.directions[directionIndex].frames[frameIndex] = frame
|
a.directions[directionIndex].frames[frameIndex] = frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,18 +118,14 @@ func (a *DCCAnimation) decodeDirection(directionIndex int) error {
|
||||||
|
|
||||||
a.directions[directionIndex].decoded = true
|
a.directions[directionIndex].decoded = true
|
||||||
|
|
||||||
frame, err := a.decodeFrame(directionIndex, frameIndex)
|
frame := a.decodeFrame(directionIndex)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.directions[directionIndex].frames[frameIndex] = frame
|
a.directions[directionIndex].frames[frameIndex] = frame
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DCCAnimation) decodeFrame(directionIndex, frameIndex int) (animationFrame, error) {
|
func (a *DCCAnimation) decodeFrame(directionIndex int) animationFrame {
|
||||||
dccDirection := a.dcc.Directions[directionIndex]
|
dccDirection := a.dcc.Directions[directionIndex]
|
||||||
|
|
||||||
minX, minY := math.MaxInt32, math.MaxInt32
|
minX, minY := math.MaxInt32, math.MaxInt32
|
||||||
|
@ -153,7 +149,7 @@ func (a *DCCAnimation) decodeFrame(directionIndex, frameIndex int) (animationFra
|
||||||
decoded: true,
|
decoded: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
return frame, nil
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DCCAnimation) createSurfaces() error {
|
func (a *DCCAnimation) createSurfaces() error {
|
||||||
|
@ -168,7 +164,7 @@ func (a *DCCAnimation) createSurfaces() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DCCAnimation) createDirectionSurfaces(directionIndex int) error {
|
func (a *DCCAnimation) createDirectionSurfaces(directionIndex int) error {
|
||||||
for frameIndex := 0; frameIndex < int(a.dcc.FramesPerDirection); frameIndex++ {
|
for frameIndex := 0; frameIndex < a.dcc.FramesPerDirection; frameIndex++ {
|
||||||
if !a.directions[directionIndex].decoded {
|
if !a.directions[directionIndex].decoded {
|
||||||
err := a.decodeDirection(directionIndex)
|
err := a.decodeDirection(directionIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -189,11 +185,7 @@ func (a *DCCAnimation) createDirectionSurfaces(directionIndex int) error {
|
||||||
|
|
||||||
func (a *DCCAnimation) createFrameSurface(directionIndex, frameIndex int) (d2interface.Surface, error) {
|
func (a *DCCAnimation) createFrameSurface(directionIndex, frameIndex int) (d2interface.Surface, error) {
|
||||||
if !a.directions[directionIndex].frames[frameIndex].decoded {
|
if !a.directions[directionIndex].frames[frameIndex].decoded {
|
||||||
frame, err := a.decodeFrame(directionIndex, frameIndex)
|
frame := a.decodeFrame(directionIndex)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.directions[directionIndex].frames[frameIndex] = frame
|
a.directions[directionIndex].frames[frameIndex] = frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,8 @@ type HeroSkill struct {
|
||||||
shallow *shallowHeroSkill
|
shallow *shallowHeroSkill
|
||||||
}
|
}
|
||||||
|
|
||||||
// An auxilary struct which only stores the ID of the SkillRecord, instead of the whole SkillRecord and SkillDescrptionRecord.
|
// An auxiliary struct which only stores the ID of the SkillRecord, instead of the whole SkillRecord
|
||||||
|
// and SkillDescrptionRecord.
|
||||||
type shallowHeroSkill struct {
|
type shallowHeroSkill struct {
|
||||||
SkillID int `json:"skillId"`
|
SkillID int `json:"skillId"`
|
||||||
SkillPoints int `json:"skillPoints"`
|
SkillPoints int `json:"skillPoints"`
|
||||||
|
|
|
@ -245,6 +245,7 @@ func (f *HeroStateFactory) Save(state *HeroState) error {
|
||||||
if state.FilePath == "" {
|
if state.FilePath == "" {
|
||||||
state.FilePath = f.getFirstFreeFileName()
|
state.FilePath = f.getFirstFreeFileName()
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(path.Dir(state.FilePath), mkdirPermission); err != nil {
|
if err := os.MkdirAll(path.Dir(state.FilePath), mkdirPermission); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
//nolint:gochecknoglobals This is a constant in all but by name, no constant map in go
|
//nolint:gochecknoglobals // This is a constant in all but by name, no constant map in go
|
||||||
keyToEbiten = map[d2enum.Key]ebiten.Key{
|
keyToEbiten = map[d2enum.Key]ebiten.Key{
|
||||||
d2enum.Key0: ebiten.Key0,
|
d2enum.Key0: ebiten.Key0,
|
||||||
d2enum.Key1: ebiten.Key1,
|
d2enum.Key1: ebiten.Key1,
|
||||||
|
@ -112,7 +112,7 @@ var (
|
||||||
d2enum.KeyControl: ebiten.KeyControl,
|
d2enum.KeyControl: ebiten.KeyControl,
|
||||||
d2enum.KeyShift: ebiten.KeyShift,
|
d2enum.KeyShift: ebiten.KeyShift,
|
||||||
}
|
}
|
||||||
//nolint:gochecknoglobals This is a constant in all but by name, no constant map in go
|
//nolint:gochecknoglobals // This is a constant in all but by name, no constant map in go
|
||||||
mouseButtonToEbiten = map[d2enum.MouseButton]ebiten.MouseButton{
|
mouseButtonToEbiten = map[d2enum.MouseButton]ebiten.MouseButton{
|
||||||
d2enum.MouseButtonLeft: ebiten.MouseButtonLeft,
|
d2enum.MouseButtonLeft: ebiten.MouseButtonLeft,
|
||||||
d2enum.MouseButtonMiddle: ebiten.MouseButtonMiddle,
|
d2enum.MouseButtonMiddle: ebiten.MouseButtonMiddle,
|
||||||
|
|
|
@ -429,7 +429,7 @@ func TestSetup(t *testing.T) {
|
||||||
testAssetManager.Records.Properties = properties
|
testAssetManager.Records.Properties = properties
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewProperty(t *testing.T) { //nolint:funlen it's mostly test-case definitions
|
func TestNewProperty(t *testing.T) { //nolint:funlen // it's mostly test-case definitions
|
||||||
rand.Seed(time.Now().UTC().UnixNano())
|
rand.Seed(time.Now().UTC().UnixNano())
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
|
|
|
@ -26,6 +26,7 @@ type Object struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// setMode changes the graphical mode of this animated entity
|
// setMode changes the graphical mode of this animated entity
|
||||||
|
// nolint:unparam // direction may not always be passed 0 in the future
|
||||||
func (ob *Object) setMode(animationMode d2enum.ObjectAnimationMode, direction int, randomFrame bool) error {
|
func (ob *Object) setMode(animationMode d2enum.ObjectAnimationMode, direction int, randomFrame bool) error {
|
||||||
err := ob.composite.SetMode(animationMode, "HTH")
|
err := ob.composite.SetMode(animationMode, "HTH")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package d2mapgen
|
package d2mapgen
|
||||||
|
|
||||||
|
// magic number suppression has been added because most of the work done here
|
||||||
|
// is experiemental, and mapgen will likely change dramatically in the future.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
@ -80,7 +83,7 @@ func (g *MapGenerator) GenerateAct1Overworld() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nolint:gosec // we're not concerned with crypto-strong randomness
|
// nolint:gosec,gomnd // we dont need crypto-strong randomness, mapgen will get a refactor soon
|
||||||
func (g *MapGenerator) generateWilderness1TownEast(startX, startY int) {
|
func (g *MapGenerator) generateWilderness1TownEast(startX, startY int) {
|
||||||
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
||||||
|
|
||||||
|
@ -146,7 +149,7 @@ func (g *MapGenerator) generateWilderness1TownEast(startX, startY int) {
|
||||||
g.engine.PlaceStamp(fenceSouthEastStamp, startX+levelDetails.SizeXNormal, startY+levelDetails.SizeYNormal+6)
|
g.engine.PlaceStamp(fenceSouthEastStamp, startX+levelDetails.SizeXNormal, startY+levelDetails.SizeYNormal+6)
|
||||||
}
|
}
|
||||||
|
|
||||||
// nolint:gosec // we're not concerned with crypto-strong randomness
|
// nolint:gosec,gomnd // we dont need crypto-strong randomness, mapgen will get a refactor soon
|
||||||
func (g *MapGenerator) generateWilderness1TownSouth(startX, startY int) {
|
func (g *MapGenerator) generateWilderness1TownSouth(startX, startY int) {
|
||||||
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
||||||
|
|
||||||
|
@ -200,7 +203,7 @@ func (g *MapGenerator) generateWilderness1TownSouth(startX, startY int) {
|
||||||
g.engine.PlaceStamp(fenceWaterBorderSouthEast, startX+(9*9)-4, startY+(8*9)+1)
|
g.engine.PlaceStamp(fenceWaterBorderSouthEast, startX+(9*9)-4, startY+(8*9)+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// nolint:gosec // we're not concerned with crypto-strong randomness
|
// nolint:gosec,gomnd // we dont need crypto-strong randomness, mapgen will get a refactor soon
|
||||||
func (g *MapGenerator) generateWilderness1TownWest(startX, startY int) {
|
func (g *MapGenerator) generateWilderness1TownWest(startX, startY int) {
|
||||||
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
||||||
|
|
||||||
|
@ -267,7 +270,7 @@ func (g *MapGenerator) generateWilderness1TownWest(startX, startY int) {
|
||||||
g.generateWilderness1Contents(areaRect)
|
g.generateWilderness1Contents(areaRect)
|
||||||
}
|
}
|
||||||
|
|
||||||
// nolint:gosec // we're not concerned with crypto-strong randomness
|
// nolint:gosec,gomnd // we dont need crypto-strong randomness, mapgen will get a refactor soon
|
||||||
func (g *MapGenerator) generateWilderness1Contents(rect d2geom.Rectangle) {
|
func (g *MapGenerator) generateWilderness1Contents(rect d2geom.Rectangle) {
|
||||||
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
levelDetails := g.asset.Records.GetLevelDetails(wildernessDetailsRecordID)
|
||||||
|
|
||||||
|
|
|
@ -52,12 +52,12 @@ type diablo2Stat struct {
|
||||||
// depending on the stat record, sets up the proper number of values,
|
// depending on the stat record, sets up the proper number of values,
|
||||||
// as well as set up the stat value number types, value combination types, and
|
// as well as set up the stat value number types, value combination types, and
|
||||||
// the value stringer functions used
|
// the value stringer functions used
|
||||||
func (s *diablo2Stat) init(numbers ...float64) { //nolint:funlen doesn't make sense to split
|
func (s *diablo2Stat) init(numbers ...float64) { //nolint:funlen,gocyclo // can't reduce
|
||||||
if s.record == nil {
|
if s.record == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gomdn introducing a const for these would be worse
|
//nolint:gomnd // introducing a const for these would be worse
|
||||||
switch s.record.DescFnID {
|
switch s.record.DescFnID {
|
||||||
case 0:
|
case 0:
|
||||||
// special case for poisonlength, or other stats, which have a
|
// special case for poisonlength, or other stats, which have a
|
||||||
|
@ -345,7 +345,7 @@ func (s *diablo2Stat) canBeCombinedWith(other d2stats.Stat) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the formatted description string
|
// String returns the formatted description string
|
||||||
func (s *diablo2Stat) String() string { //nolint:gocyclo switch statement is not so bad
|
func (s *diablo2Stat) String() string { //nolint:gocyclo // switch statement is not so bad
|
||||||
var result string
|
var result string
|
||||||
|
|
||||||
for idx := range s.values {
|
for idx := range s.values {
|
||||||
|
@ -354,7 +354,7 @@ func (s *diablo2Stat) String() string { //nolint:gocyclo switch statement is not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gomdn introducing a const for these would be worse
|
//nolint:gomnd // introducing a const for these would be worse
|
||||||
switch s.record.DescFnID {
|
switch s.record.DescFnID {
|
||||||
case 1, 2, 3, 4, 5, 12, 20:
|
case 1, 2, 3, 4, 5, 12, 20:
|
||||||
result = s.descFn1()
|
result = s.descFn1()
|
||||||
|
|
|
@ -54,8 +54,13 @@ func (sm *SkillSelectMenu) RegenerateImageCache() {
|
||||||
|
|
||||||
// Render gets called on every frame
|
// Render gets called on every frame
|
||||||
func (sm *SkillSelectMenu) Render(target d2interface.Surface) {
|
func (sm *SkillSelectMenu) Render(target d2interface.Surface) {
|
||||||
sm.LeftPanel.Render(target)
|
if err := sm.LeftPanel.Render(target); err != nil {
|
||||||
sm.RightPanel.Render(target)
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sm.RightPanel.Render(target); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsOpen returns whether one of the panels(left or right) is open
|
// IsOpen returns whether one of the panels(left or right) is open
|
||||||
|
|
4
main.go
4
main.go
|
@ -14,11 +14,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// GitBranch is set by the CI build process to the name of the branch
|
// GitBranch is set by the CI build process to the name of the branch
|
||||||
//nolint:gochecknoglobals This is filled in by the build system
|
//nolint:gochecknoglobals // This is filled in by the build system
|
||||||
var GitBranch string
|
var GitBranch string
|
||||||
|
|
||||||
// GitCommit is set by the CI build process to the commit hash
|
// GitCommit is set by the CI build process to the commit hash
|
||||||
//nolint:gochecknoglobals This is filled in by the build system
|
//nolint:gochecknoglobals // This is filled in by the build system
|
||||||
var GitCommit string
|
var GitCommit string
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user