504 - removes input singleton in favor of d2interface.InputManager constructor injection (#584)

Co-authored-by: carrelda <carrelda@git>
This commit is contained in:
David Carrell 2020-07-13 19:29:17 -05:00 committed by GitHub
parent 894c60f77a
commit cc893e4dd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 87 additions and 97 deletions

View File

@ -25,7 +25,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2config" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
@ -47,6 +46,7 @@ type App struct {
captureFrames []*image.RGBA captureFrames []*image.RGBA
gitBranch string gitBranch string
gitCommit string gitCommit string
inputManager d2interface.InputManager
terminal d2interface.Terminal terminal d2interface.Terminal
scriptEngine *d2script.ScriptEngine scriptEngine *d2script.ScriptEngine
audio d2interface.AudioProvider audio d2interface.AudioProvider
@ -69,6 +69,7 @@ const (
// Create creates a new instance of the application // Create creates a new instance of the application
func Create(gitBranch, gitCommit string, func Create(gitBranch, gitCommit string,
inputManager d2interface.InputManager,
terminal d2interface.Terminal, terminal d2interface.Terminal,
scriptEngine *d2script.ScriptEngine, scriptEngine *d2script.ScriptEngine,
audio d2interface.AudioProvider, audio d2interface.AudioProvider,
@ -76,6 +77,7 @@ func Create(gitBranch, gitCommit string,
result := &App{ result := &App{
gitBranch: gitBranch, gitBranch: gitBranch,
gitCommit: gitCommit, gitCommit: gitCommit,
inputManager: inputManager,
terminal: terminal, terminal: terminal,
scriptEngine: scriptEngine, scriptEngine: scriptEngine,
audio: audio, audio: audio,
@ -108,7 +110,7 @@ func (p *App) Run() error {
return err return err
} }
d2screen.SetNextScreen(d2gamescreen.CreateMainMenu(p.renderer, p.audio, p.terminal, p.scriptEngine)) d2screen.SetNextScreen(d2gamescreen.CreateMainMenu(p.renderer, p.inputManager, p.audio, p.terminal, p.scriptEngine))
if p.gitBranch == "" { if p.gitBranch == "" {
p.gitBranch = "Local Build" p.gitBranch = "Local Build"
@ -160,7 +162,7 @@ func (p *App) initialize() error {
return err return err
} }
if err := d2gui.Initialize(); err != nil { if err := d2gui.Initialize(p.inputManager); err != nil {
return err return err
} }
@ -176,7 +178,7 @@ func (p *App) initialize() error {
d2inventory.LoadHeroObjects() d2inventory.LoadHeroObjects()
d2ui.Initialize(p.audio) d2ui.Initialize(p.inputManager, p.audio)
return nil return nil
} }
@ -415,7 +417,7 @@ func (p *App) advance(elapsed, current float64) error {
d2ui.Advance(elapsed) d2ui.Advance(elapsed)
if err := d2input.Advance(elapsed, current); err != nil { if err := p.inputManager.Advance(elapsed, current); err != nil {
return err return err
} }
@ -481,7 +483,7 @@ func (p *App) evalJS(code string) {
return return
} }
p.terminal.OutputInfof("%s", val) log.Printf("%s", val)
} }
func (p *App) toggleFullScreen() { func (p *App) toggleFullScreen() {

View File

@ -13,11 +13,11 @@ var (
var singleton *manager var singleton *manager
func Initialize() error { func Initialize(inputManager d2interface.InputManager) error {
verifyNotInit() verifyNotInit()
var err error var err error
if singleton, err = createGuiManager(); err != nil { if singleton, err = createGuiManager(inputManager); err != nil {
return err return err
} }

View File

@ -8,7 +8,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
) )
type manager struct { type manager struct {
@ -21,7 +20,7 @@ type manager struct {
loading bool loading bool
} }
func createGuiManager() (*manager, error) { func createGuiManager(inputManager d2interface.InputManager) (*manager, error) {
cursorAnim, err := d2asset.LoadAnimation(d2resource.CursorDefault, d2resource.PaletteUnits) cursorAnim, err := d2asset.LoadAnimation(d2resource.CursorDefault, d2resource.PaletteUnits)
if err != nil { if err != nil {
return nil, err return nil, err
@ -38,7 +37,7 @@ func createGuiManager() (*manager, error) {
cursorVisible: true, cursorVisible: true,
} }
if err := d2input.BindHandler(manager); err != nil { if err := inputManager.BindHandler(manager); err != nil {
return nil, err return nil, err
} }

View File

@ -2,11 +2,6 @@ package d2input
import ( import (
"errors" "errors"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
) )
var ( var (
@ -15,34 +10,3 @@ var (
// ErrNotReg shows the input system has no registered handler // ErrNotReg shows the input system has no registered handler
ErrNotReg = errors.New("input system does not have provided handler") ErrNotReg = errors.New("input system does not have provided handler")
) )
var singleton *inputManager // TODO remove this singleton
// Initialize creates a single global input manager based on a specific input service
func Create() (d2interface.InputManager, error) {
singleton = &inputManager{
inputService: ebiten_input.InputService{},
}
return singleton, nil
}
// Advance moves the input manager with the elapsed number of seconds.
func Advance(elapsed, current float64) error {
return singleton.Advance(elapsed, current)
}
// BindHandlerWithPriority adds an event handler with a specific call priority
func BindHandlerWithPriority(handler d2interface.InputEventHandler, priority d2enum.Priority) error {
return singleton.BindHandlerWithPriority(handler, priority)
}
// BindHandler adds an event handler
func BindHandler(handler d2interface.InputEventHandler) error {
return BindHandlerWithPriority(handler, d2enum.PriorityDefault)
}
// UnbindHandler removes a previously bound event handler
func UnbindHandler(handler d2interface.InputEventHandler) error {
return singleton.UnbindHandler(handler)
}

View File

@ -1,10 +1,11 @@
package d2input package d2input
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"sort" "sort"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
) )
type inputManager struct { type inputManager struct {
@ -18,6 +19,12 @@ type inputManager struct {
entries handlerEntryList entries handlerEntryList
} }
func New() d2interface.InputManager {
return &inputManager{
inputService: ebiten_input.InputService{},
}
}
// Advance advances the inputManager // Advance advances the inputManager
func (im *inputManager) Advance(_, _ float64) error { func (im *inputManager) Advance(_, _ float64) error {
im.updateKeyMod() im.updateKeyMod()
@ -211,7 +218,7 @@ func (im *inputManager) updateCursor(cursorX, cursorY int, e HandlerEvent) {
func (im *inputManager) BindHandlerWithPriority( func (im *inputManager) BindHandlerWithPriority(
h d2interface.InputEventHandler, h d2interface.InputEventHandler,
p d2enum.Priority) error { p d2enum.Priority) error {
return singleton.bindHandler(h, p) return im.bindHandler(h, p)
} }
// BindHandler adds an event handler // BindHandler adds an event handler

View File

@ -3,17 +3,16 @@ package d2term
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
) )
// Initialize creates and initializes the terminal // New creates and initializes the terminal
func Initialize() (d2interface.Terminal, error) { func New(inputManager d2interface.InputManager) (d2interface.Terminal, error) {
term, err := createTerminal() term, err := createTerminal()
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err := d2input.BindHandlerWithPriority(term, d2enum.PriorityHigh); err != nil { if err := inputManager.BindHandlerWithPriority(term, d2enum.PriorityHigh); err != nil {
return nil, err return nil, err
} }

View File

@ -1,13 +1,13 @@
package d2ui package d2ui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
) )
// CursorButton represents a mouse button // CursorButton represents a mouse button
@ -21,6 +21,7 @@ const (
) )
type UI struct { type UI struct {
inputManager d2interface.InputManager
widgets []Widget widgets []Widget
cursorButtons CursorButton // TODO (carrelld) convert dependent code and remove cursorButtons CursorButton // TODO (carrelld) convert dependent code and remove
CursorX int // TODO (carrelld) convert dependent code and remove CursorX int // TODO (carrelld) convert dependent code and remove
@ -31,14 +32,17 @@ type UI struct {
var singleton UI var singleton UI
var clickSfx d2interface.SoundEffect var clickSfx d2interface.SoundEffect
func Initialize(audioProvider d2interface.AudioProvider) { func Initialize(inputManager d2interface.InputManager, audioProvider d2interface.AudioProvider) {
sfx, err := audioProvider.LoadSoundEffect(d2resource.SFXButtonClick) sfx, err := audioProvider.LoadSoundEffect(d2resource.SFXButtonClick)
if err != nil { if err != nil {
log.Fatalf("failed to initialize ui: %v", err) log.Fatalf("failed to initialize ui: %v", err)
} }
clickSfx = sfx clickSfx = sfx
d2input.BindHandler(&singleton) singleton.inputManager = inputManager
if err := singleton.inputManager.BindHandler(&singleton); err != nil {
log.Fatalf("failed to initialize ui: %v", err)
}
} }
// Reset resets the state of the UI manager. Typically called for new screens // Reset resets the state of the UI manager. Typically called for new screens
@ -49,7 +53,7 @@ func Reset() {
// AddWidget adds a widget to the UI manager // AddWidget adds a widget to the UI manager
func AddWidget(widget Widget) { func AddWidget(widget Widget) {
d2input.BindHandler(widget) singleton.inputManager.BindHandler(widget)
singleton.widgets = append(singleton.widgets, widget) singleton.widgets = append(singleton.widgets, widget)
} }

View File

@ -11,7 +11,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
@ -46,6 +45,7 @@ type CharacterSelect struct {
showDeleteConfirmation bool showDeleteConfirmation bool
connectionType d2clientconnectiontype.ClientConnectionType connectionType d2clientconnectiontype.ClientConnectionType
connectionHost string connectionHost string
inputManager d2interface.InputManager
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
scriptEngine *d2script.ScriptEngine scriptEngine *d2script.ScriptEngine
@ -55,6 +55,7 @@ type CharacterSelect struct {
// CreateCharacterSelect creates the character select screen and returns a pointer to it // CreateCharacterSelect creates the character select screen and returns a pointer to it
func CreateCharacterSelect( func CreateCharacterSelect(
renderer d2interface.Renderer, renderer d2interface.Renderer,
inputManager d2interface.InputManager,
audioProvider d2interface.AudioProvider, audioProvider d2interface.AudioProvider,
connectionType d2clientconnectiontype.ClientConnectionType, connectionType d2clientconnectiontype.ClientConnectionType,
connectionHost string, term d2interface.Terminal, scriptEngine *d2script.ScriptEngine, connectionHost string, term d2interface.Terminal, scriptEngine *d2script.ScriptEngine,
@ -64,6 +65,7 @@ func CreateCharacterSelect(
renderer: renderer, renderer: renderer,
connectionType: connectionType, connectionType: connectionType,
connectionHost: connectionHost, connectionHost: connectionHost,
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
terminal: term, terminal: term,
scriptEngine: scriptEngine, scriptEngine: scriptEngine,
@ -74,7 +76,7 @@ func CreateCharacterSelect(
func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) {
v.audioProvider.PlayBGM(d2resource.BGMTitle) v.audioProvider.PlayBGM(d2resource.BGMTitle)
if err := d2input.BindHandler(v); err != nil { if err := v.inputManager.BindHandler(v); err != nil {
fmt.Println("failed to add Character Select screen as event handler") fmt.Println("failed to add Character Select screen as event handler")
} }
@ -213,12 +215,12 @@ func (v *CharacterSelect) updateCharacterBoxes() {
} }
func (v *CharacterSelect) onNewCharButtonClicked() { func (v *CharacterSelect) onNewCharButtonClicked() {
d2screen.SetNextScreen(CreateSelectHeroClass(v.renderer, v.audioProvider, v.connectionType, v.connectionHost, d2screen.SetNextScreen(CreateSelectHeroClass(v.renderer, v.inputManager, v.audioProvider, v.connectionType, v.connectionHost,
v.terminal, v.scriptEngine)) v.terminal, v.scriptEngine))
} }
func (v *CharacterSelect) onExitButtonClicked() { func (v *CharacterSelect) onExitButtonClicked() {
mainMenu := CreateMainMenu(v.renderer, v.audioProvider, v.terminal, v.scriptEngine) mainMenu := CreateMainMenu(v.renderer, v.inputManager, v.audioProvider, v.terminal, v.scriptEngine)
mainMenu.setScreenMode(screenModeMainMenu) mainMenu.setScreenMode(screenModeMainMenu)
d2screen.SetNextScreen(mainMenu) d2screen.SetNextScreen(mainMenu)
} }
@ -376,5 +378,5 @@ func (v *CharacterSelect) onOkButtonClicked() {
fmt.Printf("can not connect to the host: %s", host) fmt.Printf("can not connect to the host: %s", host)
} }
d2screen.SetNextScreen(CreateGame(v.renderer, v.audioProvider, gameClient, v.terminal, v.scriptEngine)) d2screen.SetNextScreen(CreateGame(v.renderer, v.inputManager, v.audioProvider, gameClient, v.terminal, v.scriptEngine))
} }

View File

@ -34,19 +34,21 @@ type Credits struct {
cyclesTillNextLine int cyclesTillNextLine int
doneWithCredits bool doneWithCredits bool
renderer d2interface.Renderer renderer d2interface.Renderer
inputManager d2interface.InputManager
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
scriptEngine *d2script.ScriptEngine scriptEngine *d2script.ScriptEngine
} }
// CreateCredits creates an instance of the credits screen // CreateCredits creates an instance of the credits screen
func CreateCredits(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, scriptEngine *d2script.ScriptEngine) *Credits { func CreateCredits(renderer d2interface.Renderer, inputManager d2interface.InputManager, audioProvider d2interface.AudioProvider, scriptEngine *d2script.ScriptEngine) *Credits {
result := &Credits{ result := &Credits{
labels: make([]*labelItem, 0), labels: make([]*labelItem, 0),
cycleTime: 0, cycleTime: 0,
doneWithCredits: false, doneWithCredits: false,
cyclesTillNextLine: 0, cyclesTillNextLine: 0,
renderer: renderer, renderer: renderer,
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
scriptEngine: scriptEngine, scriptEngine: scriptEngine,
} }
@ -160,7 +162,7 @@ func (v *Credits) Advance(tickTime float64) error {
} }
func (v *Credits) onExitButtonClicked() { func (v *Credits) onExitButtonClicked() {
mainMenu := CreateMainMenu(v.renderer, v.audioProvider, v.terminal, v.scriptEngine) mainMenu := CreateMainMenu(v.renderer, v.inputManager, v.audioProvider, v.terminal, v.scriptEngine)
mainMenu.setScreenMode(screenModeMainMenu) mainMenu.setScreenMode(screenModeMainMenu)
d2screen.SetNextScreen(mainMenu) d2screen.SetNextScreen(mainMenu)
} }

View File

@ -69,6 +69,7 @@ type EscapeMenu struct {
layouts []*layout layouts []*layout
renderer d2interface.Renderer renderer d2interface.Renderer
inputManager d2interface.InputManager
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
scriptEngine *d2script.ScriptEngine scriptEngine *d2script.ScriptEngine
@ -125,9 +126,10 @@ type actionableElement interface {
} }
// NewEscapeMenu creates a new escape menu // NewEscapeMenu creates a new escape menu
func NewEscapeMenu(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, term d2interface.Terminal, func NewEscapeMenu(renderer d2interface.Renderer, inputManager d2interface.InputManager, audioProvider d2interface.AudioProvider, term d2interface.Terminal,
scriptEngine *d2script.ScriptEngine) *EscapeMenu { scriptEngine *d2script.ScriptEngine) *EscapeMenu {
m := &EscapeMenu{ m := &EscapeMenu{
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
terminal: term, terminal: term,
renderer: renderer, renderer: renderer,
@ -371,7 +373,7 @@ func (m *EscapeMenu) showLayout(id layoutID) {
} }
if id == saveLayoutID { if id == saveLayoutID {
mainMenu := CreateMainMenu(m.renderer, m.audioProvider, m.terminal, m.scriptEngine) mainMenu := CreateMainMenu(m.renderer, m.inputManager, m.audioProvider, m.terminal, m.scriptEngine)
mainMenu.setScreenMode(screenModeMainMenu) mainMenu.setScreenMode(screenModeMainMenu)
d2screen.SetNextScreen(mainMenu) d2screen.SetNextScreen(mainMenu)

View File

@ -8,7 +8,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
@ -31,12 +30,13 @@ type Game struct {
escapeMenu *EscapeMenu escapeMenu *EscapeMenu
renderer d2interface.Renderer renderer d2interface.Renderer
inputManager d2interface.InputManager
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
} }
// CreateGame creates the Gameplay screen and returns a pointer to it // CreateGame creates the Gameplay screen and returns a pointer to it
func CreateGame(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, gameClient *d2client.GameClient, func CreateGame(renderer d2interface.Renderer, inputManager d2interface.InputManager, audioProvider d2interface.AudioProvider, gameClient *d2client.GameClient,
term d2interface.Terminal, scriptEngine *d2script.ScriptEngine) *Game { term d2interface.Terminal, scriptEngine *d2script.ScriptEngine) *Game {
result := &Game{ result := &Game{
gameClient: gameClient, gameClient: gameClient,
@ -45,14 +45,15 @@ func CreateGame(renderer d2interface.Renderer, audioProvider d2interface.AudioPr
lastRegionType: d2enum.RegionNone, lastRegionType: d2enum.RegionNone,
ticksSinceLevelCheck: 0, ticksSinceLevelCheck: 0,
mapRenderer: d2maprenderer.CreateMapRenderer(renderer, gameClient.MapEngine, term), mapRenderer: d2maprenderer.CreateMapRenderer(renderer, gameClient.MapEngine, term),
escapeMenu: NewEscapeMenu(renderer, audioProvider, term, scriptEngine), escapeMenu: NewEscapeMenu(renderer, inputManager, audioProvider, term, scriptEngine),
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
renderer: renderer, renderer: renderer,
terminal: term, terminal: term,
} }
result.escapeMenu.onLoad() result.escapeMenu.onLoad()
if err := d2input.BindHandler(result.escapeMenu); err != nil { if err := inputManager.BindHandler(result.escapeMenu); err != nil {
fmt.Println("failed to add gameplay screen as event handler") fmt.Println("failed to add gameplay screen as event handler")
} }
@ -66,11 +67,11 @@ func (v *Game) OnLoad(_ d2screen.LoadingState) {
// OnUnload releases the resources of Gameplay screen // OnUnload releases the resources of Gameplay screen
func (v *Game) OnUnload() error { func (v *Game) OnUnload() error {
if err := d2input.UnbindHandler(v.gameControls); err != nil { // TODO: hack if err := v.inputManager.UnbindHandler(v.gameControls); err != nil { // TODO: hack
return err return err
} }
if err := d2input.UnbindHandler(v.escapeMenu); err != nil { // TODO: hack if err := v.inputManager.UnbindHandler(v.escapeMenu); err != nil { // TODO: hack
return err return err
} }
@ -162,7 +163,7 @@ func (v *Game) bindGameControls() {
v.gameControls = d2player.NewGameControls(v.renderer, player, v.gameClient.MapEngine, v.mapRenderer, v, v.terminal) v.gameControls = d2player.NewGameControls(v.renderer, player, v.gameClient.MapEngine, v.mapRenderer, v, v.terminal)
v.gameControls.Load() v.gameControls.Load()
if err := d2input.BindHandler(v.gameControls); err != nil { if err := v.inputManager.BindHandler(v.gameControls); err != nil {
fmt.Printf("failed to add gameControls as input handler for player: %s\n", player.Id) fmt.Printf("failed to add gameControls as input handler for player: %s\n", player.Id)
} }

View File

@ -15,7 +15,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
@ -68,6 +67,7 @@ type MainMenu struct {
tcpJoinGameEntry d2ui.TextBox tcpJoinGameEntry d2ui.TextBox
screenMode mainMenuScreenMode screenMode mainMenuScreenMode
leftButtonHeld bool leftButtonHeld bool
inputManager d2interface.InputManager
renderer d2interface.Renderer renderer d2interface.Renderer
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
@ -75,12 +75,13 @@ type MainMenu struct {
} }
// CreateMainMenu creates an instance of MainMenu // CreateMainMenu creates an instance of MainMenu
func CreateMainMenu(renderer d2interface.Renderer, audioProvider d2interface.AudioProvider, term d2interface.Terminal, func CreateMainMenu(renderer d2interface.Renderer, inputManager d2interface.InputManager, audioProvider d2interface.AudioProvider, term d2interface.Terminal,
scriptEngine *d2script.ScriptEngine) *MainMenu { scriptEngine *d2script.ScriptEngine) *MainMenu {
return &MainMenu{ return &MainMenu{
screenMode: screenModeUnknown, screenMode: screenModeUnknown,
leftButtonHeld: true, leftButtonHeld: true,
renderer: renderer, renderer: renderer,
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
terminal: term, terminal: term,
scriptEngine: scriptEngine, scriptEngine: scriptEngine,
@ -109,7 +110,7 @@ func (v *MainMenu) OnLoad(loading d2screen.LoadingState) {
v.setScreenMode(screenModeMainMenu) v.setScreenMode(screenModeMainMenu)
} }
if err := d2input.BindHandler(v); err != nil { if err := v.inputManager.BindHandler(v); err != nil {
fmt.Println("failed to add main menu as event handler") fmt.Println("failed to add main menu as event handler")
} }
} }
@ -279,18 +280,18 @@ func (v *MainMenu) createMultiplayerMenuButtons() {
} }
func (v *MainMenu) onMapTestClicked() { func (v *MainMenu) onMapTestClicked() {
d2screen.SetNextScreen(CreateMapEngineTest(0, 1, v.terminal, v.renderer)) d2screen.SetNextScreen(CreateMapEngineTest(0, 1, v.terminal, v.renderer, v.inputManager))
} }
func (v *MainMenu) onSinglePlayerClicked() { func (v *MainMenu) onSinglePlayerClicked() {
// Go here only if existing characters are available to select // Go here only if existing characters are available to select
if d2player.HasGameStates() { if d2player.HasGameStates() {
d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.audioProvider, d2clientconnectiontype.Local, d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.inputManager, v.audioProvider, d2clientconnectiontype.Local,
v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine)) v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine))
return return
} }
d2screen.SetNextScreen(CreateSelectHeroClass(v.renderer, v.audioProvider, d2screen.SetNextScreen(CreateSelectHeroClass(v.renderer, v.inputManager, v.audioProvider,
d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine)) d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine))
} }
@ -320,7 +321,7 @@ func (v *MainMenu) onExitButtonClicked() {
} }
func (v *MainMenu) onCreditsButtonClicked() { func (v *MainMenu) onCreditsButtonClicked() {
d2screen.SetNextScreen(CreateCredits(v.renderer, v.audioProvider, v.scriptEngine)) d2screen.SetNextScreen(CreateCredits(v.renderer, v.inputManager, v.audioProvider, v.scriptEngine))
} }
// Render renders the main menu // Render renders the main menu
@ -485,7 +486,7 @@ func (v *MainMenu) onTCPIPCancelClicked() {
} }
func (v *MainMenu) onTCPIPHostGameClicked() { func (v *MainMenu) onTCPIPHostGameClicked() {
d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.audioProvider, d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.inputManager, v.audioProvider,
d2clientconnectiontype.LANServer, "", v.terminal, v.scriptEngine)) d2clientconnectiontype.LANServer, "", v.terminal, v.scriptEngine))
} }
@ -498,6 +499,6 @@ func (v *MainMenu) onBtnTCPIPCancelClicked() {
} }
func (v *MainMenu) onBtnTCPIPOkClicked() { func (v *MainMenu) onBtnTCPIPOkClicked() {
d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.audioProvider, d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.inputManager, v.audioProvider,
d2clientconnectiontype.LANClient, v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine)) d2clientconnectiontype.LANClient, v.tcpJoinGameEntry.GetText(), v.terminal, v.scriptEngine))
} }

View File

@ -13,7 +13,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
) )
@ -81,11 +80,12 @@ var regions = []regionSpec{
// MapEngineTest represents the MapEngineTest screen // MapEngineTest represents the MapEngineTest screen
type MapEngineTest struct { type MapEngineTest struct {
gameState *d2player.PlayerState gameState *d2player.PlayerState
mapEngine *d2mapengine.MapEngine mapEngine *d2mapengine.MapEngine
mapRenderer *d2maprenderer.MapRenderer mapRenderer *d2maprenderer.MapRenderer
terminal d2interface.Terminal terminal d2interface.Terminal
renderer d2interface.Renderer renderer d2interface.Renderer
inputManager d2interface.InputManager
//TODO: this is region specific properties, should be refactored for multi-region rendering //TODO: this is region specific properties, should be refactored for multi-region rendering
currentRegion int currentRegion int
@ -97,7 +97,7 @@ type MapEngineTest struct {
} }
// CreateMapEngineTest creates the Map Engine Test screen and returns a pointer to it // CreateMapEngineTest creates the Map Engine Test screen and returns a pointer to it
func CreateMapEngineTest(currentRegion, levelPreset int, term d2interface.Terminal, renderer d2interface.Renderer) *MapEngineTest { func CreateMapEngineTest(currentRegion, levelPreset int, term d2interface.Terminal, renderer d2interface.Renderer, inputManager d2interface.InputManager) *MapEngineTest {
result := &MapEngineTest{ result := &MapEngineTest{
currentRegion: currentRegion, currentRegion: currentRegion,
levelPreset: levelPreset, levelPreset: levelPreset,
@ -106,6 +106,7 @@ func CreateMapEngineTest(currentRegion, levelPreset int, term d2interface.Termin
filesCount: 0, filesCount: 0,
terminal: term, terminal: term,
renderer: renderer, renderer: renderer,
inputManager: inputManager,
} }
result.gameState = d2player.CreateTestGameState() result.gameState = d2player.CreateTestGameState()
@ -160,7 +161,7 @@ func (met *MapEngineTest) loadRegionByIndex(n, levelPreset, fileIndex int) {
// OnLoad loads the resources for the Map Engine Test screen // OnLoad loads the resources for the Map Engine Test screen
func (met *MapEngineTest) OnLoad(loading d2screen.LoadingState) { func (met *MapEngineTest) OnLoad(loading d2screen.LoadingState) {
if err := d2input.BindHandler(met); err != nil { if err := met.inputManager.BindHandler(met); err != nil {
fmt.Printf("could not add MapEngineTest as event handler") fmt.Printf("could not add MapEngineTest as event handler")
} }
@ -178,7 +179,7 @@ func (met *MapEngineTest) OnLoad(loading d2screen.LoadingState) {
// OnUnload releases the resources for the Map Engine Test screen // OnUnload releases the resources for the Map Engine Test screen
func (met *MapEngineTest) OnUnload() error { func (met *MapEngineTest) OnUnload() error {
if err := d2input.UnbindHandler(met); err != nil { if err := met.inputManager.UnbindHandler(met); err != nil {
return err return err
} }

View File

@ -181,6 +181,7 @@ type SelectHeroClass struct {
hardcoreCharLabel d2ui.Label hardcoreCharLabel d2ui.Label
connectionType d2clientconnectiontype.ClientConnectionType connectionType d2clientconnectiontype.ClientConnectionType
connectionHost string connectionHost string
inputManager d2interface.InputManager
audioProvider d2interface.AudioProvider audioProvider d2interface.AudioProvider
terminal d2interface.Terminal terminal d2interface.Terminal
renderer d2interface.Renderer renderer d2interface.Renderer
@ -190,6 +191,7 @@ type SelectHeroClass struct {
// CreateSelectHeroClass creates an instance of a SelectHeroClass // CreateSelectHeroClass creates an instance of a SelectHeroClass
func CreateSelectHeroClass( func CreateSelectHeroClass(
renderer d2interface.Renderer, renderer d2interface.Renderer,
inputManager d2interface.InputManager,
audioProvider d2interface.AudioProvider, audioProvider d2interface.AudioProvider,
connectionType d2clientconnectiontype.ClientConnectionType, connectionType d2clientconnectiontype.ClientConnectionType,
connectionHost string, connectionHost string,
@ -201,6 +203,7 @@ func CreateSelectHeroClass(
selectedHero: d2enum.HeroNone, selectedHero: d2enum.HeroNone,
connectionType: connectionType, connectionType: connectionType,
connectionHost: connectionHost, connectionHost: connectionHost,
inputManager: inputManager,
audioProvider: audioProvider, audioProvider: audioProvider,
terminal: terminal, terminal: terminal,
renderer: renderer, renderer: renderer,
@ -340,7 +343,7 @@ func (v *SelectHeroClass) OnUnload() error {
} }
func (v *SelectHeroClass) onExitButtonClicked() { func (v *SelectHeroClass) onExitButtonClicked() {
d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.audioProvider, v.connectionType, d2screen.SetNextScreen(CreateCharacterSelect(v.renderer, v.inputManager, v.audioProvider, v.connectionType,
v.connectionHost, v.terminal, v.scriptEngine)) v.connectionHost, v.terminal, v.scriptEngine))
} }
@ -357,7 +360,7 @@ func (v *SelectHeroClass) onOkButtonClicked() {
fmt.Printf("can not connect to the host: %s\n", v.connectionHost) fmt.Printf("can not connect to the host: %s\n", v.connectionHost)
} }
d2screen.SetNextScreen(CreateGame(v.renderer, v.audioProvider, gameClient, v.terminal, v.scriptEngine)) d2screen.SetNextScreen(CreateGame(v.renderer, v.inputManager, v.audioProvider, gameClient, v.terminal, v.scriptEngine))
} }
// Render renders the Select Hero Class screen // Render renders the Select Hero Class screen

3
go.sum
View File

@ -29,6 +29,8 @@ github.com/hajimehoshi/ebiten v1.12.0-alpha.5.0.20200627174955-aea4630b5f84 h1:B
github.com/hajimehoshi/ebiten v1.12.0-alpha.5.0.20200627174955-aea4630b5f84/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o= github.com/hajimehoshi/ebiten v1.12.0-alpha.5.0.20200627174955-aea4630b5f84/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o=
github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce h1:cEKWqbtxFremkIRhJxz0Z80wXqNNe8ZNk6ra8XASC1I= github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce h1:cEKWqbtxFremkIRhJxz0Z80wXqNNe8ZNk6ra8XASC1I=
github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o= github.com/hajimehoshi/ebiten v1.12.0-alpha.6.0.20200629133528-780465b702ce/go.mod h1:8vzUI4e0fBkbONYOY4WJN/qikY2zv/VG6kFTzJ0B//o=
github.com/hajimehoshi/ebiten v1.12.0-alpha.7.0.20200703165837-6c33ed107f28 h1:su0k5pB/7j3FCoLsXGoPNWMJW7phujO0GC8sViJ07ow=
github.com/hajimehoshi/ebiten v1.12.0-alpha.7.0.20200703165837-6c33ed107f28/go.mod h1:vDl2Rhoz8i09Red8XR3B+/Jw+IubfG+V9SDBgQOEI8I=
github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61 h1:PYZd+KUiq0+ByYlNTMByZz2U/VJ+KmLJ9Q2QAoYb8G0= github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61 h1:PYZd+KUiq0+ByYlNTMByZz2U/VJ+KmLJ9Q2QAoYb8G0=
github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= github.com/hajimehoshi/file2byteslice v0.0.0-20190607115218-790acb50cc61/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE=
github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE= github.com/hajimehoshi/go-mp3 v0.2.1/go.mod h1:Rr+2P46iH6PwTPVgSsEwBkon0CK5DxCAeX/Rp65DCTE=
@ -66,6 +68,7 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/veandco/go-sdl2 v0.4.4/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
github.com/walle/lll v1.0.1 h1:lbK8008fOXbQNYt8daBGUrjvElvlwlE7D7N/9dLP5IQ= github.com/walle/lll v1.0.1 h1:lbK8008fOXbQNYt8daBGUrjvElvlwlE7D7N/9dLP5IQ=
github.com/walle/lll v1.0.1/go.mod h1:lYxcXzoPhiAHR9eaq+Yv7RYg1nIipLloBCIfPUzfaWQ= github.com/walle/lll v1.0.1/go.mod h1:lYxcXzoPhiAHR9eaq+Yv7RYg1nIipLloBCIfPUzfaWQ=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

View File

@ -39,15 +39,15 @@ func main() {
panic(err) panic(err)
} }
d2input.Create() // TODO d2input singleton must be init before d2term inputManager := d2input.New()
term, err := d2term.Initialize() term, err := d2term.New(inputManager)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
scriptEngine := d2script.CreateScriptEngine() scriptEngine := d2script.CreateScriptEngine()
app := d2app.Create(GitBranch, GitCommit, term, scriptEngine, audio, renderer) app := d2app.Create(GitBranch, GitCommit, inputManager, term, scriptEngine, audio, renderer)
if err := app.Run(); err != nil { if err := app.Run(); err != nil {
log.Fatal(err) log.Fatal(err)
} }