#pragma once
#define _XOPEN_SOURCE 700
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifndef GRUG_TYPE_NUMBER
#define GRUG_TYPE_NUMBER double
#endif
#ifndef GRUG_TYPE_BOOL
#define GRUG_TYPE_BOOL bool
#endif
#ifndef GRUG_TYPE_STRING
#define GRUG_TYPE_STRING const char*
#endif
#ifndef GRUG_TYPE_ID
#define GRUG_TYPE_ID uint64_t
#endif
#ifndef GRUG_TYPE_ON_FN_ID
#define GRUG_TYPE_ON_FN_ID uint64_t
#endif
union grug_value {
#ifndef GRUG_NO_NUMBER
GRUG_TYPE_NUMBER _number;
#endif
#ifndef GRUG_NO_BOOL
GRUG_TYPE_BOOL _bool;
#endif
#ifndef GRUG_NO_STRING
GRUG_TYPE_STRING _string;
#endif
#ifndef GRUG_NO_ID
GRUG_TYPE_ID _id;
#endif
};
#define CALL(state, game_fn_name, ...) p_game_fn_##game_fn_name((state), (const union grug_value[]){ __VA_ARGS__ })
#define CALL_ARGLESS(state, game_fn_name) p_game_fn_##game_fn_name((state), NULL)
typedef union grug_value (*game_fn)(void* state, const union grug_value[]);
static inline union grug_value grug_number(GRUG_TYPE_NUMBER v) { union grug_value r; r._number = v; return r; }
static inline union grug_value grug_bool(GRUG_TYPE_BOOL v) { union grug_value r; r._bool = v; return r; }
static inline union grug_value grug_string(GRUG_TYPE_STRING v) { union grug_value r; r._string = v; return r; }
static inline union grug_value grug_id(GRUG_TYPE_ID v) { union grug_value r; r._id = v; return r; }
enum grug_runtime_error_type {
GRUG_ON_FN_STACK_OVERFLOW,
GRUG_ON_FN_TIME_LIMIT_EXCEEDED,
GRUG_ON_FN_GAME_FN_ERROR,
};
typedef void* (*compile_grug_file_t)(void* state, const char* file_path, const char** error_out);
typedef void (*init_globals_t)(void* state, void* file_id);
typedef void (*call_export_fn_t)(void* state, void* file_id, const char* fn_name, const union grug_value* args, size_t args_count);
typedef bool (*dump_file_to_json_t)(void* state, const char *input_grug_path, const char *output_json_path);
typedef bool (*generate_file_from_json_t)(void* state, const char *input_json_path, const char *output_grug_path);
typedef void (*game_fn_error_t)(void* state, const char *message);
typedef void* (*create_grug_state_t) (
const char* mod_api_path,
const char* mods_dir
);
typedef void (*destroy_grug_state_t)(void* grug_state);
struct grug_state_vtable {
create_grug_state_t create_grug_state;
destroy_grug_state_t destroy_grug_state;
compile_grug_file_t compile_grug_file;
init_globals_t init_globals;
call_export_fn_t call_export_fn;
dump_file_to_json_t dump_file_to_json;
generate_file_from_json_t generate_file_from_json;
game_fn_error_t game_fn_error;
};
void grug_tests_run(const char *tests_dir_path,
const char *mod_api_path,
struct grug_state_vtable state_vtable,
const char *whitelisted_test);
void grug_tests_runtime_error_handler(const char *reason,
enum grug_runtime_error_type type,
const char *on_fn_name,
const char *on_fn_path);
union grug_value game_fn_nothing (void* grug_state, const union grug_value args[]);
union grug_value game_fn_magic (void* grug_state, const union grug_value args[]);
union grug_value game_fn_initialize (void* grug_state, const union grug_value args[]);
union grug_value game_fn_initialize_bool (void* grug_state, const union grug_value args[]);
union grug_value game_fn_identity (void* grug_state, const union grug_value args[]);
union grug_value game_fn_max (void* grug_state, const union grug_value args[]);
union grug_value game_fn_say (void* grug_state, const union grug_value args[]);
union grug_value game_fn_sin (void* grug_state, const union grug_value args[]);
union grug_value game_fn_cos (void* grug_state, const union grug_value args[]);
union grug_value game_fn_mega (void* grug_state, const union grug_value args[]);
union grug_value game_fn_get_false (void* grug_state, const union grug_value args[]);
union grug_value game_fn_set_is_happy (void* grug_state, const union grug_value args[]);
union grug_value game_fn_mega_f32 (void* grug_state, const union grug_value args[]);
union grug_value game_fn_mega_i32 (void* grug_state, const union grug_value args[]);
union grug_value game_fn_draw (void* grug_state, const union grug_value args[]);
union grug_value game_fn_blocked_alrm (void* grug_state, const union grug_value args[]);
union grug_value game_fn_spawn (void* grug_state, const union grug_value args[]);
union grug_value game_fn_has_resource (void* grug_state, const union grug_value args[]);
union grug_value game_fn_has_entity (void* grug_state, const union grug_value args[]);
union grug_value game_fn_has_string (void* grug_state, const union grug_value args[]);
union grug_value game_fn_get_opponent (void* grug_state, const union grug_value args[]);
union grug_value game_fn_get_os (void* grug_state, const union grug_value args[]);
union grug_value game_fn_set_d (void* grug_state, const union grug_value args[]);
union grug_value game_fn_set_opponent (void* grug_state, const union grug_value args[]);
union grug_value game_fn_motherload (void* grug_state, const union grug_value args[]);
union grug_value game_fn_motherload_subless (void* grug_state, const union grug_value args[]);
union grug_value game_fn_offset_32_bit_f32 (void* grug_state, const union grug_value args[]);
union grug_value game_fn_offset_32_bit_i32 (void* grug_state, const union grug_value args[]);
union grug_value game_fn_offset_32_bit_string (void* grug_state, const union grug_value args[]);
union grug_value game_fn_talk (void* grug_state, const union grug_value args[]);
union grug_value game_fn_get_position (void* grug_state, const union grug_value args[]);
union grug_value game_fn_set_position (void* grug_state, const union grug_value args[]);
union grug_value game_fn_cause_game_fn_error (void* grug_state, const union grug_value args[]);
union grug_value game_fn_call_on_b_fn (void* grug_state, const union grug_value args[]);
union grug_value game_fn_store (void* grug_state, const union grug_value args[]);
union grug_value game_fn_retrieve (void* grug_state, const union grug_value args[]);
union grug_value game_fn_box_number (void* grug_state, const union grug_value args[]);