summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.zig1
-rw-r--r--src/puzzles/puzzle.c8
-rw-r--r--src/puzzles/puzzle.h25
-rw-r--r--src/scenes/puzzleScene.c4
-rw-r--r--src/scenes/resultView.c68
-rw-r--r--src/scenes/scenes.h1
-rw-r--r--src/ui_elements/TextEditor.c1
-rw-r--r--src/ui_elements/UI.c1
-rw-r--r--src/wren_inter/wren_inter.c23
-rw-r--r--src/wren_inter/wren_inter.h2
10 files changed, 113 insertions, 21 deletions
diff --git a/build.zig b/build.zig
index 874aaff..9ceae7f 100644
--- a/build.zig
+++ b/build.zig
@@ -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