mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-09 01:56:47 -05:00
174 lines
4.0 KiB
Go
174 lines
4.0 KiB
Go
package d2player
|
|
|
|
import (
|
|
// "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
|
"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
|
|
partyPanelTopLeft = iota
|
|
partyPanelTopRight
|
|
partyPanelBottomLeft
|
|
partyPanelBottomRight
|
|
)
|
|
|
|
const (
|
|
partyPanelOffsetX, partyPanelOffsetY = 80, 64
|
|
)
|
|
|
|
const (
|
|
partyPanelCloseButtonX, partyPanelCloseButtonY = 358, 453
|
|
)
|
|
|
|
// NewPartyPanel creates a new party panel
|
|
func NewPartyPanel(asset *d2asset.AssetManager,
|
|
ui *d2ui.UIManager,
|
|
heroName string,
|
|
l d2util.LogLevel,
|
|
heroState *d2hero.HeroStatsState) *PartyPanel {
|
|
originX := 0
|
|
originY := 0
|
|
|
|
hsp := &PartyPanel{
|
|
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
|
|
}
|
|
|
|
// PartyPanel represents the party panel
|
|
type PartyPanel struct {
|
|
asset *d2asset.AssetManager
|
|
uiManager *d2ui.UIManager
|
|
panel *d2ui.Sprite
|
|
heroState *d2hero.HeroStatsState
|
|
heroName string
|
|
labels *StatsPanelLabels
|
|
onCloseCb func()
|
|
panelGroup *d2ui.WidgetGroup
|
|
|
|
originX int
|
|
originY int
|
|
isOpen bool
|
|
|
|
*d2util.Logger
|
|
}
|
|
|
|
// Load the data for the hero status panel
|
|
func (s *PartyPanel) Load() {
|
|
var err error
|
|
|
|
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
|
|
|
|
frame := s.uiManager.NewUIFrame(d2ui.FrameLeft)
|
|
s.panelGroup.AddWidget(frame)
|
|
|
|
s.panel, err = s.uiManager.NewSprite(d2resource.PartyPanel, d2resource.PaletteSky)
|
|
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)
|
|
closeButton.SetPosition(partyPanelCloseButtonX, partyPanelCloseButtonY)
|
|
closeButton.OnActivated(func() { s.Close() })
|
|
s.panelGroup.AddWidget(closeButton)
|
|
|
|
s.panelGroup.SetVisible(false)
|
|
}
|
|
|
|
// IsOpen returns true if the hero status panel is open
|
|
func (s *PartyPanel) IsOpen() bool {
|
|
return s.isOpen
|
|
}
|
|
|
|
// Toggle toggles the visibility of the hero status panel
|
|
func (s *PartyPanel) Toggle() {
|
|
if s.isOpen {
|
|
s.Close()
|
|
} else {
|
|
s.Open()
|
|
}
|
|
}
|
|
|
|
// Open opens the hero status panel
|
|
func (s *PartyPanel) Open() {
|
|
s.isOpen = true
|
|
s.panelGroup.SetVisible(true)
|
|
}
|
|
|
|
// Close closed the hero status panel
|
|
func (s *PartyPanel) Close() {
|
|
s.isOpen = false
|
|
s.panelGroup.SetVisible(false)
|
|
}
|
|
|
|
// SetOnCloseCb the callback run on closing the PartyPanel
|
|
func (s *PartyPanel) SetOnCloseCb(cb func()) {
|
|
s.onCloseCb = cb
|
|
}
|
|
|
|
// Advance advances panel
|
|
func (s *PartyPanel) Advance(_ float64) {
|
|
// noop
|
|
}
|
|
|
|
func (s *PartyPanel) renderStaticMenu(target d2interface.Surface) {
|
|
s.renderStaticPanelFrames(target)
|
|
}
|
|
|
|
// nolint:dupl // see quest_log.go.renderStaticPanelFrames comment
|
|
func (s *PartyPanel) renderStaticPanelFrames(target d2interface.Surface) {
|
|
frames := []int{
|
|
partyPanelTopLeft,
|
|
partyPanelTopRight,
|
|
partyPanelBottomRight,
|
|
partyPanelBottomLeft,
|
|
}
|
|
|
|
currentX := s.originX + partyPanelOffsetX
|
|
currentY := s.originY + partyPanelOffsetY
|
|
|
|
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)
|
|
}
|
|
}
|