aboutsummaryrefslogtreecommitdiff
path: root/src/gunner/script_sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gunner/script_sys.c')
-rw-r--r--src/gunner/script_sys.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/gunner/script_sys.c b/src/gunner/script_sys.c
new file mode 100644
index 0000000..12dbac1
--- /dev/null
+++ b/src/gunner/script_sys.c
@@ -0,0 +1,105 @@
+#include "script_sys.h"
+#include "texture_sys.h"
+#include "shader_sys.h"
+
+#include "controller.h"
+#include "text.h"
+
+#include "rand_sys.h"
+#include "audio_sys.h"
+
+#include <libtcc.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include <raylib.h>
+
+static TCCState* state = NULL;
+
+static void(*script_init)(void) = NULL;
+static void(*script_update)(void) = NULL;
+static void(*script_exit)(void) = NULL;
+
+static i32 current_mod = -1;
+
+static void restart(void)
+{
+ TCCState* new_state = tcc_new();
+ tcc_set_output_type(new_state, TCC_OUTPUT_MEMORY);
+ tcc_set_options(new_state, "-nostdinc");
+
+ tcc_add_symbol(new_state, "load_new_tex", load_new_tex);
+ tcc_add_symbol(new_state, "load_new_shader", load_new_shader);
+
+ tcc_add_symbol(new_state, "draw_text", DrawText);
+ tcc_add_symbol(new_state, "set_active_shader", set_active_shader);
+ tcc_add_symbol(new_state, "draw_texture", draw_texture);
+ tcc_add_symbol(new_state, "unload_tex", unload_tex);
+ tcc_add_symbol(new_state, "reset_active_shader", reset_active_shader);
+
+ tcc_add_symbol(new_state, "set_blend_mode", BeginBlendMode);
+ tcc_add_symbol(new_state, "reset_blend_mode", EndBlendMode);
+
+ tcc_add_symbol(new_state, "load_font", load_font);
+ tcc_add_symbol(new_state, "draw_text_font", draw_text_font);
+
+ tcc_add_symbol(new_state, "set_rumble", set_rumble);
+ tcc_add_symbol(new_state, "stop_rumble", stop_rumble);
+
+ tcc_add_symbol(new_state, "rand_u32", rand_u32);
+ tcc_add_symbol(new_state, "rand_range", rand_range);
+
+ tcc_add_symbol(new_state, "is_key_pressed", is_key_pressed);
+ tcc_add_symbol(new_state, "is_key_held", is_key_held);
+ tcc_add_symbol(new_state, "is_key_released", is_key_released);
+
+ tcc_add_symbol(new_state, "get_dir_input", get_dir_input);
+
+ tcc_add_symbol(new_state, "load_audio", load_audio);
+ tcc_add_symbol(new_state, "play_audio", play_audio);
+
+ tcc_add_symbol(new_state, "load_music", load_music);
+ tcc_add_symbol(new_state, "play_music", play_music);
+ tcc_add_symbol(new_state, "set_music_loop", set_music_loop);
+ tcc_add_symbol(new_state, "set_music_loop_point", set_music_loop_point);
+
+ if(tcc_add_file(new_state, "assets/src/main.c") == -1){
+ tcc_delete(new_state);
+ return;
+ }
+
+ if(state != NULL)
+ deinit_script_sys();
+ state = new_state;
+
+ tcc_relocate(state, TCC_RELOCATE_AUTO);
+ script_init = tcc_get_symbol(state, "init");
+ script_update = tcc_get_symbol(state, "update");
+ script_exit = tcc_get_symbol(state, "exit");
+ script_init();
+}
+
+void init_script_sys(void)
+{
+ current_mod = GetFileModTime("assets/src/main.c");
+ restart();
+}
+
+void update_script(void)
+{
+ i32 new_mod = GetFileModTime("assets/src/main.c");
+
+ if(new_mod != current_mod){
+ current_mod = new_mod;
+
+ restart();
+ }
+ if(script_update != NULL)
+ script_update();
+}
+
+void deinit_script_sys(void)
+{
+ script_exit();
+ tcc_delete(state);
+} \ No newline at end of file