Index: Daodan/src/BFW_Utility.h
===================================================================
--- Daodan/src/BFW_Utility.h	(revision 445)
+++ Daodan/src/BFW_Utility.h	(revision 446)
@@ -14,5 +14,17 @@
 void    ONICALL UUrPlatform_Terminate();
 
+typedef struct {
+	int16_t Top;
+	int16_t Left;
+	int16_t Right;
+	int16_t Bottom; 
+} OniRectangle;
+
+
+void* TestContext;
 void ONICALL COrTextArea_Print(uint32_t area, uint32_t priority, uint32_t textshade, uint32_t textshadowshade, const char* text, uint32_t unk_alwaws_0, uint32_t fadetime);
+int16_t ONICALL TSrContext_DrawText(uint32_t TSrContext, char* Text, int alpha, uint32_t usuallyzero, OniRectangle* pRect);
+int16_t ONICALL TSrContext_New( void* FontInstance, int size, int hthsik1,int hthsik2,int hthsik3, void* TSrContext); //int16_t TSrContext_New( TSFF*, size 7, ??? 1, ??? 1, ??? 0, TSrContext*);
+int16_t ONICALL TMrInstance_GetDataPtr(int, char*, void*);	//int TMrInstance_GetDataPtr( Type 'TSFF', char* "Tahoma", ptr);
 
 int __cdecl AUrMessageBox(int Buttons, char *Message, ...);
Index: Daodan/src/Daodan_BSL.c
===================================================================
--- Daodan/src/Daodan_BSL.c	(revision 445)
+++ Daodan/src/Daodan_BSL.c	(revision 446)
@@ -10,4 +10,5 @@
 #include "Oni_Character.h"
 #include "dSFMT\dSFMT.h"
+#include "Daodan_Character.h"
 
 uint16_t ONICALL bsl_int32mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
@@ -92,4 +93,5 @@
 	int index;
 	if (numargs == 0) index = 0;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
 	else index = args[0].value_int32;
 	int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1670;
