From 1f2771e8bc130a481f9c4c753ff99cce1ea6fccb Mon Sep 17 00:00:00 2001 From: Julien Ganichot <2302338+Ganitzsh@users.noreply.github.com> Date: Mon, 2 Nov 2020 01:05:50 +0100 Subject: [PATCH] Resolves #874 and #892 (#894) * 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 --- d2app/app.go | 209 ++++++++++++++++++++++++++----- d2common/d2math/math.go | 5 + d2networking/dedicated_server.go | 83 ++++++------ go.sum | 23 +--- main.go | 80 +----------- 5 files changed, 227 insertions(+), 173 deletions(-) diff --git a/d2app/app.go b/d2app/app.go index 1f3a98e4..2fb200fc 100644 --- a/d2app/app.go +++ b/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 { diff --git a/d2common/d2math/math.go b/d2common/d2math/math.go index 650ef850..87c73583 100644 --- a/d2common/d2math/math.go +++ b/d2common/d2math/math.go @@ -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))) +} diff --git a/d2networking/dedicated_server.go b/d2networking/dedicated_server.go index 3b2d3dde..8059da50 100644 --- a/d2networking/dedicated_server.go +++ b/d2networking/dedicated_server.go @@ -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 } diff --git a/go.sum b/go.sum index ce269b05..45038abc 100644 --- a/go.sum +++ b/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= diff --git a/main.go b/main.go index 192b58dc..93df8d57 100644 --- a/main.go +++ b/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 } }