mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-12-25 03:28:33 -05:00
* Move engine initialization to d2app * adding debug print of error returned from `App.Run` * adding ClampInt utility function to d2math * cleaned up argument parsing in app.go, dedicated server no longer starts a renderer Co-authored-by: gravestench <dknuth0101@gmail.com>
This commit is contained in:
parent
33cf06732e
commit
1f2771e8bc
209
d2app/app.go
209
d2app/app.go
@ -11,11 +11,13 @@ import (
|
||||
"image/png"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime"
|
||||
"runtime/pprof"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/pkg/profile"
|
||||
"golang.org/x/image/colornames"
|
||||
@ -27,11 +29,16 @@ import (
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||
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"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/ebiten"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2gamescreen"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client/d2clientconnectiontype"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2script"
|
||||
@ -66,6 +73,15 @@ type App struct {
|
||||
ui *d2ui.UIManager
|
||||
tAllocSamples *ring.Ring
|
||||
guiManager *d2gui.GuiManager
|
||||
*Options
|
||||
}
|
||||
|
||||
// Options is used to store all of the app options that can be set with arguments
|
||||
type Options struct {
|
||||
printVersion *bool
|
||||
Debug *bool
|
||||
profiler *string
|
||||
Server *d2networking.ServerOptions
|
||||
}
|
||||
|
||||
type bindTerminalEntry struct {
|
||||
@ -81,52 +97,183 @@ const (
|
||||
)
|
||||
|
||||
// Create creates a new instance of the application
|
||||
func Create(gitBranch, gitCommit string,
|
||||
inputManager d2interface.InputManager,
|
||||
terminal d2interface.Terminal,
|
||||
scriptEngine *d2script.ScriptEngine,
|
||||
audio d2interface.AudioProvider,
|
||||
renderer d2interface.Renderer,
|
||||
asset *d2asset.AssetManager,
|
||||
) *App {
|
||||
uiManager := d2ui.NewUIManager(asset, renderer, inputManager, audio)
|
||||
|
||||
result := &App{
|
||||
gitBranch: gitBranch,
|
||||
gitCommit: gitCommit,
|
||||
inputManager: inputManager,
|
||||
terminal: terminal,
|
||||
scriptEngine: scriptEngine,
|
||||
audio: audio,
|
||||
renderer: renderer,
|
||||
ui: uiManager,
|
||||
asset: asset,
|
||||
tAllocSamples: createZeroedRing(nSamplesTAlloc),
|
||||
func Create(gitBranch, gitCommit string) *App {
|
||||
return &App{
|
||||
gitBranch: gitBranch,
|
||||
gitCommit: gitCommit,
|
||||
Options: &Options{
|
||||
Server: &d2networking.ServerOptions{},
|
||||
},
|
||||
}
|
||||
|
||||
if result.gitBranch == "" {
|
||||
result.gitBranch = "Local Build"
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func updateNOOP() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) startDedicatedServer() error {
|
||||
// hack, for now we need to create the asset manager here
|
||||
// Attempt to load the configuration file
|
||||
err := d2config.Load()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
asset, err := d2asset.NewAssetManager(d2config.Config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
a.asset = asset
|
||||
|
||||
min, max := d2networking.ServerMinPlayers, d2networking.ServerMaxPlayersDefault
|
||||
maxPlayers := d2math.ClampInt(*a.Options.Server.MaxPlayers, min, max)
|
||||
|
||||
srvChanIn := make(chan int)
|
||||
srvChanLog := make(chan string)
|
||||
|
||||
srvErr := d2networking.StartDedicatedServer(a.asset, srvChanIn, srvChanLog, maxPlayers)
|
||||
if srvErr != nil {
|
||||
return srvErr
|
||||
}
|
||||
|
||||
c := make(chan os.Signal)
|
||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM) // This traps Control-c to safely shut down the server
|
||||
|
||||
go func() {
|
||||
<-c
|
||||
srvChanIn <- d2networking.ServerEventStop
|
||||
}()
|
||||
|
||||
for {
|
||||
for data := range srvChanLog {
|
||||
log.Println(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a *App) loadEngine() error {
|
||||
// Attempt to load the configuration file
|
||||
configError := d2config.Load()
|
||||
|
||||
// Create our renderer
|
||||
renderer, err := ebiten.CreateRenderer()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// If we failed to load our config, lets show the boot panic screen
|
||||
if configError != nil {
|
||||
return configError
|
||||
}
|
||||
|
||||
// Create the asset manager
|
||||
asset, err := d2asset.NewAssetManager(d2config.Config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
audio := ebiten2.CreateAudio(asset)
|
||||
|
||||
inputManager := d2input.NewInputManager()
|
||||
|
||||
term, err := d2term.New(inputManager)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = asset.BindTerminalCommands(term)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
scriptEngine := d2script.CreateScriptEngine()
|
||||
|
||||
uiManager := d2ui.NewUIManager(asset, renderer, inputManager, audio)
|
||||
|
||||
a.inputManager = inputManager
|
||||
a.terminal = term
|
||||
a.scriptEngine = scriptEngine
|
||||
a.audio = audio
|
||||
a.renderer = renderer
|
||||
a.ui = uiManager
|
||||
a.asset = asset
|
||||
a.tAllocSamples = createZeroedRing(nSamplesTAlloc)
|
||||
|
||||
if a.gitBranch == "" {
|
||||
a.gitBranch = "Local Build"
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) parseArguments() {
|
||||
const (
|
||||
versionArg = "version"
|
||||
versionShort = 'v'
|
||||
versionDesc = "Prints the version of the app"
|
||||
|
||||
profilerArg = "profile"
|
||||
profilerDesc = "Profiles the program, one of (cpu, mem, block, goroutine, trace, thread, mutex)"
|
||||
|
||||
serverArg = "dedicated"
|
||||
serverShort = 'd'
|
||||
serverDesc = "Starts a dedicated server"
|
||||
|
||||
playersArg = "players"
|
||||
playersDesc = "Sets the number of max players for the dedicated server"
|
||||
)
|
||||
|
||||
a.Options.profiler = kingpin.Flag(profilerArg, profilerDesc).String()
|
||||
|
||||
a.Options.Server.Dedicated = kingpin.Flag(serverArg, serverDesc).Short(serverShort).Bool()
|
||||
|
||||
a.Options.printVersion = kingpin.Flag(versionArg, versionDesc).Short(versionShort).Bool()
|
||||
|
||||
a.Options.Server.MaxPlayers = kingpin.Flag(playersArg, playersDesc).Int()
|
||||
|
||||
kingpin.Parse()
|
||||
}
|
||||
|
||||
// Run executes the application and kicks off the entire game process
|
||||
func (a *App) Run() error {
|
||||
profileOption := kingpin.Flag("profile", "Profiles the program, one of (cpu, mem, block, goroutine, trace, thread, mutex)").String()
|
||||
kingpin.Parse()
|
||||
a.parseArguments()
|
||||
|
||||
if len(*profileOption) > 0 {
|
||||
profiler := enableProfiler(*profileOption)
|
||||
// print version and exit if `--version` was supplied
|
||||
if *a.Options.printVersion {
|
||||
fmtVersion := "OpenDiablo2 (%s %s)"
|
||||
|
||||
if a.gitBranch == "" {
|
||||
a.gitBranch = "local"
|
||||
}
|
||||
|
||||
if a.gitCommit == "" {
|
||||
a.gitCommit = "build"
|
||||
}
|
||||
|
||||
return fmt.Errorf(fmtVersion, a.gitBranch, a.gitCommit)
|
||||
}
|
||||
|
||||
// start profiler if argument was supplied
|
||||
if len(*a.Options.profiler) > 0 {
|
||||
profiler := enableProfiler(*a.Options.profiler)
|
||||
if profiler != nil {
|
||||
defer profiler.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
// start the server if `--listen` option was supplied
|
||||
if *a.Options.Server.Dedicated {
|
||||
if err := a.startDedicatedServer(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err := a.loadEngine(); err != nil {
|
||||
a.renderer.ShowPanicScreen(err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
windowTitle := fmt.Sprintf("OpenDiablo2 (%s)", a.gitBranch)
|
||||
// If we fail to initialize, we will show the error screen
|
||||
if err := a.initialize(); err != nil {
|
||||
|
@ -167,3 +167,8 @@ func GetRadiansBetween(p1X, p1Y, p2X, p2Y float64) float64 {
|
||||
|
||||
return math.Atan2(deltaY, deltaX)
|
||||
}
|
||||
|
||||
// ClampInt ensures that the given value is between or equal to the given min or max
|
||||
func ClampInt(value, min, max int) int {
|
||||
return int(math.Min(math.Max(float64(value), float64(min)), float64(max)))
|
||||
}
|
||||
|
@ -2,73 +2,64 @@ package d2networking
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2server"
|
||||
)
|
||||
|
||||
// ServerEventFlag represents a server event
|
||||
type ServerEventFlag = int
|
||||
|
||||
// Server events
|
||||
const (
|
||||
stopServer = 0b1
|
||||
ServerEventStop ServerEventFlag = iota
|
||||
)
|
||||
|
||||
// ServerMinPlayers is the minimum number of players a server can have
|
||||
const (
|
||||
ServerMinPlayers = 1
|
||||
ServerMaxPlayersDefault = 8
|
||||
)
|
||||
|
||||
func hasFlag(value, flag int) bool {
|
||||
return (value & flag) == flag
|
||||
}
|
||||
|
||||
/*
|
||||
StartDedicatedServer Checks whether or not we should start a server i.e the -listen parameter has been passed in, and if so launches a
|
||||
server hosted to the network, in theory. (this is still WIP)
|
||||
*/
|
||||
func StartDedicatedServer(manager *d2asset.AssetManager, in chan byte, log chan string) (started bool, e error) {
|
||||
var listen bool
|
||||
|
||||
maxPlayers := 3
|
||||
|
||||
for argCount, arg := range os.Args {
|
||||
if arg == "--listen" || arg == "-L" {
|
||||
listen = true
|
||||
}
|
||||
|
||||
if arg == "--maxplayers" || arg == "-p" {
|
||||
max, _ := strconv.ParseInt(os.Args[argCount+1], 10, 32)
|
||||
maxPlayers = int(max)
|
||||
}
|
||||
}
|
||||
|
||||
if !listen {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func StartDedicatedServer(
|
||||
manager *d2asset.AssetManager,
|
||||
in chan int,
|
||||
log chan string,
|
||||
maxPlayers int,
|
||||
) error {
|
||||
server, err := d2server.NewGameServer(manager, true, maxPlayers)
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
return err
|
||||
}
|
||||
|
||||
err = server.Start()
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
return err
|
||||
}
|
||||
|
||||
// I have done the messaging with a bitmask for memory efficiency, this can easily be translated to pretty error
|
||||
// messages later, sue me.
|
||||
go func() {
|
||||
for {
|
||||
msgIn := <-in
|
||||
/* For those who do not know an AND operation denoted by & discards bits which do not line up so for instance:
|
||||
01011001 & 00000001 = 00000001 or 1
|
||||
00100101 & 00000010 = 00000000 or 0
|
||||
01100110 & 01100000 = 01100000 or 96
|
||||
these can be used to have multiple messages in just 8 bits, that's a quarter of a rune in go!
|
||||
*/
|
||||
if (msgIn & stopServer) == stopServer {
|
||||
log <- "Stopping server"
|
||||
for {
|
||||
msgIn := <-in
|
||||
if hasFlag(msgIn, ServerEventStop) {
|
||||
log <- "Stopping server"
|
||||
|
||||
server.Stop()
|
||||
log <- "Exiting..."
|
||||
server.Stop()
|
||||
log <- "Exiting..."
|
||||
|
||||
os.Exit(0)
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
}()
|
||||
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
// ServerOptions represents game server options
|
||||
type ServerOptions struct {
|
||||
Dedicated *bool
|
||||
MaxPlayers *int
|
||||
}
|
||||
|
23
go.sum
23
go.sum
@ -11,40 +11,29 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2 h1:Ac1OEHHkbAZ6EUnJahF0GKcU0FjPc/V8F1DvjhKngFE=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1 h1:LoN2wx/aN8JPGebG+2DaUyk4M+xRcqJXfuIbs8AWHdE=
|
||||
github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk=
|
||||
github.com/go-restruct/restruct v1.2.0-alpha h1:2Lp474S/9660+SJjpVxoKuWX09JsXHSrdV7Nv3/gkvc=
|
||||
github.com/go-restruct/restruct v1.2.0-alpha/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk=
|
||||
github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||
github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY=
|
||||
github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gravestench/akara v0.0.0-20201014060234-a64208a7fd3c h1:WopE590cKxkcKXcOee4gPXHqtzwbarLClCaWNCdLqgI=
|
||||
github.com/gravestench/akara v0.0.0-20201014060234-a64208a7fd3c/go.mod h1:fTeda1SogMg5Lkd4lXMEd/Pk/a5/gQuLGaAI2rn1PBQ=
|
||||
github.com/hajimehoshi/bitmapfont v1.2.0/go.mod h1:h9QrPk6Ktb2neObTlAbma6Ini1xgMjbJ3w7ysmD7IOU=
|
||||
github.com/hajimehoshi/bitmapfont/v2 v2.1.0/go.mod h1:2BnYrkTQGThpr/CY6LorYtt/zEPNzvE/ND69CRTaHMs=
|
||||
github.com/hajimehoshi/ebiten v1.11.4 h1:ngYF0NxKjFBsY/Bol6V0X/b0hoCCTi9nJRg7Dv8+ePc=
|
||||
github.com/hajimehoshi/ebiten v1.11.4/go.mod h1:aDEhx0K9gSpXw3Cxf2hCXDxPSoF8vgjNqKxrZa/B4Dg=
|
||||
github.com/hajimehoshi/ebiten/v2 v2.0.0 h1:G8mhkKFtnDPPZ/ChaGWx4Bm0NusYEcafGCJ8QLxEaYs=
|
||||
github.com/hajimehoshi/ebiten/v2 v2.0.0/go.mod h1:hpZZQ/kk8DZqft7QsQ5hZLRQXHSZPdKnaa0tcJ3CZFE=
|
||||
github.com/hajimehoshi/file2byteslice v0.0.0-20200812174855-0e5e8a80490e/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.3.1/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM=
|
||||
github.com/hajimehoshi/oto v0.3.4/go.mod h1:PgjqsBJff0efqL2nlMJidJgVJywLn6M4y8PI4TfeWfA=
|
||||
github.com/hajimehoshi/oto v0.5.4/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
|
||||
github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
|
||||
github.com/hajimehoshi/oto v0.6.6 h1:HYSZ8cYZqOL4iHugvbcfhNN2smiSOsBMaoSBi4nnWcw=
|
||||
github.com/hajimehoshi/oto v0.6.6/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
|
||||
github.com/jakecoffman/cp v0.1.0/go.mod h1:a3xPx9N8RyFAACD644t2dj/nK4SuLg1v+jL61m2yVo4=
|
||||
github.com/jakecoffman/cp v1.0.0/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg=
|
||||
github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM=
|
||||
github.com/jfreymuth/oggvorbis v1.0.1/go.mod h1:NqS+K+UXKje0FUYUPosyQ+XTVvjmVjps1aEZH1sumIk=
|
||||
github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
@ -55,8 +44,6 @@ github.com/pkg/profile v1.5.0 h1:042Buzk+NhDI+DeSAA62RwJL8VAuZUMQZUjCsRz1Mug=
|
||||
github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff h1:+6NUiITWwE5q1KO6SAfUX918c+Tab0+tGAM/mtdlUyA=
|
||||
github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=
|
||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
@ -75,13 +62,11 @@ golang.org/x/exp v0.0.0-20201008143054-e3b2a7f2fdc7/go.mod h1:1phAWC201xIgDyaFpm
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM=
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mobile v0.0.0-20200222142934-3c8601c510d0/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
|
||||
golang.org/x/mobile v0.0.0-20200801112145-973feb4309de h1:OVJ6QQUBAesB8CZijKDSsXX7xYVtUhrkY0gwMfbi4p4=
|
||||
golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
@ -100,7 +85,6 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM=
|
||||
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
@ -110,7 +94,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20201009162240-fcf82128ed91/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@ -119,7 +102,7 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=
|
||||
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
|
||||
|
80
main.go
80
main.go
@ -1,21 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2networking"
|
||||
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2app"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
|
||||
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2config"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render/ebiten"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2term"
|
||||
"github.com/OpenDiablo2/OpenDiablo2/d2script"
|
||||
)
|
||||
|
||||
// GitBranch is set by the CI build process to the name of the branch
|
||||
@ -30,71 +19,10 @@ func main() {
|
||||
log.SetFlags(log.Lshortfile)
|
||||
log.Println("OpenDiablo2 - Open source Diablo 2 engine")
|
||||
|
||||
// Attempt to load the configuration file
|
||||
configError := d2config.Load()
|
||||
instance := d2app.Create(GitBranch, GitCommit)
|
||||
|
||||
// Create our renderer
|
||||
renderer, err := ebiten.CreateRenderer()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// If we failed to load our config, lets show the boot panic screen
|
||||
if configError != nil {
|
||||
renderer.ShowPanicScreen(configError.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// Create the asset manager
|
||||
asset, err := d2asset.NewAssetManager(d2config.Config)
|
||||
if err != nil {
|
||||
renderer.ShowPanicScreen(err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
srvChanIn := make(chan byte)
|
||||
srvChanLog := make(chan string)
|
||||
started, srvErr := d2networking.StartDedicatedServer(asset, srvChanIn, srvChanLog)
|
||||
|
||||
if srvErr != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
c := make(chan os.Signal)
|
||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM) // This traps Control-c to safely shut down the server
|
||||
|
||||
go func() {
|
||||
<-c
|
||||
srvChanIn <- 0b1
|
||||
}()
|
||||
|
||||
if started {
|
||||
for data := range srvChanLog {
|
||||
log.Println(data)
|
||||
}
|
||||
}
|
||||
|
||||
audio := ebiten2.CreateAudio(asset)
|
||||
|
||||
inputManager := d2input.NewInputManager()
|
||||
|
||||
term, err := d2term.New(inputManager)
|
||||
if err != nil {
|
||||
renderer.ShowPanicScreen(err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err = asset.BindTerminalCommands(term)
|
||||
if err != nil {
|
||||
renderer.ShowPanicScreen(err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
scriptEngine := d2script.CreateScriptEngine()
|
||||
|
||||
app := d2app.Create(GitBranch, GitCommit, inputManager, term, scriptEngine, audio, renderer, asset)
|
||||
if err := app.Run(); err != nil {
|
||||
renderer.ShowPanicScreen(err.Error())
|
||||
if err := instance.Run(); err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user