diff --git a/go.mod b/go.mod index 2967675..57750f6 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.22 require ( github.com/faiface/beep v1.1.0 - github.com/stretchr/testify v1.8.4 - golang.org/x/sys v0.17.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/sys v0.18.0 ) require ( @@ -14,7 +14,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8 // indirect - golang.org/x/image v0.13.0 // indirect + golang.org/x/image v0.15.0 // indirect golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ca9419f..ae60168 100644 --- a/go.sum +++ b/go.sum @@ -26,22 +26,22 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8 h1:idBdZTd9UioThJp8KpM/rTSinK/ChZFBE43/WtIy8zg= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.13.0 h1:3cge/F/QTkNLauhf2QoE9zp+7sr+ZcL4HnoZmdwg9sg= -golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6 h1:vyLBGJPIl9ZYbcQFM2USFmJBK6KI+t+z6jL0lbwjrnc= golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/data/data.go b/pkg/data/data.go index 3ce984e..8025b52 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -35,9 +35,6 @@ func (pc *PointCounter) Percent(point int, maxPoint int, hasBo bool) int { return int((float64(point) / float64(pc.MaxPoint)) * 100) } -var maxHp PointCounter -var maxMp PointCounter - const ( goldPerLevel = 10000 @@ -170,6 +167,8 @@ type PlayerUnit struct { LeftSkill skill.ID RightSkill skill.ID AvailableWaypoints []area.Area // Is only filled when WP menu is open and only for the specific selected tab + MaxHPValue *PointCounter + MaxMPValue *PointCounter } func (pu PlayerUnit) MaxGold() int { @@ -186,7 +185,7 @@ func (pu PlayerUnit) HPPercent() int { if !found { return 100 } - return maxHp.Percent(pu.Stats[stat.Life], pu.Stats[stat.MaxLife], pu.States.HasState(state.Battleorders)) + return pu.MaxHPValue.Percent(pu.Stats[stat.Life], pu.Stats[stat.MaxLife], pu.States.HasState(state.Battleorders)) } func (pu PlayerUnit) MPPercent() int { @@ -194,7 +193,7 @@ func (pu PlayerUnit) MPPercent() int { if !found { return 100 } - return maxMp.Percent(pu.Stats[stat.Mana], pu.Stats[stat.MaxMana], pu.States.HasState(state.Battleorders)) + return pu.MaxMPValue.Percent(pu.Stats[stat.Mana], pu.Stats[stat.MaxMana], pu.States.HasState(state.Battleorders)) } func (pu PlayerUnit) HasDebuff() bool { diff --git a/pkg/memory/game_reader.go b/pkg/memory/game_reader.go index 157386a..1fa6297 100644 --- a/pkg/memory/game_reader.go +++ b/pkg/memory/game_reader.go @@ -6,7 +6,8 @@ import ( ) type GameReader struct { - offset Offset + offset Offset + previousRead data.Data Process } @@ -17,8 +18,6 @@ func NewGameReader(process Process) *GameReader { } } -var previousData *data.Data - func (gd *GameReader) GetData() data.Data { if gd.offset.UnitTable == 0 { gd.offset = calculateOffsets(gd.Process) @@ -27,7 +26,7 @@ func (gd *GameReader) GetData() data.Data { roster := gd.getRoster() playerUnitPtr, corpse := gd.GetPlayerUnitPtr(roster) - pu := gd.GetPlayerUnit(playerUnitPtr) + pu := gd.GetPlayerUnit(playerUnitPtr, gd.previousRead.PlayerUnit.MaxHPValue, gd.previousRead.PlayerUnit.MaxMPValue) hover := gd.hoveredData() // Quests @@ -51,10 +50,10 @@ func (gd *GameReader) GetData() data.Data { } if playerUnitPtr == 0 { - return *previousData + return gd.previousRead } - previousData = &d + gd.previousRead = d return d } diff --git a/pkg/memory/player.go b/pkg/memory/player.go index fa39f2c..b2ecab8 100644 --- a/pkg/memory/player.go +++ b/pkg/memory/player.go @@ -76,7 +76,14 @@ func (gd *GameReader) GetPlayerUnitPtr(roster data.Roster) (playerUnitPtr uintpt return } -func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit { +func (gd *GameReader) GetPlayerUnit(playerUnit uintptr, previousHP, previousMP *data.PointCounter) data.PlayerUnit { + if previousHP == nil { + previousHP = &data.PointCounter{} + } + if previousMP == nil { + previousMP = &data.PointCounter{} + } + unitID := gd.Process.ReadUInt(playerUnit+0x08, Uint32) // Read X and Y Positions @@ -148,7 +155,7 @@ func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit { } } - return data.PlayerUnit{ + d := data.PlayerUnit{ Name: name, ID: data.UnitID(unitID), Area: area.Area(levelNo), @@ -163,7 +170,15 @@ func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit { LeftSkill: skill.ID(leftSkillId), RightSkill: skill.ID(rightSkillId), AvailableWaypoints: availableWPs, + MaxHPValue: previousHP, + MaxMPValue: previousMP, } + + // Recalculate max HP and MP + d.HPPercent() + d.MPPercent() + + return d } func (gd *GameReader) getSkills(skillListPtr uintptr) map[skill.ID]skill.Points {