mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-06-20 14:15:23 +00:00
animation stops playing, when quest log is closed & quest socket gets highlighted, when animation is playing & fixed highlight bug
This commit is contained in:
parent
856138daca
commit
8a027eb48d
|
@ -51,6 +51,8 @@ const (
|
||||||
questTabXOffset = 61
|
questTabXOffset = 61
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const questCompleteAnimationDuration = 3
|
||||||
|
|
||||||
func (s *QuestLog) getPositionForSocket(number int) (x, y int) {
|
func (s *QuestLog) getPositionForSocket(number int) (x, y int) {
|
||||||
pos := []struct {
|
pos := []struct {
|
||||||
x int
|
x int
|
||||||
|
@ -80,12 +82,12 @@ func NewQuestLog(asset *d2asset.AssetManager,
|
||||||
qs := map[int]int{
|
qs := map[int]int{
|
||||||
0: -2,
|
0: -2,
|
||||||
1: -2,
|
1: -2,
|
||||||
2: -1,
|
2: -2,
|
||||||
3: 0,
|
3: 0,
|
||||||
4: 1,
|
4: 1,
|
||||||
5: 2,
|
5: 2,
|
||||||
6: 3,
|
6: 3,
|
||||||
7: 0,
|
7: -1,
|
||||||
8: 0,
|
8: 0,
|
||||||
9: 0,
|
9: 0,
|
||||||
10: 0,
|
10: 0,
|
||||||
|
@ -169,7 +171,9 @@ type QuestLog struct {
|
||||||
|
|
||||||
type questEntire struct {
|
type questEntire struct {
|
||||||
*d2ui.WidgetGroup
|
*d2ui.WidgetGroup
|
||||||
icons []*d2ui.Sprite
|
icons []*d2ui.Sprite
|
||||||
|
buttons []*d2ui.Button
|
||||||
|
sockets []*d2ui.Sprite
|
||||||
}
|
}
|
||||||
|
|
||||||
/* questIconTab returns path to quest animation using its
|
/* questIconTab returns path to quest animation using its
|
||||||
|
@ -185,6 +189,11 @@ const (
|
||||||
notStartedFrame = 26
|
notStartedFrame = 26
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
socketNormalFrame = 0
|
||||||
|
socketHighlightedFrame = 1
|
||||||
|
)
|
||||||
|
|
||||||
const questDescriptionLenght = 30
|
const questDescriptionLenght = 30
|
||||||
|
|
||||||
type questLogTab struct {
|
type questLogTab struct {
|
||||||
|
@ -197,6 +206,9 @@ func (s *QuestLog) Load() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
s.completeSound, err = s.audioProvider.LoadSound(d2resource.QuestLogDoneSfx, false, false)
|
s.completeSound, err = s.audioProvider.LoadSound(d2resource.QuestLogDoneSfx, false, false)
|
||||||
|
if err != nil {
|
||||||
|
s.Error(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog)
|
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog)
|
||||||
|
|
||||||
|
@ -238,9 +250,10 @@ func (s *QuestLog) Load() {
|
||||||
|
|
||||||
s.loadTabs()
|
s.loadTabs()
|
||||||
|
|
||||||
|
// creates quest boards for each act
|
||||||
for i := 0; i < d2enum.ActsNumber; i++ {
|
for i := 0; i < d2enum.ActsNumber; i++ {
|
||||||
item, icons := s.loadQuestIconsForAct(i + 1)
|
item, icons, buttons, sockets := s.loadQuestBoard(i + 1)
|
||||||
s.quests[i] = &questEntire{item, icons}
|
s.quests[i] = &questEntire{item, icons, buttons, sockets}
|
||||||
}
|
}
|
||||||
|
|
||||||
s.panelGroup.SetVisible(false)
|
s.panelGroup.SetVisible(false)
|
||||||
|
@ -280,7 +293,8 @@ func (s *QuestLog) loadTabs() {
|
||||||
s.setTab(s.act - 1)
|
s.setTab(s.act - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *QuestLog) loadQuestIconsForAct(act int) (*d2ui.WidgetGroup, []*d2ui.Sprite) {
|
// loadQuestBoard creates quest fields (socket, button, icon) for specified act
|
||||||
|
func (s *QuestLog) loadQuestBoard(act int) (*d2ui.WidgetGroup, []*d2ui.Sprite, []*d2ui.Button, []*d2ui.Sprite) {
|
||||||
wg := s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog)
|
wg := s.uiManager.NewWidgetGroup(d2ui.RenderPriorityQuestLog)
|
||||||
|
|
||||||
var questsInAct int
|
var questsInAct int
|
||||||
|
@ -307,62 +321,68 @@ func (s *QuestLog) loadQuestIconsForAct(act int) (*d2ui.WidgetGroup, []*d2ui.Spr
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.SetPosition(x+questOffsetX, y+iconOffsetY+2*questOffsetY)
|
socket.SetPosition(x, y+iconOffsetY+questOffsetY)
|
||||||
sockets = append(sockets, socket)
|
sockets = append(sockets, socket)
|
||||||
|
|
||||||
|
icon, err = s.makeQuestIconForAct(act, n, x, y)
|
||||||
|
if err != nil {
|
||||||
|
s.Error(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
icons = append(icons, icon)
|
||||||
|
|
||||||
button := s.uiManager.NewButton(d2ui.ButtonTypeBlankQuestBtn, "")
|
button := s.uiManager.NewButton(d2ui.ButtonTypeBlankQuestBtn, "")
|
||||||
button.SetPosition(x+questOffsetX, y+questOffsetY)
|
button.SetPosition(x+questOffsetX, y+questOffsetY)
|
||||||
button.SetEnabled(s.questStatus[s.cordsToQuestID(act, cw)] != d2enum.QuestStatusNotStarted)
|
button.SetEnabled(s.questStatus[s.cordsToQuestID(act, cw)] != d2enum.QuestStatusNotStarted)
|
||||||
buttons = append(buttons, button)
|
buttons = append(buttons, button)
|
||||||
|
|
||||||
icon, err = s.makeQuestIconForAct(act, n)
|
|
||||||
if err != nil {
|
|
||||||
s.Error(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
icon.SetPosition(x+questOffsetX, y+questOffsetY+iconOffsetY)
|
|
||||||
|
|
||||||
icons = append(icons, icon)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < questsInAct; i++ {
|
for i := 0; i < questsInAct; i++ {
|
||||||
currentQuest := i
|
currentQuest := i
|
||||||
|
// creates callback for quest button
|
||||||
buttons[i].OnActivated(func() {
|
buttons[i].OnActivated(func() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
// set normal (not-highlighted) frame for each quest socket
|
||||||
for j := 0; j < questsInAct; j++ {
|
for j := 0; j < questsInAct; j++ {
|
||||||
err = sockets[j].SetCurrentFrame(0)
|
err = sockets[j].SetCurrentFrame(socketNormalFrame)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if act-1 == s.selectedTab {
|
|
||||||
err = sockets[currentQuest].SetCurrentFrame(1)
|
// highlights appropiate socket
|
||||||
if err != nil {
|
err = sockets[currentQuest].SetCurrentFrame(socketHighlightedFrame)
|
||||||
s.Error(err.Error())
|
if err != nil {
|
||||||
}
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
s.onQuestClicked(currentQuest + 1)
|
s.onQuestClicked(currentQuest + 1)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adds sockets to widget group
|
||||||
for _, s := range sockets {
|
for _, s := range sockets {
|
||||||
wg.AddWidget(s)
|
wg.AddWidget(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adds buttons to widget group
|
||||||
for _, b := range buttons {
|
for _, b := range buttons {
|
||||||
wg.AddWidget(b)
|
wg.AddWidget(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adds icons to widget group
|
||||||
for _, i := range icons {
|
for _, i := range icons {
|
||||||
wg.AddWidget(i)
|
wg.AddWidget(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
wg.SetVisible(false)
|
wg.SetVisible(false)
|
||||||
|
|
||||||
return wg, icons
|
return wg, icons, buttons, sockets
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *QuestLog) makeQuestIconForAct(act, n int) (*d2ui.Sprite, error) {
|
func (s *QuestLog) makeQuestIconForAct(act, n int, x, y int) (*d2ui.Sprite, error) {
|
||||||
iconResource := s.questIconsTable(act, n)
|
iconResource := s.questIconsTable(act, n)
|
||||||
|
|
||||||
icon, err := s.uiManager.NewSprite(iconResource, d2resource.PaletteSky)
|
icon, err := s.uiManager.NewSprite(iconResource, d2resource.PaletteSky)
|
||||||
|
@ -382,9 +402,12 @@ func (s *QuestLog) makeQuestIconForAct(act, n int) (*d2ui.Sprite, error) {
|
||||||
err = icon.SetCurrentFrame(inProgresFrame)
|
err = icon.SetCurrentFrame(inProgresFrame)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
icon.SetPosition(x+questOffsetX, y+questOffsetY+iconOffsetY)
|
||||||
|
|
||||||
return icon, err
|
return icon, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// playQuestAnimations plays animations for quests (when status=questStatusCompleting)
|
||||||
func (s *QuestLog) playQuestAnimations() {
|
func (s *QuestLog) playQuestAnimations() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -392,20 +415,25 @@ func (s *QuestLog) playQuestAnimations() {
|
||||||
questID := s.cordsToQuestID(s.selectedTab+1, j)
|
questID := s.cordsToQuestID(s.selectedTab+1, j)
|
||||||
if s.questStatus[questID] == d2enum.QuestStatusCompleting {
|
if s.questStatus[questID] == d2enum.QuestStatusCompleting {
|
||||||
s.completeSound.Play()
|
s.completeSound.Play()
|
||||||
|
|
||||||
|
// quest should be highlighted and it's label should be displayed
|
||||||
|
s.quests[s.selectedTab].buttons[j].Activate()
|
||||||
|
|
||||||
err = i.SetCurrentFrame(0)
|
err = i.SetCurrentFrame(0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
i.SetPlayLength(3)
|
i.SetPlayLength(questCompleteAnimationDuration)
|
||||||
i.PlayForward()
|
i.PlayForward()
|
||||||
i.SetPlayLoop(false)
|
i.SetPlayLoop(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setQuestLabel loads quest labels text (title and description)
|
||||||
func (s *QuestLog) setQuestLabel() {
|
func (s *QuestLog) setQuestLabel() {
|
||||||
if s.selectedQuest == 0 {
|
if s.selectedQuest == d2enum.QuestNone {
|
||||||
s.questName.SetText("")
|
s.questName.SetText("")
|
||||||
s.questDescr.SetText("")
|
s.questDescr.SetText("")
|
||||||
|
|
||||||
|
@ -416,7 +444,7 @@ func (s *QuestLog) setQuestLabel() {
|
||||||
|
|
||||||
status := s.questStatus[s.cordsToQuestID(s.selectedTab+1, s.selectedQuest)-1]
|
status := s.questStatus[s.cordsToQuestID(s.selectedTab+1, s.selectedQuest)-1]
|
||||||
switch status {
|
switch status {
|
||||||
case d2enum.QuestStatusCompleted:
|
case d2enum.QuestStatusCompleted, d2enum.QuestStatusCompleting:
|
||||||
s.questDescr.SetText(
|
s.questDescr.SetText(
|
||||||
strings.Join(
|
strings.Join(
|
||||||
d2util.SplitIntoLinesWithMaxWidth(
|
d2util.SplitIntoLinesWithMaxWidth(
|
||||||
|
@ -424,8 +452,6 @@ func (s *QuestLog) setQuestLabel() {
|
||||||
questDescriptionLenght),
|
questDescriptionLenght),
|
||||||
"\n"),
|
"\n"),
|
||||||
)
|
)
|
||||||
case d2enum.QuestStatusCompleting:
|
|
||||||
s.questDescr.SetText("")
|
|
||||||
case d2enum.QuestStatusNotStarted:
|
case d2enum.QuestStatusNotStarted:
|
||||||
s.questDescr.SetText("")
|
s.questDescr.SetText("")
|
||||||
default:
|
default:
|
||||||
|
@ -440,12 +466,26 @@ func (s *QuestLog) setQuestLabel() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *QuestLog) clearHighlightment() {
|
||||||
|
for _, i := range s.quests[s.selectedTab].sockets {
|
||||||
|
err := i.SetCurrentFrame(socketNormalFrame)
|
||||||
|
if err != nil {
|
||||||
|
s.Error(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *QuestLog) setTab(tab int) {
|
func (s *QuestLog) setTab(tab int) {
|
||||||
var mod int
|
var mod int
|
||||||
|
|
||||||
|
// before we leafe current tab, we need to switch highlighted
|
||||||
|
// quest socket to normal frame
|
||||||
|
s.clearHighlightment()
|
||||||
|
|
||||||
s.selectedTab = tab
|
s.selectedTab = tab
|
||||||
s.selectedQuest = d2enum.QuestNone
|
s.selectedQuest = d2enum.QuestNone
|
||||||
s.setQuestLabel()
|
s.setQuestLabel()
|
||||||
|
s.playQuestAnimations()
|
||||||
|
|
||||||
for i := 0; i < s.maxPlayersAct; i++ {
|
for i := 0; i < s.maxPlayersAct; i++ {
|
||||||
s.quests[i].SetVisible(tab == i)
|
s.quests[i].SetVisible(tab == i)
|
||||||
|
@ -508,9 +548,26 @@ func (s *QuestLog) Close() {
|
||||||
s.quests[i].SetVisible(false)
|
s.quests[i].SetVisible(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.stopPlayedAnimations()
|
||||||
|
|
||||||
s.onCloseCb()
|
s.onCloseCb()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *QuestLog) stopPlayedAnimations() {
|
||||||
|
// stops all played animations
|
||||||
|
for j, i := range s.quests[s.selectedTab].icons {
|
||||||
|
questID := s.cordsToQuestID(s.selectedTab+1, j)
|
||||||
|
if s.questStatus[questID] == d2enum.QuestStatusCompleting {
|
||||||
|
s.questStatus[questID] = d2enum.QuestStatusCompleted
|
||||||
|
|
||||||
|
err := i.SetCurrentFrame(completedFrame)
|
||||||
|
if err != nil {
|
||||||
|
s.Error(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SetOnCloseCb the callback run on closing the HeroStatsPanel
|
// SetOnCloseCb the callback run on closing the HeroStatsPanel
|
||||||
func (s *QuestLog) SetOnCloseCb(cb func()) {
|
func (s *QuestLog) SetOnCloseCb(cb func()) {
|
||||||
s.onCloseCb = cb
|
s.onCloseCb = cb
|
||||||
|
@ -528,6 +585,7 @@ func (s *QuestLog) Advance(elapsed float64) {
|
||||||
if err := i.Advance(elapsed); err != nil {
|
if err := i.Advance(elapsed); err != nil {
|
||||||
s.Error(err.Error())
|
s.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if i.GetCurrentFrame() == completedFrame {
|
if i.GetCurrentFrame() == completedFrame {
|
||||||
s.questStatus[questID] = d2enum.QuestStatusCompleted
|
s.questStatus[questID] = d2enum.QuestStatusCompleted
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user