Refactor getQuests to read bits from 2 byte flags

This commit is contained in:
CarlPoppa
2025-10-16 13:31:47 +01:00
parent 4fea7bde76
commit ce746c57af

View File

@@ -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)),
}
}
func (gd *GameReader) getQuestStatus(questStatusInt uint) []quest.Status {
var activeStates []quest.Status
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))
}
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)),
}
}
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)
}
func (gd *GameReader) getQuestStatus(flags uint16) []quest.Status {
var statuses []quest.Status
if flags == 0 {
statuses = append(statuses, quest.StatusQuestNotStarted)
return statuses
}
// Return early if completed
if (flags & (1 << 0)) != 0 {
statuses = append(statuses, quest.StatusUpdateQuestLogCompleted)
return statuses
}
// 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
}
}
statuses = append(statuses, quest.StatusUnknown2)
return statuses
}