mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-20 23:47:16 -05:00
Refactor escape (#450)
* refactoring escape menu to allow pop back to menu * refactors escape menu to allow exiting the game * fixes bug causing player to not be removed on game exit
This commit is contained in:
parent
6dae0097b9
commit
2656339def
@ -1,4 +1,4 @@
|
||||
package d2player
|
||||
package d2gamescreen
|
||||
|
||||
import (
|
||||
"log"
|
||||
@ -8,6 +8,7 @@ import (
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||
)
|
||||
|
||||
@ -49,7 +50,24 @@ func NewEscapeMenu() *EscapeMenu {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *EscapeMenu) OnKeyDown(event d2input.KeyEvent) bool {
|
||||
switch event.Key {
|
||||
case d2input.KeyEscape:
|
||||
m.Toggle()
|
||||
case d2input.KeyUp:
|
||||
m.OnUpKey()
|
||||
case d2input.KeyDown:
|
||||
m.OnDownKey()
|
||||
case d2input.KeyEnter:
|
||||
m.OnEnterKey()
|
||||
default:
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *EscapeMenu) OnLoad() error {
|
||||
d2input.BindHandler(m)
|
||||
m.labels = []d2ui.Label{
|
||||
d2ui.CreateLabel(d2resource.Font42, d2resource.PaletteSky),
|
||||
d2ui.CreateLabel(d2resource.Font42, d2resource.PaletteSky),
|
||||
@ -231,6 +249,9 @@ func (m *EscapeMenu) onOptions() error {
|
||||
// User clicked on "SAVE AND EXIT"
|
||||
func (m *EscapeMenu) onSaveAndExit() error {
|
||||
log.Println("SAVE AND EXIT GAME Clicked from Escape Menu")
|
||||
mainMenu := CreateMainMenu()
|
||||
mainMenu.SetScreenMode(ScreenModeMainMenu)
|
||||
d2screen.SetNextScreen(mainMenu)
|
||||
return nil
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ type Game struct {
|
||||
localPlayer *d2mapentity.Player
|
||||
lastRegionType d2enum.RegionIdType
|
||||
ticksSinceLevelCheck float64
|
||||
escapeMenu *EscapeMenu
|
||||
}
|
||||
|
||||
func CreateGame(gameClient *d2client.GameClient) *Game {
|
||||
@ -38,7 +39,10 @@ func CreateGame(gameClient *d2client.GameClient) *Game {
|
||||
lastRegionType: d2enum.RegionNone,
|
||||
ticksSinceLevelCheck: 0,
|
||||
mapRenderer: d2maprenderer.CreateMapRenderer(gameClient.MapEngine),
|
||||
escapeMenu: NewEscapeMenu(),
|
||||
}
|
||||
result.escapeMenu.OnLoad()
|
||||
d2input.BindHandler(result.escapeMenu)
|
||||
return result
|
||||
}
|
||||
|
||||
@ -48,6 +52,7 @@ func (v *Game) OnLoad(loading d2screen.LoadingState) {
|
||||
|
||||
func (v *Game) OnUnload() error {
|
||||
d2input.UnbindHandler(v.gameControls) // TODO: hack
|
||||
v.gameClient.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -64,13 +69,17 @@ func (v *Game) Render(screen d2render.Surface) error {
|
||||
v.gameControls.Render(screen)
|
||||
}
|
||||
|
||||
if v.escapeMenu != nil {
|
||||
v.escapeMenu.Render(screen)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var hideZoneTextAfterSeconds = 2.0
|
||||
|
||||
func (v *Game) Advance(tickTime float64) error {
|
||||
if !v.gameControls.InEscapeMenu() || len(v.gameClient.Players) != 1 {
|
||||
if (v.escapeMenu != nil && !v.escapeMenu.IsOpen()) || len(v.gameClient.Players) != 1 {
|
||||
v.gameClient.MapEngine.Advance(tickTime) // TODO: Hack
|
||||
}
|
||||
|
||||
@ -120,6 +129,10 @@ func (v *Game) Advance(tickTime float64) error {
|
||||
}
|
||||
}
|
||||
|
||||
if v.escapeMenu.IsOpen() {
|
||||
v.escapeMenu.Advance(tickTime)
|
||||
}
|
||||
|
||||
// Update the camera to focus on the player
|
||||
if v.localPlayer != nil && !v.gameControls.FreeCam {
|
||||
rx, ry := v.mapRenderer.WorldToOrtho(v.localPlayer.LocationX/5, v.localPlayer.LocationY/5)
|
||||
|
@ -30,12 +30,12 @@ type Panel interface {
|
||||
var missileID = 59
|
||||
|
||||
type GameControls struct {
|
||||
hero *d2mapentity.Player
|
||||
mapEngine *d2mapengine.MapEngine
|
||||
mapRenderer *d2maprenderer.MapRenderer
|
||||
inventory *Inventory
|
||||
heroStats *HeroStats
|
||||
escapeMenu *EscapeMenu
|
||||
hero *d2mapentity.Player
|
||||
mapEngine *d2mapengine.MapEngine
|
||||
mapRenderer *d2maprenderer.MapRenderer
|
||||
inventory *Inventory
|
||||
heroStats *HeroStats
|
||||
|
||||
inputListener InputCallbackListener
|
||||
FreeCam bool
|
||||
lastMouseX int
|
||||
@ -92,7 +92,6 @@ func NewGameControls(hero *d2mapentity.Player, mapEngine *d2mapengine.MapEngine,
|
||||
mapRenderer: mapRenderer,
|
||||
inventory: NewInventory(),
|
||||
heroStats: NewHeroStats(),
|
||||
escapeMenu: NewEscapeMenu(),
|
||||
nameLabel: &nameLabel,
|
||||
zoneChangeText: &label,
|
||||
actionableRegions: []ActionableRegion{
|
||||
@ -154,13 +153,6 @@ func (g *GameControls) OnKeyDown(event d2input.KeyEvent) bool {
|
||||
g.updateLayout()
|
||||
break
|
||||
}
|
||||
g.escapeMenu.Toggle()
|
||||
case d2input.KeyUp:
|
||||
g.escapeMenu.OnUpKey()
|
||||
case d2input.KeyDown:
|
||||
g.escapeMenu.OnDownKey()
|
||||
case d2input.KeyEnter:
|
||||
g.escapeMenu.OnEnterKey()
|
||||
case d2input.KeyI:
|
||||
g.inventory.Toggle()
|
||||
g.updateLayout()
|
||||
@ -205,11 +197,6 @@ func (g *GameControls) OnMouseMove(event d2input.MouseMoveEvent) bool {
|
||||
g.lastMouseX = mx
|
||||
g.lastMouseY = my
|
||||
|
||||
if g.escapeMenu.IsOpen() {
|
||||
g.escapeMenu.OnMouseMove(event)
|
||||
return false
|
||||
}
|
||||
|
||||
for i := range g.actionableRegions {
|
||||
// Mouse over a game control element
|
||||
if g.actionableRegions[i].Rect.IsInRect(mx, my) {
|
||||
@ -221,9 +208,6 @@ func (g *GameControls) OnMouseMove(event d2input.MouseMoveEvent) bool {
|
||||
}
|
||||
|
||||
func (g *GameControls) OnMouseButtonDown(event d2input.MouseEvent) bool {
|
||||
if g.escapeMenu.IsOpen() {
|
||||
return g.escapeMenu.OnMouseButtonDown(event)
|
||||
}
|
||||
|
||||
mx, my := event.X, event.Y
|
||||
for i := range g.actionableRegions {
|
||||
@ -294,7 +278,6 @@ func (g *GameControls) Load() {
|
||||
|
||||
g.inventory.Load()
|
||||
g.heroStats.Load()
|
||||
g.escapeMenu.OnLoad()
|
||||
}
|
||||
|
||||
func (g *GameControls) loadUIButtons() {
|
||||
@ -317,7 +300,6 @@ func (g *GameControls) onToggleRunButton() {
|
||||
|
||||
// ScreenAdvanceHandler
|
||||
func (g *GameControls) Advance(elapsed float64) error {
|
||||
g.escapeMenu.Advance(elapsed)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -350,19 +332,17 @@ func (g *GameControls) Render(target d2render.Surface) {
|
||||
entScreenX := int(math.Floor(entScreenXf))
|
||||
entScreenY := int(math.Floor(entScreenYf))
|
||||
|
||||
if ((entScreenX-20) <= g.lastMouseX) && ((entScreenX+20) >= g.lastMouseX) &&
|
||||
((entScreenY-80) <= g.lastMouseY) && (entScreenY>= g.lastMouseY) {
|
||||
if ((entScreenX - 20) <= g.lastMouseX) && ((entScreenX + 20) >= g.lastMouseX) &&
|
||||
((entScreenY - 80) <= g.lastMouseY) && (entScreenY >= g.lastMouseY) {
|
||||
g.nameLabel.SetText(entity.Name())
|
||||
g.nameLabel.SetPosition(entScreenX, entScreenY - 100)
|
||||
g.nameLabel.SetPosition(entScreenX, entScreenY-100)
|
||||
g.nameLabel.Render(target)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
g.inventory.Render(target)
|
||||
g.heroStats.Render(target)
|
||||
g.escapeMenu.Render(target)
|
||||
|
||||
width, height := target.GetSize()
|
||||
offset := 0
|
||||
@ -458,9 +438,9 @@ func (g *GameControls) HideZoneChangeTextAfter(delay float64) {
|
||||
})
|
||||
}
|
||||
|
||||
func (g *GameControls) InEscapeMenu() bool {
|
||||
return g != nil && g.escapeMenu != nil && g.escapeMenu.IsOpen()
|
||||
}
|
||||
// func (g *GameControls) InEscapeMenu() bool {
|
||||
// return g != nil && g.escapeMenu != nil && g.escapeMenu.IsOpen()
|
||||
// }
|
||||
|
||||
// Handles what to do when an actionable is hovered
|
||||
func (g *GameControls) onHoverActionable(item ActionableType) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user