From f06c587c7a10767182ca7f84bc8e7c0197f39ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Gim=C3=A9nez?= Date: Fri, 19 Jan 2024 22:00:48 +0900 Subject: [PATCH] Read WP data (#7) --- pkg/data/data.go | 21 +++++++++++---------- pkg/memory/game_reader.go | 7 +++++++ pkg/memory/player.go | 25 +++++++++++++++++++------ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/pkg/data/data.go b/pkg/data/data.go index c7033b1..4711aaf 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -157,16 +157,17 @@ type Position struct { } type PlayerUnit struct { - Name string - ID UnitID - Area area.Area - Position Position - Stats map[stat.ID]int - Skills map[skill.Skill]int - States state.States - Class Class - LeftSkill skill.Skill - RightSkill skill.Skill + Name string + ID UnitID + Area area.Area + Position Position + Stats map[stat.ID]int + Skills map[skill.Skill]int + States state.States + Class Class + LeftSkill skill.Skill + RightSkill skill.Skill + AvailableWaypoints []area.Area // Is only filled when WP menu is open and only for the specific selected tab } func (pu PlayerUnit) MaxGold() int { diff --git a/pkg/memory/game_reader.go b/pkg/memory/game_reader.go index 0a81d4b..284c312 100644 --- a/pkg/memory/game_reader.go +++ b/pkg/memory/game_reader.go @@ -132,3 +132,10 @@ func (gd *GameReader) getStatsData(statCount uint, statPtr uintptr) []stat.Data return stats } + +// TODO: Take a look to better ways to get this data, now it's very flakky, is just a random memory position + not in game +func (gd *GameReader) InCharacterSelectionScreen() bool { + uiBase := gd.Process.moduleBaseAddressPtr + gd.offset.UI - 0xA + + return gd.Process.ReadUInt(uiBase, Uint8) != 1 && gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x1EC5AA8, Uint64) == 0 +} diff --git a/pkg/memory/player.go b/pkg/memory/player.go index 3efde73..11c3965 100644 --- a/pkg/memory/player.go +++ b/pkg/memory/player.go @@ -1,6 +1,7 @@ package memory import ( + "encoding/binary" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/skill" @@ -136,6 +137,17 @@ func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit { levelPtr := uintptr(gd.Process.ReadUInt(room2Ptr+0x90, Uint64)) levelNo := gd.Process.ReadUInt(levelPtr+0x1F8, Uint32) + availableWPs := make([]area.Area, 0) + // Probably there is a better place to pick up those values, since this seems to be very tied to the UI + wpList := gd.Process.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x21AD220, 0x48) + for i := 0; i < 0x48; i = i + 8 { + a := binary.LittleEndian.Uint32(wpList[i : i+4]) + available := binary.LittleEndian.Uint32(wpList[i+4 : i+8]) + if available == 1 || area.Area(levelNo) == area.Area(a) { + availableWPs = append(availableWPs, area.Area(a)) + } + } + return data.PlayerUnit{ Name: name, ID: data.UnitID(unitID), @@ -144,12 +156,13 @@ func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit { X: int(xPos), Y: int(yPos), }, - Stats: stats, - Skills: skills, - States: states, - Class: class, - LeftSkill: skill.Skill(leftSkillId), - RightSkill: skill.Skill(rightSkillId), + Stats: stats, + Skills: skills, + States: states, + Class: class, + LeftSkill: skill.Skill(leftSkillId), + RightSkill: skill.Skill(rightSkillId), + AvailableWaypoints: availableWPs, } }