party panel: party-index management methods

This commit is contained in:
M. Sz 2021-01-18 10:08:33 +01:00
parent 81ebabeeff
commit 63ef18c178
2 changed files with 141 additions and 73 deletions

View File

@ -173,7 +173,7 @@ func NewGameControls(
heroStatsPanel := NewHeroStatsPanel(asset, ui, hero.Name(), hero.Class, l, hero.Stats)
partyPanel := NewPartyPanel(asset, ui, hero.Name(), l, hero.Stats)
partyPanel := NewPartyPanel(asset, ui, hero.Name(), l, hero, hero.Stats)
questLog := NewQuestLog(asset, ui, l, audioProvider, hero.Act)

View File

@ -10,6 +10,7 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
)
@ -53,12 +54,49 @@ const (
baseSeeingSwitcherY = 140
baseListeningSwitcherY = 140
baseNameLabelY = 145
baseClassLabelY = 160
baseClassLabelY = 158
baseLevelLabelY = 160
nextBar = 52
)
// newPartyIndex creates new party index
func (s *PartyPanel) newPartyIndex(player *d2mapentity.Player, idx int, relations d2enum.PlayersRelationships) *partyIndex {
result := &partyIndex{
hero: player,
}
nameLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
nameLabel.SetText(player.Name())
result.name = nameLabel
classLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
classLabel.SetText(s.asset.TranslateString(player.Class.String()))
result.class = classLabel
levelLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
levelLabel.SetText(s.asset.TranslateString("level") + ": " + strconv.Itoa(player.Stats.Level))
levelLabel.Alignment = d2ui.HorizontalAlignRight
result.level = levelLabel
relationships := s.createSwitcher(relationshipsFrame)
result.relationshipSwitcher = relationships
seeing := s.createSwitcher(seeingButtonFrame)
result.seeingSwitcher = seeing
listening := s.createSwitcher(listeningButtonFrame)
result.listeningSwitcher = listening
result.relationships = relations
result.setColor(relations)
result.setPositions(idx)
return result
}
type partyIndex struct {
hero *d2mapentity.Player
name *d2ui.Label
class *d2ui.Label
level *d2ui.Label
@ -68,42 +106,6 @@ type partyIndex struct {
relationships d2enum.PlayersRelationships
}
// newPartyIndex creates new party index
func (s *PartyPanel) newPartyIndex(name string, class d2enum.Hero, level, idx int, relations d2enum.PlayersRelationships) *partyIndex {
result := &partyIndex{}
nameLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
nameLabel.SetText(name)
nameLabel.SetPosition(nameLabelX, baseNameLabelY+nextBar*idx)
result.name = nameLabel
classLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
classLabel.SetText(s.asset.TranslateString(class.String()))
classLabel.SetPosition(classLabelX, baseClassLabelY+nextBar*idx)
result.class = classLabel
levelLabel := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
levelLabel.SetText(s.asset.TranslateString("level") + ": " + strconv.Itoa(level))
levelLabel.Alignment = d2ui.HorizontalAlignRight
levelLabel.SetPosition(levelLabelX, baseLevelLabelY+nextBar*idx)
result.level = levelLabel
relationships := s.createSwitcher(relationshipsFrame, relationshipSwitcherX, baseRelationshipSwitcherY+nextBar*idx)
result.relationshipSwitcher = relationships
seeing := s.createSwitcher(seeingButtonFrame, seeingSwitcherX, baseSeeingSwitcherY+nextBar*idx)
result.seeingSwitcher = seeing
listening := s.createSwitcher(listeningButtonFrame, listeningSwitcherX, baseListeningSwitcherY+nextBar*idx)
result.listeningSwitcher = listening
result.relationships = relations
result.setColor(relations)
return result
}
func (pi *partyIndex) setColor(relations d2enum.PlayersRelationships) {
var color = d2util.Color(d2gui.ColorWhite)
@ -121,18 +123,91 @@ func (pi *partyIndex) setColor(relations d2enum.PlayersRelationships) {
pi.level.Color[0] = color
}
func (pi *partyIndex) setPositions(idx int) {
pi.name.SetPosition(nameLabelX, baseNameLabelY+nextBar*idx)
pi.class.SetPosition(classLabelX, baseClassLabelY+nextBar*idx)
pi.level.SetPosition(levelLabelX, baseLevelLabelY+nextBar*idx)
pi.relationshipSwitcher.SetPosition(relationshipSwitcherX, baseRelationshipSwitcherY+nextBar*idx)
pi.seeingSwitcher.SetPosition(seeingSwitcherX, baseSeeingSwitcherY+idx*nextBar)
pi.listeningSwitcher.SetPosition(listeningSwitcherX, baseListeningSwitcherY+idx*nextBar)
}
// DeletePlayer deletes player from PartyIndexes
func (s *PartyPanel) DeletePlayer(player *d2mapentity.Player) bool {
for n, i := range s.partyIndexes {
if i.hero == player {
s.partyIndexes[n] = nil
s.Sort()
return true
}
}
return false
}
// Sort sorts party indexes
func (s *PartyPanel) Sort() {
var sorted [maxPlayersInGame]*partyIndex
idx := 0
for _, i := range s.partyIndexes {
if i != nil {
sorted[idx] = i
idx++
}
}
s.partyIndexes = sorted
for n, i := range s.partyIndexes {
if i != nil {
i.setPositions(n)
}
}
}
// UpdatePlayer updates party-index
func (s *PartyPanel) UpdatePlayer(oldPlayer, newPlayer *d2mapentity.Player) bool {
for n, i := range s.partyIndexes {
if i.hero == oldPlayer {
s.partyIndexes[n].hero = newPlayer
return true
}
}
return false
}
func (s *PartyPanel) setBarPosition() {
for n, i := range s.partyIndexes {
currentN := n
if i == nil {
s.barX, s.barY = barX, baseBarY+currentN*nextBar
break
}
}
}
// NewPartyPanel creates a new party panel
func NewPartyPanel(asset *d2asset.AssetManager,
ui *d2ui.UIManager,
heroName string,
l d2util.LogLevel,
// example Player structure (me)
testPlayer *d2mapentity.Player,
heroState *d2hero.HeroStatsState) *PartyPanel {
originX := 0
originY := 0
var v [maxPlayersInGame]*partyIndex
for i := 0; i < maxPlayersInGame; i++ {
v[i] = &partyIndex{}
v[i] = nil
}
hsp := &PartyPanel{
@ -146,6 +221,8 @@ func NewPartyPanel(asset *d2asset.AssetManager,
partyIndexes: v,
barX: barX,
barY: baseBarY,
testPlayer: testPlayer,
}
hsp.Logger = d2util.NewLogger()
@ -175,6 +252,8 @@ type PartyPanel struct {
barY int
*d2util.Logger
testPlayer *d2mapentity.Player
}
// Load the data for the hero status panel
@ -213,56 +292,45 @@ func (s *PartyPanel) Load() {
}
// example data
s.partyIndexes[0] = s.newPartyIndex("PartyMember", d2enum.HeroPaladin, 5, 0, d2enum.PlayerRelationEnemy)
s.partyIndexes[1] = s.newPartyIndex("gameMember1", d2enum.HeroPaladin, 99, 1, d2enum.PlayerRelationFriend)
p0 := s.testPlayer
s.partyIndexes[0] = s.newPartyIndex(p0, 0, d2enum.PlayerRelationEnemy)
p1 := s.testPlayer
// nolint:gomnd // only test
p1.Stats.Level = 99
p1.Class = d2enum.HeroNecromancer
s.partyIndexes[1] = s.newPartyIndex(p1, 1, d2enum.PlayerRelationFriend)
for _, i := range s.partyIndexes {
// needed for "developing time" to avoit panic
if i.name != nil {
s.panelGroup.AddWidget(i.name)
}
if i.class != nil {
s.panelGroup.AddWidget(i.class)
}
if i.relationshipSwitcher != nil {
s.panelGroup.AddWidget(i.relationshipSwitcher)
}
if i.seeingSwitcher != nil {
s.panelGroup.AddWidget(i.seeingSwitcher)
}
if i.listeningSwitcher != nil {
s.panelGroup.AddWidget(i.listeningSwitcher)
}
if i.level != nil {
s.panelGroup.AddWidget(i.level)
}
if !s.DeletePlayer(p0) {
s.Warning("Cannot remove player: Player Not Found")
}
for n, i := range s.partyIndexes {
currentN := n
if i.name == nil {
s.barX, s.barY = barX, baseBarY+currentN*nextBar
break
for _, i := range s.partyIndexes {
if i != nil {
continue
}
s.panelGroup.AddWidget(i.name)
s.panelGroup.AddWidget(i.class)
s.panelGroup.AddWidget(i.relationshipSwitcher)
s.panelGroup.AddWidget(i.seeingSwitcher)
s.panelGroup.AddWidget(i.listeningSwitcher)
s.panelGroup.AddWidget(i.level)
}
w, h = s.bar.GetCurrentFrameSize()
v := s.uiManager.NewCustomWidget(s.renderBar, w, h)
s.panelGroup.AddWidget(v)
s.setBarPosition()
s.panelGroup.SetVisible(false)
}
func (s *PartyPanel) createSwitcher(frame, x, y int) *d2ui.SwitchableButton {
func (s *PartyPanel) createSwitcher(frame int) *d2ui.SwitchableButton {
active := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame)
inactive := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame+nextButtonFrame)
switcher := s.uiManager.NewSwitchableButton(active, inactive, true)
switcher.SetPosition(x, y)
switcher.SetVisible(false)
return switcher
}