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
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

View File

@@ -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

View File

@@ -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)
}