DEADSOFTWARE

Revert "weapon order fix (supermini comes first now)"
[d2df-sdl.git] / src / game / g_player.pas
index c65d7206064025f82998691f1ada73203f575c7a..7a500ceb6bf735a9baed1f1d4f6cef2df52544cb 100644 (file)
@@ -310,6 +310,7 @@ type
     procedure   DrawPickup();
     procedure   DrawRulez();
     procedure   DrawAim();
+    procedure   DrawIndicator();
     procedure   DrawBubble();
     procedure   DrawGUI();
     procedure   Update(); virtual;
@@ -542,6 +543,7 @@ var
   gFly: Boolean = False;
   gAimLine: Boolean = False;
   gChatBubble: Byte = 0;
+  gPlayerIndicator: Boolean = True;
   gNumBots: Word = 0;
   gLMSPID1: Word = 0;
   gLMSPID2: Word = 0;
@@ -1512,11 +1514,20 @@ end;
 
 procedure g_Player_CreateCorpse(Player: TPlayer);
 var
+  i: Integer;
   find_id: DWORD;
   ok: Boolean;
 begin
   if Player.alive then
     Exit;
+
+// Ðàçðûâàåì ñâÿçü ñ ïðåæíèì òðóïîì:
+  if gCorpses <> nil then
+    for i := 0 to High(gCorpses) do
+      if gCorpses[i] <> nil then
+        if gCorpses[i].FPlayerUID = Player.FUID then
+          gCorpses[i].FPlayerUID := 0;
+
   if Player.FObj.Y >= gMapInfo.Height+128 then
     Exit;
 
@@ -1602,11 +1613,13 @@ procedure g_Player_CreateGibs(fX, fY: Integer; ModelName: string; fColor: TRGB);
 var
   a: Integer;
   GibsArray: TGibsArray;
+  Blood: TModelBlood;
 begin
   if (gGibs = nil) or (Length(gGibs) = 0) then
     Exit;
   if not g_PlayerModel_GetGibs(ModelName, GibsArray) then
     Exit;
+  Blood := g_PlayerModel_GetBlood(ModelName);
 
   for a := 0 to High(GibsArray) do
     with gGibs[CurrentGib] do
@@ -1625,7 +1638,7 @@ begin
 
       if gBloodCount > 0 then
         g_GFX_Blood(fX, fY, 16*gBloodCount+Random(5*gBloodCount), -16+Random(33), -16+Random(33),
-                    Random(48), Random(48), 150, 0, 0);
+                    Random(48), Random(48), Blood.R, Blood.G, Blood.B, Blood.Kind);
 
       if CurrentGib >= High(gGibs) then
         CurrentGib := 0
@@ -2262,6 +2275,25 @@ begin
   inherited;
 end;
 
+procedure TPlayer.DrawIndicator();
+var
+  indX, indY: Integer;
+  indW, indH: Word;
+  ID: DWORD;
+begin
+  if FAlive then
+    begin
+      indX := FObj.X+FObj.Rect.X;
+      indY := FObj.Y - 12;
+      if g_Texture_Get('TEXTURE_PLAYER_INDICATOR', ID) then
+        begin
+          e_GetTextureSize(ID, @indW, @indH);
+          e_Draw(ID, indX + indW div 2, indY, 0, True, False);
+        end;
+    end;
+  //e_TextureFontPrint(indX, indY, FName, gStdFont); // Shows player name overhead
+end;
+
 procedure TPlayer.DrawBubble();
 var
   bubX, bubY: Integer;
@@ -3509,11 +3541,11 @@ begin
   g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)+8,
               FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
               Count div 2, 3, -1, 16, (PLAYER_RECT.Height*2 div 3),
-              150, 0, 0);
+              FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind);
   g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2)-8,
               FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
               Count div 2, -3, -1, 16, (PLAYER_RECT.Height*2) div 3,
-              150, 0, 0);
+              FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind);
 end;
 
 procedure TPlayer.MakeBloodVector(Count: Word; VelX, VelY: Integer);
