1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-09-29 22:56:07 -04: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:
Brendan Porter 2020-06-25 09:16:17 -05:00 committed by GitHub
parent 6dae0097b9
commit 2656339def
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 34 deletions

View File

@ -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
}

View File

@ -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)

View File

@ -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) {