@@ -103,8 +105,167 @@
 	int index;
 	if (numargs == 0) index = 0;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
 	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_powerup(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	char powerup_list[7][16] = {"ammo", "cell", "hypo", "shield", "invis" , "lsi", "bossshield"};
+	int powerup_offset[7] = {    0xE,    0x12,   0x10,   0x24,     0x26,     0x20,  -1};
+	char powerup_type[16] = "\0";
+	int index;
+	if (numargs < 2 || args[1].type != sl_str32) return 1;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
+	else index = args[0].value_int32;
+	int i;
+	
+	for(i = 0; i < 6; i++) 
+	{
+		if(!strcmp(args[1].value_str32,powerup_list[i])) 
+		{
+			sprintf(powerup_type,"%s",powerup_list[i]);
+				break;
+		}
+	}
+	
+	//todo, add setting
+	
+	if (powerup_type[0] == 0) return 1;
+	Character* Chr = ONgGameState + 0x1260;
+	void* returnval = &(Chr[index]) + 0x194 + powerup_offset[i];
+	//*returnval = (int)Inv 
+	if (numargs >= 2) 
+	{
+		//*health = args[1].value_int32;
+	}
+	ret->value_int32 = (int)*(uint16_t*)returnval;
+	ret->type = sl_int32;
+	return 0;
+}
+
+uint16_t ONICALL bsl_health(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int index;
+	if (numargs == 0) index = 0;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
+	else index = args[0].value_int32;
+	Character* Chr = ONgGameState + 0x1260 ;
+	int* health = &Chr[index].Health;
+
+	ret->value_int32 = *health;
+	ret->type = sl_int32;
+
+	if (numargs >= 2) {
+		*health = args[1].value_int32;
+	}
+	ret->value_int32 = *health;
+	ret->type = sl_int32;
+	return 0;
+}
+
+uint16_t ONICALL bsl_maxhealth(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int index;
+	if (numargs == 0) index = 0;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
+	else index = args[0].value_int32;
+	Character* Chr = ONgGameState + 0x1260 ;
+	int* maxhealth = &Chr[index].MaxHealth;
+	int oldmaxhealth = Chr[index].MaxHealth;
+	int oldhealth = Chr->Health;
+	if (numargs >= 2) {
+		*maxhealth = args[1].value_int32;
+	}
+	if (numargs >= 3 && args[2].value_bool) {
+		Chr->Health = (int)(((float)args[1].value_int32 / (float)oldmaxhealth) * (float)oldhealth);
+	}
+	ret->value_int32 = oldmaxhealth;
+	ret->type = sl_int32;
+	return 0;
+}
+
+uint16_t ONICALL bsl_getattacker(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	//broken...not only does it sometimes blam, but it returns a string when i want an int so i can study it :<
+	int index;
+	if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
+	else index = args[0].value_int32;
+	
+
+	if(ONrGetActiveCharacter(ONgGameState + 0x1260 + index * 0x16A0)) return 1;
+
+	int attacker= (int)(ONrGetActiveCharacter(ONgGameState + 0x1260 + index * 0x16A0) + 0x120);
+	ret->type = sl_int32;
+	ret->value_int32 = attacker;
+	return 0;
+}
+
+
+uint16_t ONICALL bsl_chrname(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	int index;
+	if (numargs == 0) index = 0;
+	else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
+	else index = args[0].value_int32;
+	if (index == -1) {
+		ret->type = sl_str32;
+		ret->value_str32 = "NULL";
+		return 0;
+	}
+	char* name = ONgGameState + 0x1260  + index * 0x16A0 + 0x14;
+	if (numargs == 2) {
+		strncpy(name, (char*)args[1].value_str32, 31);
+	}
+	
+	ret->type = sl_str32;
+	ret->value_str32 = name;
+	
+	return 0;
+}
+
+
+uint16_t ONICALL bsl_count(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	//testing numargs...
+	ret->type = sl_int32;
+	ret->value_int32 = numargs;
+	return 0;
+}
+
+uint16_t ONICALL bsl_dprintcolored(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	//TODO: figure out why our implementation of dprint shows after dev mode is turned off
+	RGBA color;
+	RGBA shade;
+	
+	if(numargs == 0) return 0;
+	if(numargs > 1 ) color.R = (char)args[1].value_int32;
+	else color.R = 255;
+	if(numargs > 2 ) color.G = (char)args[2].value_int32;
+	else color.G = 255;
+	if(numargs > 3 ) color.B = (char)args[3].value_int32;
+	else color.B = 255;
+	color.A = 0;
+	if(numargs > 5 ) shade.R = (char)args[5].value_int32;
+	else shade.R = 0x3F;
+	if(numargs > 6 ) shade.G = (char)args[6].value_int32;
+	else shade.G = 0x3F;
+	if(numargs > 7 ) shade.B = (char)args[7].value_int32;
+	else shade.B = 0x3F;
+	shade.A = 0; 
+
+	DDrConsole_PrintColored(args[0].value_str32, 1, color, shade);
+	return 0;
+}
+
+
+uint16_t ONICALL bsl_nametoindex(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
+{
+	ret->type = sl_int32;
+	ret->value_int32 = DDrGetCharacterIndexFromName(args[0].value_str32);
 	return 0;
 }
@@ -193,7 +354,16 @@
 	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);
+	SLrScript_Command_Register_ReturnType("d_getkills","Gets the number of kills a character has", "[ai_name:str | script_id:int]", sl_int32, bsl_getkills);
+	SLrScript_Command_Register_ReturnType("d_getdamage","Gets the amount of damage a character has caused", "[ai_name:string | script_id:int]", sl_int32, bsl_getdamage);
+	SLrScript_Command_Register_ReturnType("d_name","Gets or sets a character's name", "[ai_name:str | script_id:int] [newname:string]", sl_str32, bsl_chrname);
+	SLrScript_Command_Register_ReturnType("d_getindex","Converts a character's name to its index", "script_id:int", sl_int32, bsl_nametoindex);
+	SLrScript_Command_Register_ReturnType("d_health","Gets or sets a character's health", "[ai_name:str | script_id:int] [newhealth:int]", sl_str32, bsl_health);
+	SLrScript_Command_Register_ReturnType("d_maxhealth","Gets or sets a character's maximum health", "[ai_name:str | script_id:int] [newmaxhealth:int] [scalehealth:bool]", sl_str32, bsl_maxhealth);
+	SLrScript_Command_Register_ReturnType("d_powerup","Gets or sets a character's powerups", "ai_name:str|script_id:int powerup:str", sl_int32, bsl_powerup);
+	//broken. sometimes crashes, and sometimes returns a string... : /
+	SLrScript_Command_Register_ReturnType("d_getattacker","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_chrname);
 	
 	SLrScript_Command_Register_ReturnType("sprintf", "C-style sprintf.", "format:string arg1 arg2 ...", sl_str32, bsl_sprintf);
-}
+
+	SLrScript_Command_Register_ReturnType("dprintcolor", "prints to console in color", "text:string [color: r b g] [color: r b g]", sl_void, bsl_dprintcolored);
+}
Index: Daodan/src/Daodan_Character.c
===================================================================
--- Daodan/src/Daodan_Character.c	(revision 445)
+++ Daodan/src/Daodan_Character.c	(revision 446)
@@ -2,4 +2,6 @@
 #include "Daodan_Character.h"
 #include "Oni_Character.h"
