mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-11-16 09:25:57 -05:00
140 lines
3.3 KiB
Go
140 lines
3.3 KiB
Go
package d2app
|
|
|
|
import (
|
|
"os"
|
|
"runtime/pprof"
|
|
"strconv"
|
|
|
|
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2gamescreen"
|
|
)
|
|
|
|
func (a *App) initTerminalCommands() {
|
|
terminalCommands := []struct {
|
|
name string
|
|
desc string
|
|
args []string
|
|
fn func(args []string) error
|
|
}{
|
|
{"dumpheap", "dumps the heap to pprof/heap.pprof", nil, a.dumpHeap},
|
|
{"fullscreen", "toggles fullscreen", nil, a.toggleFullScreen},
|
|
{"capframe", "captures a still frame", []string{"filename"}, a.setupCaptureFrame},
|
|
{"capgifstart", "captures an animation (start)", []string{"filename"}, a.startAnimationCapture},
|
|
{"capgifstop", "captures an animation (stop)", nil, a.stopAnimationCapture},
|
|
{"vsync", "toggles vsync", nil, a.toggleVsync},
|
|
{"fps", "toggle fps counter", nil, a.toggleFpsCounter},
|
|
{"timescale", "set scalar for elapsed time", []string{"float"}, a.setTimeScale},
|
|
{"quit", "exits the game", nil, a.quitGame},
|
|
{"screen-gui", "enters the gui playground screen", nil, a.enterGuiPlayground},
|
|
{"js", "eval JS scripts", []string{"code"}, a.evalJS},
|
|
}
|
|
|
|
for _, cmd := range terminalCommands {
|
|
if err := a.terminal.Bind(cmd.name, cmd.desc, cmd.args, cmd.fn); err != nil {
|
|
a.Fatalf("failed to bind action %q: %v", cmd.name, err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func (a *App) dumpHeap([]string) error {
|
|
if _, err := os.Stat("./pprof/"); os.IsNotExist(err) {
|
|
if err := os.Mkdir("./pprof/", 0750); err != nil {
|
|
a.Fatal(err.Error())
|
|
}
|
|
}
|
|
|
|
fileOut, err := os.Create("./pprof/heap.pprof")
|
|
if err != nil {
|
|
a.Error(err.Error())
|
|
}
|
|
|
|
if err := pprof.WriteHeapProfile(fileOut); err != nil {
|
|
a.Fatal(err.Error())
|
|
}
|
|
|
|
if err := fileOut.Close(); err != nil {
|
|
a.Fatal(err.Error())
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) evalJS(args []string) error {
|
|
val, err := a.scriptEngine.Eval(args[0])
|
|
if err != nil {
|
|
a.terminal.Errorf(err.Error())
|
|
return nil
|
|
}
|
|
|
|
a.Info("%s" + val)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) toggleFullScreen([]string) error {
|
|
fullscreen := !a.renderer.IsFullScreen()
|
|
a.renderer.SetFullScreen(fullscreen)
|
|
a.terminal.Infof("fullscreen is now: %v", fullscreen)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) setupCaptureFrame(args []string) error {
|
|
a.captureState = captureStateFrame
|
|
a.capturePath = args[0]
|
|
a.captureFrames = nil
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) startAnimationCapture(args []string) error {
|
|
a.captureState = captureStateGif
|
|
a.capturePath = args[0]
|
|
a.captureFrames = nil
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) stopAnimationCapture([]string) error {
|
|
a.captureState = captureStateNone
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) toggleVsync([]string) error {
|
|
vsync := !a.renderer.GetVSyncEnabled()
|
|
a.renderer.SetVSyncEnabled(vsync)
|
|
a.terminal.Infof("vsync is now: %v", vsync)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) toggleFpsCounter([]string) error {
|
|
a.showFPS = !a.showFPS
|
|
a.terminal.Infof("fps counter is now: %v", a.showFPS)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) setTimeScale(args []string) error {
|
|
timeScale, err := strconv.ParseFloat(args[0], 64)
|
|
if err != nil || timeScale <= 0 {
|
|
a.terminal.Errorf("invalid time scale value")
|
|
return nil
|
|
}
|
|
|
|
a.terminal.Infof("timescale changed from %f to %f", a.timeScale, timeScale)
|
|
a.timeScale = timeScale
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) quitGame([]string) error {
|
|
os.Exit(0)
|
|
return nil
|
|
}
|
|
|
|
func (a *App) enterGuiPlayground([]string) error {
|
|
a.screen.SetNextScreen(d2gamescreen.CreateGuiTestMain(a.renderer, a.guiManager, *a.Options.LogLevel, a.asset))
|
|
return nil
|
|
}
|