Index: Daodan/src/BFW_ScriptingLanguage.h
===================================================================
--- Daodan/src/BFW_ScriptingLanguage.h	(revision 443)
+++ Daodan/src/BFW_ScriptingLanguage.h	(revision 444)
@@ -27,5 +27,10 @@
 } sl_arg;
 
-typedef uint16_t (ONICALL *sl_func)(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret);
+typedef struct {
+	char*    name;
+	char*    calllocation; //maybe
+} sl_callinfo;
+
+typedef uint16_t (ONICALL *sl_func)(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret);
 
 uint16_t ONICALL SLrScript_Command_Register_ReturnType(char* name, char* desc, char* argfmt, sl_type type, sl_func callback);
Index: Daodan/src/Daodan_BSL.c
===================================================================
--- Daodan/src/Daodan_BSL.c	(revision 443)
+++ Daodan/src/Daodan_BSL.c	(revision 444)
@@ -4,4 +4,6 @@
 
 #include "Daodan_BSL.h"
+#include "Daodan_Utility.h"
+#include "Daodan_Console.h"
 #include "BFW_ScriptingLanguage.h"
 #include "Oni.h"
@@ -9,5 +11,5 @@
 #include "dSFMT\dSFMT.h"
 
-uint16_t ONICALL bsl_int32mul(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_int32mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -18,5 +20,5 @@
 }
 
-uint16_t ONICALL bsl_mul(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -41,5 +43,5 @@
 }
 
-uint16_t ONICALL bsl_int32div(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_int32div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -50,5 +52,5 @@
 }
 
-uint16_t ONICALL bsl_div(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -73,5 +75,5 @@
 }
 
-uint16_t ONICALL bsl_int32rand(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_int32rand(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -99,5 +101,5 @@
 }
 
-uint16_t ONICALL bsl_getkills(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_getkills(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	int index;
@@ -110,5 +112,5 @@
 }
 
-uint16_t ONICALL bsl_getdamage(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+uint16_t ONICALL bsl_getdamage(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	int index;
@@ -120,6 +122,6 @@
 	return 0;
 }
-
-uint16_t ONICALL bsl_sprintf(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+/*
+uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
 {
 	if (numargs < 2)
@@ -127,15 +129,7 @@
 
 	char output[255];
-	char temp[255];
-	int i = 1;
-	for(i; i < numargs; i++)	{
-		sprintf(output, args[0].value_str32, args[i].value_str32);/*
-		if(args[i].type == sl_int32 || args[i].type == sl_bool) {
-			sprintf(temp, "%i",args[i].value_int32);
-			sprintf(output, args[0].value_str32, temp); }
-		else if(args[i].type == sl_float) {
-			sprintf(temp, "%f",args[i].value_float);
-			sprintf(output, args[0].value_str32, temp); }
-		else*/
+	int i;
+	for(i = 1; i < numargs; i++)	{
+		sprintf(output, args[0].value_str32, args[i].value_str32);
 	}
 	
@@ -144,36 +138,49 @@
 	return 0;
 }
-/*
-char* sprintf_return = NULL;
-uint16_t ONICALL bsl_sprintf(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
-{
-	if (!sprintf_return)
-		sprintf_return = malloc(4096);
+*/
+uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int ffi_ret;
+	char* str = NULL;
+	int size = 0;
 	
 	ffi_cif cif;
-	ffi_type *ffi_args[256];
-	void *values[256];
-	int ffi_ret;
+	ffi_type* ffi_args[256];
+	void* values[256];
 	
 	ffi_args[0] = &ffi_type_pointer;
-	values[0] = sprintf_return;
+	values[0] = &str;
 	ffi_args[1] = &ffi_type_uint32;
-	values[1] = (void*)4095;
+	values[1] = &size;
 	
 	int i;
 	for(i = 2; i < numargs + 2; i ++)
 	{
-		ffi_args[i] = &ffi_type_pointer;
-		values[i] = args[i - 2].value;
-	}
-	
-	ffi_prep_cif(&cif, FFI_DEFAULT_ABI, i, &ffi_type_sint32, ffi_args);
+		if (args[i - 2].type == sl_float)
+		{
+			float value_float = args[i - 2].value_float;
+			double* value_double = (double*)&(args[i - 2]);
+			*value_double = value_float;
+			
+			ffi_args[i] = &ffi_type_double;
+			values[i] = value_double;
+		}
+		else
+		{
+			ffi_args[i] = &ffi_type_pointer;
+			values[i] = &(args[i - 2].value);
+		}
+	}
+	
+	if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, i, &ffi_type_sint32, ffi_args) != FFI_OK)
+		MessageBox(0, "", "", 0);
 	ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
-	
-	ret->value_str32 = sprintf_return;
+	str = malloc(ffi_ret + 1);
+	size = ffi_ret + 1;
+	ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
+	ret->value_str32 = str;
 	ret->type = sl_str32;
 	return 0;
 }
-*/
 
 void SLrDaodan_Initalize()
Index: Daodan/src/Oni_Symbols.S
===================================================================
--- Daodan/src/Oni_Symbols.S	(revision 443)
+++ Daodan/src/Oni_Symbols.S	(revision 444)
@@ -53,11 +53,12 @@
 symbol ( @ONrGameState_GetPlayerCharacter@0        , 0x000b63a7 )
 symbol ( @ONrGetActiveCharacter@4				   , 0x000f1180 )
+
 // Console
-
-symbol ( @TSrContext_DrawText@20			 , 0x0002DF00 )
-symbol ( @TSrContext_New@24					 , 0x0002EA30 )
-symbol ( @TMrInstance_GetDataPtr@12			 , 0x000232E0 )
+symbol ( @TSrContext_DrawText@20                   , 0x0002DF00 )
+symbol ( @TSrContext_New@24                        , 0x0002EA30 )
+symbol ( @TMrInstance_GetDataPtr@12                , 0x000232E0 )
 
 symbol ( @COrTextArea_Print@28                     , 0x00031340 )
+
 symbol ( _COgConsoleLines                          , 0x001cb468 )
 symbol ( _COgFadeTimeValue                         , 0x00133f68 )
@@ -67,3 +68,6 @@
 // ScriptingLanguage
 symbol ( @SLrScript_Command_Register_ReturnType@20 , 0x00077b20 )
+symbol ( @SLrScript_Command_Register_Void@16       , 0x00077b40 )
+symbol ( @SLrGlobalVariable_Register_Int32@12      , 0x00077e30 )
+symbol ( @SLrGlobalVariable_Register_Float@12      , 0x00077ec0 )
 
