DEADSOFTWARE

Revert "fixed flawed "weapon switch key release" detection logic (flags should change...
authorKetmar Dark <ketmar@ketmar.no-ip.org>
Sun, 30 Sep 2018 14:48:38 +0000 (17:48 +0300)
committerKetmar Dark <ketmar@ketmar.no-ip.org>
Sun, 30 Sep 2018 14:51:27 +0000 (17:51 +0300)
src/game/g_game.pas
src/game/g_player.pas

index f92af351077aaa34fee47dc16dbb0d6eb9a1056f..de729fae42e2b139d809d3e451dccd8c7afee1b2 100644 (file)
@@ -1515,6 +1515,7 @@ var
   time: Word;
   strafeDir: Byte;
   i: Integer;
   time: Word;
   strafeDir: Byte;
   i: Integer;
+  rwk: Boolean;
 begin
   if (plr = nil) then exit;
   if (p2hack) then time := 1000 else time := 1;
 begin
   if (plr = nil) then exit;
   if (p2hack) then time := 1000 else time := 1;
@@ -1553,24 +1554,41 @@ begin
     // fix movebutton state
     MoveButton := MoveButton or (strafeDir shl 4);
 
     // fix movebutton state
     MoveButton := MoveButton or (strafeDir shl 4);
 
-    plr.weaponSwitchKeysStateChange(-1, isKeyPressed(KeyNextWeapon, KeyNextWeapon2));
-    plr.weaponSwitchKeysStateChange(-2, isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2));
-
     // Îñòàëüíûå êëàâèøè:
     if isKeyPressed(KeyJump, KeyJump2) then plr.PressKey(KEY_JUMP, time);
     if isKeyPressed(KeyUp, KeyUp2) then plr.PressKey(KEY_UP, time);
     if isKeyPressed(KeyDown, KeyDown2) then plr.PressKey(KEY_DOWN, time);
     if isKeyPressed(KeyFire, KeyFire2) then plr.PressKey(KEY_FIRE);
     // Îñòàëüíûå êëàâèøè:
     if isKeyPressed(KeyJump, KeyJump2) then plr.PressKey(KEY_JUMP, time);
     if isKeyPressed(KeyUp, KeyUp2) then plr.PressKey(KEY_UP, time);
     if isKeyPressed(KeyDown, KeyDown2) then plr.PressKey(KEY_DOWN, time);
     if isKeyPressed(KeyFire, KeyFire2) then plr.PressKey(KEY_FIRE);
-    if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) and plr.isWeaponSwitchKeyReleased(-1) then plr.PressKey(KEY_NEXTWEAPON);
-    if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) and plr.isWeaponSwitchKeyReleased(-2) then plr.PressKey(KEY_PREVWEAPON);
+    if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) then
+    begin
+      rwk := plr.isWeaponSwitchKeyReleased(-1);
+      if rwk then plr.PressKey(KEY_NEXTWEAPON);
+      plr.weaponSwitchKeysStateChange(-1, true);
+    end
+    else
+    begin
+      plr.weaponSwitchKeysStateChange(-1, false);
+    end;
+    if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then
+    begin
+      rwk := plr.isWeaponSwitchKeyReleased(-2);
+      if rwk then plr.PressKey(KEY_PREVWEAPON);
+      plr.weaponSwitchKeysStateChange(-2, true);
+    end
+    else
+    begin
+      plr.weaponSwitchKeysStateChange(-2, false);
+    end;
     if isKeyPressed(KeyOpen, KeyOpen2) then plr.PressKey(KEY_OPEN);
 
     for i := 0 to High(KeyWeapon) do
     begin
       if isKeyPressed(KeyWeapon[i], KeyWeapon2[i]) then
       begin
     if isKeyPressed(KeyOpen, KeyOpen2) then plr.PressKey(KEY_OPEN);
 
     for i := 0 to High(KeyWeapon) do
     begin
       if isKeyPressed(KeyWeapon[i], KeyWeapon2[i]) then
       begin
+        rwk := plr.isWeaponSwitchKeyReleased(i);
+        //writeln('rwk:', rwk);
         plr.weaponSwitchKeysStateChange(i, true);
         plr.weaponSwitchKeysStateChange(i, true);
