Fix quest status reading to use correct statuses
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user