@@ -3521,7 +3553,7 @@ begin
   g_GFX_Blood(FObj.X+PLAYER_RECT.X+(PLAYER_RECT.Width div 2),
               FObj.Y+PLAYER_RECT.Y+(PLAYER_RECT.Height div 2),
               Count, VelX, VelY, 16, (PLAYER_RECT.Height*2) div 3,
-              150, 0, 0);
+              FModel.Blood.R, FModel.Blood.G, FModel.Blood.B, FModel.Blood.Kind);
 end;
 
 procedure TPlayer.QueueWeaponSwitch(Weapon: Byte);
@@ -3556,9 +3588,9 @@ function TPlayer.getNextWeaponIndex (): Byte;
 var
   i: Word;
   wantThisWeapon: array[0..64] of Boolean;
-  weaponOrder: array[0..64] of Integer; // value: index in `FWeapon`
-  wwc: Integer = 0; //HACK!
-  dir, cwi, rwidx, curlidx: Integer;
+  weaponOrder: array[0..16] of Integer; // value: index in `FWeapon`
+  wwc: Integer;
+  f, dir, cwi, rwidx, curlidx: Integer;
 
   function real2log (ridx: Integer): Integer;
   var
@@ -3566,7 +3598,7 @@ var
   begin
     if (ridx >= 0) then
     begin
-      for f := 0 to 10 do if (weaponOrder[f] = ridx) then begin result := f; exit; end;
+      for f := 0 to High(weaponOrder) do if (weaponOrder[f] = ridx) then begin result := f; exit; end;
     end;
     result := -1;
   end;
@@ -3581,22 +3613,39 @@ begin
     FNextWeapDelay := 0;
   end;
 
+  for f := 0 to High(weaponOrder) do weaponOrder[f] := -1;
+
   // build weapon order (k8: i know, i know, learn how to do constants and such... gtfo, please!)
+  // two knuckles are for "normal" and "berserk" (see `if` below -- it removes the one that is not needed)
   // priorities:
-  //   bfg, plasma, flamethrower, ssg, minigun, sg, pistol, berserk, chainsaw, fist
+  //   bfg, launcher, plasma, flamethrower, ssg, minigun, sg, pistol, berserk, chainsaw, fist
   weaponOrder[0] := WEAPON_BFG;
