diff --git a/d2common/d2enum/quests.go b/d2common/d2enum/quests.go new file mode 100644 index 00000000..90be64ee --- /dev/null +++ b/d2common/d2enum/quests.go @@ -0,0 +1,63 @@ +package d2enum + +const ( + // NormalActQuestsNumber is number of quests in standard act + NormalActQuestsNumber = 6 + // HalfQuestsNumber is number of quests in act 4 + HalfQuestsNumber = 3 +) + +// ActsNumber is number of acts in game +const ActsNumber = 5 + +const ( + // Act1 is act 1 in game + Act1 = iota + 1 + // Act2 is act 2 in game + Act2 + // Act3 is act 3 in game + Act3 + // Act4 is act 4 in game + Act4 + // Act5 is act 4 in game + Act5 +) + +// ActsWithHalfQuestNumber is act, where is half quest number (act4) +const ActsWithHalfQuestNumber = Act4 + +/* I think, It should looks like that: + each quest has its own position in questStatus map + which should come from save file. + quests status values: + - -2 - done + - -1 - done, need to play animation + - 0 - not started yet + - and after that we have "in progress status" + so for status (from 1 to n) we have appropriate + quest descriptions and we'll have appropriate + actions +*/ +const ( + QuestStatusCompleted = iota - 2 // quest completed + QuestStatusCompleting // quest completed (need to play animation) + QuestStatusNotStarted // quest not started yet + QuestStatusInProgress // quest is in progress +) + +const ( + // QuestNone describes "no selected quest" status + QuestNone = iota + // Quest1 describes quest field 1 + Quest1 + // Quest2 describes quest field 2 + Quest2 + // Quest3 describes quest field 3 + Quest3 + // Quest4 describes quest field 4 + Quest4 + // Quest5 describes quest field 5 + Quest5 + // Quest6 describes quest field 6 + Quest6 +) diff --git a/d2game/d2player/quest_log.go b/d2game/d2player/quest_log.go index 8f0908b1..dee95804 100644 --- a/d2game/d2player/quest_log.go +++ b/d2game/d2player/quest_log.go @@ -5,6 +5,7 @@ import ( "image/color" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2util" @@ -14,14 +15,6 @@ import ( const white = 0xffffffff -const ( - act1 = iota + 1 - act2 - act3 - act4 - act5 -) - const ( // for the dc6 frames questLogTopLeft = iota questLogTopRight @@ -29,19 +22,6 @@ const ( // for the dc6 frames questLogBottomRight ) -const ( - questStatusCompleted = iota - 2 // quest completed - questStatusCompleting // quest completed (need to play animation) - questStatusNotStarted // quest not started yet - // nolint:deadcode,varcheck // if will not be used, just remove - questStatusInProgress // quest is in progress -) - -const ( - normalActQuestsNumber = 6 - act4QuestsNumber = 3 -) - const ( questLogOffsetX, questLogOffsetY = 80, 64 ) @@ -83,10 +63,6 @@ const ( questLogNumTabs ) -const ( - questNone = 0 -) - func (s *QuestLog) getPositionForSocket(number int) (x, y int) { pos := []struct { x int @@ -142,6 +118,11 @@ func NewQuestLog(asset *d2asset.AssetManager, 26: 0, } + var quests [d2enum.ActsNumber]*d2ui.WidgetGroup + for i := 0; i < d2enum.ActsNumber; i++ { + quests[i] = ui.NewWidgetGroup(d2ui.RenderPriorityQuestLog) + } + ql := &QuestLog{ asset: asset, uiManager: ui, @@ -155,6 +136,7 @@ func NewQuestLog(asset *d2asset.AssetManager, {}, {}, }, + quests: quests, questStatus: qs, } @@ -177,26 +159,9 @@ type QuestLog struct { act int tab [questLogNumTabs]*questLogTab - questName *d2ui.Label - questDescr *d2ui.Label - questsa1 *d2ui.WidgetGroup - questsa2 *d2ui.WidgetGroup - questsa3 *d2ui.WidgetGroup - questsa4 *d2ui.WidgetGroup - questsa5 *d2ui.WidgetGroup - - /* I think, It should looks like that: - each quest has its own position in questStatus map - which should come from save file. - quests status values: - - -2 - done - - -1 - done, need to play animation - - 0 - not started yet - - and after that we have "in progress status" - so for status (from 1 to n) we have appropriate - quest descriptions and we'll have appropriate - actions - */ + questName *d2ui.Label + questDescr *d2ui.Label + quests [5]*d2ui.WidgetGroup questStatus map[int]int originX int @@ -238,11 +203,6 @@ func (q *questLogTab) newTab(ui *d2ui.UIManager, tabType d2ui.ButtonType, x int) func (s *QuestLog) Load() { var err error - s.questsa1 = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) - s.questsa2 = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) - s.questsa3 = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) - s.questsa4 = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) - s.questsa5 = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) frame := d2ui.NewUIFrame(s.asset, s.uiManager, d2ui.FrameLeft) @@ -282,7 +242,10 @@ func (s *QuestLog) Load() { s.panelGroup.AddWidget(s.questDescr) s.loadTabs() - s.loadQuestIcons() + + for i := 0; i < 5; i++ { + s.quests[i] = s.loadQuestIconsForAct(i + 1) + } s.panelGroup.SetVisible(false) } @@ -316,22 +279,14 @@ func (s *QuestLog) loadTabs() { s.setTab(s.act - 1) } -func (s *QuestLog) loadQuestIcons() { - s.questsa1 = s.loadQuestIconsForAct(act1) - s.questsa2 = s.loadQuestIconsForAct(act2) - s.questsa3 = s.loadQuestIconsForAct(act3) - s.questsa4 = s.loadQuestIconsForAct(act4) - s.questsa5 = s.loadQuestIconsForAct(act5) -} - func (s *QuestLog) loadQuestIconsForAct(act int) *d2ui.WidgetGroup { wg := s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog) var questsInAct int - if act == act4 { - questsInAct = act4QuestsNumber + if act == d2enum.Act4 { + questsInAct = d2enum.HalfQuestsNumber } else { - questsInAct = normalActQuestsNumber + questsInAct = d2enum.NormalActQuestsNumber } var sockets []*d2ui.Sprite @@ -361,9 +316,9 @@ func (s *QuestLog) loadQuestIconsForAct(act int) *d2ui.WidgetGroup { } switch s.questStatus[s.cordsToQuestID(act, n)] { - case questStatusCompleted: + case d2enum.QuestStatusCompleted: err = icon.SetCurrentFrame(completedFrame) - case questStatusCompleting: + case d2enum.QuestStatusCompleting: // that's not complet now err = icon.SetCurrentFrame(0) if err != nil { @@ -371,9 +326,10 @@ func (s *QuestLog) loadQuestIconsForAct(act int) *d2ui.WidgetGroup { } icon.PlayForward() + icon.SetPlayLoop(false) err = icon.SetCurrentFrame(completedFrame) - s.questStatus[s.cordsToQuestID(act, n)] = questStatusCompleted - case questStatusNotStarted: + s.questStatus[s.cordsToQuestID(act, n)] = d2enum.QuestStatusCompleted + case d2enum.QuestStatusNotStarted: err = icon.SetCurrentFrame(notStartedFrame) default: err = icon.SetCurrentFrame(inProgresFrame) @@ -432,7 +388,7 @@ func (s *QuestLog) setQuestLabel() { status := s.questStatus[s.cordsToQuestID(s.selectedTab+1, s.selectedQuest)] switch status { - case questStatusCompleted, questStatusCompleting: + case d2enum.QuestStatusCompleted: s.questDescr.SetText( strings.Join( d2util.SplitIntoLinesWithMaxWidth( @@ -440,7 +396,7 @@ func (s *QuestLog) setQuestLabel() { questDescriptionLenght), "\n"), ) - case questStatusNotStarted: + case d2enum.QuestStatusNotStarted: s.questDescr.SetText("") default: s.questDescr.SetText(strings.Join( @@ -456,14 +412,12 @@ func (s *QuestLog) setQuestLabel() { func (s *QuestLog) setTab(tab int) { s.selectedTab = tab - s.selectedQuest = questNone + s.selectedQuest = d2enum.QuestNone s.setQuestLabel() - s.questsa1.SetVisible(tab == questLogTab1) - s.questsa2.SetVisible(tab == questLogTab2) - s.questsa3.SetVisible(tab == questLogTab3) - s.questsa4.SetVisible(tab == questLogTab4) - s.questsa5.SetVisible(tab == questLogTab5) + for i := 0; i < d2enum.ActsNumber; i++ { + s.quests[i].SetVisible(tab == i) + } for i := 0; i < questLogNumTabs; i++ { s.tab[i].button.SetEnabled(i == tab) @@ -505,11 +459,11 @@ func (s *QuestLog) Open() { func (s *QuestLog) Close() { s.isOpen = false s.panelGroup.SetVisible(false) - s.questsa1.SetVisible(false) - s.questsa2.SetVisible(false) - s.questsa3.SetVisible(false) - s.questsa4.SetVisible(false) - s.questsa5.SetVisible(false) + + for i := 0; i < d2enum.ActsNumber; i++ { + s.quests[i].SetVisible(false) + } + s.onCloseCb() } @@ -590,9 +544,9 @@ func rgbaColor(rgba uint32) color.RGBA { } func (s *QuestLog) cordsToQuestID(act, number int) int { - key := (act-1)*normalActQuestsNumber + number - if act > act4 { - key -= act4QuestsNumber + key := (act-1)*d2enum.NormalActQuestsNumber + number + if act > d2enum.Act4 { + key -= d2enum.HalfQuestsNumber } return key @@ -600,21 +554,21 @@ func (s *QuestLog) cordsToQuestID(act, number int) int { //nolint:deadcode,unused // I think, it will be used, if not, we can just remove it func (s *QuestLog) questIDToCords(id int) (act, number int) { - act = act1 + act = 1 - for i := 0; i < normalActQuestsNumber; i++ { - if id < normalActQuestsNumber { + for i := 0; i < d2enum.ActsNumber; i++ { + if id < d2enum.NormalActQuestsNumber { break } act++ - id -= normalActQuestsNumber + id -= d2enum.NormalActQuestsNumber } number = id - if act > act4 { - number -= act4QuestsNumber + if act > d2enum.Act4 { + number -= d2enum.HalfQuestsNumber } return act, number