mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-06-20 06:05:23 +00:00
Display HP/Mana stats when hovering over or clicking respective globe. Update d2debugutil to not use internal package for assets. (#709)
* Set HP/Mana stats when globes are clicked * Display HP or Mana stat when hovering over globe * Display HP/Mana stats when hovering globe or when toggling by clicking the respective globe. Rename internal to assets and move assets package into folder. * Adding .bmp to assets folder
This commit is contained in:
parent
2ceba68c73
commit
41e43ac6be
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
|
@ -4,8 +4,7 @@ package d2debugutil
|
||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
|
|
||||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2debugutil/internal/assets"
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2debugutil/assets"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package d2player
|
package d2player
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"log"
|
"log"
|
||||||
|
@ -62,11 +63,14 @@ type GameControls struct {
|
||||||
skillIcon *d2ui.Sprite
|
skillIcon *d2ui.Sprite
|
||||||
zoneChangeText *d2ui.Label
|
zoneChangeText *d2ui.Label
|
||||||
nameLabel *d2ui.Label
|
nameLabel *d2ui.Label
|
||||||
|
hpManaStatsLabel *d2ui.Label
|
||||||
runButton *d2ui.Button
|
runButton *d2ui.Button
|
||||||
lastLeftBtnActionTime float64
|
lastLeftBtnActionTime float64
|
||||||
lastRightBtnActionTime float64
|
lastRightBtnActionTime float64
|
||||||
FreeCam bool
|
FreeCam bool
|
||||||
isZoneTextShown bool
|
isZoneTextShown bool
|
||||||
|
hpStatsIsVisible bool
|
||||||
|
manaStatsIsVisible bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type ActionableType int
|
type ActionableType int
|
||||||
|
@ -86,6 +90,8 @@ const (
|
||||||
miniPanel = ActionableType(iota)
|
miniPanel = ActionableType(iota)
|
||||||
rightSelec = ActionableType(iota)
|
rightSelec = ActionableType(iota)
|
||||||
rightSkill = ActionableType(iota)
|
rightSkill = ActionableType(iota)
|
||||||
|
hpGlobe = ActionableType(iota)
|
||||||
|
manaGlobe = ActionableType(iota)
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewGameControls creates a GameControls instance and returns a pointer to it
|
// NewGameControls creates a GameControls instance and returns a pointer to it
|
||||||
|
@ -114,6 +120,9 @@ func NewGameControls(
|
||||||
nameLabel.Alignment = d2gui.HorizontalAlignCenter
|
nameLabel.Alignment = d2gui.HorizontalAlignCenter
|
||||||
nameLabel.SetText(d2ui.ColorTokenize("", d2ui.ColorTokenServer))
|
nameLabel.SetText(d2ui.ColorTokenize("", d2ui.ColorTokenServer))
|
||||||
|
|
||||||
|
hpManaStatsLabel := ui.NewLabel(d2resource.Font16, d2resource.PaletteUnits)
|
||||||
|
hpManaStatsLabel.Alignment = d2gui.HorizontalAlignLeft
|
||||||
|
|
||||||
// TODO make this depend on the hero type to respect inventory.txt
|
// TODO make this depend on the hero type to respect inventory.txt
|
||||||
var inventoryRecordKey string
|
var inventoryRecordKey string
|
||||||
|
|
||||||
|
@ -141,18 +150,21 @@ func NewGameControls(
|
||||||
hoverLabel := nameLabel
|
hoverLabel := nameLabel
|
||||||
hoverLabel.SetBackgroundColor(color.RGBA{0, 0, 0, uint8(128)})
|
hoverLabel.SetBackgroundColor(color.RGBA{0, 0, 0, uint8(128)})
|
||||||
|
|
||||||
|
globeStatsLabel := hpManaStatsLabel
|
||||||
|
|
||||||
gc := &GameControls{
|
gc := &GameControls{
|
||||||
uiManager: ui,
|
uiManager: ui,
|
||||||
renderer: renderer,
|
renderer: renderer,
|
||||||
hero: hero,
|
hero: hero,
|
||||||
mapEngine: mapEngine,
|
mapEngine: mapEngine,
|
||||||
inputListener: inputListener,
|
inputListener: inputListener,
|
||||||
mapRenderer: mapRenderer,
|
mapRenderer: mapRenderer,
|
||||||
inventory: NewInventory(ui, inventoryRecord),
|
inventory: NewInventory(ui, inventoryRecord),
|
||||||
heroStatsPanel: NewHeroStatsPanel(ui, hero.Name(), hero.Class, hero.Stats),
|
heroStatsPanel: NewHeroStatsPanel(ui, hero.Name(), hero.Class, hero.Stats),
|
||||||
missileID: missileID,
|
missileID: missileID,
|
||||||
nameLabel: hoverLabel,
|
nameLabel: hoverLabel,
|
||||||
zoneChangeText: zoneLabel,
|
zoneChangeText: zoneLabel,
|
||||||
|
hpManaStatsLabel: globeStatsLabel,
|
||||||
actionableRegions: []ActionableRegion{
|
actionableRegions: []ActionableRegion{
|
||||||
{leftSkill, d2common.Rectangle{Left: 115, Top: 550, Width: 50, Height: 50}},
|
{leftSkill, d2common.Rectangle{Left: 115, Top: 550, Width: 50, Height: 50}},
|
||||||
{leftSelec, d2common.Rectangle{Left: 206, Top: 563, Width: 30, Height: 30}},
|
{leftSelec, d2common.Rectangle{Left: 206, Top: 563, Width: 30, Height: 30}},
|
||||||
|
@ -162,6 +174,8 @@ func NewGameControls(
|
||||||
{miniPanel, d2common.Rectangle{Left: 393, Top: 563, Width: 12, Height: 23}},
|
{miniPanel, d2common.Rectangle{Left: 393, Top: 563, Width: 12, Height: 23}},
|
||||||
{rightSelec, d2common.Rectangle{Left: 562, Top: 563, Width: 30, Height: 30}},
|
{rightSelec, d2common.Rectangle{Left: 562, Top: 563, Width: 30, Height: 30}},
|
||||||
{rightSkill, d2common.Rectangle{Left: 634, Top: 550, Width: 50, Height: 50}},
|
{rightSkill, d2common.Rectangle{Left: 634, Top: 550, Width: 50, Height: 50}},
|
||||||
|
{hpGlobe, d2common.Rectangle{Left: 30, Top: 525, Width: 65, Height: 50}},
|
||||||
|
{manaGlobe, d2common.Rectangle{Left: 700, Top: 525, Width: 65, Height: 50}},
|
||||||
},
|
},
|
||||||
lastLeftBtnActionTime: 0,
|
lastLeftBtnActionTime: 0,
|
||||||
lastRightBtnActionTime: 0,
|
lastRightBtnActionTime: 0,
|
||||||
|
@ -443,6 +457,8 @@ func (g *GameControls) isInActiveMenusRect(px, py int) bool {
|
||||||
// TODO: consider caching the panels to single image that is reused.
|
// TODO: consider caching the panels to single image that is reused.
|
||||||
// Render draws the GameControls onto the target
|
// Render draws the GameControls onto the target
|
||||||
func (g *GameControls) Render(target d2interface.Surface) error {
|
func (g *GameControls) Render(target d2interface.Surface) error {
|
||||||
|
|
||||||
|
mx, my := g.lastMouseX, g.lastMouseY
|
||||||
for entityIdx := range g.mapEngine.Entities() {
|
for entityIdx := range g.mapEngine.Entities() {
|
||||||
entity := (g.mapEngine.Entities())[entityIdx]
|
entity := (g.mapEngine.Entities())[entityIdx]
|
||||||
if !entity.Selectable() {
|
if !entity.Selectable() {
|
||||||
|
@ -458,7 +474,6 @@ func (g *GameControls) Render(target d2interface.Surface) error {
|
||||||
halfWidth, halfHeight := entityWidth/2, entityHeight/2
|
halfWidth, halfHeight := entityWidth/2, entityHeight/2
|
||||||
l, r := entScreenX-halfWidth-hoverLabelOuterPad, entScreenX+halfWidth+hoverLabelOuterPad
|
l, r := entScreenX-halfWidth-hoverLabelOuterPad, entScreenX+halfWidth+hoverLabelOuterPad
|
||||||
t, b := entScreenY-halfHeight-hoverLabelOuterPad, entScreenY+halfHeight-hoverLabelOuterPad
|
t, b := entScreenY-halfHeight-hoverLabelOuterPad, entScreenY+halfHeight-hoverLabelOuterPad
|
||||||
mx, my := g.lastMouseX, g.lastMouseY
|
|
||||||
xWithin := (l <= mx) && (r >= mx)
|
xWithin := (l <= mx) && (r >= mx)
|
||||||
yWithin := (t <= my) && (b >= my)
|
yWithin := (t <= my) && (b >= my)
|
||||||
within := xWithin && yWithin
|
within := xWithin && yWithin
|
||||||
|
@ -696,6 +711,24 @@ func (g *GameControls) Render(target d2interface.Surface) error {
|
||||||
g.zoneChangeText.Render(target)
|
g.zoneChangeText.Render(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hpWithin := (95 >= mx) && (30 <= mx) && (575 >= my) && (525 <= my)
|
||||||
|
manaWithin := (765 >= mx) && (700 <= mx) && (575 >= my) && (525 <= my)
|
||||||
|
|
||||||
|
// Display current hp and mana stats hpGlobe or manaGlobe region is clicked
|
||||||
|
if hpWithin || g.hpStatsIsVisible {
|
||||||
|
g.hpManaStatsLabel.SetText(d2ui.ColorTokenize(fmt.Sprintf("LIFE: %v / %v", float64(g.hero.Stats.Health), float64(g.hero.Stats.MaxHealth)), d2ui.ColorTokenWhite))
|
||||||
|
g.hpManaStatsLabel.SetPosition(15, 485)
|
||||||
|
g.hpManaStatsLabel.Render(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
if manaWithin || g.manaStatsIsVisible {
|
||||||
|
g.hpManaStatsLabel.SetText(fmt.Sprintf("MANA: %v / %v", float64(g.hero.Stats.Mana), float64(g.hero.Stats.MaxMana)))
|
||||||
|
widthManaLabel, _ := g.hpManaStatsLabel.GetSize()
|
||||||
|
xManaLabel := 785 - widthManaLabel
|
||||||
|
g.hpManaStatsLabel.SetPosition(xManaLabel, 485)
|
||||||
|
g.hpManaStatsLabel.Render(target)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -716,6 +749,26 @@ func (g *GameControls) HideZoneChangeTextAfter(delay float64) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HpStatsIsVisible returns true if the hp and mana stats are visible to the player
|
||||||
|
func (g *GameControls) HpStatsIsVisible() bool {
|
||||||
|
return g.hpStatsIsVisible
|
||||||
|
}
|
||||||
|
|
||||||
|
// ManaStatsIsVisible returns true if the hp and mana stats are visible to the player
|
||||||
|
func (g *GameControls) ManaStatsIsVisible() bool {
|
||||||
|
return g.manaStatsIsVisible
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToggleHpStats toggles the visibility of the hp and mana stats placed above their respective globe
|
||||||
|
func (g *GameControls) ToggleHpStats() {
|
||||||
|
g.hpStatsIsVisible = !g.hpStatsIsVisible
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToggleManaStats toggles the visibility of the hp and mana stats placed above their respective globe
|
||||||
|
func (g *GameControls) ToggleManaStats() {
|
||||||
|
g.manaStatsIsVisible = !g.manaStatsIsVisible
|
||||||
|
}
|
||||||
|
|
||||||
// Handles what to do when an actionable is hovered
|
// Handles what to do when an actionable is hovered
|
||||||
func (g *GameControls) onHoverActionable(item ActionableType) {
|
func (g *GameControls) onHoverActionable(item ActionableType) {
|
||||||
switch item {
|
switch item {
|
||||||
|
@ -735,6 +788,10 @@ func (g *GameControls) onHoverActionable(item ActionableType) {
|
||||||
return
|
return
|
||||||
case rightSkill:
|
case rightSkill:
|
||||||
return
|
return
|
||||||
|
case hpGlobe:
|
||||||
|
return
|
||||||
|
case manaGlobe:
|
||||||
|
return
|
||||||
default:
|
default:
|
||||||
log.Printf("Unrecognized ActionableType(%d) being hovered\n", item)
|
log.Printf("Unrecognized ActionableType(%d) being hovered\n", item)
|
||||||
}
|
}
|
||||||
|
@ -759,6 +816,12 @@ func (g *GameControls) onClickActionable(item ActionableType) {
|
||||||
log.Println("Right Skill Selector Action Pressed")
|
log.Println("Right Skill Selector Action Pressed")
|
||||||
case rightSkill:
|
case rightSkill:
|
||||||
log.Println("Right Skill Action Pressed")
|
log.Println("Right Skill Action Pressed")
|
||||||
|
case hpGlobe:
|
||||||
|
g.ToggleHpStats()
|
||||||
|
log.Println("HP Globe Pressed")
|
||||||
|
case manaGlobe:
|
||||||
|
g.ToggleManaStats()
|
||||||
|
log.Println("Mana Globe Pressed")
|
||||||
default:
|
default:
|
||||||
log.Printf("Unrecognized ActionableType(%d) being clicked\n", item)
|
log.Printf("Unrecognized ActionableType(%d) being clicked\n", item)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user