Index: /Daodan/src/Oni/GameState.h
===================================================================
--- /Daodan/src/Oni/GameState.h	(revision 1160)
+++ /Daodan/src/Oni/GameState.h	(revision 1161)
@@ -305,11 +305,6 @@
 	Action_PlayRecord                = 0x1000,
 	Action_F12                       = 0x2000,
-	Action_Unknown1                  = 0x4000,
 	Action_LookMode                  = 0x8000,
 	Action_Screenshot                = 0x10000,
-	Action_Unknown2                  = 0x20000,
-	Action_Unknown3                  = 0x40000,
-	Action_Unknown4                  = 0x80000,
-	Action_Unknown5                  = 0x100000,
 	Action_Forward                   = 0x200000,
 	Action_Backward                  = 0x400000,
@@ -323,32 +318,24 @@
 	Action_Kick                      = 0x40000000,
 	Action_Block                     = 0x80000000,
-	//used in second action field
-	Action2_Walk                     = 1,
-	Action2_Action                   = 2,
-	Action2_Hypo                     = 4,
-	Action2_Reload                   = 8,
-	Action2_Swap                     = 0x10,
-	Action2_Drop                     = 0x20,
-	Action2_Fire1                    = 0x40,
-	Action2_Fire2                    = 0x80,
-	Action2_Fire3                    = 0x100,
+	Action_Walk                      = 0x100000000ull,
+	Action_Action                    = 0x200000000ull,
+	Action_Hypo                      = 0x400000000ull,
+	Action_Reload                    = 0x800000000ull,
+	Action_Swap                      = 0x1000000000ull,
+	Action_Drop                      = 0x2000000000ull,
+	Action_Fire1                     = 0x4000000000ull,
+	Action_Fire2                     = 0x8000000000ull,
+	Action_Fire3                     = 0x10000000000ull,
 };
-
-
-typedef struct {
-	int32_t Actions1;
-	int32_t Actions2;
-} InputAction;
-
 
 typedef struct {
 	float MouseDeltaX;
 	float MouseDeltaY;
-	float field_8;
-	float field_C;
-	InputAction Current;
-	InputAction Stopped;
-	InputAction Start;
-	InputAction Stop;
+	float unknown1;
+	int unknown2;
+	uint64_t ActionsDown;
+	uint64_t ActionsUp;
+	uint64_t ActionsPressed;
+	uint64_t ActionsReleased;
 } GameInput;
 
Index: /Daodan/src/Patches/BSL.c
===================================================================
--- /Daodan/src/Patches/BSL.c	(revision 1160)
+++ /Daodan/src/Patches/BSL.c	(revision 1161)
@@ -431,8 +431,8 @@
 typedef struct {
 char Name[16];
-int Bit;
+uint64_t Bit;
 } KeyBit;
 
