diff --git a/pkg/data/belt.go b/pkg/data/belt.go index c3ccfb7..419ff7e 100644 --- a/pkg/data/belt.go +++ b/pkg/data/belt.go @@ -1,6 +1,10 @@ package data -import "strings" +import ( + "strings" + + "github.com/hectorgimenez/d2go/pkg/data/item" +) const ( HealingPotion PotionType = "HealingPotion" @@ -8,10 +12,13 @@ const ( RejuvenationPotion PotionType = "RejuvenationPotion" ) -type Belt []Item +type Belt struct { + Items []Item + Name item.Name +} func (b Belt) GetFirstPotion(potionType PotionType) (Position, bool) { - for _, i := range b { + for _, i := range b.Items { // Ensure potion is in row 0 and one of the four columns if strings.Contains(string(i.Name), string(potionType)) && i.Position.Y == 0 && (i.Position.X == 0 || i.Position.X == 1 || i.Position.X == 2 || i.Position.X == 3) { return i.Position, true @@ -21,4 +28,17 @@ func (b Belt) GetFirstPotion(potionType PotionType) (Position, bool) { return Position{}, false } +func (b Belt) Rows() int { + switch b.Name { + case "": + return 1 + case "Sash", "LightBelt": + return 2 + case "Belt", "HeavyBelt": + return 3 + default: + return 4 + } +} + type PotionType string diff --git a/pkg/memory/item.go b/pkg/memory/item.go index 769a94d..a5af34d 100644 --- a/pkg/memory/item.go +++ b/pkg/memory/item.go @@ -1,11 +1,12 @@ package memory import ( + "sort" + "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/utils" - "sort" ) func (gd *GameReader) Items(playerPosition data.Position) data.Items { @@ -15,6 +16,7 @@ func (gd *GameReader) Items(playerPosition data.Position) data.Items { unitTableBuffer := gd.Process.ReadBytesFromMemory(baseAddr, 128*8) items := data.Items{} + belt := data.Belt{} for i := 0; i < 128; i++ { itemOffset := 8 * i itemUnitPtr := uintptr(ReadUIntFromBuffer(unitTableBuffer, uint(itemOffset), Uint64)) @@ -82,8 +84,11 @@ func (gd *GameReader) Items(playerPosition data.Position) data.Items { } case 1: items.Equipped = append(items.Equipped, itm) + if itm.Type() == "belt" { + belt.Name = itm.Name + } case 2: - items.Belt = append(items.Belt, itm) + belt.Items = append(belt.Items, itm) case 3, 5: items.Ground = append(items.Ground, itm) } @@ -92,6 +97,8 @@ func (gd *GameReader) Items(playerPosition data.Position) data.Items { } } + items.Belt = belt + sort.SliceStable(items.Ground, func(i, j int) bool { distanceI := utils.DistanceFromPoint(playerPosition, items.Ground[i].Position) distanceJ := utils.DistanceFromPoint(playerPosition, items.Ground[j].Position)