1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-11-05 17:57:17 -05:00
OpenDiablo2/d2core/d2scene/main_menu.go

276 lines
9.3 KiB
Go
Raw Normal View History

2019-11-10 08:51:02 -05:00
package d2scene
2019-10-24 09:31:59 -04:00
import (
2019-10-26 12:55:36 -04:00
"fmt"
"image/color"
2019-10-26 12:55:36 -04:00
"log"
2019-10-25 23:41:54 -04:00
"os"
2019-10-26 12:55:36 -04:00
"os/exec"
"runtime"
"github.com/OpenDiablo2/OpenDiablo2/d2core"
"github.com/OpenDiablo2/D2Shared/d2common/d2resource"
2019-11-10 08:51:02 -05:00
"github.com/OpenDiablo2/D2Shared/d2data/d2datadict"
2019-11-10 03:36:53 -05:00
"github.com/OpenDiablo2/D2Shared/d2common/d2enum"
2019-11-10 03:36:53 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2render"
"github.com/OpenDiablo2/D2Shared/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2corecommon/d2coreinterface"
2019-11-10 03:36:53 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2audio"
"github.com/OpenDiablo2/D2Shared/d2common"
2019-11-10 08:51:02 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2render/d2ui"
2019-10-24 09:31:59 -04:00
"github.com/hajimehoshi/ebiten"
)
// MainMenu represents the main menu
2019-10-24 09:31:59 -04:00
type MainMenu struct {
2019-11-10 08:51:02 -05:00
uiManager *d2ui.Manager
2019-11-10 03:36:53 -05:00
soundManager *d2audio.Manager
fileProvider d2interface.FileProvider
sceneProvider d2coreinterface.SceneProvider
2019-11-10 10:44:13 -05:00
trademarkBackground d2render.Sprite
background d2render.Sprite
diabloLogoLeft d2render.Sprite
diabloLogoRight d2render.Sprite
diabloLogoLeftBack d2render.Sprite
diabloLogoRightBack d2render.Sprite
singlePlayerButton d2ui.Button
githubButton d2ui.Button
exitDiabloButton d2ui.Button
creditsButton d2ui.Button
cinematicsButton d2ui.Button
mapTestButton d2ui.Button
copyrightLabel d2ui.Label
copyrightLabel2 d2ui.Label
openDiabloLabel d2ui.Label
versionLabel d2ui.Label
commitLabel d2ui.Label
2019-10-26 20:09:33 -04:00
2019-10-26 00:55:59 -04:00
ShowTrademarkScreen bool
leftButtonHeld bool
2019-10-24 09:31:59 -04:00
}
// CreateMainMenu creates an instance of MainMenu
func CreateMainMenu(fileProvider d2interface.FileProvider, sceneProvider d2coreinterface.SceneProvider, uiManager *d2ui.Manager, soundManager *d2audio.Manager) *MainMenu {
2019-10-24 09:31:59 -04:00
result := &MainMenu{
2019-10-25 20:28:14 -04:00
fileProvider: fileProvider,
uiManager: uiManager,
soundManager: soundManager,
2019-10-26 00:26:48 -04:00
sceneProvider: sceneProvider,
2019-10-26 00:55:59 -04:00
ShowTrademarkScreen: true,
leftButtonHeld: true,
2019-10-24 09:31:59 -04:00
}
return result
}
// Load is called to load the resources for the main menu
2019-10-25 20:28:14 -04:00
func (v *MainMenu) Load() []func() {
2019-11-10 08:51:02 -05:00
v.soundManager.PlayBGM(d2resource.BGMTitle)
2019-10-25 20:28:14 -04:00
return []func(){
func() {
2019-11-10 08:51:02 -05:00
v.versionLabel = d2ui.CreateLabel(v.fileProvider, d2resource.FontFormal12, d2enum.Static)
v.versionLabel.Alignment = d2ui.LabelAlignRight
2019-11-10 03:36:53 -05:00
v.versionLabel.SetText("OpenDiablo2 - " + d2common.BuildInfo.Branch)
v.versionLabel.Color = color.RGBA{255, 255, 255, 255}
v.versionLabel.MoveTo(795, -10)
},
func() {
2019-11-10 08:51:02 -05:00
v.commitLabel = d2ui.CreateLabel(v.fileProvider, d2resource.FontFormal10, d2enum.Static)
v.commitLabel.Alignment = d2ui.LabelAlignLeft
2019-11-10 03:36:53 -05:00
v.commitLabel.SetText(d2common.BuildInfo.Commit)
v.commitLabel.Color = color.RGBA{255, 255, 255, 255}
v.commitLabel.MoveTo(2, 2)
},
2019-10-25 20:28:14 -04:00
func() {
2019-11-10 08:51:02 -05:00
v.copyrightLabel = d2ui.CreateLabel(v.fileProvider, d2resource.FontFormal12, d2enum.Static)
v.copyrightLabel.Alignment = d2ui.LabelAlignCenter
v.copyrightLabel.SetText("Diablo 2 is © Copyright 2000-2016 Blizzard Entertainment")
v.copyrightLabel.Color = color.RGBA{188, 168, 140, 255}
v.copyrightLabel.MoveTo(400, 500)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.copyrightLabel2 = d2ui.CreateLabel(v.fileProvider, d2resource.FontFormal12, d2enum.Static)
v.copyrightLabel2.Alignment = d2ui.LabelAlignCenter
2019-11-10 03:36:53 -05:00
v.copyrightLabel2.SetText(d2common.TranslateString("#1614"))
v.copyrightLabel2.Color = color.RGBA{188, 168, 140, 255}
v.copyrightLabel2.MoveTo(400, 525)
2019-10-25 20:28:14 -04:00
},
2019-10-26 12:55:36 -04:00
func() {
2019-11-10 08:51:02 -05:00
v.openDiabloLabel = d2ui.CreateLabel(v.fileProvider, d2resource.FontFormal10, d2enum.Static)
v.openDiabloLabel.Alignment = d2ui.LabelAlignCenter
2019-10-26 12:55:36 -04:00
v.openDiabloLabel.SetText("OpenDiablo2 is neither developed by, nor endorsed by Blizzard or its parent company Activision")
v.openDiabloLabel.Color = color.RGBA{255, 255, 140, 255}
v.openDiabloLabel.MoveTo(400, 580)
},
2019-10-25 20:28:14 -04:00
func() {
2019-11-10 08:51:02 -05:00
v.background = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.GameSelectScreen), d2datadict.Palettes[d2enum.Sky])
v.background.MoveTo(0, 0)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.trademarkBackground = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.TrademarkScreen), d2datadict.Palettes[d2enum.Sky])
v.trademarkBackground.MoveTo(0, 0)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.diabloLogoLeft = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.Diablo2LogoFireLeft), d2datadict.Palettes[d2enum.Units])
v.diabloLogoLeft.Blend = true
v.diabloLogoLeft.Animate = true
v.diabloLogoLeft.MoveTo(400, 120)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.diabloLogoRight = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.Diablo2LogoFireRight), d2datadict.Palettes[d2enum.Units])
v.diabloLogoRight.Blend = true
v.diabloLogoRight.Animate = true
v.diabloLogoRight.MoveTo(400, 120)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.diabloLogoLeftBack = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.Diablo2LogoBlackLeft), d2datadict.Palettes[d2enum.Units])
v.diabloLogoLeftBack.MoveTo(400, 120)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.diabloLogoRightBack = d2render.CreateSprite(v.fileProvider.LoadFile(d2resource.Diablo2LogoBlackRight), d2datadict.Palettes[d2enum.Units])
v.diabloLogoRightBack.MoveTo(400, 120)
2019-10-25 20:28:14 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.exitDiabloButton = d2ui.CreateButton(d2ui.ButtonTypeWide, v.fileProvider, d2common.TranslateString("#1625"))
v.exitDiabloButton.MoveTo(264, 535)
2019-10-26 00:55:59 -04:00
v.exitDiabloButton.SetVisible(!v.ShowTrademarkScreen)
2019-10-25 23:41:54 -04:00
v.exitDiabloButton.OnActivated(func() { v.onExitButtonClicked() })
v.uiManager.AddWidget(&v.exitDiabloButton)
},
2019-10-26 00:06:54 -04:00
func() {
2019-11-10 08:51:02 -05:00
v.creditsButton = d2ui.CreateButton(d2ui.ButtonTypeShort, v.fileProvider, d2common.TranslateString("#1627"))
2019-10-26 00:06:54 -04:00
v.creditsButton.MoveTo(264, 505)
2019-10-26 00:55:59 -04:00
v.creditsButton.SetVisible(!v.ShowTrademarkScreen)
2019-10-26 00:26:48 -04:00
v.creditsButton.OnActivated(func() { v.onCreditsButtonClicked() })
v.uiManager.AddWidget(&v.creditsButton)
2019-10-26 00:06:54 -04:00
},
2019-10-26 12:55:36 -04:00
func() {
2019-11-10 08:51:02 -05:00
v.cinematicsButton = d2ui.CreateButton(d2ui.ButtonTypeShort, v.fileProvider, d2common.TranslateString("#1639"))
2019-10-26 12:55:36 -04:00
v.cinematicsButton.MoveTo(401, 505)
v.cinematicsButton.SetVisible(!v.ShowTrademarkScreen)
v.uiManager.AddWidget(&v.cinematicsButton)
2019-10-26 12:55:36 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.singlePlayerButton = d2ui.CreateButton(d2ui.ButtonTypeWide, v.fileProvider, d2common.TranslateString("#1620"))
2019-10-26 12:55:36 -04:00
v.singlePlayerButton.MoveTo(264, 290)
v.singlePlayerButton.SetVisible(!v.ShowTrademarkScreen)
v.singlePlayerButton.OnActivated(func() { v.onSinglePlayerClicked() })
v.uiManager.AddWidget(&v.singlePlayerButton)
2019-10-26 12:55:36 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.githubButton = d2ui.CreateButton(d2ui.ButtonTypeWide, v.fileProvider, "PROJECT WEBSITE")
2019-10-26 12:55:36 -04:00
v.githubButton.MoveTo(264, 330)
v.githubButton.SetVisible(!v.ShowTrademarkScreen)
v.githubButton.OnActivated(func() { v.onGithubButtonClicked() })
v.uiManager.AddWidget(&v.githubButton)
2019-10-26 12:55:36 -04:00
},
func() {
2019-11-10 08:51:02 -05:00
v.mapTestButton = d2ui.CreateButton(d2ui.ButtonTypeWide, v.fileProvider, "MAP ENGINE TEST")
v.mapTestButton.MoveTo(264, 450)
v.mapTestButton.SetVisible(!v.ShowTrademarkScreen)
v.mapTestButton.OnActivated(func() { v.onMapTestClicked() })
v.uiManager.AddWidget(&v.mapTestButton)
},
2019-10-25 20:28:14 -04:00
}
2019-10-24 09:31:59 -04:00
}
func (v *MainMenu) onMapTestClicked() {
v.sceneProvider.SetNextScene(CreateMapEngineTest(v.fileProvider, v.sceneProvider, v.uiManager, v.soundManager, 0, 1))
}
2019-10-26 12:55:36 -04:00
func openbrowser(url string) {
var err error
switch runtime.GOOS {
case "linux":
err = exec.Command("xdg-open", url).Start()
case "windows":
err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
err = exec.Command("open", url).Start()
default:
err = fmt.Errorf("unsupported platform")
}
if err != nil {
log.Fatal(err)
}
}
func (v *MainMenu) onSinglePlayerClicked() {
// Go here only if existing characters are available to select
if d2core.HasGameStates() {
v.sceneProvider.SetNextScene(CreateCharacterSelect(v.fileProvider, v.sceneProvider, v.uiManager, v.soundManager))
return
}
v.sceneProvider.SetNextScene(CreateSelectHeroClass(v.fileProvider, v.sceneProvider, v.uiManager, v.soundManager))
}
2019-10-26 12:55:36 -04:00
func (v *MainMenu) onGithubButtonClicked() {
openbrowser("https://www.github.com/OpenDiablo2/OpenDiablo2")
2019-10-26 12:55:36 -04:00
}
2019-10-25 23:41:54 -04:00
func (v *MainMenu) onExitButtonClicked() {
os.Exit(0)
}
2019-10-26 00:26:48 -04:00
func (v *MainMenu) onCreditsButtonClicked() {
v.sceneProvider.SetNextScene(CreateCredits(v.fileProvider, v.sceneProvider, v.uiManager, v.soundManager))
}
// Unload unloads the data for the main menu
2019-10-24 09:31:59 -04:00
func (v *MainMenu) Unload() {
}
// Render renders the main menu
2019-10-24 09:31:59 -04:00
func (v *MainMenu) Render(screen *ebiten.Image) {
2019-10-26 00:55:59 -04:00
if v.ShowTrademarkScreen {
v.trademarkBackground.DrawSegments(screen, 4, 3, 0)
2019-10-24 09:31:59 -04:00
} else {
v.background.DrawSegments(screen, 4, 3, 0)
2019-10-24 09:31:59 -04:00
}
v.diabloLogoLeftBack.Draw(screen)
v.diabloLogoRightBack.Draw(screen)
v.diabloLogoLeft.Draw(screen)
v.diabloLogoRight.Draw(screen)
2019-10-24 09:31:59 -04:00
2019-10-26 00:55:59 -04:00
if v.ShowTrademarkScreen {
v.copyrightLabel.Draw(screen)
v.copyrightLabel2.Draw(screen)
2019-10-24 09:31:59 -04:00
} else {
2019-10-26 12:55:36 -04:00
v.openDiabloLabel.Draw(screen)
v.versionLabel.Draw(screen)
v.commitLabel.Draw(screen)
2019-10-24 09:31:59 -04:00
}
}
// Update runs the update logic on the main menu
func (v *MainMenu) Update(tickTime float64) {
2019-10-26 00:55:59 -04:00
if v.ShowTrademarkScreen {
2019-11-10 08:51:02 -05:00
if v.uiManager.CursorButtonPressed(d2ui.CursorButtonLeft) {
if v.leftButtonHeld {
return
}
v.uiManager.WaitForMouseRelease()
v.leftButtonHeld = true
2019-10-26 00:55:59 -04:00
v.ShowTrademarkScreen = false
v.exitDiabloButton.SetVisible(true)
2019-10-26 00:06:54 -04:00
v.creditsButton.SetVisible(true)
2019-10-26 12:55:36 -04:00
v.cinematicsButton.SetVisible(true)
v.singlePlayerButton.SetVisible(true)
v.githubButton.SetVisible(true)
v.mapTestButton.SetVisible(true)
} else {
v.leftButtonHeld = false
2019-10-25 15:06:47 -04:00
}
return
}
2019-10-24 09:31:59 -04:00
}