diff --git a/pkg/data/keybindings.go b/pkg/data/keybindings.go index 7ca1642..f717e38 100644 --- a/pkg/data/keybindings.go +++ b/pkg/data/keybindings.go @@ -1,5 +1,7 @@ package data +import "github.com/hectorgimenez/d2go/pkg/data/skill" + type KeyBindings struct { CharacterScreen KeyBinding Inventory KeyBinding @@ -12,7 +14,7 @@ type KeyBindings struct { SkillTree KeyBinding SkillSpeedBar KeyBinding - Skills [16]KeyBinding + Skills [16]SkillBinding SelectPreviousSkill KeyBinding SelectNextSkill KeyBinding @@ -54,3 +56,18 @@ type KeyBinding struct { Key1 [2]byte Key2 [2]byte } + +type SkillBinding struct { + SkillID skill.ID + KeyBinding +} + +func (kb KeyBindings) KeyBindingForSkill(skillID skill.ID) (KeyBinding, bool) { + for _, sk := range kb.Skills { + if sk.SkillID == skillID { + return sk.KeyBinding, true + } + } + + return KeyBinding{}, false +} diff --git a/pkg/memory/keybindings.go b/pkg/memory/keybindings.go index 0fd6888..469421b 100644 --- a/pkg/memory/keybindings.go +++ b/pkg/memory/keybindings.go @@ -1,23 +1,33 @@ package memory import ( + "encoding/binary" "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/skill" ) func (gd *GameReader) GetKeyBindings() data.KeyBindings { blob := gd.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x1e26934, 0x500) + blobSkills := gd.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x224edc0, 0x500) - skills := [16]data.KeyBinding{} + skillsKB := [16]data.SkillBinding{} for i := 0; i < 7; i++ { - skills[i] = data.KeyBinding{ - Key1: [2]byte{blob[0x118+(i*0x14)], blob[0x119+(i*0x14)]}, - Key2: [2]byte{blob[0x122+(i*0x14)], blob[0x123+(i*0x14)]}, + skillsKB[i] = data.SkillBinding{ + SkillID: skill.ID(binary.LittleEndian.Uint32(blobSkills[i*0x1c : i*0x1c+4])), + KeyBinding: data.KeyBinding{ + Key1: [2]byte{blob[0x118+(i*0x14)], blob[0x119+(i*0x14)]}, + Key2: [2]byte{blob[0x122+(i*0x14)], blob[0x123+(i*0x14)]}, + }, } } for i := 0; i < 9; i++ { - skills[i+7] = data.KeyBinding{ - Key1: [2]byte{blob[0x384+(i*0x14)], blob[0x385+(i*0x14)]}, - Key2: [2]byte{blob[0x38e+(i*0x14)], blob[0x38f+(i*0x14)]}, + skillIdx := i + 7 + skillsKB[skillIdx] = data.SkillBinding{ + SkillID: skill.ID(binary.LittleEndian.Uint32(blobSkills[skillIdx*0x1c : skillIdx*0x1c+4])), + KeyBinding: data.KeyBinding{ + Key1: [2]byte{blob[0x384+(i*0x14)], blob[0x385+(i*0x14)]}, + Key2: [2]byte{blob[0x38e+(i*0x14)], blob[0x38f+(i*0x14)]}, + }, } } @@ -70,7 +80,7 @@ func (gd *GameReader) GetKeyBindings() data.KeyBindings { Key1: [2]byte{blob[0x104], blob[0x105]}, Key2: [2]byte{blob[0x10e], blob[0x10f]}, }, - Skills: skills, + Skills: skillsKB, SelectPreviousSkill: data.KeyBinding{ Key1: [2]byte{blob[0x2f8], blob[0x2f9]}, Key2: [2]byte{blob[0x302], blob[0x303]},