diff --git a/pkg/memory/quests.go b/pkg/memory/quests.go index bde51f7..03ea37b 100644 --- a/pkg/memory/quests.go +++ b/pkg/memory/quests.go @@ -7,60 +7,70 @@ import ( func (gd *GameReader) getQuests(questBytes []byte) quest.Quests { return quest.Quests{ // Act 1 - 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)), + quest.Act1DenOfEvil: gd.getQuestStatus(gd.readQuestFlags(questBytes, 1)), + quest.Act1SistersBurialGrounds: gd.getQuestStatus(gd.readQuestFlags(questBytes, 2)), + quest.Act1ToolsOfTheTrade: gd.getQuestStatus(gd.readQuestFlags(questBytes, 3)), + quest.Act1TheSearchForCain: gd.getQuestStatus(gd.readQuestFlags(questBytes, 4)), + quest.Act1TheForgottenTower: gd.getQuestStatus(gd.readQuestFlags(questBytes, 5)), + quest.Act1SistersToTheSlaughter: gd.getQuestStatus(gd.readQuestFlags(questBytes, 6)), // Act 2 - 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)), + quest.Act2RadamentsLair: gd.getQuestStatus(gd.readQuestFlags(questBytes, 9)), + quest.Act2TheHoradricStaff: gd.getQuestStatus(gd.readQuestFlags(questBytes, 10)), + quest.Act2TaintedSun: gd.getQuestStatus(gd.readQuestFlags(questBytes, 11)), + quest.Act2ArcaneSanctuary: gd.getQuestStatus(gd.readQuestFlags(questBytes, 12)), + quest.Act2TheSummoner: gd.getQuestStatus(gd.readQuestFlags(questBytes, 13)), + quest.Act2TheSevenTombs: gd.getQuestStatus(gd.readQuestFlags(questBytes, 14)), // Act 3 - 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)), + quest.Act3LamEsensTome: gd.getQuestStatus(gd.readQuestFlags(questBytes, 17)), + quest.Act3KhalimsWill: gd.getQuestStatus(gd.readQuestFlags(questBytes, 18)), + quest.Act3BladeOfTheOldReligion: gd.getQuestStatus(gd.readQuestFlags(questBytes, 19)), + quest.Act3TheGoldenBird: gd.getQuestStatus(gd.readQuestFlags(questBytes, 20)), + quest.Act3TheBlackenedTemple: gd.getQuestStatus(gd.readQuestFlags(questBytes, 21)), + quest.Act3TheGuardian: gd.getQuestStatus(gd.readQuestFlags(questBytes, 22)), // Act 4 - quest.Act4TheFallenAngel: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 24, 1)), - quest.Act4TerrorsEnd: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 25, 1)), - quest.Act4HellForge: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 26, 1)), + quest.Act4TheFallenAngel: gd.getQuestStatus(gd.readQuestFlags(questBytes, 25)), + quest.Act4HellForge: gd.getQuestStatus(gd.readQuestFlags(questBytes, 27)), + quest.Act4TerrorsEnd: gd.getQuestStatus(gd.readQuestFlags(questBytes, 26)), // Act 5 - 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)), + quest.Act5SiegeOnHarrogath: gd.getQuestStatus(gd.readQuestFlags(questBytes, 35)), + quest.Act5RescueOnMountArreat: gd.getQuestStatus(gd.readQuestFlags(questBytes, 36)), + quest.Act5PrisonOfIce: gd.getQuestStatus(gd.readQuestFlags(questBytes, 37)), + quest.Act5BetrayalOfHarrogath: gd.getQuestStatus(gd.readQuestFlags(questBytes, 38)), + quest.Act5RiteOfPassage: gd.getQuestStatus(gd.readQuestFlags(questBytes, 39)), + quest.Act5EveOfDestruction: gd.getQuestStatus(gd.readQuestFlags(questBytes, 40)), } } -func (gd *GameReader) getQuestStatus(questStatusInt uint) []quest.Status { - var activeStates []quest.Status - activeStates = append(activeStates, quest.Status(questStatusInt)) - return activeStates + +func (gd *GameReader) readQuestFlags(questBytes []byte, questIndex int) uint16 { + byteOffset := 2 * questIndex + if byteOffset+1 >= len(questBytes) { + return 0 + } + return uint16(questBytes[byteOffset]) | (uint16(questBytes[byteOffset+1]) << 8) } -//outdated +func (gd *GameReader) getQuestStatus(flags uint16) []quest.Status { + var statuses []quest.Status -/* func (gd *GameReader) getQuestStatus(questBytes []byte) []quest.Status { - combinedValue := uint16(questBytes[0])<<8 | uint16(questBytes[1]) + if flags == 0 { + statuses = append(statuses, quest.StatusQuestNotStarted) + return statuses + } - binaryRepresentation := fmt.Sprintf("%016b", combinedValue) + // Return early if completed + if (flags & (1 << 0)) != 0 { + statuses = append(statuses, quest.StatusUpdateQuestLogCompleted) + return statuses + } - 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)) - } - } - } + // If not completed, find the highest bit, ignoring unknown + for bit := 10; bit >= 1; bit-- { + if (flags & (1 << bit)) != 0 { + statuses = append(statuses, quest.Status(bit)) + return statuses + } + } - return activeStates -}*/ + statuses = append(statuses, quest.StatusUnknown2) + return statuses +}