Index: Daodan/src/Daodan_BSL.c
===================================================================
--- Daodan/src/Daodan_BSL.c	(revision 442)
+++ Daodan/src/Daodan_BSL.c	(revision 443)
@@ -1,7 +1,8 @@
+#include <stdio.h>
 #include <time.h>
+#include <ffi.h>
 
 #include "Daodan_BSL.h"
 #include "BFW_ScriptingLanguage.h"
-#include <stdio.h>
 #include "Oni.h"
 #include "Oni_Character.h"
@@ -15,30 +16,4 @@
 	ret->type = sl_int32;
 	return 0;
-}
-
-uint16_t ONICALL bsl_getkills(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
-{
-
-	int index;
-	if (numargs == 0) index = 0;
-	else index = args[0].value_int32;
-	int* killcount = ONgGameState + index * 0x16A0 +  0x1260 + 0x1670;
-	ret->value_int32 = *killcount;
-	ret->type = sl_int32;
-	return 0;
-
-}
-
-uint16_t ONICALL bsl_getdamage(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
-{
-
-	int index;
-	if (numargs == 0) index = 0;
-	else index = args[0].value_int32;
-	int* killcount = ONgGameState + index * 0x16A0 +  0x1260 + 0x1674;
-	ret->value_int32 = *killcount;
-	ret->type = sl_int32;
-	return 0;
-
 }
 
@@ -97,28 +72,4 @@
 	return 0;
 }
-uint16_t ONICALL bsl_sprintf(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
-{
-	if (numargs < 2)
-		return 1;
-	
-	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 */
-	}
-	
-	ret->value_str32 = output;
-	ret->type = sl_str32;
-	return 0;
-}
-
 
 uint16_t ONICALL bsl_int32rand(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
@@ -148,4 +99,81 @@
 }
 
+uint16_t ONICALL bsl_getkills(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int index;
+	if (numargs == 0) index = 0;
+	else index = args[0].value_int32;
+	int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1670;
+	ret->value_int32 = *killcount;
+	ret->type = sl_int32;
+	return 0;
+}
+
+uint16_t ONICALL bsl_getdamage(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int index;
+	if (numargs == 0) index = 0;
+	else index = args[0].value_int32;
+	int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1674;
+	ret->value_int32 = *killcount;
+	ret->type = sl_int32;
+	return 0;
+}
+
+uint16_t ONICALL bsl_sprintf(void* dontuse0, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	if (numargs < 2)
+		return 1;
+
+	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*/
+	}
+	
+	ret->value_str32 = output;
+	ret->type = sl_str32;
+	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);
+	
+	ffi_cif cif;
+	ffi_type *ffi_args[256];
+	void *values[256];
+	int ffi_ret;
+	
+	ffi_args[0] = &ffi_type_pointer;
+	values[0] = sprintf_return;
+	ffi_args[1] = &ffi_type_uint32;
+	values[1] = (void*)4095;
+	
+	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);
+	ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
+	
+	ret->value_str32 = sprintf_return;
+	ret->type = sl_str32;
+	return 0;
+}
+*/
 
 void SLrDaodan_Initalize()
@@ -156,13 +184,11 @@
 	SLrScript_Command_Register_ReturnType("int32div", "Divides two numbers", "n1:int n2:int", sl_int32, bsl_int32div);
 	SLrScript_Command_Register_ReturnType("div", "Divides two numbers", "[int1:int|float1:float] [int2:int|float2:float]", sl_float, bsl_div);
-
 	
-	SLrScript_Command_Register_ReturnType("sprintf", "sprintf", "str1:format str2:value [str3:...]", sl_str32, bsl_sprintf);
-
+	dsfmt_gv_init_gen_rand((uint32_t)time(NULL));
+	SLrScript_Command_Register_ReturnType("int32rand", "Returns a pseudo-random number between two numbers (inclusive).", "start:int end:int", sl_int32, bsl_int32rand);
+	
 	SLrScript_Command_Register_ReturnType("chr_getkills","Gets the number of kills a character has", "[chrindex:int]", sl_int32, bsl_getkills);
 	SLrScript_Command_Register_ReturnType("chr_getdamage","Gets the amount of damage a character has caused", "[chrindex:int]", sl_int32, bsl_getdamage);
 	
-	dsfmt_gv_init_gen_rand((uint32_t)time(NULL));
-	SLrScript_Command_Register_ReturnType("int32rand", "Returns a pseudo-random number between two numbers (inclusive).", "start:int end:int", sl_int32, bsl_int32rand);
-
+	SLrScript_Command_Register_ReturnType("sprintf", "C-style sprintf.", "str1:format", sl_str32, bsl_sprintf);
 }
