#include #include #include #include "grrlib_duk.h" #include "data.h" extern const char* program; static bool running = true; static duk_ret_t native_print(duk_context *ctx) { GRRLIB_GeckoPrintf("%s\n", duk_to_string(ctx, 0)); return 0; } static duk_ret_t native_exit(duk_context *ctx) { running = false; return 0; } static void duk_fatal_error(void *udata, const char *msg) { GRRLIB_GeckoPrintf("an error has occured: %s\n", msg); } static duk_ret_t pad_scan_pads() { PAD_ScanPads(); return 0; } static duk_ret_t pad_buttons_down(duk_context *ctx) { u32 pressed = PAD_ButtonsDown(0); duk_push_number(ctx, pressed); return 1; } static duk_ret_t get_file(duk_context *ctx) { const char* filename = duk_to_string(ctx, 0); void* ptr; size_t size; if (get_file_pointer(filename, &ptr, &size)) { duk_idx_t file_obj = duk_push_object(ctx); duk_push_number(ctx, size); duk_put_prop_string(ctx, file_obj, "size"); duk_push_pointer(ctx, ptr); duk_put_prop_string(ctx, file_obj, "file_ptr"); return 1; } return duk_error(ctx, DUK_ERR_ERROR, "Error trying to get the file %s.", filename); } static void define_pad_object(duk_context *ctx) { duk_idx_t pad_obj = duk_push_object(ctx); duk_push_c_function(ctx, pad_scan_pads, 0); duk_put_prop_string(ctx, pad_obj, "scan_pads"); duk_push_c_function(ctx, pad_buttons_down, 0); duk_put_prop_string(ctx, pad_obj, "buttons_down"); } static void define_wii_object(duk_context *ctx) { duk_idx_t wii_obj = duk_push_object(ctx); duk_push_c_function(ctx, native_print, 1); duk_put_prop_string(ctx, wii_obj, "print"); duk_push_c_function(ctx, native_exit, 0); duk_put_prop_string(ctx, wii_obj, "exit"); define_pad_object(ctx); duk_put_prop_string(ctx, wii_obj, "pad"); define_grrlib_object(ctx); duk_put_prop_string(ctx, wii_obj, "grrlib"); duk_push_c_function(ctx, get_file, 1); duk_put_prop_string(ctx, wii_obj, "get_file"); } int main(int argc, char **argv) { GRRLIB_Init(); PAD_Init(); duk_context *ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error); define_wii_object(ctx); duk_put_global_string(ctx, "wii"); // evaluate functions from game.js duk_eval_string_noresult(ctx, program); // call start function duk_get_global_string(ctx, "start"); duk_call(ctx, 0); duk_pop(ctx); while (running) { PAD_ScanPads(); duk_get_global_string(ctx, "update"); duk_call(ctx, 0); duk_pop(ctx); GRRLIB_Render(); } // printf("destroying heap\n"); duk_destroy_heap(ctx); // printf("exit time\n"); GRRLIB_Exit(); return 0; }