77 lines
3.3 KiB
Go
77 lines
3.3 KiB
Go
package memory
|
|
|
|
import (
|
|
"github.com/hectorgimenez/d2go/pkg/data/quest"
|
|
)
|
|
|
|
func (gd *GameReader) getQuests(questBytes []byte) quest.Quests {
|
|
return quest.Quests{
|
|
// Act 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(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(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(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(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) 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
|
|
}
|