-        if plr.isWeaponSwitchKeyReleased(i) then plr.QueueWeaponSwitch(i); // all choices are passed there, and god will take the best
+        if rwk then plr.QueueWeaponSwitch(i); // all choices are passed there, and god will take the best
       end
       else
       begin
       end
       else
       begin
@@ -1579,8 +1597,6 @@ begin
     end;
   end;
 
     end;
   end;
 
-  plr.weaponSwitchKeysShiftNewStates();
-
   // HACK: add dynlight here
   if gwin_k8_enable_light_experiments then
   begin
   // HACK: add dynlight here
   if gwin_k8_enable_light_experiments then
   begin
index 4604b3c95f5a1f9ed2250ebed552b4e5ffc53f23..fa2dcfce5243696c55b09cc25aee27d9c44229f9 100644 (file)
@@ -201,7 +201,7 @@ type
     mEDamageType: Integer;
 
     // client-side only
     mEDamageType: Integer;
 
     // client-side only
-    weaponSwitchKeyReleased: array[0..16] of Byte; // bit 0: was released on prev frame; bit 1: new status
+    weaponSwitchKeyReleased: array[0..16] of Boolean; // true: was release
 
 
     function CollideLevel(XInc, YInc: Integer): Boolean;
 
 
     function CollideLevel(XInc, YInc: Integer): Boolean;
@@ -339,7 +339,6 @@ type
     procedure releaseAllWeaponSwitchKeys ();
     procedure weaponSwitchKeysStateChange (index: Integer; pressed: Boolean);
     function isWeaponSwitchKeyReleased (index: Integer): Boolean;
     procedure releaseAllWeaponSwitchKeys ();
     procedure weaponSwitchKeysStateChange (index: Integer; pressed: Boolean);
     function isWeaponSwitchKeyReleased (index: Integer): Boolean;
-    procedure weaponSwitchKeysShiftNewStates ();
 
   public
     property    Vel: TPoint2i read FObj.Vel;
 
   public
     property    Vel: TPoint2i read FObj.Vel;
@@ -2144,15 +2143,14 @@ procedure TPlayer.releaseAllWeaponSwitchKeys ();
 var
   f: Integer;
 begin
 var
   f: Integer;
 begin
-  for f := 0 to High(weaponSwitchKeyReleased) do weaponSwitchKeyReleased[f] := $03;
+  for f := 0 to High(weaponSwitchKeyReleased) do weaponSwitchKeyReleased[f] := true;
 end;
 
 procedure TPlayer.weaponSwitchKeysStateChange (index: Integer; pressed: Boolean);
 begin
   Inc(index, 2); // -2: prev; -1: next
   if (index < 0) or (index > High(weaponSwitchKeyReleased)) then exit;
 end;
 
 procedure TPlayer.weaponSwitchKeysStateChange (index: Integer; pressed: Boolean);
 begin
   Inc(index, 2); // -2: prev; -1: next
   if (index < 0) or (index > High(weaponSwitchKeyReleased)) then exit;
-  weaponSwitchKeyReleased[index] := weaponSwitchKeyReleased[index] or $02;
-  if (pressed) then weaponSwitchKeyReleased[index] := weaponSwitchKeyReleased[index] xor $02;
+  weaponSwitchKeyReleased[index] := not pressed;
 end;
 
 function TPlayer.isWeaponSwitchKeyReleased (index: Integer): Boolean;
 end;
 
 function TPlayer.isWeaponSwitchKeyReleased (index: Integer): Boolean;
@@ -2164,20 +2162,7 @@ begin
   end
   else
   begin
   end
   else
   begin
-    result := (weaponSwitchKeyReleased[index] and $01) <> 0;
-  end;
-end;
-
-procedure TPlayer.weaponSwitchKeysShiftNewStates ();
-var
-  f: Integer;
-begin
-  // copy bit 1 to bit 0
-  for f := 0 to High(weaponSwitchKeyReleased) do
-  begin
-    weaponSwitchKeyReleased[f] :=
-      (weaponSwitchKeyReleased[f] and $02) or
-      ((weaponSwitchKeyReleased[f] shr 1) and $01);
+    result := weaponSwitchKeyReleased[index];
   end;
 end;
 
   end;
 end;