DEADSOFTWARE

fixed bug with weapon cycling direction
[d2df-sdl.git] / src / game / g_player.pas
index e90398276756262f8eb5272e2015fae609deae20..bfba263a40cf6fb9dbd08781f419d92a7b0b1f9d 100644 (file)
@@ -1271,8 +1271,11 @@ begin
 
   for i := 0 to High(gPlayers) do
     if gPlayers[i] <> nil then
+    begin
+      gPlayers[i].RealizeCurrentWeapon();
       if gPlayers[i] is TPlayer then gPlayers[i].Update()
       else TBot(gPlayers[i]).Update();
+    end;
 end;
 
 procedure g_Player_DrawAll();
@@ -3303,17 +3306,6 @@ begin
   result := 255; // default result: "no switch"
   for i := 0 to High(wantThisWeapon) do wantThisWeapon[i] := false;
   for i := 0 to High(FWeapon) do if (FNextWeap and (1 shl i)) <> 0 then begin wantThisWeapon[i] := true; Inc(wwc); end;
-  (*
-  if wantThisWeapon[FCurrWeap] then
-  begin
-    // these hacks implements alternating between SG and SSG; sorry
-    if FCurrWeap = WEAPON_SHOTGUN1 then begin wantThisWeapon[WEAPON_SHOTGUN2] := true; Inc(wwc); end;
-    if FCurrWeap = WEAPON_SHOTGUN2 then begin wantThisWeapon[WEAPON_SHOTGUN1] := true; Inc(wwc); end;
-    // these hacks implements alternating between knuckles and chainsaw; sorry
-    if FCurrWeap = WEAPON_KASTET then begin wantThisWeapon[WEAPON_SAW] := true; Inc(wwc); end;
-    if FCurrWeap = WEAPON_SAW then begin wantThisWeapon[WEAPON_KASTET] := true; Inc(wwc); end;
-  end;
-  *)
   // exclude currently selected weapon from the set
   wantThisWeapon[FCurrWeap] := false;
   // slow down alterations a little
@@ -3323,6 +3315,8 @@ begin
     if FNextWeapDelay > 0 then begin FNextWeap := 0; exit; end; // yeah
   end;
   // do not reset weapon queue, it will be done in `RealizeCurrentWeapon()`
+  if wwc < 1 then begin resetWeaponQueue(); exit; end;
+  //e_WriteLog(Format('wwc=%d', [wwc]), MSG_WARNING);
   // try weapons in descending order
   for i := High(FWeapon) downto 0 do
   begin
@@ -3333,6 +3327,8 @@ begin
       exit;
     end;
   end;
+  // no suitable weapon found, so reset the queue, to avoid accidental "queuing" of weapon w/o ammo
+  resetWeaponQueue();
 end;
 
 procedure TPlayer.RealizeCurrentWeapon();
@@ -3366,13 +3362,11 @@ procedure TPlayer.cycleWeapon (dir: Integer);
 var
   i, cwi: Integer;
 begin
-  if dir < 0 then dir := 1 else if dir > 0 then dir := 1 else exit;
+  if dir < 0 then dir := -1 else if dir > 0 then dir := 1 else exit;
   cwi := FCurrWeap;
   for i := 0 to High(FWeapon) do
   begin
-    cwi := cwi+dir;
-         if cwi < 0 then cwi += length(FWeapon)
-    else if cwi > High(FWeapon) then cwi := cwi-length(FWeapon);
+    cwi := (cwi+length(FWeapon)+dir) mod length(FWeapon);
     if FWeapon[cwi] then
     begin
       QueueWeaponSwitch(Byte(cwi));
@@ -5656,6 +5650,20 @@ begin
         FJetFuel := JET_MAX;
       end;
 
+    ITEM_MEDKIT_SMALL: if FHealth < PLAYER_HP_SOFT then IncMax(FHealth, 10, PLAYER_HP_SOFT);
+    ITEM_MEDKIT_LARGE: if FHealth < PLAYER_HP_SOFT then IncMax(FHealth, 25, PLAYER_HP_SOFT);
+
+    ITEM_ARMOR_GREEN: if FArmor < PLAYER_AP_SOFT then FArmor := PLAYER_AP_SOFT;
+    ITEM_ARMOR_BLUE: if FArmor < PLAYER_AP_LIMIT then FArmor := PLAYER_AP_LIMIT;
+
+    ITEM_SPHERE_BLUE: if FHealth < PLAYER_HP_LIMIT then IncMax(FHealth, 100, PLAYER_HP_LIMIT);
+    ITEM_SPHERE_WHITE:
+      if (FHealth < PLAYER_HP_LIMIT) or (FArmor < PLAYER_AP_LIMIT) then
+      begin
+        if FHealth < PLAYER_HP_LIMIT then FHealth := PLAYER_HP_LIMIT;
+        if FArmor < PLAYER_AP_LIMIT then FArmor := PLAYER_AP_LIMIT;
+      end;
+
     ITEM_WEAPON_SAW: FWeapon[WEAPON_SAW] := True;
     ITEM_WEAPON_SHOTGUN1: FWeapon[WEAPON_SHOTGUN1] := True;
     ITEM_WEAPON_SHOTGUN2: FWeapon[WEAPON_SHOTGUN2] := True;