* Init for gold button and label

* gold button and label in inventory menu

* gold value saved/loaded from player save file

Co-authored-by: M. Sz <mszeptuch@protonmail.com>
This commit is contained in:
gucio321 2020-11-22 23:53:33 +01:00 committed by GitHub
parent 24affd785c
commit 7919b742bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 170 additions and 56 deletions

View File

@ -286,7 +286,6 @@ func (am *AssetManager) TranslateString(key string) string {
return value
}
}
// Fix to allow v.setDescLabels("#123") to be bypassed for a patch in issue #360. Reenable later.
// log.Panicf("Could not find a string for the key '%s'", key)
return key

View File

@ -18,4 +18,5 @@ type HeroState struct {
Y float64 `json:"y"`
LeftSkill int `json:"leftSkill"`
RightSkill int `json:"rightSkill"`
Gold int `json:"Gold"`
}

View File

@ -64,7 +64,7 @@ func NewAnimatedEntity(x, y int, animation d2interface.Animation) *AnimatedEntit
// NewPlayer creates a new player entity and returns a pointer to it.
func (f *MapEntityFactory) NewPlayer(id, name string, x, y, direction int, heroType d2enum.Hero,
stats *d2hero.HeroStatsState, skills map[int]*d2hero.HeroSkill, equipment *d2inventory.CharacterEquipment,
leftSkill, rightSkill int) *Player {
leftSkill, rightSkill int, gold int) *Player {
layerEquipment := &[d2enum.CompositeTypeMax]string{
d2enum.CompositeTypeHead: equipment.Head.GetArmorClass(),
d2enum.CompositeTypeTorso: equipment.Torso.GetArmorClass(),
@ -101,6 +101,7 @@ func (f *MapEntityFactory) NewPlayer(id, name string, x, y, direction int, heroT
isRunToggled: false,
isInTown: true,
isRunning: false,
Gold: gold,
}
result.mapEntity.uuid = id

View File

@ -23,6 +23,7 @@ type Player struct {
LeftSkill *d2hero.HeroSkill
RightSkill *d2hero.HeroSkill
Class d2enum.Hero
Gold int
lastPathSize int
isInTown bool
isRunToggled bool

View File

@ -38,9 +38,16 @@ const (
ButtonTypeMinipanelQuest ButtonType = 18
ButtonTypeMinipanelMen ButtonType = 19
ButtonTypeSquareClose ButtonType = 20
ButtonTypeSkillTreeTab ButtonType = 21
ButtonTypeMinipanelOpenClose ButtonType = 22
ButtonTypeMinipanelParty ButtonType = 23
ButtonTypeSquareOk ButtonType = 21
ButtonTypeSkillTreeTab ButtonType = 22
ButtonTypeMinipanelOpenClose ButtonType = 23
ButtonTypeMinipanelParty ButtonType = 24
ButtonTypeBuy ButtonType = 25
ButtonTypeSell ButtonType = 26
ButtonTypeRepair ButtonType = 27
ButtonTypeRepairAll ButtonType = 28
ButtonTypeLeftArrow ButtonType = 29
ButtonTypeRightArrow ButtonType = 30
ButtonNoFixedWidth int = -1
ButtonNoFixedHeight int = -1
@ -53,7 +60,16 @@ const (
)
const (
// buyButtonBaseFrame = 2 // base frame offset of the "buy" button dc6
// sellButtonBaseFrame = 4 // base frame offset of the "sell" button dc6
// repairButtonBaseFrame = 6 // base frame offset of the "repair" button dc6
// quaryButtonBaseFrame = 8 // base frame offset of the "quary" button dc6
closeButtonBaseFrame = 10 // base frame offset of the "close" button dc6
// leftArrowButtonBaseFrame = 12 // base frame offset of the "leftArrow" button dc6
// rightArrowButtonBaseFrame = 14 // base frame offset of the "rightArrow" button dc6
okButtonBaseFrame = 16 // base frame offset of the "ok" button dc6
// repairAllButtonBaseFrame = 18 // base frame offset of the "repair all" button dc6
// ?AllButtonBaseFrame = 20 // base frame offset of the "?" button dc6
)
const (
@ -88,6 +104,7 @@ type ButtonLayout struct {
const (
buttonTooltipNone int = iota
buttonTooltipClose
buttonTooltipOk
)
const (
@ -146,6 +163,10 @@ const (
buttonRunSegmentsY = 1
buttonRunDisabledFrame = -1
buttonGoldCoinSegmentsX = 1
buttonGoldCoinSegmentsY = 1
buttonGoldCoinDisabledFrame = -1
pressedButtonOffset = 2
)
@ -238,6 +259,21 @@ func getButtonLayouts() map[ButtonType]ButtonLayout {
FixedHeight: ButtonNoFixedHeight,
LabelColor: greyAlpha100,
},
ButtonTypeGoldCoin: {
XSegments: buttonGoldCoinSegmentsX,
YSegments: buttonGoldCoinSegmentsY,
DisabledFrame: buttonGoldCoinDisabledFrame,
DisabledColor: lightGreyAlpha75,
ResourceName: d2resource.GoldCoinButton,
PaletteName: d2resource.PaletteSky,
Toggleable: true,
FontPath: d2resource.FontRediculous,
AllowFrameChange: true,
HasImage: true,
FixedWidth: ButtonNoFixedWidth,
FixedHeight: ButtonNoFixedHeight,
LabelColor: greyAlpha100,
},
ButtonTypeSquareClose: {
XSegments: buttonBuySellSegmentsX,
YSegments: buttonBuySellSegmentsY,
@ -257,6 +293,25 @@ func getButtonLayouts() map[ButtonType]ButtonLayout {
TooltipXOffset: buttonCloseTooltipXOffset,
TooltipYOffset: buttonCloseTooltipYOffset,
},
ButtonTypeSquareOk: {
XSegments: buttonBuySellSegmentsX,
YSegments: buttonBuySellSegmentsY,
DisabledFrame: buttonBuySellDisabledFrame,
DisabledColor: lightGreyAlpha75,
ResourceName: d2resource.BuySellButton,
PaletteName: d2resource.PaletteUnits,
Toggleable: true,
FontPath: d2resource.Font30,
AllowFrameChange: true,
BaseFrame: okButtonBaseFrame,
HasImage: true,
FixedWidth: ButtonNoFixedWidth,
FixedHeight: ButtonNoFixedHeight,
LabelColor: greyAlpha100,
Tooltip: buttonTooltipOk,
TooltipXOffset: buttonCloseTooltipXOffset,
TooltipYOffset: buttonCloseTooltipYOffset,
},
ButtonTypeSkillTreeTab: {
XSegments: buttonSkillTreeTabXSegments,
YSegments: buttonSkillTreeTabYSegments,
@ -521,6 +576,9 @@ func (v *Button) createTooltip() {
case buttonTooltipClose:
t = v.manager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, TooltipXCenter, TooltipYBottom)
t.SetText(v.manager.asset.TranslateString("strClose"))
case buttonTooltipOk:
t = v.manager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, TooltipXCenter, TooltipYBottom)
t.SetText(v.manager.asset.TranslateString("#971"))
}
t.SetVisible(false)

View File

@ -365,6 +365,7 @@ func (v *CharacterSelect) updateCharacterBoxes() {
&equipment,
v.gameStates[idx].LeftSkill,
v.gameStates[idx].RightSkill,
v.gameStates[idx].Gold,
)
}
}

View File

@ -209,7 +209,7 @@ func NewGameControls(
inventoryRecord := asset.Records.Layout.Inventory[inventoryRecordKey]
heroStatsPanel := NewHeroStatsPanel(asset, ui, hero.Name(), hero.Class, l, hero.Stats)
inventory := NewInventory(asset, ui, l, inventoryRecord)
inventory := NewInventory(asset, ui, l, hero.Gold, inventoryRecord)
skilltree := newSkillTree(hero.Skills, hero.Class, asset, l, ui)
miniPanel := newMiniPanel(asset, ui, l, isSinglePlayer)

View File

@ -1,6 +1,8 @@
package d2player
import (
"fmt"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2records"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
@ -21,12 +23,15 @@ const (
const (
invCloseButtonX, invCloseButtonY = 419, 449
invGoldButtonX, invGoldButtonY = 485, 455
invGoldLabelX, invGoldLabelY = 510, 455
)
// NewInventory creates an inventory instance and returns a pointer to it
func NewInventory(asset *d2asset.AssetManager,
ui *d2ui.UIManager,
l d2util.LogLevel,
gold int,
record *d2records.InventoryRecord) *Inventory {
itemTooltip := ui.NewTooltip(d2resource.FontFormal11, d2resource.PaletteStatic, d2ui.TooltipXCenter, d2ui.TooltipYBottom)
@ -42,6 +47,7 @@ func NewInventory(asset *d2asset.AssetManager,
itemTooltip: itemTooltip,
// originY: record.Panel.Top,
originY: 0, // expansion data has these all offset by +60 ...
gold: gold,
}
inventory.Logger = d2util.NewLogger()
@ -53,32 +59,32 @@ func NewInventory(asset *d2asset.AssetManager,
// Inventory represents the inventory
type Inventory struct {
asset *d2asset.AssetManager
item *diablo2item.ItemFactory
uiManager *d2ui.UIManager
frame *d2ui.UIFrame
panel *d2ui.Sprite
grid *ItemGrid
itemTooltip *d2ui.Tooltip
closeButton *d2ui.Button
hoverX int
hoverY int
originX int
originY int
lastMouseX int
lastMouseY int
hovering bool
isOpen bool
onCloseCb func()
asset *d2asset.AssetManager
item *diablo2item.ItemFactory
uiManager *d2ui.UIManager
frame *d2ui.UIFrame
panel *d2ui.Sprite
grid *ItemGrid
itemTooltip *d2ui.Tooltip
closeButton *d2ui.Button
goldButton *d2ui.Button
goldLabel *d2ui.Label
panelGroup *d2ui.WidgetGroup
panelMoveGold *d2ui.WidgetGroup
hoverX int
hoverY int
originX int
originY int
lastMouseX int
lastMouseY int
hovering bool
isOpen bool
onCloseCb func()
gold int
*d2util.Logger
}
// IsOpen returns true if the inventory is open
func (g *Inventory) IsOpen() bool {
return g.isOpen
}
// Toggle negates the open state of the inventory
func (g *Inventory) Toggle() {
if g.isOpen {
@ -88,34 +94,42 @@ func (g *Inventory) Toggle() {
}
}
// Open opens the inventory
func (g *Inventory) Open() {
g.isOpen = true
g.closeButton.SetVisible(true)
}
// Close closes the inventory
func (g *Inventory) Close() {
g.isOpen = false
g.closeButton.SetVisible(false)
g.onCloseCb()
}
// SetOnCloseCb the callback run on closing the inventory
func (g *Inventory) SetOnCloseCb(cb func()) {
g.onCloseCb = cb
}
// Load the resources required by the inventory
func (g *Inventory) Load() {
var err error
g.panelGroup = g.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
g.panelMoveGold = g.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
g.frame = d2ui.NewUIFrame(g.asset, g.uiManager, d2ui.FrameRight)
g.panelGroup.AddWidget(g.frame)
g.closeButton = g.uiManager.NewButton(d2ui.ButtonTypeSquareClose, "")
g.closeButton.SetVisible(false)
g.closeButton.SetPosition(invCloseButtonX, invCloseButtonY)
g.closeButton.OnActivated(func() { g.Close() })
g.panelGroup.AddWidget(g.closeButton)
g.panel, _ = g.uiManager.NewSprite(d2resource.InventoryCharacterPanel, d2resource.PaletteSky)
g.goldButton = g.uiManager.NewButton(d2ui.ButtonTypeGoldCoin, "")
g.goldButton.SetVisible(false)
g.goldButton.SetPosition(invGoldButtonX, invGoldButtonY)
g.goldButton.OnActivated(func() { g.onGoldClicked() })
g.panelGroup.AddWidget(g.goldButton)
g.goldLabel = g.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteStatic)
g.goldLabel.Alignment = d2ui.HorizontalAlignLeft
g.goldLabel.SetText(fmt.Sprintln(g.gold))
g.goldLabel.SetPosition(invGoldLabelX, invGoldLabelY)
g.panelGroup.AddWidget(g.goldLabel)
g.goldButton = g.uiManager.NewButton(d2ui.ButtonTypeGoldCoin, "")
g.panel, err = g.uiManager.NewSprite(d2resource.InventoryCharacterPanel, d2resource.PaletteSky)
if err != nil {
g.Error(err.Error())
}
g.panelGroup.SetVisible(false)
// https://github.com/OpenDiablo2/OpenDiablo2/issues/795
testInventoryCodes := [][]string{
@ -128,8 +142,8 @@ func (g *Inventory) Load() {
inventoryItems := make([]InventoryItem, 0)
for idx := range testInventoryCodes {
item, err := g.item.NewItem(testInventoryCodes[idx]...)
if err != nil {
item, itemErr := g.item.NewItem(testInventoryCodes[idx]...)
if itemErr != nil {
continue
}
@ -152,26 +166,55 @@ func (g *Inventory) Load() {
}
for slot := range testEquippedItemCodes {
item, err := g.item.NewItem(testEquippedItemCodes[slot]...)
if err != nil {
item, itemErr := g.item.NewItem(testEquippedItemCodes[slot]...)
if itemErr != nil {
continue
}
g.grid.ChangeEquippedSlot(slot, item)
}
_, err := g.grid.Add(inventoryItems...)
_, err = g.grid.Add(inventoryItems...)
if err != nil {
g.Errorf("could not add items to the inventory, err: %v", err.Error())
}
}
// Open opens the inventory
func (g *Inventory) Open() {
g.isOpen = true
g.panelGroup.SetVisible(true)
}
// Close closes the inventory
func (g *Inventory) Close() {
g.isOpen = false
g.panelGroup.SetVisible(false)
g.onCloseCb()
}
// SetOnCloseCb the callback run on closing the inventory
func (g *Inventory) SetOnCloseCb(cb func()) {
g.onCloseCb = cb
}
func (g *Inventory) onGoldClicked() {
g.Info("Gold action clicked")
}
// IsOpen returns true if the inventory is open
func (g *Inventory) IsOpen() bool {
return g.isOpen
}
// Render draws the inventory onto the given surface
func (g *Inventory) Render(target d2interface.Surface) {
if !g.isOpen {
return
}
g.goldLabel.Render(target)
err := g.renderFrame(target)
if err != nil {
g.Error(err.Error())

View File

@ -220,7 +220,7 @@ func (g *GameClient) handleAddPlayerPacket(packet d2netpacket.NetPacket) error {
d2hero.HydrateSkills(player.Skills, g.asset)
newPlayer := g.MapEngine.NewPlayer(player.ID, player.Name, player.X, player.Y, 0,
player.HeroType, player.Stats, player.Skills, &player.Equipment, player.LeftSkill, player.RightSkill)
player.HeroType, player.Stats, player.Skills, &player.Equipment, player.LeftSkill, player.RightSkill, player.Gold)
g.Players[newPlayer.ID()] = newPlayer
g.MapEngine.AddEntity(newPlayer)

View File

@ -24,13 +24,20 @@ type AddPlayerPacket struct {
Skills map[int]*d2hero.HeroSkill `json:"heroSkills"`
LeftSkill int `json:"leftSkill"`
RightSkill int `json:"rightSkill"`
Gold int
}
// CreateAddPlayerPacket returns a NetPacket which declares an
// AddPlayerPacket with the data in given parameters.
func CreateAddPlayerPacket(id, name string, x, y int, heroType d2enum.Hero,
stats *d2hero.HeroStatsState, skills map[int]*d2hero.HeroSkill, equipment d2inventory.CharacterEquipment,
leftSkill, rightSkill int) NetPacket {
func CreateAddPlayerPacket(
id, name string,
x, y int,
heroType d2enum.Hero,
stats *d2hero.HeroStatsState,
skills map[int]*d2hero.HeroSkill,
equipment d2inventory.CharacterEquipment,
leftSkill, rightSkill int,
gold int) NetPacket {
addPlayerPacket := AddPlayerPacket{
ID: id,
Name: name,
@ -42,6 +49,7 @@ func CreateAddPlayerPacket(id, name string, x, y int, heroType d2enum.Hero,
Skills: skills,
LeftSkill: leftSkill,
RightSkill: rightSkill,
Gold: gold,
}
b, err := json.Marshal(addPlayerPacket)

View File

@ -376,6 +376,7 @@ func (g *GameServer) handleClientConnection(client ClientConnection, x, y float6
playerState.Equipment,
playerState.LeftSkill,
playerState.RightSkill,
playerState.Gold,
)
for _, connection := range g.connections {
@ -403,6 +404,7 @@ func (g *GameServer) handleClientConnection(client ClientConnection, x, y float6
conPlayerState.Equipment,
conPlayerState.LeftSkill,
conPlayerState.RightSkill,
conPlayerState.Gold,
),
)