+#include "BFW_Utility.h"
+#include "Oni.h"
 
 int DDr_TeamToTeamID(const char* team_string) //Already something like this in the engine, but I'm reimplementing it...
@@ -16,6 +18,22 @@
 }
 
+uint32_t DDrGetCharacterIndexFromName(char* input) {
+	Character **characterlist;								//pointer to array of Character pointers
+	characterlist = ONgGameState + 0x00167500;				//Character List
+	int* total_characters = ONgGameState + 0x00167700;		//Max number of characters
+	int i;
+	for(i = 0; i < *total_characters; i++) {
+		if (characterlist[i] != 0)							//anti Blam!
+			if (!strcmp(characterlist[i]->Name, input)) {	//checks for the same name
+			return characterlist[i]->Number;
+			}
+	}
+return -1;													//not found :(
+}
+
+OniRectangle TestRect;
 void CHARTest()
 {
+	
 	CharacterObject* TestCHAR = malloc(sizeof(CharacterObject));
 	memset(TestCHAR, 0, sizeof(CharacterObject));
@@ -25,9 +43,18 @@
 	memcpy(TestCHAR->OSD.Name, "Gumby", 6);
 	memcpy(TestCHAR->OSD.Class, "striker_easy_1", 15);
-	memcpy(TestCHAR->OSD.ScriptSpawn, "dmsg", 20);
-	TestCHAR->OSD.Options = chr_unkillable;
+	memcpy(TestCHAR->OSD.ScriptSpawn, "dmsg", 20);	
+	//TestCHAR->OSD.Options = chr_unkillable;
 	TestCHAR->OSD.TeamID = team_syndicate;
+	//int* ptr = 0x005ECE70;
+	TestRect.Top = 10;
+	TestRect.Left = 10;
+	TestRect.Right = 100;
+	TestRect.Bottom = 100;
 	
-
-	ONrGameState_NewCharacter(TestCHAR, NULL, NULL, NULL);
+	char str[5] = "hi";
+	str[2] = '\0';
+	AUrMessageBox(0, "%8x", &TestRect);
+	int16_t a = TSrContext_DrawText(TestContext, str, 0xFF, &TestRect, &TestRect);
+	//ONrGameState_NewCharacter(TestCHAR, NULL, NULL, NULL);
+	return;
 }
Index: Daodan/src/Daodan_Character.h
===================================================================
--- Daodan/src/Daodan_Character.h	(revision 445)
+++ Daodan/src/Daodan_Character.h	(revision 446)
@@ -8,4 +8,4 @@
 int DDr_TeamToTeamID(const char* team_string);
 void CHARTest();
-
+uint32_t DDrGetCharacterIndexFromName(char* );
 #endif
Index: Daodan/src/Daodan_Console.c
===================================================================
--- Daodan/src/Daodan_Console.c	(revision 445)
+++ Daodan/src/Daodan_Console.c	(revision 446)
@@ -9,4 +9,11 @@
 {
 	COrTextArea_Print(COgConsoleLines, 1, COgDefaultTextShade, COgDefaultTextShadow, text, 0, COgFadeTimeValue);
+}
+
+void DDrConsole_PrintColored(const char* text, int priority, RGBA color, RGBA shade)
+{
+	int* intcolor = (int*)&color;
+	int* intshade = (int*)&shade;
+	COrTextArea_Print(COgConsoleLines, 1, *intcolor, *intshade, text, 0, COgFadeTimeValue);
 }
 
Index: Daodan/src/Daodan_Console.h
===================================================================
--- Daodan/src/Daodan_Console.h	(revision 445)
+++ Daodan/src/Daodan_Console.h	(revision 446)
@@ -7,5 +7,13 @@
 #include "Daodan.h"
 