-  weaponOrder[1] := WEAPON_PLASMA;
-  weaponOrder[2] := WEAPON_FLAMETHROWER;
-  weaponOrder[3] := WEAPON_SHOTGUN2;
-  weaponOrder[4] := WEAPON_CHAINGUN;
-  weaponOrder[5] := WEAPON_SHOTGUN1;
-  weaponOrder[6] := WEAPON_PISTOL;
-  weaponOrder[7] := WEAPON_KASTET;
-  weaponOrder[8] := WEAPON_SAW;
-  weaponOrder[9] := WEAPON_KASTET;
-  weaponOrder[10] := WEAPON_SUPERPULEMET;
-
-  if (R_BERSERK in FRulez) then weaponOrder[9] := -1 else weaponOrder[7] := -1;
+  weaponOrder[1] := WEAPON_ROCKETLAUNCHER;
+  weaponOrder[2] := WEAPON_PLASMA;
+  weaponOrder[3] := WEAPON_FLAMETHROWER;
+  weaponOrder[4] := WEAPON_SHOTGUN2;
+  weaponOrder[5] := WEAPON_CHAINGUN;
+  weaponOrder[6] := WEAPON_SHOTGUN1;
+  weaponOrder[7] := WEAPON_PISTOL;
+  weaponOrder[8] := WEAPON_KASTET+666; // berserk fist
+  weaponOrder[9] := WEAPON_SAW;
+  weaponOrder[10] := WEAPON_KASTET; // normal fist
+  weaponOrder[11] := WEAPON_SUPERPULEMET;
+
+  for f := 0 to High(weaponOrder) do
+  begin
+    if (weaponOrder[f] = WEAPON_KASTET) then
+    begin
+      // normal fist: remove if we have a berserk pack
+      if (R_BERSERK in FRulez) then weaponOrder[f] := -1;
+    end
+    else
+    if (weaponOrder[f] = WEAPON_KASTET+666) then
+    begin
+      // berserk fist: remove if we don't have a berserk pack
+      if (R_BERSERK in FRulez) then weaponOrder[f] := WEAPON_KASTET else weaponOrder[f] := -1;
+    end;
+  end;
 
   (*
   WEAPON_KASTET         = 0;
@@ -3641,6 +3690,7 @@ begin
 
   // no cycling
   for i := 0 to High(wantThisWeapon) do wantThisWeapon[i] := false;
+  wwc := 0;
   for i := 0 to High(FWeapon) do
   begin
     if (FNextWeap and (1 shl i)) <> 0 then
@@ -3654,10 +3704,10 @@ begin
   // slow down alterations a little
   if (wwc > 1) then
   begin
-    //e_WriteLog(Format(' FNextWeap=%x; delay=%d', [FNextWeap, FNextWeapDelay]), MSG_WARNING);
     // more than one weapon requested, assume "alteration", and check alteration delay
     if FNextWeapDelay > 0 then
     begin
+      //e_WriteLog(Format(' FNextWeap=%x; delay=%d', [FNextWeap, FNextWeapDelay]), TMsgType.Warning);
       FNextWeap := 0;
       exit;
     end; // yeah
@@ -3670,10 +3720,10 @@ begin
     resetWeaponQueue();
     exit;
   end;
-  //e_WriteLog(Format('wwc=%d', [wwc]), TMsgType.Warning);
 
   // 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
@@ -3688,8 +3738,9 @@ begin
     rwidx := weaponOrder[cwi];
     if (rwidx < 0) then continue;
     //e_WriteLog(Format('  trying logical %d (real %d)', [cwi, rwidx]), TMsgType.Warning);
-    if FWeapon[cwi] and ((wwc = 1) or hasAmmoForWeapon(cwi)) then
+    if FWeapon[rwidx] and ((wwc = 1) or hasAmmoForWeapon(rwidx)) then
     begin
+      //e_WriteLog('    I FOUND HER!', TMsgType.Warning);
       // i found her!
       result := Byte(rwidx);
       resetWeaponQueue();
@@ -3737,7 +3788,7 @@ begin
   if nw > High(FWeapon) then
   begin
     // don't forget to reset queue here!
-    //e_WriteLog(' RealizeCurrentWeapon: WUTAFUUUU', MSG_WARNING);
+    //e_WriteLog(Format(' RealizeCurrentWeapon: WUTAFUUUU?! (%d)', [nw]), TMsgType.Warning);
     resetWeaponQueue();
     exit;
   end;
@@ -4518,13 +4569,6 @@ begin
       FRulez := [];
   end;
 
-// Ðàçðûâàåì ñâÿçè ñ òðóïàìè:
-  if gCorpses <> nil then
-    for a := 0 to High(gCorpses) do
-      if gCorpses[a] <> nil then
-        if gCorpses[a].FPlayerUID = FUID then
-          gCorpses[a].FPlayerUID := 0;
-
 // Ïîëó÷àåì êîîðäèíàòû òî÷êè âîçðîæäåíèÿ:
   if not g_Map_GetPoint(c, RespawnPoint) then
   begin
@@ -6315,6 +6359,7 @@ end;
 procedure TCorpse.Damage(Value: Word; vx, vy: Integer);
 var
   pm: TPlayerModel;
+  Blood: TModelBlood;
 begin
   if FState = CORPSE_STATE_REMOVEME then
     Exit;
@@ -6347,12 +6392,13 @@ begin
     end
   else
     begin
+      Blood := g_PlayerModel_GetBlood(FModelName);
       FObj.Vel.X := FObj.Vel.X + vx;
       FObj.Vel.Y := FObj.Vel.Y + vy;
       g_GFX_Blood(FObj.X+PLAYER_CORPSERECT.X+(PLAYER_CORPSERECT.Width div 2),
                   FObj.Y+PLAYER_CORPSERECT.Y+(PLAYER_CORPSERECT.Height div 2),
                   Value, vx, vy, 16, (PLAYER_CORPSERECT.Height*2) div 3,
-                  150, 0, 0);
+                  Blood.R, Blood.G, Blood.B, Blood.Kind);
     end;
 end;