DEADSOFTWARE

Revert "fixed flawed "weapon switch key release" detection logic (flags should change...
[d2df-sdl.git] / src / game / g_player.pas
index f4e571549d3a43a2b5cf0a360eaa8f596640a224..fa2dcfce5243696c55b09cc25aee27d9c44229f9 100644 (file)
@@ -201,7 +201,7 @@ type
     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;
@@ -339,7 +339,6 @@ type
     procedure releaseAllWeaponSwitchKeys ();
     procedure weaponSwitchKeysStateChange (index: Integer; pressed: Boolean);
     function isWeaponSwitchKeyReleased (index: Integer): Boolean;
-    procedure weaponSwitchKeysShiftNewStates ();
 
   public
     property    Vel: TPoint2i read FObj.Vel;
@@ -2144,15 +2143,14 @@ procedure TPlayer.releaseAllWeaponSwitchKeys ();
 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;
-  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;
@@ -2164,20 +2162,7 @@ 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;
 
@@ -3722,13 +3707,21 @@ begin
   // no cycling
   for i := 0 to High(wantThisWeapon) do wantThisWeapon[i] := false;
   wwc := 0;
+
+  curlidx := -1; // start from a weapon with a highest priority (-1, 'cause loop will immediately increment this index)
+
   for i := 0 to High(FWeapon) do
   begin
     if (FNextWeap and (1 shl i)) <> 0 then
     begin
       cwi := real2log(i);
-      if (cwi >= 0) then wantThisWeapon[cwi] := true;
-      Inc(wwc);
+      if (cwi >= 0) then
+      begin
+        wantThisWeapon[cwi] := true;
+        Inc(wwc);
+        // if we hit currently selected weapon, start seachring from it, so we'll get "next weaker" weapon
+        if (i = FCurrWeap) then curlidx := cwi; // compare real, start from logical
+      end;
     end;
   end;
 
@@ -3752,12 +3745,7 @@ begin
     exit;
   end;
 
-  // exclude currently selected weapon from the set
-  curlidx := real2log(FCurrWeap);
   //e_WriteLog(Format('*** wwc=%d; currweap=%d; logweap=%d', [wwc, FCurrWeap, curlidx]), TMsgType.Warning);
-  //e_WriteLog(Format('FCurrWeap=%d; curlidx=%d', [FCurrWeap, curlidx]), TMsgType.Warning);
-  //if (curlidx >= 0) then wantThisWeapon[curlidx] := false;
-  //if (wwc = 2) then begin Dec(wwc); end; // easy case: switch between two weapons
 
   // find next weapon to switch onto
   cwi := curlidx;
@@ -4227,6 +4215,7 @@ begin
           Result := True;
           remove := True;
           FFireTime := 0;
+          //k8:do we need it? if g_Game_IsNet and g_Game_IsServer then MH_SEND_PlayerStats(FUID);
         end;
         if FHealth < PLAYER_HP_SOFT then
         begin