Пример #1
0
/**
 * @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);
}
Пример #2
0
/**
 * @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 );
}
Пример #3
0
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);
}
Пример #4
0
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);
}