/** * @function ferite_init_error_system * @declaration void ferite_init_error_system( FeriteScript *script, FeriteNamespace *ns ) * @brief Setup the special error handling class on a script * @param FeriteScript *script The current script * @param FeriteNamespace *ns The namespace in which the class should be registered */ void ferite_init_error_system( FeriteScript *script, FeriteNamespace *ns ) { FeriteClass *ferite_error_class = NULL; FeriteVariable *var, *errobj = NULL; FeriteNamespaceBucket *nsb = NULL; FE_ENTER_FUNCTION; ferite_error_class = ferite_register_class( script, ns, "Error" ); ferite_register_class_variable( script, ferite_error_class, "num", ferite_create_number_long_variable( script, "num", 0, FE_STATIC ), 0 ); ferite_register_class_variable( script, ferite_error_class, "str", ferite_create_string_variable( script, "str", NULL, FE_STATIC ), 0 ); ferite_register_class_variable( script, ferite_error_class, "backtrace", ferite_create_uarray_variable( script, "backtrace", 32, FE_STATIC ), 0 ); fe_create_cls_fnc( script, ferite_error_class, "constructor", ferite_error_constructor_sn, "sn", FE_FALSE ); fe_create_cls_fnc( script, ferite_error_class, "constructor", ferite_error_constructor_s, "s", FE_FALSE ); fe_create_cls_fnc( script, ferite_error_class, "backtrace", ferite_error_backtrace, "", FE_FALSE ); nsb = ferite_find_namespace( script, script->mainns, "err", FENS_VAR ); if( nsb != NULL ) { errobj = ferite_build_object( script, ferite_error_class ); var = nsb->data; VAO(var) = VAO(errobj); VAO(errobj) = NULL; ferite_variable_destroy( script, errobj ); } FE_LEAVE_FUNCTION(NOWT); }
/** * @function ferite_create_external_function * @declaration FeriteFunction *ferite_create_external_function( FeriteScript *script, char *name, void *(*funcPtr)(FeriteScript *, FeriteFunction*, FeriteVariable **), char *description ) * @brief Allocate a FeriteFunction structure and set it up for use as a native function * @param FeriteScript *script The script it is being used within * @param char *name The name of the function to be created * @param void *funcPtr A pointer to the native c function handling it * @param char *description A description of the functions signiture * @return A pointer to a FeriteFunction structure * @description * The description is pretty straight forward - it is simply a sequence of characters eg "oosna" They mean the following:<nl/> * <ul> * <li> <b>n</b> - number * <li> <b>s</b> - string * <li> <b>a</b> - array * <li> <b>o</b> - object * <li> <b>v</b> - void * <li> <b>.</b> - variable argument list * </ul> * <nl/> * This means that the function will only actually ever be called with the correct parameters. */ FeriteFunction *ferite_create_external_function( FeriteScript *script, char *name, void *f, char *description ) { FeriteFunction *ptr; int i; FeriteVariable *new_variable = NULL; FE_ENTER_FUNCTION; FUD(("Creating Function: %s\n", name)); ptr = fmalloc( sizeof( FeriteFunction ) ); ptr->name = fstrdup( name ); ptr->type = FNC_IS_EXTRL; ptr->fncPtr = (FeriteVariable*(*)(FeriteScript*,void*,FeriteObject*,FeriteFunction*,FeriteVariable**))f; ptr->odata = NULL; ptr->bytecode = NULL; ptr->localvars = NULL; ptr->signature = fmalloc( sizeof( FeriteParameterRecord* ) * FE_FUNCTION_PARAMETER_MAX_SIZE ); for( i = 0; i < FE_FUNCTION_PARAMETER_MAX_SIZE; i++ ) ptr->signature[i] = NULL; ptr->arg_count = 0; for( i = 0; i < (signed)strlen( description ); i++ ) { switch( description[i] ) { case 'a': new_variable = ferite_create_uarray_variable( script, "a", 0, FE_STATIC ); break; case 's': new_variable = ferite_create_string_variable( script, "s", NULL, FE_STATIC ); break; case 'n': new_variable = ferite_create_number_long_variable( script, "n", 0, FE_STATIC ); break; case 'o': new_variable = ferite_create_object_variable( script, "o", FE_STATIC ); break; case 'v': new_variable = ferite_create_void_variable( script, "v", FE_STATIC ); break; case '?': new_variable = ferite_create_void_variable( script, "?", FE_STATIC ); break; case '.': new_variable = ferite_create_void_variable( script, ".", FE_STATIC ); break; default: ferite_error( script, 0, "Type '%c' not allowed for function signatures (%s)\n", name ); break; } if( new_variable != NULL ) { ptr->signature[ptr->arg_count] = fmalloc( sizeof( FeriteParameterRecord ) ); ptr->signature[ptr->arg_count]->variable = new_variable; ptr->signature[ptr->arg_count]->has_default_value = FE_FALSE; ptr->signature[ptr->arg_count]->pass_type = FE_BY_VALUE; ptr->signature[ptr->arg_count]->name = NULL; ptr->signature[ptr->arg_count]->is_dots = FE_FALSE; if( description[i] == '.' ) ptr->signature[ptr->arg_count]->is_dots = FE_TRUE; ptr->arg_count++; } } ptr->native_information = NULL; ptr->klass = NULL; ptr->lock = NULL; ptr->is_static = FE_TRUE; ptr->next = NULL; ptr->state = FE_ITEM_IS_PUBLIC; ptr->is_alias = FE_FALSE; ptr->length = 0; ptr->cached = FE_FALSE; ptr->return_type = F_VAR_VOID; FE_LEAVE_FUNCTION( ptr ); }
void game_engine_network_init( FeriteScript *script ) { FeriteNamespaceBucket *nsb = ferite_find_namespace(script, script->mainns, "Network", FENS_NS); FeriteNamespace *network_namespace = (nsb && nsb->data ? nsb->data : ferite_register_namespace(script, "Network", script->mainns)); FeriteClass *server_class = ferite_register_inherited_class(script, network_namespace, "Server", NULL); FeriteClass *client_class = ferite_register_inherited_class(script, network_namespace, "Client", NULL); ferite_register_ns_variable(script, network_namespace, "MESSAGE_DATA", ferite_create_number_long_variable(script, "MESSAGE_DATA", ENET_EVENT_TYPE_RECEIVE, FE_STATIC)); ferite_register_ns_variable(script, network_namespace, "MESSAGE_CONNECT", ferite_create_number_long_variable(script, "MESSAGE_CONNECT", ENET_EVENT_TYPE_CONNECT, FE_STATIC)); ferite_register_ns_variable(script, network_namespace, "MESSAGE_DISCONNECT", ferite_create_number_long_variable(script, "MESSAGE_DISCONNECT", ENET_EVENT_TYPE_DISCONNECT, FE_STATIC)); ferite_register_inherited_class(script, network_namespace, "Peer", NULL); ferite_register_inherited_class(script, network_namespace, "ConnectMessage", NULL); ferite_register_inherited_class(script, network_namespace, "DisconnectMessage", NULL); ferite_register_inherited_class(script, network_namespace, "DataMessage", NULL); FeriteFunction *server_start_function = ferite_create_external_function(script, "start", game_engine_network_server_start, "n"); FeriteFunction *server_destroy_function = ferite_create_external_function(script, "destroy", game_engine_network_server_destroy, ""); FeriteFunction *server_flush_function = ferite_create_external_function(script, "flush", game_engine_network_server_flush, ""); FeriteFunction *server_service_function = ferite_create_external_function(script, "service", game_engine_network_server_service, "n"); FeriteFunction *server_send_function = ferite_create_external_function(script, "send", game_engine_network_server_send, "os"); ferite_register_class_function(script, server_class, server_start_function, FE_TRUE); ferite_register_class_function(script, server_class, server_destroy_function, FE_FALSE); ferite_register_class_function(script, server_class, server_flush_function, FE_FALSE); ferite_register_class_function(script, server_class, server_service_function, FE_FALSE); ferite_register_class_function(script, server_class, server_send_function, FE_FALSE); FeriteFunction *client_start_function = ferite_create_external_function(script, "start", game_engine_network_client_start, "sn"); FeriteFunction *client_destroy_function = ferite_create_external_function(script, "destroy", game_engine_network_client_destroy, ""); FeriteFunction *client_flush_function = ferite_create_external_function(script, "flush", game_engine_network_client_flush, ""); FeriteFunction *client_service_function = ferite_create_external_function(script, "service", game_engine_network_client_service, "n"); FeriteFunction *client_send_function = ferite_create_external_function(script, "send", game_engine_network_client_send, "s"); ferite_register_class_function(script, client_class, client_start_function, FE_TRUE); ferite_register_class_function(script, client_class, client_destroy_function, FE_FALSE); ferite_register_class_function(script, client_class, client_flush_function, FE_FALSE); ferite_register_class_function(script, client_class, client_service_function, FE_FALSE); ferite_register_class_function(script, client_class, client_send_function, FE_FALSE); }
void game_engine_init( FeriteScript *script ) { FeriteNamespaceBucket *nsb = ferite_find_namespace(script, script->mainns, "Engine", FENS_NS); FeriteNamespace *engine_namespace = (nsb && nsb->data ? nsb->data : ferite_register_namespace(script, "Engine", script->mainns)); FeriteVariable *event_keydown_variable = ferite_create_number_long_variable(script, "EVENT_KEYDOWN", SDL_KEYDOWN, FE_STATIC); FeriteVariable *event_keyup_variable = ferite_create_number_long_variable(script, "EVENT_KEYUP", SDL_KEYUP, FE_STATIC); FeriteVariable *event_mousebuttondown_variable = ferite_create_number_long_variable(script, "EVENT_MOUSEBUTTONDOWN", SDL_MOUSEBUTTONDOWN, FE_STATIC); FeriteVariable *event_mousebuttonup_variable = ferite_create_number_long_variable(script, "EVENT_MOUSEBUTTONUP", SDL_MOUSEBUTTONUP, FE_STATIC); FeriteVariable *event_mousemotion_variable = ferite_create_number_long_variable(script, "EVENT_MOUSEMOTION", SDL_MOUSEMOTION, FE_STATIC); FeriteVariable *event_quit_variable = ferite_create_number_long_variable(script, "EVENT_QUIT", SDL_QUIT, FE_STATIC); FeriteVariable *button_left_variable = ferite_create_number_long_variable(script, "BUTTON_LEFT", SDL_BUTTON_LEFT, FE_STATIC); FeriteFunction *sin_function = ferite_create_external_function(script, "sin", game_engine_sin, "n"); FeriteFunction *cos_function = ferite_create_external_function(script, "cos", game_engine_cos, "n"); FeriteFunction *print_line_function = ferite_create_external_function(script, "printLine", game_engine_print_line, "s"); FeriteFunction *set_screen_function = ferite_create_external_function(script, "setScreen", game_engine_set_screen, "nnn"); FeriteFunction *clear_screen_function = ferite_create_external_function(script, "clearScreen", game_engine_clear_screen, ""); FeriteFunction *update_screen_function = ferite_create_external_function(script, "updateScreen", game_engine_update_screen, ""); FeriteFunction *next_event_function = ferite_create_external_function(script, "nextEvent", game_engine_next_event, ""); FeriteFunction *current_time_function = ferite_create_external_function(script, "currentTime", game_engine_current_time, ""); FeriteFunction *load_image_function = ferite_create_external_function(script, "loadImage", game_engine_load_image, "sn"); FeriteFunction *draw_image_function = ferite_create_external_function(script, "drawImage", game_engine_draw_image, "onnnnnn"); FeriteFunction *screen_width_function = ferite_create_external_function(script, "screenWidth", game_engine_screen_width, ""); FeriteFunction *screen_height_function = ferite_create_external_function(script, "screenHeight", game_engine_screen_height, ""); FeriteFunction *current_working_directory_function = ferite_create_external_function(script, "currentWorkingDirectory", game_engine_current_working_directory, ""); FeriteFunction *draw_rectangle_function = ferite_create_external_function(script, "drawRectangle", game_engine_draw_rectangle, "nnnnnnn"); FeriteFunction *play_music_function = ferite_create_external_function(script, "playMusic", game_engine_play_music, "s"); FeriteFunction *stop_music_function = ferite_create_external_function(script, "stopMusic", game_engine_stop_music, ""); FeriteFunction *set_sound_channels_function = ferite_create_external_function(script, "setSoundChannels", game_engine_set_sound_channels, "n"); FeriteFunction *load_sound_function = ferite_create_external_function(script, "loadSound", game_engine_load_sound, "s"); ferite_register_inherited_class(script, engine_namespace, "KeyboardEvent", NULL); ferite_register_inherited_class(script, engine_namespace, "MouseButtonEvent", NULL); ferite_register_inherited_class(script, engine_namespace, "MouseMotionEvent", NULL); ferite_register_inherited_class(script, engine_namespace, "QuitEvent", NULL); ferite_register_ns_variable(script, engine_namespace, "EVENT_KEYDOWN", event_keydown_variable); ferite_register_ns_variable(script, engine_namespace, "EVENT_KEYUP", event_keyup_variable); ferite_register_ns_variable(script, engine_namespace, "EVENT_MOUSEBUTTONDOWN", event_mousebuttondown_variable); ferite_register_ns_variable(script, engine_namespace, "EVENT_MOUSEBUTTONUP", event_mousebuttonup_variable); ferite_register_ns_variable(script, engine_namespace, "EVENT_MOUSEMOTION", event_mousemotion_variable); ferite_register_ns_variable(script, engine_namespace, "EVENT_QUIT", event_quit_variable); // SDL_BUTTON_LEFT, SDL_BUTTON_MIDDLE, SDL_BUTTON_RIGHT, SDL_BUTTON_WHEELUP, SDL_BUTTON_WHEELDOWN ferite_register_ns_variable(script, engine_namespace, "BUTTON_LEFT", button_left_variable); ferite_register_ns_function(script, engine_namespace, sin_function); ferite_register_ns_function(script, engine_namespace, cos_function); ferite_register_ns_function(script, engine_namespace, print_line_function); ferite_register_ns_function(script, engine_namespace, set_screen_function); ferite_register_ns_function(script, engine_namespace, clear_screen_function); ferite_register_ns_function(script, engine_namespace, update_screen_function); ferite_register_ns_function(script, engine_namespace, next_event_function); ferite_register_ns_function(script, engine_namespace, current_time_function); ferite_register_ns_function(script, engine_namespace, load_image_function); ferite_register_ns_function(script, engine_namespace, draw_image_function); ferite_register_ns_function(script, engine_namespace, screen_width_function); ferite_register_ns_function(script, engine_namespace, screen_height_function); ferite_register_ns_function(script, engine_namespace, current_working_directory_function); ferite_register_ns_function(script, engine_namespace, draw_rectangle_function); ferite_register_ns_function(script, engine_namespace, play_music_function); ferite_register_ns_function(script, engine_namespace, stop_music_function); ferite_register_ns_function(script, engine_namespace, set_sound_channels_function); ferite_register_ns_function(script, engine_namespace, load_sound_function); game_engine_key_init(script, engine_namespace); game_engine_image_init(script, engine_namespace); game_engine_sound_init(script, engine_namespace); game_engine_network_init(script); }