OpenDiablo2/d2game/d2player/party_panel.go

174 lines
4.0 KiB
Go
Raw Normal View History

2021-01-13 16:34:33 +00:00
package d2player
import (
2021-01-15 12:04:46 +00:00
// "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
2021-01-13 16:34:33 +00:00
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
)
const ( // for the dc6 frames
2021-01-14 18:24:18 +00:00
partyPanelTopLeft = iota
partyPanelTopRight
partyPanelBottomLeft
partyPanelBottomRight
2021-01-13 16:34:33 +00:00
)
const (
partyPanelOffsetX, partyPanelOffsetY = 80, 64
2021-01-13 16:34:33 +00:00
)
const (
2021-01-14 18:24:18 +00:00
partyPanelCloseButtonX, partyPanelCloseButtonY = 358, 453
2021-01-13 16:34:33 +00:00
)
2021-01-15 12:04:46 +00:00
// NewPartyPanel creates a new party panel
2021-01-14 18:24:18 +00:00
func NewPartyPanel(asset *d2asset.AssetManager,
2021-01-13 16:34:33 +00:00
ui *d2ui.UIManager,
heroName string,
l d2util.LogLevel,
2021-01-14 18:24:18 +00:00
heroState *d2hero.HeroStatsState) *PartyPanel {
2021-01-13 16:34:33 +00:00
originX := 0
originY := 0
2021-01-14 18:24:18 +00:00
hsp := &PartyPanel{
2021-01-13 16:34:33 +00:00
asset: asset,
uiManager: ui,
originX: originX,
originY: originY,
heroState: heroState,
heroName: heroName,
labels: &StatsPanelLabels{},
}
hsp.Logger = d2util.NewLogger()
hsp.Logger.SetLevel(l)
hsp.Logger.SetPrefix(logPrefix)
return hsp
}
2021-01-15 12:04:46 +00:00
// PartyPanel represents the party panel
2021-01-14 18:24:18 +00:00
type PartyPanel struct {
2021-01-15 12:04:46 +00:00
asset *d2asset.AssetManager
uiManager *d2ui.UIManager
panel *d2ui.Sprite
heroState *d2hero.HeroStatsState
heroName string
labels *StatsPanelLabels
onCloseCb func()
panelGroup *d2ui.WidgetGroup
2021-01-13 16:34:33 +00:00
originX int
originY int
isOpen bool
*d2util.Logger
}
// Load the data for the hero status panel
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) Load() {
2021-01-13 16:34:33 +00:00
var err error
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
frame := s.uiManager.NewUIFrame(d2ui.FrameLeft)
s.panelGroup.AddWidget(frame)
2021-01-14 18:24:18 +00:00
s.panel, err = s.uiManager.NewSprite(d2resource.PartyPanel, d2resource.PaletteSky)
2021-01-13 16:34:33 +00:00
if err != nil {
s.Error(err.Error())
}
w, h := frame.GetSize()
staticPanel := s.uiManager.NewCustomWidgetCached(s.renderStaticMenu, w, h)
s.panelGroup.AddWidget(staticPanel)
closeButton := s.uiManager.NewButton(d2ui.ButtonTypeSquareClose, "")
closeButton.SetVisible(false)
2021-01-14 18:24:18 +00:00
closeButton.SetPosition(partyPanelCloseButtonX, partyPanelCloseButtonY)
2021-01-13 16:34:33 +00:00
closeButton.OnActivated(func() { s.Close() })
s.panelGroup.AddWidget(closeButton)
s.panelGroup.SetVisible(false)
}
// IsOpen returns true if the hero status panel is open
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) IsOpen() bool {
2021-01-13 16:34:33 +00:00
return s.isOpen
}
// Toggle toggles the visibility of the hero status panel
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) Toggle() {
2021-01-13 16:34:33 +00:00
if s.isOpen {
s.Close()
} else {
s.Open()
}
}
// Open opens the hero status panel
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) Open() {
2021-01-13 16:34:33 +00:00
s.isOpen = true
s.panelGroup.SetVisible(true)
}
// Close closed the hero status panel
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) Close() {
2021-01-13 16:34:33 +00:00
s.isOpen = false
s.panelGroup.SetVisible(false)
}
2021-01-15 12:04:46 +00:00
// SetOnCloseCb the callback run on closing the PartyPanel
func (s *PartyPanel) SetOnCloseCb(cb func()) {
2021-01-13 16:34:33 +00:00
s.onCloseCb = cb
}
// Advance advances panel
func (s *PartyPanel) Advance(_ float64) {
// noop
2021-01-13 16:34:33 +00:00
}
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) renderStaticMenu(target d2interface.Surface) {
2021-01-13 16:34:33 +00:00
s.renderStaticPanelFrames(target)
}
// nolint:dupl // see quest_log.go.renderStaticPanelFrames comment
2021-01-14 18:24:18 +00:00
func (s *PartyPanel) renderStaticPanelFrames(target d2interface.Surface) {
2021-01-13 16:34:33 +00:00
frames := []int{
2021-01-14 18:24:18 +00:00
partyPanelTopLeft,
partyPanelTopRight,
partyPanelBottomRight,
partyPanelBottomLeft,
2021-01-13 16:34:33 +00:00
}
currentX := s.originX + partyPanelOffsetX
currentY := s.originY + partyPanelOffsetY
2021-01-13 16:34:33 +00:00
for _, frameIndex := range frames {
if err := s.panel.SetCurrentFrame(frameIndex); err != nil {
s.Error(err.Error())
}
w, h := s.panel.GetCurrentFrameSize()
switch frameIndex {
case statsPanelTopLeft:
s.panel.SetPosition(currentX, currentY+h)
currentX += w
case statsPanelTopRight:
s.panel.SetPosition(currentX, currentY+h)
currentY += h
case statsPanelBottomRight:
s.panel.SetPosition(currentX, currentY+h)
case statsPanelBottomLeft:
s.panel.SetPosition(currentX-w, currentY+h)
}
s.panel.Render(target)
}
}