diff --git a/devtools/control.go b/devtools/control.go index d5cdb342..5bf2fec5 100644 --- a/devtools/control.go +++ b/devtools/control.go @@ -11,8 +11,9 @@ import ( ) var ( - gamePaused bool - timeWhenPaused float64 + gamePaused bool + pauseOnNextFrame bool + timeWhenPaused float64 ) var helpShown bool @@ -23,6 +24,8 @@ func pauseGame() { helpShown = true fmt.Println("\nPress right mouse button in the game window to show the toolbar.") fmt.Println("Press P in the game window to take screenshot.") + fmt.Println("Press N in the game window to go to next frame.") + fmt.Println("Press F12 in the game window to resume the game and exit devtools inspector.") } gamePaused = true timeWhenPaused = pi.Time @@ -35,3 +38,12 @@ func resumeGame() { snapshot.Draw() fmt.Println("Game resumed") } + +func resumeUntilNextFrame() { + if gamePaused { + resumeGame() + pauseOnNextFrame = true + } else { + fmt.Println("Game not paused") + } +} diff --git a/devtools/internal/help/help.go b/devtools/internal/help/help.go index fed74f34..055c65de 100644 --- a/devtools/internal/help/help.go +++ b/devtools/internal/help/help.go @@ -27,7 +27,7 @@ func PrintHelp(topic string) error { "\n\n" + "Type help topic for more information. For example: help pi or help pi.Spr" + "\n\n" + - "Available commands: help [h], pause [p], resume [r], undo [u]", + "Available commands: help [h], pause [p], resume [r], undo [u], next [n]", ) return nil default: diff --git a/devtools/internal/interpreter/interpreter.go b/devtools/internal/interpreter/interpreter.go index 712c98d9..0dd47af3 100644 --- a/devtools/internal/interpreter/interpreter.go +++ b/devtools/internal/interpreter/interpreter.go @@ -125,7 +125,7 @@ func ensureNameDoesNotClashWithImportedPackages(name string) error { return nil } -var allCommandNames = []string{"h", "help", "p", "pause", "r", "resume", "u", "undo"} +var allCommandNames = []string{"h", "help", "p", "pause", "r", "resume", "u", "undo", "n", "next"} func ensureNameDoesNotClashWithCommandNames(name string) error { for _, cmd := range allCommandNames { @@ -185,12 +185,13 @@ func ExportType[T any](i Instance) error { type EvalResult int const ( - HelpPrinted EvalResult = 0 - GoCodeExecuted EvalResult = 1 - Resumed EvalResult = 2 - Paused EvalResult = 3 - Undoed EvalResult = 4 - Continued EvalResult = 5 + HelpPrinted EvalResult = 0 + GoCodeExecuted EvalResult = 1 + Resumed EvalResult = 2 + Paused EvalResult = 3 + Undoed EvalResult = 4 + Continued EvalResult = 5 + NextFrameRequested EvalResult = 6 ) func (i Instance) Eval(cmd string) (EvalResult, error) { @@ -199,6 +200,8 @@ func (i Instance) Eval(cmd string) (EvalResult, error) { if isHelpCommand(trimmedCmd) { topic := strings.Trim(strings.TrimLeft(trimmedCmd, "help"), " ") return HelpPrinted, i.printHelp(topic) + } else if trimmedCmd == "next" || trimmedCmd == "n" { + return NextFrameRequested, nil } else if trimmedCmd == "resume" || trimmedCmd == "r" { return Resumed, nil } else if trimmedCmd == "pause" || trimmedCmd == "p" { diff --git a/devtools/internal/interpreter/interpreter_test.go b/devtools/internal/interpreter/interpreter_test.go index 42f947ec..6dcbf680 100644 --- a/devtools/internal/interpreter/interpreter_test.go +++ b/devtools/internal/interpreter/interpreter_test.go @@ -85,6 +85,22 @@ func TestEval(t *testing.T) { code: "resume ", expectedResult: interpreter.Resumed, }, + "next": { + code: "next", + expectedResult: interpreter.NextFrameRequested, + }, + "next with space in the beginning": { + code: " next", + expectedResult: interpreter.NextFrameRequested, + }, + "next with space in the end": { + code: "next ", + expectedResult: interpreter.NextFrameRequested, + }, + "n": { + code: "n", + expectedResult: interpreter.NextFrameRequested, + }, } for name, testCase := range tests { t.Run(name, func(t *testing.T) { @@ -273,7 +289,7 @@ func TestExport(t *testing.T) { }) t.Run("should return error when name clashes with command name", func(t *testing.T) { - var allCommandNames = []string{"h", "help", "p", "pause", "r", "resume", "u", "undo"} + var allCommandNames = []string{"h", "help", "p", "pause", "r", "resume", "u", "undo", "n", "next"} for _, cmd := range allCommandNames { t.Run(cmd, func(t *testing.T) { diff --git a/devtools/scripting.go b/devtools/scripting.go index 3a4492e9..58f914f7 100644 --- a/devtools/scripting.go +++ b/devtools/scripting.go @@ -70,6 +70,8 @@ func evaluateNextCommandFromTerminal() { case interpreter.Undoed: snapshot.Undo() fmt.Println("Undoed last draw operation") + case interpreter.NextFrameRequested: + resumeUntilNextFrame() } if result == interpreter.Continued { diff --git a/devtools/update.go b/devtools/update.go index 98c3f240..a8324e40 100644 --- a/devtools/update.go +++ b/devtools/update.go @@ -17,7 +17,16 @@ func updateDevTools() { } } + if pauseOnNextFrame { + pauseGame() + pauseOnNextFrame = false + } + if gamePaused { + if key.Btnp(key.N) { + resumeUntilNextFrame() + } + inspector.Update() }