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