diff options
Diffstat (limited to 'src/gunner/script_sys.c')
| -rw-r--r-- | src/gunner/script_sys.c | 105 |
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 |
