party panel: rearranged constants (moved part of them into d2enum)

This commit is contained in:
M. Sz 2021-01-19 17:39:40 +01:00
parent 57bf4078b6
commit 07eeec4827
3 changed files with 194 additions and 192 deletions

View File

@ -0,0 +1,11 @@
package d2enum
// Frames of party Buttons
const (
PartyButtonListeningFrame = iota * 4
PartyButtonRelationshipsFrame
PartyButtonSeeingFrame
PartyButtonCorpsLootingFrame
PartyButtonNextButtonFrame = 2
)

View File

@ -9,3 +9,11 @@ const (
PlayerRelationFriend PlayerRelationFriend
PlayerRelationEnemy PlayerRelationEnemy
) )
const (
PlayersHostileLevel = 9
)
const (
MaxPlayersInGame = 8
)

View File

@ -22,10 +22,6 @@ const (
orange = 0xffa800ff orange = 0xffa800ff
) )
const (
playerHostileLevel = 9
)
const ( // for the dc6 frames const ( // for the dc6 frames
partyPanelTopLeft = iota partyPanelTopLeft = iota
partyPanelTopRight partyPanelTopRight
@ -33,6 +29,11 @@ const ( // for the dc6 frames
partyPanelBottomRight partyPanelBottomRight
) )
const ( // for bar's dc6 frames
barLeft = iota
barRight
)
const ( const (
partyPanelOffsetX, partyPanelOffsetY = 80, 64 partyPanelOffsetX, partyPanelOffsetY = 80, 64
) )
@ -42,41 +43,21 @@ const (
partyPanelHeroNameX, partyPanelHeroNameY = 180, 80 partyPanelHeroNameX, partyPanelHeroNameY = 180, 80
) )
const (
listeningButtonFrame = iota * 4
relationshipsFrame
seeingButtonFrame
// nolint:deadcode,varcheck,unused // will be used
lockButtonFrame
nextButtonFrame = 2
)
const ( const (
buttonSize = 19 buttonSize = 19
) )
const ( const (
maxPlayersInGame = 8 barX, baseBarY = 90, 134
barX = 90 relationshipSwitcherX, baseRelationshipSwitcherY = 95, 150
relationshipSwitcherX = 95 listeningSwitcherX, baseListeningSwitcherY = 342, 140
listeningSwitcherX = 345 seeingSwitcherX, baseSeeingSwitcherY = 365, 140
seeingSwitcherX = 365 nameLabelX, baseNameLabelY = 115, 144
nameLabelX = 115 nameTooltipX, baseNameTooltipY = 100, 120
nameTooltipX = 100 classLabelX, baseClassLabelY = 115, 158
classLabelX = 115 levelLabelX, baseLevelLabelY = 386, 160
levelLabelX = 383 inviteAcceptButtonX, baseInviteAcceptButtonY = 265, 147
inviteAcceptButtonX = 250 indexOffset = 52
baseBarY = 134
baseRelationshipSwitcherY = 150
baseSeeingSwitcherY = 140
baseListeningSwitcherY = 140
baseNameLabelY = 144
baseNameTooltipY = 120
baseClassLabelY = 158
baseLevelLabelY = 160
baseInviteAcceptButtonY = 140
indexOffset = 52
) )
// newPartyIndex creates new party index // newPartyIndex creates new party index
@ -99,7 +80,7 @@ func (s *PartyPanel) newPartyIndex() *partyIndex {
levelLabel.Alignment = d2ui.HorizontalAlignRight levelLabel.Alignment = d2ui.HorizontalAlignRight
result.level = levelLabel result.level = levelLabel
relationships := s.createSwitcher(relationshipsFrame) relationships := s.createSwitcher(d2enum.PartyButtonRelationshipsFrame)
relationships.SetDisabledColor(lightRed) relationships.SetDisabledColor(lightRed)
result.relationshipsActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop) result.relationshipsActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
@ -113,7 +94,7 @@ func (s *PartyPanel) newPartyIndex() *partyIndex {
result.relationshipSwitcher = relationships result.relationshipSwitcher = relationships
seeing := s.createSwitcher(seeingButtonFrame) seeing := s.createSwitcher(d2enum.PartyButtonSeeingFrame)
result.seeingActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop) result.seeingActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.seeingActiveTooltip.SetText(s.asset.TranslateString("strParty19")) result.seeingActiveTooltip.SetText(s.asset.TranslateString("strParty19"))
@ -125,7 +106,7 @@ func (s *PartyPanel) newPartyIndex() *partyIndex {
result.seeingSwitcher = seeing result.seeingSwitcher = seeing
listening := s.createSwitcher(listeningButtonFrame) listening := s.createSwitcher(d2enum.PartyButtonListeningFrame)
result.listeningActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop) result.listeningActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.listeningActiveTooltip.SetText(s.asset.TranslateString("strParty17") + "\n" + s.asset.TranslateString("strParty18")) result.listeningActiveTooltip.SetText(s.asset.TranslateString("strParty17") + "\n" + s.asset.TranslateString("strParty18"))
@ -243,147 +224,7 @@ func (pi *partyIndex) setPositions(idx int) {
} }
func (pi *partyIndex) CanGoHostile() bool { func (pi *partyIndex) CanGoHostile() bool {
return pi.hero.Stats.Level >= playerHostileLevel && pi.me.Stats.Level >= playerHostileLevel return pi.hero.Stats.Level >= d2enum.PlayersHostileLevel && pi.me.Stats.Level >= d2enum.PlayersHostileLevel
}
// AddPlayer adds a new player to the party panel
func (s *PartyPanel) AddPlayer(player *d2mapentity.Player, relations d2enum.PlayersRelationships) {
idx := 0
// search for free index
for n, i := range s.partyIndexes {
if i.hero == nil {
idx = n
break
}
}
s.partyIndexes[idx].hero = player
s.partyIndexes[idx].name.SetText(player.Name())
s.partyIndexes[idx].class.SetText(s.asset.TranslateString(player.Class.String()))
s.partyIndexes[idx].level.SetText(s.asset.TranslateString("Level") + ":" + strconv.Itoa(player.Stats.Level))
s.partyIndexes[idx].relationships = relations
s.partyIndexes[idx].setColor(relations)
s.partyIndexes[idx].setPositions(idx)
s.partyIndexes[idx].setNameTooltipText()
}
// DeletePlayer deletes player from PartyIndexes
func (s *PartyPanel) DeletePlayer(player *d2mapentity.Player) bool {
for n, i := range s.partyIndexes {
if i.hero == player {
s.Debugf("removing player at index %d", n)
s.partyIndexes[n].hero = nil
s.Sort()
return true
}
}
return false
}
// Sort sorts party indexes
func (s *PartyPanel) Sort() {
var emptySlots []*partyIndex
var emptySlotsNumbers []int
var fullSlots []*partyIndex
var fullSlotsNumbers []int
// split s.partyIndexes to empty and non-empty
for n, i := range s.partyIndexes {
if i.hero == nil {
emptySlots = append(emptySlots, i)
emptySlotsNumbers = append(emptySlotsNumbers, n)
} else {
fullSlots = append(fullSlots, i)
fullSlotsNumbers = append(fullSlotsNumbers, n)
}
}
// adds non-empty indexes befor empty indexes
for n, i := range fullSlots {
s.partyIndexes[n] = i
}
// adds empty indexes
for n, i := range emptySlots {
s.partyIndexes[len(fullSlots)+n] = i
}
// sorts widget groups
var sortedWG [maxPlayersInGame]*d2ui.WidgetGroup
// first add non empty WG's
for n, i := range fullSlotsNumbers {
sortedWG[n] = s.indexes[i]
}
// after that, adds empty WG's
for n, i := range emptySlotsNumbers {
sortedWG[len(fullSlotsNumbers)+n] = s.indexes[i]
}
// overwrite existing order
s.indexes = sortedWG
// sets appropriate positions
for n, i := range s.partyIndexes {
if i.hero != nil {
i.setPositions(n)
}
}
}
// IsInPanel returns true if player given already exists in panel
func (s *PartyPanel) IsInPanel(player *d2mapentity.Player) bool {
for _, i := range s.partyIndexes {
if i.hero == player {
return true
}
}
return false
}
// IsMe returns true if player given is "me"
func (s *PartyPanel) IsMe(player *d2mapentity.Player) bool {
return player == s.me
}
// setBarPosition sets party-panel bar's position
func (s *PartyPanel) setBarPosition() {
for n, i := range s.partyIndexes {
currentN := n
if i.hero == nil {
s.barX, s.barY = barX, baseBarY+currentN*indexOffset
break
}
}
}
// UpdatePanel updates panel indexes with players list
func (s *PartyPanel) UpdatePanel() {
for _, i := range s.players {
if !s.IsInPanel(i) && !s.IsMe(i) {
s.AddPlayer(i, d2enum.PlayerRelationNeutral)
// we need to switch all hidden widgets to be visible
if s.IsOpen() {
s.Open()
}
}
}
} }
// NewPartyPanel creates a new party panel // NewPartyPanel creates a new party panel
@ -413,11 +254,11 @@ func NewPartyPanel(asset *d2asset.AssetManager,
me: me, me: me,
} }
var partyIndexes [maxPlayersInGame]*partyIndex var partyIndexes [d2enum.MaxPlayersInGame]*partyIndex
var indexes [maxPlayersInGame]*d2ui.WidgetGroup var indexes [d2enum.MaxPlayersInGame]*d2ui.WidgetGroup
for i := 0; i < maxPlayersInGame; i++ { for i := 0; i < d2enum.MaxPlayersInGame; i++ {
partyIndexes[i] = pp.newPartyIndex() partyIndexes[i] = pp.newPartyIndex()
indexes[i] = pp.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel) indexes[i] = pp.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
} }
@ -443,8 +284,8 @@ type PartyPanel struct {
onCloseCb func() onCloseCb func()
panelGroup *d2ui.WidgetGroup panelGroup *d2ui.WidgetGroup
partyIndexes [maxPlayersInGame]*partyIndex partyIndexes [d2enum.MaxPlayersInGame]*partyIndex
indexes [maxPlayersInGame]*d2ui.WidgetGroup indexes [d2enum.MaxPlayersInGame]*d2ui.WidgetGroup
players map[string]*d2mapentity.Player players map[string]*d2mapentity.Player
me *d2mapentity.Player me *d2mapentity.Player
@ -466,7 +307,7 @@ func (s *PartyPanel) Load() {
// create widgetGroups // create widgetGroups
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel) s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
for i := 0; i < maxPlayersInGame; i++ { for i := 0; i < d2enum.MaxPlayersInGame; i++ {
s.indexes[i] = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel) s.indexes[i] = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
} }
@ -531,7 +372,7 @@ func (s *PartyPanel) Load() {
// createSwitcher creates party-panel switcher using frame given // createSwitcher creates party-panel switcher using frame given
func (s *PartyPanel) createSwitcher(frame int) *d2ui.SwitchableButton { func (s *PartyPanel) createSwitcher(frame int) *d2ui.SwitchableButton {
active := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame) active := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame)
inactive := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame+nextButtonFrame) inactive := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame+d2enum.PartyButtonNextButtonFrame)
switcher := s.uiManager.NewSwitchableButton(active, inactive, true) switcher := s.uiManager.NewSwitchableButton(active, inactive, true)
switcher.SetVisible(false) switcher.SetVisible(false)
@ -579,6 +420,153 @@ func (s *PartyPanel) SetOnCloseCb(cb func()) {
s.onCloseCb = cb s.onCloseCb = cb
} }
// AddPlayer adds a new player to the party panel
func (s *PartyPanel) AddPlayer(player *d2mapentity.Player, relations d2enum.PlayersRelationships) {
idx := 0
// search for free index
for n, i := range s.partyIndexes {
if i.hero == nil {
idx = n
break
}
}
s.partyIndexes[idx].hero = player
s.partyIndexes[idx].name.SetText(player.Name())
s.partyIndexes[idx].class.SetText(s.asset.TranslateString(player.Class.String()))
s.partyIndexes[idx].level.SetText(s.asset.TranslateString("Level") + ":" + strconv.Itoa(player.Stats.Level))
s.partyIndexes[idx].relationships = relations
s.partyIndexes[idx].setColor(relations)
s.partyIndexes[idx].setPositions(idx)
s.partyIndexes[idx].setNameTooltipText()
}
// DeletePlayer deletes player from PartyIndexes
func (s *PartyPanel) DeletePlayer(player *d2mapentity.Player) bool {
for n, i := range s.partyIndexes {
if i.hero == player {
s.Debugf("removing player at index %d", n)
s.partyIndexes[n].hero = nil
s.Sort()
return true
}
}
return false
}
// Sort sorts party indexes
func (s *PartyPanel) Sort() {
var emptySlots []*partyIndex
var emptySlotsNumbers []int
var fullSlots []*partyIndex
var fullSlotsNumbers []int
// split s.partyIndexes to empty and non-empty
for n, i := range s.partyIndexes {
if i.hero == nil {
emptySlots = append(emptySlots, i)
emptySlotsNumbers = append(emptySlotsNumbers, n)
} else {
fullSlots = append(fullSlots, i)
fullSlotsNumbers = append(fullSlotsNumbers, n)
}
}
// adds non-empty indexes befor empty indexes
for n, i := range fullSlots {
s.partyIndexes[n] = i
}
// adds empty indexes
for n, i := range emptySlots {
s.partyIndexes[len(fullSlots)+n] = i
}
// sorts widget groups
var sortedWG [d2enum.MaxPlayersInGame]*d2ui.WidgetGroup
// first add non empty WG's
for n, i := range fullSlotsNumbers {
sortedWG[n] = s.indexes[i]
}
// after that, adds empty WG's
for n, i := range emptySlotsNumbers {
sortedWG[len(fullSlotsNumbers)+n] = s.indexes[i]
}
// overwrite existing order
s.indexes = sortedWG
// sets appropriate positions
for n, i := range s.partyIndexes {
if i.hero != nil {
i.setPositions(n)
}
}
}
// IsInPanel returns true if player given already exists in panel
func (s *PartyPanel) IsInPanel(player *d2mapentity.Player) bool {
for _, i := range s.partyIndexes {
if i.hero == player {
return true
}
}
return false
}
// IsMe returns true if player given is "me"
func (s *PartyPanel) IsMe(player *d2mapentity.Player) bool {
return player == s.me
}
// setBarPosition sets party-panel bar's position
func (s *PartyPanel) setBarPosition() {
for n, i := range s.partyIndexes {
currentN := n
if i.hero == nil {
s.barX, s.barY = barX, baseBarY+currentN*indexOffset
break
}
}
}
// UpdatePanel updates panel indexes with players list
func (s *PartyPanel) UpdatePanel() {
for _, i := range s.players {
if !s.IsInPanel(i) && !s.IsMe(i) {
s.AddPlayer(i, d2enum.PlayerRelationNeutral)
// we need to switch all hidden widgets to be visible
// s.Open contains appropriate code to do that.
if s.IsOpen() {
s.Open()
}
}
}
}
// UpdatePlayersList updates internal players list
func (s *PartyPanel) UpdatePlayersList(list map[string]*d2mapentity.Player) {
s.players = list
}
// Advance advances panel // Advance advances panel
func (s *PartyPanel) Advance(_ float64) { func (s *PartyPanel) Advance(_ float64) {
if !s.IsOpen() { if !s.IsOpen() {
@ -588,11 +576,6 @@ func (s *PartyPanel) Advance(_ float64) {
s.UpdatePanel() s.UpdatePanel()
} }
// UpdatePlayersList updates internal players list
func (s *PartyPanel) UpdatePlayersList(list map[string]*d2mapentity.Player) {
s.players = list
}
// OnMouseMove handles mouse movement events // OnMouseMove handles mouse movement events
func (s *PartyPanel) OnMouseMove(event d2interface.MouseMoveEvent) bool { func (s *PartyPanel) OnMouseMove(event d2interface.MouseMoveEvent) bool {
mx, my := event.X(), event.Y() mx, my := event.X(), event.Y()
@ -648,8 +631,8 @@ func (s *PartyPanel) renderStaticPanelFrames(target d2interface.Surface) {
// renderBar renders party panel's bar // renderBar renders party panel's bar
func (s *PartyPanel) renderBar(target d2interface.Surface) { func (s *PartyPanel) renderBar(target d2interface.Surface) {
frames := []int{ frames := []int{
partyPanelTopLeft, barLeft,
partyPanelTopRight, barRight,
} }
currentX := s.originX + s.barX currentX := s.originX + s.barX