diff --git a/pkg/data/quest/quest.go b/pkg/data/quest/quest.go index 6ae8b0b..eec978c 100644 --- a/pkg/data/quest/quest.go +++ b/pkg/data/quest/quest.go @@ -1,21 +1,18 @@ package quest type Quest int16 -type Status int16 -type States []Status +type Status uint16 -func (s States) Completed() bool { - return s.HasStatus(StatusUpdateQuestLogCompleted) || s.HasStatus(StatusPrimaryGoalCompleted) || s.HasStatus(StatusUnknown1) || s.HasStatus(StatusUnknown2) +func (s Status) Completed() bool { + return s&StatusMaskCompleted != 0 } -func (s States) HasStatus(st Status) bool { - for _, state := range s { - if state == st { - return true - } - } +func (s Status) NotStarted() bool { + return s == 0 +} - return false +func (s Status) HasStatus(st Status) bool { + return (s & st) == st } // Note that quest order isnt what is represented visually in game @@ -49,4 +46,4 @@ const ( Act5EveOfDestruction ) -type Quests map[Quest]States +type Quests map[Quest]Status diff --git a/pkg/data/quest/status.go b/pkg/data/quest/status.go index 83ce3b6..3fef3cb 100644 --- a/pkg/data/quest/status.go +++ b/pkg/data/quest/status.go @@ -1,18 +1,27 @@ package quest const ( - StatusQuestNotStarted Status = iota + StatusRewardGranted Status = 1 << iota + StatusRewardPending + StatusStarted + StatusLeaveTown + StatusEnterArea StatusInProgress1 StatusInProgress2 StatusInProgress3 StatusInProgress4 StatusInProgress5 StatusInProgress6 - StatusInProgress8 - StatusInProgress9 - StatusInProgress10 - StatusUpdateQuestLogCompleted - StatusPrimaryGoalCompleted - StatusUnknown1 - StatusUnknown2 + StatusInProgress7 + StatusUpdateQuestLog + StatusPrimaryGoalDone + StatusCompletedNow + StatusCompletedBefore ) + +const StatusMaskCompleted = StatusPrimaryGoalDone | + StatusRewardGranted | + StatusRewardPending | + StatusCompletedNow | + StatusCompletedBefore | + StatusUpdateQuestLog diff --git a/pkg/memory/quests.go b/pkg/memory/quests.go index 03ea37b..21fa4ac 100644 --- a/pkg/memory/quests.go +++ b/pkg/memory/quests.go @@ -49,28 +49,6 @@ func (gd *GameReader) readQuestFlags(questBytes []byte, questIndex int) uint16 { 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 +func (gd *GameReader) getQuestStatus(flags uint16) quest.Status { + return quest.Status(flags) }