+typedef struct {
+char B;
+char G;
+char R;
+char A;
+} RGBA;
+
 void DDrConsole_Print(const char* text);
+void DDrConsole_PrintColored(const char* text, int priority, RGBA color, RGBA shade);
 void DDrConsole_PrintF(const char* fmt, ...);
 
Index: Daodan/src/Oni_Character.h
===================================================================
--- Daodan/src/Oni_Character.h	(revision 445)
+++ Daodan/src/Oni_Character.h	(revision 446)
@@ -211,6 +211,6 @@
 	int16_t ShieldUsed;				//Bullet shield given for the char to use
 	int16_t CloakUsed;				//Phase Cloak given for the char to use
-	int16_t field_28;			//probably bullet shield dropped
-	int16_t DoorKeys;		//Lol. We can use this later for other sorts of items.
+	int32_t field_28;			//probably bullet shield dropped
+	int32_t DoorKeys;		//Lol. We can use this later for other sorts of items.
 } Inventory;
 
@@ -432,12 +432,13 @@
 } ActiveCharacter;
 
-
+//This struct is good. 
 typedef struct { //Character
-	int16_t Number;
+	char Number;
+	char field_2;
 	int16_t ActiveCharacterIndex;
 	int32_t Flags;
-	int16_t field_8;
+	int32_t field_8;
 	int32_t ONCC;			//change type to ONCC when we get that far...
-	int32_t field_10;
+	int16_t field_10;
 	int16_t Team;
 	char Name[32];
@@ -471,11 +472,11 @@
 	Vector3 Velocity;
 	int32_t field_1D0;
-	int32_t field_1D4;
+	int32_t Recoil;
 	int32_t field_1D8;
 	int32_t field_1DC;
-	int32_t field_1E0;
+	int32_t LastNotIdleGameTime;
 	int32_t IdleDelay;
-	int32_t field_1E8;
-	int32_t field_1EzC;
+	int32_t Type;
+	int32_t field_1EC;
 	int32_t CombatFlags;
 	int32_t JobId;
@@ -484,7 +485,7 @@
 	int32_t field_200;
 	int32_t field_204;
-	int32_t field_208[107]; //its all undocumented through here
+	int32_t field_208[428]; //208-8B8   
 	int32_t CombatState;	//I think....
-	int32_t field_8BB; 
+	int32_t field_8BC; 
 	int32_t PatrolPathOSD[10];	//actually another struct. Not needed atm.
 	int32_t PatrolPathPoints[5][64]; //64 of another struct 
@@ -509,18 +510,22 @@
 	int32_t PursuitWeakHigh;
 	int32_t Pursuit5;
-	int32_t field_FC8[16];
+	int32_t field_FC8[4];
 	int32_t AlarmGroups; //a bitset
-	int32_t field_FDC[16]; //FDC-F68
-	int32_t	field_F68;
+	int32_t field_FDC[17]; //FDC-1020
 	int32_t DazeTimer;
-	int32_t field_1024[16]; //1024-1064
+	int32_t field_1024[17]; //1024-1068
 	int32_t MeleePtr; //probably MELE. Looks somewhat important.
 	int32_t field_106C[270]; //106C-14A4 skipping lots of junk and a little pathfinding stuff that we might want later.
+	int32_t MovementMode;
+	int32_t field_14A8;
+	int32_t field_14AC;
 	int32_t MovementModifiers; //hopefully sprinting, pistol, rifle, etc.
 	int32_t field_14B4[101]; //14B4-1648 Glossing over a few other things we don't need having to do with AI direction.
+	BoundingBox BoundingBox_;
+	int32_t field_1660;
 	int32_t BossShieldPower;	//a multiplier? or just a flag? who knows
 	int32_t field_1668[6];
 	int32_t CurrentConsoleActionMarker; //not sure.
-	int32_t field_1684[7]; // done. hopefully i didnt screw this up somewhere.
+	int32_t field_1684[7];
 } Character;
 
@@ -552,4 +557,5 @@
 }; //
 int16_t ONICALL ONrGameState_NewCharacter(CharacterObject* CHAR, void* AISA, void* flag, int* list_location);
+int32_t* ONICALL ONrGetActiveCharacter(void* CharacterPtr);
 //int16_t ONICALL ONrGameState_GetPlayerCharacter();
 
