diff --git a/d2common/d2interface/audio_provider.go b/d2common/d2interface/audio_provider.go new file mode 100644 index 00000000..98f16e19 --- /dev/null +++ b/d2common/d2interface/audio_provider.go @@ -0,0 +1,7 @@ +package d2interface + +type AudioProvider interface { + PlayBGM(song string) + LoadSoundEffect(sfx string) (SoundEffect, error) + SetVolumes(bgmVolume, sfxVolume float64) +} diff --git a/d2common/d2interface/sound_effect.go b/d2common/d2interface/sound_effect.go new file mode 100644 index 00000000..343a67aa --- /dev/null +++ b/d2common/d2interface/sound_effect.go @@ -0,0 +1,6 @@ +package d2interface + +type SoundEffect interface { + Play() + Stop() +} diff --git a/d2core/d2audio/d2audio.go b/d2core/d2audio/d2audio.go deleted file mode 100644 index 7a3ed93f..00000000 --- a/d2core/d2audio/d2audio.go +++ /dev/null @@ -1,59 +0,0 @@ -package d2audio - -import ( - "errors" -) - -var singleton AudioProvider - -var ( - ErrWasInit = errors.New("audio system is already initialized") - ErrNotInit = errors.New("audio system has not been initialized") -) - -type SoundEffect interface { - Play() - Stop() -} - -type AudioProvider interface { - PlayBGM(song string) - LoadSoundEffect(sfx string) (SoundEffect, error) - SetVolumes(bgmVolume, sfxVolume float64) -} - -// CreateManager creates a sound provider -func Initialize(audioProvider AudioProvider) error { - verifyNotInit() - singleton = audioProvider - return nil -} - -// PlayBGM plays an infinitely looping background track -func PlayBGM(song string) error { - verifyWasInit() - singleton.PlayBGM(song) - return nil -} - -func LoadSoundEffect(sfx string) (SoundEffect, error) { - verifyWasInit() - return singleton.LoadSoundEffect(sfx) -} - -func SetVolumes(bgmVolume, sfxVolume float64) { - verifyWasInit() - singleton.SetVolumes(bgmVolume, sfxVolume) -} - -func verifyWasInit() { - if singleton == nil { - panic(ErrNotInit) - } -} - -func verifyNotInit() { - if singleton != nil { - panic(ErrWasInit) - } -} diff --git a/d2core/d2audio/ebiten/ebiten_audio_provider.go b/d2core/d2audio/ebiten/ebiten_audio_provider.go index c2db4f07..80d47971 100644 --- a/d2core/d2audio/ebiten/ebiten_audio_provider.go +++ b/d2core/d2audio/ebiten/ebiten_audio_provider.go @@ -3,8 +3,9 @@ package ebiten import ( "log" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/hajimehoshi/ebiten/audio/wav" "github.com/hajimehoshi/ebiten/audio" @@ -70,7 +71,7 @@ func (eap *AudioProvider) PlayBGM(song string) { } } -func (eap *AudioProvider) LoadSoundEffect(sfx string) (d2audio.SoundEffect, error) { +func (eap *AudioProvider) LoadSoundEffect(sfx string) (d2interface.SoundEffect, error) { result := CreateSoundEffect(sfx, eap.audioContext, eap.sfxVolume) // TODO: Split return result, nil } diff --git a/d2core/d2ui/d2ui.go b/d2core/d2ui/d2ui.go index 363d6879..a415808a 100644 --- a/d2core/d2ui/d2ui.go +++ b/d2core/d2ui/d2ui.go @@ -3,8 +3,9 @@ package d2ui import ( "log" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" ) @@ -28,10 +29,10 @@ type UI struct { } var singleton UI -var clickSfx d2audio.SoundEffect +var clickSfx d2interface.SoundEffect -func Initialize() { - sfx, err := d2audio.LoadSoundEffect(d2resource.SFXButtonClick) +func Initialize(audioProvider d2interface.AudioProvider) { + sfx, err := audioProvider.LoadSoundEffect(d2resource.SFXButtonClick) if err != nil { log.Fatalf("failed to initialize ui: %v", err) } diff --git a/d2game/d2gamescreen/character_select.go b/d2game/d2gamescreen/character_select.go index 0def4683..b591522a 100644 --- a/d2game/d2gamescreen/character_select.go +++ b/d2game/d2gamescreen/character_select.go @@ -6,12 +6,13 @@ import ( "os" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" @@ -45,18 +46,21 @@ type CharacterSelect struct { showDeleteConfirmation bool connectionType d2clientconnectiontype.ClientConnectionType connectionHost string + audioProvider d2interface.AudioProvider } -func CreateCharacterSelect(connectionType d2clientconnectiontype.ClientConnectionType, connectionHost string) *CharacterSelect { +func CreateCharacterSelect(audioProvider d2interface.AudioProvider, + connectionType d2clientconnectiontype.ClientConnectionType, connectionHost string) *CharacterSelect { return &CharacterSelect{ selectedCharacter: -1, connectionType: connectionType, connectionHost: connectionHost, + audioProvider: audioProvider, } } func (v *CharacterSelect) OnLoad(loading d2screen.LoadingState) { - d2audio.PlayBGM(d2resource.BGMTitle) + v.audioProvider.PlayBGM(d2resource.BGMTitle) d2input.BindHandler(v) loading.Progress(0.1) @@ -172,11 +176,11 @@ func (v *CharacterSelect) updateCharacterBoxes() { } func (v *CharacterSelect) onNewCharButtonClicked() { - d2screen.SetNextScreen(CreateSelectHeroClass(v.connectionType, v.connectionHost)) + d2screen.SetNextScreen(CreateSelectHeroClass(v.audioProvider, v.connectionType, v.connectionHost)) } func (v *CharacterSelect) onExitButtonClicked() { - mainMenu := CreateMainMenu() + mainMenu := CreateMainMenu(v.audioProvider) mainMenu.SetScreenMode(ScreenModeMainMenu) d2screen.SetNextScreen(mainMenu) } @@ -307,5 +311,5 @@ func (v *CharacterSelect) onOkButtonClicked() { gameClient.Open("", v.gameStates[v.selectedCharacter].FilePath) } - d2screen.SetNextScreen(CreateGame(gameClient)) + d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient)) } diff --git a/d2game/d2gamescreen/credits.go b/d2game/d2gamescreen/credits.go index dd53f644..434af10e 100644 --- a/d2game/d2gamescreen/credits.go +++ b/d2game/d2gamescreen/credits.go @@ -8,6 +8,8 @@ import ( "path" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" @@ -32,15 +34,17 @@ type Credits struct { cycleTime float64 cyclesTillNextLine int doneWithCredits bool + audioProvider d2interface.AudioProvider } // CreateCredits creates an instance of the credits screen -func CreateCredits() *Credits { +func CreateCredits(audioProvider d2interface.AudioProvider) *Credits { result := &Credits{ labels: make([]*labelItem, 0), cycleTime: 0, doneWithCredits: false, cyclesTillNextLine: 0, + audioProvider: audioProvider, } return result } @@ -134,7 +138,7 @@ func (v *Credits) Advance(tickTime float64) error { } func (v *Credits) onExitButtonClicked() { - mainMenu := CreateMainMenu() + mainMenu := CreateMainMenu(v.audioProvider) mainMenu.SetScreenMode(ScreenModeMainMenu) d2screen.SetNextScreen(mainMenu) } diff --git a/d2game/d2gamescreen/escape_menu.go b/d2game/d2gamescreen/escape_menu.go index d3dc77b7..5b97cba4 100644 --- a/d2game/d2gamescreen/escape_menu.go +++ b/d2game/d2gamescreen/escape_menu.go @@ -3,8 +3,9 @@ package d2gamescreen import ( "fmt" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" @@ -56,13 +57,14 @@ const ( type EscapeMenu struct { isOpen bool - selectSound d2audio.SoundEffect + selectSound d2interface.SoundEffect currentLayout layoutID // leftPent and rightPent are generated once and shared between the layouts - leftPent *d2gui.AnimatedSprite - rightPent *d2gui.AnimatedSprite - layouts []*layout + leftPent *d2gui.AnimatedSprite + rightPent *d2gui.AnimatedSprite + layouts []*layout + audioProvider d2interface.AudioProvider } type layout struct { @@ -110,8 +112,11 @@ type actionableElement interface { Trigger() } -func NewEscapeMenu() *EscapeMenu { - m := &EscapeMenu{} +func NewEscapeMenu(audioProvider d2interface.AudioProvider) *EscapeMenu { + m := &EscapeMenu{ + audioProvider: audioProvider, + } + m.layouts = []*layout{ mainLayoutID: m.newMainLayout(), optionsLayoutID: m.newOptionsLayout(), @@ -283,7 +288,7 @@ func (m *EscapeMenu) addEnumLabel(l *layout, optID optionID, text string, values } func (m *EscapeMenu) OnLoad() { - m.selectSound, _ = d2audio.LoadSoundEffect(d2resource.SFXCursorSelect) + m.selectSound, _ = m.audioProvider.LoadSoundEffect(d2resource.SFXCursorSelect) } func (m *EscapeMenu) OnEscKey() { @@ -334,7 +339,7 @@ func (m *EscapeMenu) showLayout(id layoutID) { } if id == saveLayoutID { - mainMenu := CreateMainMenu() + mainMenu := CreateMainMenu(m.audioProvider) mainMenu.SetScreenMode(ScreenModeMainMenu) d2screen.SetNextScreen(mainMenu) return diff --git a/d2game/d2gamescreen/game.go b/d2game/d2gamescreen/game.go index 7394a1c3..cbfa05ec 100644 --- a/d2game/d2gamescreen/game.go +++ b/d2game/d2gamescreen/game.go @@ -2,14 +2,15 @@ package d2gamescreen import ( "fmt" - "github.com/OpenDiablo2/OpenDiablo2/d2common" "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer" @@ -25,11 +26,12 @@ type Game struct { gameControls *d2player.GameControls // TODO: Hack localPlayer *d2mapentity.Player lastRegionType d2enum.RegionIdType + audioProvider d2interface.AudioProvider ticksSinceLevelCheck float64 escapeMenu *EscapeMenu } -func CreateGame(gameClient *d2client.GameClient) *Game { +func CreateGame(audioProvider d2interface.AudioProvider, gameClient *d2client.GameClient) *Game { result := &Game{ gameClient: gameClient, gameControls: nil, @@ -37,7 +39,8 @@ func CreateGame(gameClient *d2client.GameClient) *Game { lastRegionType: d2enum.RegionNone, ticksSinceLevelCheck: 0, mapRenderer: d2maprenderer.CreateMapRenderer(gameClient.MapEngine), - escapeMenu: NewEscapeMenu(), + escapeMenu: NewEscapeMenu(audioProvider), + audioProvider: audioProvider, } result.escapeMenu.OnLoad() d2input.BindHandler(result.escapeMenu) @@ -45,7 +48,7 @@ func CreateGame(gameClient *d2client.GameClient) *Game { } func (v *Game) OnLoad(loading d2screen.LoadingState) { - d2audio.PlayBGM("") + v.audioProvider.PlayBGM("") } func (v *Game) OnUnload() error { @@ -88,7 +91,7 @@ func (v *Game) Advance(tickTime float64) error { tile := v.gameClient.MapEngine.TileAt(v.localPlayer.TileX, v.localPlayer.TileY) if tile != nil { musicInfo := d2common.GetMusicDef(tile.RegionType) - d2audio.PlayBGM(musicInfo.MusicFile) + v.audioProvider.PlayBGM(musicInfo.MusicFile) // skip showing zone change text the first time we enter the world if v.lastRegionType != d2enum.RegionNone && v.lastRegionType != tile.RegionType { diff --git a/d2game/d2gamescreen/main_menu.go b/d2game/d2gamescreen/main_menu.go index bfcae5c8..2a3834bd 100644 --- a/d2game/d2gamescreen/main_menu.go +++ b/d2game/d2gamescreen/main_menu.go @@ -8,6 +8,8 @@ import ( "os/exec" "runtime" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" @@ -18,7 +20,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" @@ -69,19 +70,21 @@ type MainMenu struct { tcpJoinGameEntry d2ui.TextBox screenMode MainMenuScreenMode leftButtonHeld bool + audioProvider d2interface.AudioProvider } // CreateMainMenu creates an instance of MainMenu -func CreateMainMenu() *MainMenu { +func CreateMainMenu(audioProvider d2interface.AudioProvider) *MainMenu { return &MainMenu{ screenMode: ScreenModeUnknown, leftButtonHeld: true, + audioProvider: audioProvider, } } // Load is called to load the resources for the main menu func (v *MainMenu) OnLoad(loading d2screen.LoadingState) { - d2audio.PlayBGM(d2resource.BGMTitle) + v.audioProvider.PlayBGM(d2resource.BGMTitle) loading.Progress(0.2) v.versionLabel = d2ui.CreateLabel(d2resource.FontFormal12, d2resource.PaletteStatic) @@ -277,10 +280,10 @@ func openbrowser(url string) { func (v *MainMenu) onSinglePlayerClicked() { // Go here only if existing characters are available to select if d2player.HasGameStates() { - d2screen.SetNextScreen(CreateCharacterSelect(d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText())) + d2screen.SetNextScreen(CreateCharacterSelect(v.audioProvider, d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText())) return } - d2screen.SetNextScreen(CreateSelectHeroClass(d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText())) + d2screen.SetNextScreen(CreateSelectHeroClass(v.audioProvider, d2clientconnectiontype.Local, v.tcpJoinGameEntry.GetText())) } func (v *MainMenu) onGithubButtonClicked() { @@ -292,7 +295,7 @@ func (v *MainMenu) onExitButtonClicked() { } func (v *MainMenu) onCreditsButtonClicked() { - d2screen.SetNextScreen(CreateCredits()) + d2screen.SetNextScreen(CreateCredits(v.audioProvider)) } // Render renders the main menu @@ -407,7 +410,7 @@ func (v *MainMenu) onTcpIpCancelClicked() { } func (v *MainMenu) onTcpIpHostGameClicked() { - d2screen.SetNextScreen(CreateCharacterSelect(d2clientconnectiontype.LANServer, "")) + d2screen.SetNextScreen(CreateCharacterSelect(v.audioProvider, d2clientconnectiontype.LANServer, "")) } func (v *MainMenu) onTcpIpJoinGameClicked() { @@ -419,5 +422,5 @@ func (v *MainMenu) onBtnTcpIpCancelClicked() { } func (v *MainMenu) onBtnTcpIpOkClicked() { - d2screen.SetNextScreen(CreateCharacterSelect(d2clientconnectiontype.LANClient, v.tcpJoinGameEntry.GetText())) + d2screen.SetNextScreen(CreateCharacterSelect(v.audioProvider, d2clientconnectiontype.LANClient, v.tcpJoinGameEntry.GetText())) } diff --git a/d2game/d2gamescreen/select_hero_class.go b/d2game/d2gamescreen/select_hero_class.go index 40455178..089bcdb6 100644 --- a/d2game/d2gamescreen/select_hero_class.go +++ b/d2game/d2gamescreen/select_hero_class.go @@ -4,6 +4,8 @@ import ( "image" "image/color" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client" @@ -15,7 +17,6 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" @@ -32,8 +33,8 @@ type HeroRenderInfo struct { BackWalkSprite *d2ui.Sprite BackWalkSpriteOverlay *d2ui.Sprite SelectionBounds image.Rectangle - SelectSfx d2audio.SoundEffect - DeselectSfx d2audio.SoundEffect + SelectSfx d2interface.SoundEffect + DeselectSfx d2interface.SoundEffect } func (hri *HeroRenderInfo) Advance(elapsed float64) { @@ -67,20 +68,23 @@ type SelectHeroClass struct { hardcoreCharLabel d2ui.Label connectionType d2clientconnectiontype.ClientConnectionType connectionHost string + audioProvider d2interface.AudioProvider } -func CreateSelectHeroClass(connectionType d2clientconnectiontype.ClientConnectionType, connectionHost string) *SelectHeroClass { +func CreateSelectHeroClass(audioProvider d2interface.AudioProvider, + connectionType d2clientconnectiontype.ClientConnectionType, connectionHost string) *SelectHeroClass { result := &SelectHeroClass{ heroRenderInfo: make(map[d2enum.Hero]*HeroRenderInfo), selectedHero: d2enum.HeroNone, connectionType: connectionType, connectionHost: connectionHost, + audioProvider: audioProvider, } return result } func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { - d2audio.PlayBGM(d2resource.BGMTitle) + v.audioProvider.PlayBGM(d2resource.BGMTitle) loading.Progress(0.1) v.bgImage = loadSprite(d2resource.CharacterSelectBackground, d2resource.PaletteFechar) @@ -172,8 +176,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelectBarbarianBackWalk, d2resource.PaletteFechar), nil, image.Rectangle{Min: image.Point{X: 364, Y: 201}, Max: image.Point{X: 90, Y: 170}}, - loadSoundEffect(d2resource.SFXBarbarianSelect), - loadSoundEffect(d2resource.SFXBarbarianDeselect), + v.loadSoundEffect(d2resource.SFXBarbarianSelect), + v.loadSoundEffect(d2resource.SFXBarbarianDeselect), } v.heroRenderInfo[d2enum.HeroBarbarian].IdleSprite.SetPosition(400, 330) v.heroRenderInfo[d2enum.HeroBarbarian].IdleSprite.PlayForward() @@ -205,8 +209,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelecSorceressBackWalk, d2resource.PaletteFechar), loadSprite(d2resource.CharacterSelecSorceressBackWalkOverlay, d2resource.PaletteFechar), image.Rectangle{Min: image.Point{X: 580, Y: 240}, Max: image.Point{X: 65, Y: 160}}, - loadSoundEffect(d2resource.SFXSorceressSelect), - loadSoundEffect(d2resource.SFXSorceressDeselect), + v.loadSoundEffect(d2resource.SFXSorceressSelect), + v.loadSoundEffect(d2resource.SFXSorceressDeselect), } v.heroRenderInfo[d2enum.HeroSorceress].IdleSprite.SetPosition(626, 352) v.heroRenderInfo[d2enum.HeroSorceress].IdleSprite.PlayForward() @@ -252,8 +256,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelecNecromancerBackWalk, d2resource.PaletteFechar), loadSprite(d2resource.CharacterSelecNecromancerBackWalkOverlay, d2resource.PaletteFechar), image.Rectangle{Min: image.Point{X: 265, Y: 220}, Max: image.Point{X: 55, Y: 175}}, - loadSoundEffect(d2resource.SFXNecromancerSelect), - loadSoundEffect(d2resource.SFXNecromancerDeselect), + v.loadSoundEffect(d2resource.SFXNecromancerSelect), + v.loadSoundEffect(d2resource.SFXNecromancerDeselect), } v.heroRenderInfo[d2enum.HeroNecromancer].IdleSprite.SetPosition(300, 335) v.heroRenderInfo[d2enum.HeroNecromancer].IdleSprite.PlayForward() @@ -296,8 +300,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelecPaladinBackWalk, d2resource.PaletteFechar), nil, image.Rectangle{Min: image.Point{X: 490, Y: 210}, Max: image.Point{X: 65, Y: 180}}, - loadSoundEffect(d2resource.SFXPaladinSelect), - loadSoundEffect(d2resource.SFXPaladinDeselect), + v.loadSoundEffect(d2resource.SFXPaladinSelect), + v.loadSoundEffect(d2resource.SFXPaladinDeselect), } v.heroRenderInfo[d2enum.HeroPaladin].IdleSprite.SetPosition(521, 338) v.heroRenderInfo[d2enum.HeroPaladin].IdleSprite.PlayForward() @@ -333,8 +337,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelecAmazonBackWalk, d2resource.PaletteFechar), nil, image.Rectangle{Min: image.Point{X: 70, Y: 220}, Max: image.Point{X: 55, Y: 200}}, - loadSoundEffect(d2resource.SFXAmazonSelect), - loadSoundEffect(d2resource.SFXAmazonDeselect), + v.loadSoundEffect(d2resource.SFXAmazonSelect), + v.loadSoundEffect(d2resource.SFXAmazonDeselect), } v.heroRenderInfo[d2enum.HeroAmazon].IdleSprite.SetPosition(100, 339) v.heroRenderInfo[d2enum.HeroAmazon].IdleSprite.PlayForward() @@ -365,8 +369,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelectAssassinBackWalk, d2resource.PaletteFechar), nil, image.Rectangle{Min: image.Point{X: 175, Y: 235}, Max: image.Point{X: 50, Y: 180}}, - loadSoundEffect(d2resource.SFXAssassinSelect), - loadSoundEffect(d2resource.SFXAssassinDeselect), + v.loadSoundEffect(d2resource.SFXAssassinSelect), + v.loadSoundEffect(d2resource.SFXAssassinDeselect), } v.heroRenderInfo[d2enum.HeroAssassin].IdleSprite.SetPosition(231, 365) v.heroRenderInfo[d2enum.HeroAssassin].IdleSprite.PlayForward() @@ -398,8 +402,8 @@ func (v *SelectHeroClass) OnLoad(loading d2screen.LoadingState) { loadSprite(d2resource.CharacterSelectDruidBackWalk, d2resource.PaletteFechar), nil, image.Rectangle{Min: image.Point{X: 680, Y: 220}, Max: image.Point{X: 70, Y: 195}}, - loadSoundEffect(d2resource.SFXDruidSelect), - loadSoundEffect(d2resource.SFXDruidDeselect), + v.loadSoundEffect(d2resource.SFXDruidSelect), + v.loadSoundEffect(d2resource.SFXDruidDeselect), } v.heroRenderInfo[d2enum.HeroDruid].IdleSprite.SetPosition(720, 370) v.heroRenderInfo[d2enum.HeroDruid].IdleSprite.PlayForward() @@ -429,15 +433,15 @@ func (v *SelectHeroClass) OnUnload() error { return nil } -func (v SelectHeroClass) onExitButtonClicked() { - d2screen.SetNextScreen(CreateCharacterSelect(v.connectionType, v.connectionHost)) +func (v *SelectHeroClass) onExitButtonClicked() { + d2screen.SetNextScreen(CreateCharacterSelect(v.audioProvider, v.connectionType, v.connectionHost)) } -func (v SelectHeroClass) onOkButtonClicked() { +func (v *SelectHeroClass) onOkButtonClicked() { gameState := d2player.CreatePlayerState(v.heroNameTextbox.GetText(), v.selectedHero, *d2datadict.CharStats[v.selectedHero], v.hardcoreCheckbox.GetCheckState()) gameClient, _ := d2client.Create(d2clientconnectiontype.Local) gameClient.Open(v.connectionHost, gameState.FilePath) - d2screen.SetNextScreen(CreateGame(gameClient)) + d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient)) } func (v *SelectHeroClass) Render(screen d2render.Surface) error { @@ -658,7 +662,7 @@ func loadSprite(animationPath, palettePath string) *d2ui.Sprite { return sprite } -func loadSoundEffect(sfx string) d2audio.SoundEffect { - result, _ := d2audio.LoadSoundEffect(sfx) +func (v *SelectHeroClass) loadSoundEffect(sfx string) d2interface.SoundEffect { + result, _ := v.audioProvider.LoadSoundEffect(sfx) return result } diff --git a/main.go b/main.go index 1dfd7070..7e02a480 100644 --- a/main.go +++ b/main.go @@ -15,13 +15,15 @@ import ( "strings" "sync" + ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten" + + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio" - ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2config" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" @@ -73,7 +75,13 @@ func main() { log.SetFlags(log.Lshortfile) log.Println("OpenDiablo2 - Open source Diablo 2 engine") - if err := initialize(); err != nil { + // Initialize our providers + audioProvider, err := ebiten2.CreateAudio() + if err != nil { + panic(err) + } + + if err := initialize(audioProvider); err != nil { if os.IsNotExist(err) { run(updateInitError) } @@ -88,7 +96,7 @@ func main() { } if *region == 0 { - d2screen.SetNextScreen(d2gamescreen.CreateMainMenu()) + d2screen.SetNextScreen(d2gamescreen.CreateMainMenu(audioProvider)) } else { d2screen.SetNextScreen(d2gamescreen.CreateMapEngineTest(*region, *preset)) } @@ -96,7 +104,7 @@ func main() { run(update) } -func initialize() error { +func initialize(audioProvider d2interface.AudioProvider) error { singleton.timeScale = 1.0 singleton.lastTime = d2common.Now() singleton.lastScreenAdvance = singleton.lastTime @@ -181,15 +189,7 @@ func initialize() error { return err } - audioProvider, err := ebiten2.CreateAudio() - if err != nil { - return err - } - - if err := d2audio.Initialize(audioProvider); err != nil { - return err - } - d2audio.SetVolumes(config.BgmVolume, config.SfxVolume) + audioProvider.SetVolumes(config.BgmVolume, config.SfxVolume) if err := loadDataDict(); err != nil { return err @@ -201,7 +201,7 @@ func initialize() error { d2inventory.LoadHeroObjects() - d2ui.Initialize() + d2ui.Initialize(audioProvider) d2script.CreateScriptEngine()