diff --git a/pkg/data/quest/quest.go b/pkg/data/quest/quest.go index d95e901..6ae8b0b 100644 --- a/pkg/data/quest/quest.go +++ b/pkg/data/quest/quest.go @@ -5,7 +5,7 @@ type Status int16 type States []Status func (s States) Completed() bool { - return s.HasStatus(StatusUpdateQuestLogCompleted) + return s.HasStatus(StatusUpdateQuestLogCompleted) || s.HasStatus(StatusPrimaryGoalCompleted) || s.HasStatus(StatusUnknown1) || s.HasStatus(StatusUnknown2) } func (s States) HasStatus(st Status) bool { @@ -18,6 +18,7 @@ func (s States) HasStatus(st Status) bool { return false } +// Note that quest order isnt what is represented visually in game const ( Act1DenOfEvil Quest = iota Act1SistersBurialGrounds diff --git a/pkg/data/quest/status.go b/pkg/data/quest/status.go index 6b9fcbc..83ce3b6 100644 --- a/pkg/data/quest/status.go +++ b/pkg/data/quest/status.go @@ -1,18 +1,16 @@ package quest const ( - StatusRewardGranted Status = iota - StatusRewardPending - StatusQuestInitiated - StatusLeaveTown - StatusEnterFirstArea + StatusQuestNotStarted Status = iota StatusInProgress1 StatusInProgress2 StatusInProgress3 StatusInProgress4 StatusInProgress5 StatusInProgress6 - StatusInProgress7 + StatusInProgress8 + StatusInProgress9 + StatusInProgress10 StatusUpdateQuestLogCompleted StatusPrimaryGoalCompleted StatusUnknown1 diff --git a/pkg/memory/game_reader.go b/pkg/memory/game_reader.go index 8c50a9a..448c56a 100644 --- a/pkg/memory/game_reader.go +++ b/pkg/memory/game_reader.go @@ -32,11 +32,12 @@ func (gd *GameReader) GetData() data.Data { hover := gd.hoveredData() // Quests - q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64)) - q2 := uintptr(gd.Process.ReadUInt(q1, Uint64)) - gameQuestsBytes := gd.Process.ReadBytesFromMemory(q2, 85) + // q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64)) + // q2 := uintptr(gd.Process.ReadUInt(q1, Uint64)) + // q2 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22F1E79, Uint64)) + gameQuestsBytes := gd.Process.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x22F1E79, 85) - gameQuestsBytes = gameQuestsBytes[3:] + // gameQuestsBytes = gameQuestsBytes[3:] corpseUnit := rawPlayerUnits.GetCorpse() d := data.Data{ diff --git a/pkg/memory/quests.go b/pkg/memory/quests.go index 005218b..bde51f7 100644 --- a/pkg/memory/quests.go +++ b/pkg/memory/quests.go @@ -1,60 +1,66 @@ package memory import ( - "fmt" "github.com/hectorgimenez/d2go/pkg/data/quest" ) func (gd *GameReader) getQuests(questBytes []byte) quest.Quests { return quest.Quests{ // Act 1 - quest.Act1DenOfEvil: gd.getQuestStatus([2]byte(questBytes[0:2])), - quest.Act1SistersBurialGrounds: gd.getQuestStatus([2]byte(questBytes[2:4])), - quest.Act1ToolsOfTheTrade: gd.getQuestStatus([2]byte(questBytes[4:6])), - quest.Act1TheSearchForCain: gd.getQuestStatus([2]byte(questBytes[6:8])), - quest.Act1TheForgottenTower: gd.getQuestStatus([2]byte(questBytes[8:10])), - quest.Act1SistersToTheSlaughter: gd.getQuestStatus([2]byte(questBytes[10:12])), + quest.Act1DenOfEvil: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 0, 1)), + quest.Act1SistersBurialGrounds: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 1, 1)), + quest.Act1ToolsOfTheTrade: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 2, 1)), + quest.Act1TheSearchForCain: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 3, 1)), + quest.Act1TheForgottenTower: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 4, 1)), + quest.Act1SistersToTheSlaughter: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 5, 1)), // Act 2 - quest.Act2RadamentsLair: gd.getQuestStatus([2]byte(questBytes[16:18])), - quest.Act2TheHoradricStaff: gd.getQuestStatus([2]byte(questBytes[18:20])), - quest.Act2TaintedSun: gd.getQuestStatus([2]byte(questBytes[20:22])), - quest.Act2ArcaneSanctuary: gd.getQuestStatus([2]byte(questBytes[22:24])), - quest.Act2TheSummoner: gd.getQuestStatus([2]byte(questBytes[24:26])), - quest.Act2TheSevenTombs: gd.getQuestStatus([2]byte(questBytes[26:28])), + quest.Act2RadamentsLair: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 8, 1)), + quest.Act2TheHoradricStaff: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 9, 1)), + quest.Act2TaintedSun: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 10, 1)), + quest.Act2ArcaneSanctuary: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 11, 1)), + quest.Act2TheSummoner: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 12, 1)), + quest.Act2TheSevenTombs: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 13, 1)), // Act 3 - quest.Act3LamEsensTome: gd.getQuestStatus([2]byte(questBytes[32:34])), - quest.Act3KhalimsWill: gd.getQuestStatus([2]byte(questBytes[34:36])), - quest.Act3BladeOfTheOldReligion: gd.getQuestStatus([2]byte(questBytes[36:38])), - quest.Act3TheGoldenBird: gd.getQuestStatus([2]byte(questBytes[38:40])), - quest.Act3TheBlackenedTemple: gd.getQuestStatus([2]byte(questBytes[40:42])), - quest.Act3TheGuardian: gd.getQuestStatus([2]byte(questBytes[42:44])), + quest.Act3LamEsensTome: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 16, 1)), + quest.Act3KhalimsWill: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 17, 1)), + quest.Act3BladeOfTheOldReligion: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 18, 1)), + quest.Act3TheGoldenBird: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 19, 1)), + quest.Act3TheBlackenedTemple: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 20, 1)), + quest.Act3TheGuardian: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 21, 1)), // Act 4 - quest.Act4TheFallenAngel: gd.getQuestStatus([2]byte(questBytes[48:50])), - quest.Act4TerrorsEnd: gd.getQuestStatus([2]byte(questBytes[50:52])), - quest.Act4HellForge: gd.getQuestStatus([2]byte(questBytes[52:54])), + quest.Act4TheFallenAngel: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 24, 1)), + quest.Act4TerrorsEnd: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 25, 1)), + quest.Act4HellForge: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 26, 1)), // Act 5 - quest.Act5SiegeOnHarrogath: gd.getQuestStatus([2]byte(questBytes[68:70])), - quest.Act5RescueOnMountArreat: gd.getQuestStatus([2]byte(questBytes[70:72])), - quest.Act5PrisonOfIce: gd.getQuestStatus([2]byte(questBytes[72:74])), - quest.Act5BetrayalOfHarrogath: gd.getQuestStatus([2]byte(questBytes[74:76])), - quest.Act5RiteOfPassage: gd.getQuestStatus([2]byte(questBytes[76:78])), - quest.Act5EveOfDestruction: gd.getQuestStatus([2]byte(questBytes[78:80])), + quest.Act5SiegeOnHarrogath: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 34, 1)), + quest.Act5RescueOnMountArreat: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 35, 1)), + quest.Act5PrisonOfIce: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 36, 1)), + quest.Act5BetrayalOfHarrogath: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 37, 1)), + quest.Act5RiteOfPassage: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 38, 1)), + quest.Act5EveOfDestruction: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 39, 1)), } } - -func (gd *GameReader) getQuestStatus(questBytes [2]byte) []quest.Status { - combinedValue := uint16(questBytes[0])<<8 | uint16(questBytes[1]) - - binaryRepresentation := fmt.Sprintf("%016b", combinedValue) - +func (gd *GameReader) getQuestStatus(questStatusInt uint) []quest.Status { var activeStates []quest.Status - for i, char := range binaryRepresentation { - if char == '1' { - if 15-i >= 0 && i < 16 { - activeStates = append(activeStates, quest.Status(15-i)) - } - } - } - + activeStates = append(activeStates, quest.Status(questStatusInt)) return activeStates } + +//outdated + +/* func (gd *GameReader) getQuestStatus(questBytes []byte) []quest.Status { + combinedValue := uint16(questBytes[0])<<8 | uint16(questBytes[1]) + + binaryRepresentation := fmt.Sprintf("%016b", combinedValue) + + var activeStates []quest.Status + for i, char := range binaryRepresentation { +if char == '1' { +if 15-i >= 0 && i < 16 { + activeStates = append(activeStates, quest.Status(15-i)) + } + } + } + + return activeStates +}*/