Smaxx fix to overwriting private sdl's memory
authorunc0rr
Mon, 12 Oct 2009 19:41:17 +0000
changeset 2436 246ef6271470
parent 2435 7afc9edac4cf
child 2437 10e4b5fc0d93
Smaxx fix to overwriting private sdl's memory
hedgewars/uKeys.pas
share/hedgewars/Data/Trainings/003_RCPlane.txt
--- a/hedgewars/uKeys.pas	Mon Oct 12 19:40:01 2009 +0000
+++ b/hedgewars/uKeys.pas	Mon Oct 12 19:41:17 2009 +0000
@@ -58,7 +58,7 @@
 const KeyNumber = 1024;
 type TKeyboardState = array[0..cKeyMaxIndex] of Byte;
 
-var tkbd: TKeyboardState;
+var tkbd, tkbdn: TKeyboardState;
     KeyNames: array [0..cKeyMaxIndex] of string[15];
     DefaultBinds, CurrentBinds: TBinds;
 
@@ -70,14 +70,12 @@
 KeyNameToCode:= Result
 end;
 
-
 procedure ProcessKbd;
 var  i, j, k: LongInt;
+     s: shortstring;
      pkbd: PByteArray;
      Trusted: boolean;
-     s: shortstring;
 begin
-
 hideAmmoMenu:= false;
 Trusted:= (CurrentTeam <> nil)
           and (not CurrentTeam^.ExtDriven)
@@ -86,70 +84,75 @@
 // move cursor/camera
 // TODO: Scale on screen dimensions and/or axis value (game controller)?
 movecursor(5 * CursorMovementX, 5 * CursorMovementY);
+		  
 {$IFDEF SDL13}
-pkbd := SDL_GetKeyboardState(nil);
-i    := SDL_GetMouseState(0, nil, nil);
+pkbd := SDL_GetKeyboardState(@j);
+k    := SDL_GetMouseState(0, nil, nil);
 {$ELSE}
-pkbd := SDL_GetKeyState(nil);
-i    := SDL_GetMouseState(nil, nil);
+pkbd := SDL_GetKeyState(@j);
+k    := SDL_GetMouseState(nil, nil);
 {$ENDIF}
+
+for i:= 6 to pred(j) do // first 6 will be overwritten
+	tkbdn[i]:= pkbd^[i];
+
 // mouse buttons
 {$IFDEF DARWIN}
-pkbd^[1]:= ((i and 1) and not (pkbd^[306] or pkbd^[305]));
-pkbd^[3]:= ((i and 1) and (pkbd^[306] or pkbd^[305])) or (i and 4);
+tkbdn[1]:= ((k and 1) and not (tkbdn[306] or tkbdn[305]));
+tkbdn[3]:= ((k and 1) and (tkbdn[306] or tkbdn[305])) or (k and 4);
 {$ELSE}
-pkbd^[1]:= (i and 1);
-pkbd^[3]:= ((i shr 2) and 1);
+tkbdn[1]:= (k and 1);
+tkbdn[3]:= ((k shr 2) and 1);
 {$ENDIF}
-pkbd^[2]:= ((i shr 1) and 1);
+tkbdn[2]:= ((k shr 1) and 1);
 
 // mouse wheels (see event loop in project file)
-pkbd^[4]:= ord(wheelDown);
-pkbd^[5]:= ord(wheelUp);
+tkbdn[4]:= ord(wheelDown);
+tkbdn[5]:= ord(wheelUp);
 wheelUp:= false;
 wheelDown:= false;
 
 // Controller(s)
-k:= 500; // should we test k for hitting the limit? sounds rather unlikely to ever reach it
+k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it
 for j:= 0 to Pred(ControllerNumControllers) do
 	begin
 	for i:= 0 to Pred(ControllerNumAxes[j]) do
 		begin
-		if ControllerAxes[j][i] > 20000 then pkbd^[k + 0]:= 1 else pkbd^[k + 0]:= 0;
-		if ControllerAxes[j][i] < -20000 then pkbd^[k + 1]:= 1 else pkbd^[k + 1]:= 0;
+		if ControllerAxes[j][i] > 20000 then tkbdn[k + 0]:= 1 else tkbdn[k + 0]:= 0;
+		if ControllerAxes[j][i] < -20000 then tkbdn[k + 1]:= 1 else tkbdn[k + 1]:= 0;
 		inc(k, 2);
 		end;
 	for i:= 0 to Pred(ControllerNumHats[j]) do
 		begin
