diff options
| -rw-r--r-- | build.zig | 1 | ||||
| -rw-r--r-- | src/puzzles/puzzle.c | 8 | ||||
| -rw-r--r-- | src/puzzles/puzzle.h | 25 | ||||
| -rw-r--r-- | src/scenes/puzzleScene.c | 4 | ||||
| -rw-r--r-- | src/scenes/resultView.c | 68 | ||||
| -rw-r--r-- | src/scenes/scenes.h | 1 | ||||
| -rw-r--r-- | src/ui_elements/TextEditor.c | 1 | ||||
| -rw-r--r-- | src/ui_elements/UI.c | 1 | ||||
| -rw-r--r-- | src/wren_inter/wren_inter.c | 23 | ||||
| -rw-r--r-- | src/wren_inter/wren_inter.h | 2 |
10 files changed, 113 insertions, 21 deletions
@@ -21,6 +21,7 @@ pub fn build(b: *std.Build) void { "src/ui_elements/TextEditor.c", "src/scenes/sceneManager.c", "src/scenes/mainMenu.c", + "src/scenes/resultView.c", "src/scenes/puzzleScene.c", "src/puzzles/puzzle.c", } diff --git a/src/puzzles/puzzle.c b/src/puzzles/puzzle.c index 1bfb6be..cbad998 100644 --- a/src/puzzles/puzzle.c +++ b/src/puzzles/puzzle.c @@ -13,9 +13,9 @@ Puzzle *GetTestPuzzle() { } void FreePuzzle(Puzzle *self) { - free(self->Name); - free(self->Description); - free(self->PrivateTests); - free(self->PublicTests); + if (self == NULL) return; + if (self->Name != NULL) free(self->Name); + if (self->Description != NULL) free(self->Description); + if (self->Tests != NULL) free(self->Tests); free(self); } diff --git a/src/puzzles/puzzle.h b/src/puzzles/puzzle.h index 8f7ef0d..d530a89 100644 --- a/src/puzzles/puzzle.h +++ b/src/puzzles/puzzle.h @@ -1,11 +1,23 @@ #include <stddef.h> +#include <wren.h> #ifndef PUZZLE_H +// This is a param that would be placed in a slot +// https://wren.io/embedding/slots-and-handles.html#writing-slots typedef struct { - // TODO: figure it out - char *LuaSnippet; - char *ExpectedOutput; + WrenType type; + // We store this value as void * to generalize. The downside of this approach + // is an extenciva allocation + void *value; +} PuzzleIO; + +typedef struct { + // https://wren.io/embedding/calling-wren-from-c.html#getting-a-method-handle + char *MainMethodSignature; + + size_t argc; + PuzzleIO *argv; } Test; typedef struct { @@ -13,11 +25,8 @@ typedef struct { char *Description; /// The tests that are accessible for an end user - size_t PublicTestC; - Test *PublicTests; - - size_t PrivateTestC; - Test *PrivateTests; + size_t TestC; + Test *Tests; } Puzzle; // TODO diff --git a/src/scenes/puzzleScene.c b/src/scenes/puzzleScene.c index 7c4e1b2..972335f 100644 --- a/src/scenes/puzzleScene.c +++ b/src/scenes/puzzleScene.c @@ -1,5 +1,4 @@ #include <raylib.h> -#include <stdio.h> #include <stdlib.h> #include "scenes.h" #include "../resources/resources.h" @@ -89,8 +88,9 @@ bool updatePuzzleScene(void *self) { HandleKeyboard(data->EditorInfo); if (IsKeyPressed(KEY_F5)) { char *txt = GetText(data->EditorInfo); - EvaluateScript(txt); + char *outp = EvaluateScript(txt); free(txt); + AddScene(CreateResultView(outp)); } return true; diff --git a/src/scenes/resultView.c b/src/scenes/resultView.c new file mode 100644 index 0000000..9985319 --- /dev/null +++ b/src/scenes/resultView.c @@ -0,0 +1,68 @@ +#include <raylib.h> +#include <stdarg.h> +#include <stddef.h> +#include <stdlib.h> +#include "scenes.h" +#include "../ui_elements/UI.h" +#include "../resources/resources.h" + +static const int PADDING = 10; +static const int BORDER = 2; + +typedef struct { + char *value; + int scroll; +} ResultViewData; + +Rectangle GetResultViewBodyRect() { + int HeaderOffset = PADDING * 2; + Rectangle outp = { + .x = PADDING, + .y = HeaderOffset, + .width = GetScreenWidth() - PADDING * 2, + .height = GetScreenHeight() - HeaderOffset - PADDING * 3, + }; + return outp; +} + +bool updateResultView(void *self) { + if (IsKeyDown(KEY_ESCAPE)) { + DeleteSceneFromStack(); + return true; + } + return true; +} + +bool drawResultView(void *self) { + ResultViewData *data = ((Scene *)self)->data; + DrawBackground(); + Rectangle body = GetResultViewBodyRect(); + DrawRecBordered(body, WHITE, COLORSCHEME_ORANGE, BORDER); + DrawTextInRec(body, data->value, + GetMainFont(), 20, COLORSCHEME_BROWN, 3, &data->scroll); + return true; +} + +void deinitResultView(void *self) { + TraceLog(LOG_INFO, "Deleting a result view"); + free((Scene *)self); +} + +Scene *CreateResultView(char *result) { + TraceLog(LOG_INFO, "Creating a main menu"); + Scene *outp = malloc(sizeof(Scene)); + outp->Draw = drawResultView; + outp->Update = updateResultView; + outp->Deint = deinitResultView; + + ResultViewData *data = malloc(sizeof(ResultViewData)); + if (data == NULL) { + free(outp); + return NULL; + } + data->value = result; + data->scroll = 0; + outp->data = data; + + return outp; +} diff --git a/src/scenes/scenes.h b/src/scenes/scenes.h index 22d9a41..d243a6d 100644 --- a/src/scenes/scenes.h +++ b/src/scenes/scenes.h @@ -28,5 +28,6 @@ bool UpdateScene(); Scene *CreateMainMenu(); Scene *CreatePuzzleScene(Puzzle *puzzle); +Scene *CreateResultView(char *result); #endif // SCENES_H diff --git a/src/ui_elements/TextEditor.c b/src/ui_elements/TextEditor.c index 1097f1c..06cfc41 100644 --- a/src/ui_elements/TextEditor.c +++ b/src/ui_elements/TextEditor.c @@ -1,4 +1,5 @@ // TODO: fix j being outside of the box SOME FUCKING HOW +// upd. seems to be fixed with a swirch to monofont #include "UI.h" #include "../resources/resources.h" diff --git a/src/ui_elements/UI.c b/src/ui_elements/UI.c index a9ab498..c653731 100644 --- a/src/ui_elements/UI.c +++ b/src/ui_elements/UI.c @@ -40,6 +40,7 @@ bool IsMouseInRec(Rectangle rec) { } void DrawTextInRec(Rectangle rec, char *text, Font *font, int height, Color color, float padding, int *scroll) { + if (text == NULL) return; int spans[MAX_LINES]; rec.x += padding; rec.y += padding; diff --git a/src/wren_inter/wren_inter.c b/src/wren_inter/wren_inter.c index a1b48e2..69df112 100644 --- a/src/wren_inter/wren_inter.c +++ b/src/wren_inter/wren_inter.c @@ -1,5 +1,6 @@ #include "wren_inter.h" #include "../utils/stringBuilder.h" +#include <string.h> #include <raylib.h> #include <stdio.h> #include <wren.h> @@ -18,22 +19,27 @@ void errorFn(WrenVM* vm, WrenErrorType errorType, { case WREN_ERROR_COMPILE: { - TraceLog(LOG_ERROR, "[%s line %d] [Error] %s", module, line, msg); + // TraceLog(LOG_ERROR, "[%s line %d] [Error] %s", module, line, msg); + AppendStringBuilder(&stdout_sb, "Comptime error: ", '\n'); + AppendStringBuilder(&stdout_sb, msg, ' '); } break; case WREN_ERROR_STACK_TRACE: { - TraceLog(LOG_ERROR, "[%s line %d] in %s", module, line, msg); + AppendStringBuilder(&stdout_sb, "Stack trace: ", '\n'); + AppendStringBuilder(&stdout_sb, msg, ' '); + // TraceLog(LOG_ERROR, "[%s line %d] in %s", module, line, msg); } break; case WREN_ERROR_RUNTIME: { - TraceLog(LOG_ERROR, "[Runtime Error] %s", msg); + AppendStringBuilder(&stdout_sb, "Runtime error: ", '\n'); + AppendStringBuilder(&stdout_sb, msg, ' '); + // TraceLog(LOG_ERROR, "[Runtime Error] %s", msg); } break; } } -void EvaluateScript(char *script) { +char *EvaluateScript(char *script) { TraceLog(LOG_INFO, "Evaluating %s...", script); - FreeStringBuilder(&stdout_sb); WrenConfiguration config; wrenInitConfiguration(&config); config.writeFn = writeFn; @@ -42,7 +48,7 @@ void EvaluateScript(char *script) { WrenVM* vm = wrenNewVM(&config); if (vm == NULL) { TraceLog(LOG_ERROR, "Failed to initialize a wren vm"); - return; + return NULL; } WrenInterpretResult result = wrenInterpret(vm, "main", script); @@ -53,4 +59,9 @@ void EvaluateScript(char *script) { } printf("Wren outp: %s", stdout_sb.val); wrenFreeVM(vm); + + if (stdout_sb.val == NULL) return NULL; + char *outp = strdup(stdout_sb.val); + FreeStringBuilder(&stdout_sb); + return outp; } diff --git a/src/wren_inter/wren_inter.h b/src/wren_inter/wren_inter.h index 9601209..981a606 100644 --- a/src/wren_inter/wren_inter.h +++ b/src/wren_inter/wren_inter.h @@ -1,6 +1,6 @@ #ifndef WREN_INTER_H #define WREN_INTER_H -void EvaluateScript(char *script); +char *EvaluateScript(char *script); #endif // WREN_INTER_H |