-KeyBit Actions1[32] = {
+static KeyBit Actions[] = {
 	{"Escape", Action_Escape},
 	{"Console", Action_Console},
@@ -445,15 +445,10 @@
 	{"F7", Action_F7                        },
 	{"F8", Action_F8                        },
-	{"StartRecord", Action_StartRecord        },       
-	{"StopRecord", Action_StopRecord            },    
-	{"PlayRecord", Action_PlayRecord              },  
+	{"StartRecord", Action_StartRecord        },
+	{"StopRecord", Action_StopRecord            },
+	{"PlayRecord", Action_PlayRecord              },
 	{"F12", Action_F12                       },
-	{"Unknown1", Action_Unknown1               },  
 	{"LookMode", Action_LookMode           },
-	{"Screenshot", Action_Screenshot         },     
-	{"Unknown2", Action_Unknown2              },
-	{"Unknown3", Action_Unknown3              },   
-	{"Unknown4", Action_Unknown4                },
-	{"Unknown5", Action_Unknown5                },
+	{"Screenshot", Action_Screenshot         },
 	{"Forward", Action_Forward                 },
 	{"Backward", Action_Backward                },
@@ -466,18 +461,16 @@
 	{"Punch",Action_Punch                   },
 	{"Kick", Action_Kick                    },
-	{"Block", Action_Block                   }
+	{"Block", Action_Block                   },
+	{"Walk", Action_Walk},
+	{"Action", Action_Action},
+	{"Hypo", Action_Hypo},
+	{"Reload", Action_Reload                },
+	{"Swap", Action_Swap                },
+	{"Drop", Action_Drop                     },
+	{"Fire1", Action_Fire1                       },
+	{"Fire2", Action_Fire2                       },
+	{"Fire3", Action_Fire3                       }
 };
 
-KeyBit Actions2[9] = {
-	{"Walk", Action2_Walk},
-	{"Action", Action2_Action},
-	{"Hypo", Action2_Hypo},
-	{"Reload", Action2_Reload                },
-	{"Swap", Action2_Swap                },
-	{"Drop", Action2_Drop                     },
-	{"Fire1", Action2_Fire1                       },
-	{"Fire2", Action2_Fire2                       },
-	{"Fire3", Action2_Fire3                       }
-};
 uint16_t ONICALL bsl_holdkey(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
 {
@@ -485,6 +478,5 @@
 	uint32_t i = 2;
 	uint32_t j = 0;
-	int Input1 = 0;
-	int Input2 = 0;
+	uint64_t Input = 0;
 	Character* Chr;
 	ActiveCharacter* Active;
@@ -498,17 +490,11 @@
 	for(i = 1; i < numargs - 1; i++) {
 		for(j = 0; j < 32; j++) {
-			if(!strcmp(args[i].val.value_str32, Actions1[j].Name)) {
-				Input1 = Input1 | Actions1[j].Bit;
+			if(!strcmp(args[i].val.value_str32, Actions[j].Name)) {
+				Input = Input | Actions[j].Bit;
 			}
 		}
-		for(j = 0; j < 9; j++) {
-			if(!strcmp(args[i].val.value_str32, Actions2[j].Name)) { 
-				Input2 = Input2 | Actions2[j].Bit;
-			}
-		}
-	}
-	Active->Input.Current.Actions1 = Active->Input.Current.Actions1 | Input1;
-	Active->Input.Current.Actions2 = Active->Input.Current.Actions2 | Input2;
-	if( Input1 + Input2 == 0 ) {
+	}
+	Active->Input.ActionsDown = Active->Input.ActionsDown | Input;
+	if( Input == 0 ) {
 		DDrConsole_PrintF("Func \"%s\", File \"%s\", Line %d: semantic error, \"%s\": No valid keys given.", callinfo->name, callinfo->calllocation, callinfo->linenumber, callinfo->name);
 		return 0;
@@ -537,18 +523,13 @@
 	uint32_t i = 2;
 	uint32_t j = 0;
-	int Input1 = 0;
-	int Input2 = 0;
+	uint64_t Input = 0;
 	for(i = 0; i < numargs; i++) {
 		for(j = 0; j < 32; j++) {
 			//DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].val.value_str32, Actions1[j].Name, Actions1[j].Bit);
-			if(!strcmp(args[i].val.value_str32, Actions1[j].Name)) {
-				Input1 = Input1 | Actions1[j].Bit;
+			if(!strcmp(args[i].val.value_str32, Actions[j].Name)) {
+				Input = Input | Actions[j].Bit;
 				//DDrConsole_PrintF("Success!");
 			}
-			
-		}
-		for(j = 0; j < 9; j++) {
-			if(!strcmp(args[i].val.value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
-	
+
 		}
 		}
@@ -556,5 +537,5 @@
 	ret->val.value_int32 = 0;
 	ret->type = sl_int32;
-	if ( (ONgGameState->Input.Current.Actions1 == Input1)  && (ONgGameState->Input.Current.Actions2 == Input2)) ret->val.value_int32 = 1;
+	if (ONgGameState->Input.ActionsDown == Input) ret->val.value_int32 = 1;
 	return 0;
 }
@@ -573,6 +554,5 @@
 	int i = 2;
 	int j = 0;
-	int Input1 = 0;
-	int Input2 = 0;
+	uint64_t Input = 0;
 /*
 	numargs = 0;
@@ -589,20 +569,13 @@
 		for(j = 0; j < 32; j++) {
 			//DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].val.value_str32, Actions1[j].Name, Actions1[j].Bit);
-			if(!strcmp(args[i].val.value_str32, Actions1[j].Name)) {
-				Input1 = Input1 | Actions1[j].Bit;
+			if(!strcmp(args[i].val.value_str32, Actions[j].Name)) {
+				Input = Input | Actions[j].Bit;
 				//DDrConsole_PrintF("Success!");
 			}
-			
-		}
-		for(j = 0; j < 9; j++) {
-			if(!strcmp(args[i].val.value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
-	
+
 		}
 	//	}
 	DDrConsole_PrintF("Waiting...");
-	if ( 
-		(( ONgGameState->Input.Current.Actions1 & Input1) == Input1)  && 
-		(( ONgGameState->Input.Current.Actions2 & Input2) == Input2) 
-	)
+	if (( ONgGameState->Input.ActionsDown & Input) == Input)
 	{
 	DDrConsole_PrintF("Found key!");
Index: /Daodan/src/Patches/Utility.c
===================================================================
--- /Daodan/src/Patches/Utility.c	(revision 1160)
+++ /Daodan/src/Patches/Utility.c	(revision 1161)
@@ -122,5 +122,5 @@
 	COtTextArea* cons = *(COtTextArea**)0x00571B74;
 	char* clipboardText = 0;
-	if(ONgGameState->Input.Current.Actions1 & Action_Console && GetKeyState(0x56) & 0x80 && GetKeyState(VK_CONTROL) & 0x80 )
+	if(ONgGameState->Input.ActionsDown & Action_Console && GetKeyState(0x56) & 0x80 && GetKeyState(VK_CONTROL) & 0x80 )
 	{
 		if(cons && cons->text_entries && cons->num_text_entries)
