Fix quest status reading to use correct statuses

This commit is contained in:
CarlPoppa
2025-10-20 14:14:23 +01:00
parent 53e7495886
commit 5504aaf979
3 changed files with 28 additions and 44 deletions

View File

@@ -1,21 +1,18 @@
package quest package quest
type Quest int16 type Quest int16
type Status int16 type Status uint16
type States []Status
func (s States) Completed() bool { func (s Status) Completed() bool {
return s.HasStatus(StatusUpdateQuestLogCompleted) || s.HasStatus(StatusPrimaryGoalCompleted) || s.HasStatus(StatusUnknown1) || s.HasStatus(StatusUnknown2) return s&StatusMaskCompleted != 0
} }
func (s States) HasStatus(st Status) bool { func (s Status) NotStarted() bool {
for _, state := range s { return s == 0
if state == st {
return true
}
} }
return false func (s Status) HasStatus(st Status) bool {
return (s & st) == st
} }
// Note that quest order isnt what is represented visually in game // Note that quest order isnt what is represented visually in game
@@ -49,4 +46,4 @@ const (
Act5EveOfDestruction Act5EveOfDestruction
) )
type Quests map[Quest]States type Quests map[Quest]Status

View File

@@ -1,18 +1,27 @@
package quest package quest
const ( const (
StatusQuestNotStarted Status = iota StatusRewardGranted Status = 1 << iota
StatusRewardPending
StatusStarted
StatusLeaveTown
StatusEnterArea
StatusInProgress1 StatusInProgress1
StatusInProgress2 StatusInProgress2
StatusInProgress3 StatusInProgress3
StatusInProgress4 StatusInProgress4
StatusInProgress5 StatusInProgress5
StatusInProgress6 StatusInProgress6
StatusInProgress8 StatusInProgress7
StatusInProgress9 StatusUpdateQuestLog
StatusInProgress10 StatusPrimaryGoalDone
StatusUpdateQuestLogCompleted StatusCompletedNow
StatusPrimaryGoalCompleted StatusCompletedBefore
StatusUnknown1
StatusUnknown2
) )
const StatusMaskCompleted = StatusPrimaryGoalDone |
StatusRewardGranted |
StatusRewardPending |
StatusCompletedNow |
StatusCompletedBefore |
StatusUpdateQuestLog

View File

@@ -49,28 +49,6 @@ func (gd *GameReader) readQuestFlags(questBytes []byte, questIndex int) uint16 {
return uint16(questBytes[byteOffset]) | (uint16(questBytes[byteOffset+1]) << 8) return uint16(questBytes[byteOffset]) | (uint16(questBytes[byteOffset+1]) << 8)
} }
func (gd *GameReader) getQuestStatus(flags uint16) []quest.Status { func (gd *GameReader) getQuestStatus(flags uint16) quest.Status {
var statuses []quest.Status return quest.Status(flags)
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
} }