-		pkbd^[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP;
-		pkbd^[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT;
-		pkbd^[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN;
-		pkbd^[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT;
+		tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP;
+		tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT;
+		tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN;
+		tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT;
 		inc(k, 4);
 		end;
 	for i:= 0 to Pred(ControllerNumButtons[j]) do
 		begin
-		pkbd^[k]:= ControllerButtons[j][i];
+		tkbdn[k]:= ControllerButtons[j][i];
 		inc(k, 1);
 		end;
 	end;
 
 // now process strokes
-for i:= 1 to cKeyMaxIndex do
+for i:= 0 to cKeyMaxIndex do
 if CurrentBinds[i][0] <> #0 then
 	begin
-	if (i > 3) and (pkbd^[i] <> 0) and not (hideAmmoMenu or (CurrentBinds[i] = 'put') or (CurrentBinds[i] = 'ammomenu') or (CurrentBinds[i] = '+cur_u') or (CurrentBinds[i] = '+cur_d') or (CurrentBinds[i] = '+cur_l') or (CurrentBinds[i] = '+cur_r')) then hideAmmoMenu:= true;
-	if (tkbd[i] = 0) and (pkbd^[i] <> 0) then ParseCommand(CurrentBinds[i], Trusted)
+	if (i > 3) and (tkbdn[i] <> 0) and not ((CurrentBinds[i] = 'put') or (CurrentBinds[i] = 'ammomenu') or (CurrentBinds[i] = '+cur_u') or (CurrentBinds[i] = '+cur_d') or (CurrentBinds[i] = '+cur_l') or (CurrentBinds[i] = '+cur_r')) then hideAmmoMenu:= true;
+	if (tkbd[i] = 0) and (tkbdn[i] <> 0) then ParseCommand(CurrentBinds[i], Trusted)
 	else if (CurrentBinds[i][1] = '+')
-			and (pkbd^[i] = 0)
+			and (tkbdn[i] = 0)
 			and (tkbd[i] <> 0) then
 			begin
 			s:= CurrentBinds[i];
 			s[1]:= '-';
 			ParseCommand(s, Trusted)
 			end;
-	tkbd[i]:= pkbd^[i]
-	end;
+	tkbd[i]:= tkbdn[i]
+	end
 end;
 
 procedure ResetKbd;
@@ -158,38 +161,60 @@
 begin
 
 {$IFDEF SDL13}
-pkbd:= PByteArray(SDL_GetKeyboardState(@i));
+pkbd:= SDL_GetKeyboardState(@j);
+k    := SDL_GetMouseState(0, nil, nil);
 {$ELSE}
-pkbd:= PByteArray(SDL_GetKeyState(@i));
+pkbd:= SDL_GetKeyState(@j);
+k    := SDL_GetMouseState(nil, nil);
 {$ENDIF}
-TryDo(i < cKeyMaxIndex, 'SDL keys number is more than expected (' + inttostr(i) + ')', true);
+TryDo(j < cKeyMaxIndex, 'SDL keys number is more than expected (' + inttostr(j) + ')', true);
+
+for i:= 1 to pred(j) do
+	tkbdn[i]:= pkbd^[i];
 
-k:= 500;
+// mouse buttons
+{$IFDEF DARWIN}
+tkbdn[1]:= ((k and 1) and not (tkbdn[306] or tkbdn[305]));
+tkbdn[3]:= ((k and 1) and (tkbdn[306] or tkbdn[305])) or (k and 4);
+{$ELSE}
+tkbdn[1]:= (k and 1);
+tkbdn[3]:= ((k shr 2) and 1);
+{$ENDIF}
+tkbdn[2]:= ((k shr 1) and 1);
+
+// mouse wheels (see event loop in project file)
+tkbdn[4]:= ord(wheelDown);
+tkbdn[5]:= ord(wheelUp);
+wheelUp:= false;
+wheelDown:= false;
+
+// Controller(s)
+k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it
 for j:= 0 to Pred(ControllerNumControllers) do
 	begin
 	for i:= 0 to Pred(ControllerNumAxes[j]) do
 		begin
-		pkbd^[k + 0]:= 0;
-		pkbd^[k + 1]:= 0;
+		if ControllerAxes[j][i] > 20000 then tkbdn[k + 0]:= 1 else tkbdn[k + 0]:= 0;
+		if ControllerAxes[j][i] < -20000 then tkbdn[k + 1]:= 1 else tkbdn[k + 1]:= 0;
 		inc(k, 2);
 		end;
 	for i:= 0 to Pred(ControllerNumHats[j]) do
 		begin
-		pkbd^[k + 0]:= 0;
-		pkbd^[k + 1]:= 0;
-		pkbd^[k + 2]:= 0;
-		pkbd^[k + 3]:= 0;
+		tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP;
+		tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT;
+		tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN;
+		tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT;
 		inc(k, 4);
 		end;
 	for i:= 0 to Pred(ControllerNumButtons[j]) do
 		begin
-		pkbd^[k]:= 0;
+		tkbdn[k]:= ControllerButtons[j][i];
 		inc(k, 1);
 		end;
 	end;
-
-for t:= 0 to Pred(i) do
-    tkbd[i]:= pkbd^[i]
+	
+for t:= 0 to cKeyMaxIndex do
+    tkbd[i]:= tkbdn[i]
 end;
 
 procedure InitKbdKeyTable;
@@ -214,8 +239,14 @@
        end;
     end;
 
+{$IFDEF SDL13}
+PByteArray(SDL_GetKeyboardState(@i);
+{$ELSE}
+SDL_GetKeyState(@i);
+{$ENDIF}
+
 // Controller(s)
-k:= 500;
+k:= i;
 for j:= 0 to Pred(ControllerNumControllers) do
 	begin
 	for i:= 0 to Pred(ControllerNumAxes[j]) do
--- a/share/hedgewars/Data/Trainings/003_RCPlane.txt	Mon Oct 12 19:40:01 2009 +0000
+++ b/share/hedgewars/Data/Trainings/003_RCPlane.txt	Mon Oct 12 19:41:17 2009 +0000
@@ -7,6 +7,6 @@
 $delay 0
 map EarthRise
 theme EarthRise
-ammstore 000000000000000000000000000000100000000000000000000000000000000000000000000000
+ammstore 000000100000000000000000000000100000000000000000000000000000000000000000000000
 addtrig C7 1 1
-addtrig F2147483649 2 1
\ No newline at end of file
+addtrig F2147483649 2 1