DEADSOFTWARE

Game: Use proper syntax of sets for game options instead of raw bitwise operations
[d2df-sdl.git] / src / game / g_weapons.pas
index 8554e2264e3ecdc711a000b69b75f738c68c50c9..9b0952edbb1652aa1a28ca09fb948d5a23527471 100644 (file)
@@ -84,7 +84,7 @@ procedure g_Weapon_LoadState (st: TStream);
 procedure g_Weapon_AddDynLights();
 
 const
-  WEAPON_KASTET         = 0;
+  WEAPON_IRONFIST       = 0;
   WEAPON_SAW            = 1;
   WEAPON_PISTOL         = 2;
   WEAPON_SHOTGUN1       = 3;
@@ -93,7 +93,7 @@ const
   WEAPON_ROCKETLAUNCHER = 6;
   WEAPON_PLASMA         = 7;
   WEAPON_BFG            = 8;
-  WEAPON_SUPERPULEMET   = 9;
+  WEAPON_SUPERCHAINGUN  = 9;
   WEAPON_FLAMETHROWER   = 10;
   WEAPON_ZOMBY_PISTOL   = 20;
   WEAPON_IMP_FIRE       = 21;
@@ -103,7 +103,7 @@ const
   WEAPON_MANCUB_FIRE    = 25;
   WEAPON_SKEL_FIRE      = 26;
 
-  WP_FIRST          = WEAPON_KASTET;
+  WP_FIRST          = WEAPON_IRONFIST;
   WP_LAST           = WEAPON_FLAMETHROWER;
 
 
@@ -896,7 +896,7 @@ begin
       // È â êîíöå èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè ñíàðÿä îò ìîíñòðà, èëè friendlyfire, èëè friendly_hit_projectile)
       if (g_GetUIDType(SpawnerUID) <> UID_PLAYER) or
-         LongBool(gGameSettings.Options and (GAME_OPTION_TEAMDAMAGE or GAME_OPTION_TEAMHITPROJECTILE)) then
+         ([TGameOption.TEAM_DAMAGE, TGameOption.TEAM_HIT_PROJECTILE] <= gGameSettings.Options) then
       begin
         if PlayerHit() then
         begin
@@ -942,7 +942,7 @@ begin
 
       // È â êîíöå ñâîèõ èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè friendlyfire, èëè friendly_hit_projectile)
-      if LongBool(gGameSettings.Options and (GAME_OPTION_TEAMDAMAGE or GAME_OPTION_TEAMHITPROJECTILE)) then
+      if [TGameOption.TEAM_DAMAGE, TGameOption.TEAM_HIT_PROJECTILE] <= gGameSettings.Options then
       begin
         if PlayerHit(1) then
         begin
@@ -1414,10 +1414,10 @@ var
     if (gPlayers[idx] = nil) or not gPlayers[idx].alive then exit;
     if (spawnerPlr <> nil) then
     begin
-      if ((gGameSettings.Options and (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMDAMAGE)) = 0) and
+      if (not ([TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_DAMAGE] <= gGameSettings.Options)) and
          (spawnerPlr.Team <> TEAM_NONE) and (spawnerPlr.Team = gPlayers[idx].Team) then
       begin
-        if (spawnerPlr <> gPlayers[idx]) and ((gGameSettings.Options and GAME_OPTION_TEAMABSORBDAMAGE) = 0) then
+        if (spawnerPlr <> gPlayers[idx]) and not (TGameOption.TEAM_ABSORB_DAMAGE in gGameSettings.Options) then
           dmg := Max(1, dmg div 2);
         exit;
       end;
@@ -2101,8 +2101,16 @@ begin
   g_Weapon_gun(x, y, xd, yd, 1, 3, SpawnerUID, True);
   if gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF] then
   begin
-    g_Weapon_gun(x, y+1, xd, yd+1, 1, 3, SpawnerUID, False);
-    g_Weapon_gun(x, y-1, xd, yd-1, 1, 2, SpawnerUID, False);
+    if ABS(x-xd) >= ABS(y-yd) then
+    begin
+      g_Weapon_gun(x, y+1, xd, yd+1, 1, 3, SpawnerUID, False);
+      g_Weapon_gun(x, y-1, xd, yd-1, 1, 2, SpawnerUID, False);
+    end
+    else
+    begin
+      g_Weapon_gun(x+1, y, xd+1, yd, 1, 3, SpawnerUID, False);
+      g_Weapon_gun(x-1, y, xd-1, yd, 1, 2, SpawnerUID, False);
+    end;
   end;
 end;
 
@@ -2116,30 +2124,39 @@ begin
   if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and
      (g_GetUIDType(SpawnerUID) = UID_PLAYER) then
   begin
-    g_Weapon_gun(x, y+1, xd, yd+1, 1, 2, SpawnerUID, False);
-    g_Weapon_gun(x, y-1, xd, yd-1, 1, 2, SpawnerUID, False);
+    if ABS(x-xd) >= ABS(y-yd) then
+    begin
+      g_Weapon_gun(x, y+1, xd, yd+1, 1, 2, SpawnerUID, False);
+      g_Weapon_gun(x, y-1, xd, yd-1, 1, 2, SpawnerUID, False);
+    end
+    else
+    begin
+      g_Weapon_gun(x+1, y, xd+1, yd, 1, 2, SpawnerUID, False);
+      g_Weapon_gun(x-1, y, xd-1, yd, 1, 2, SpawnerUID, False);
+    end;
   end;
 end;
 
 procedure g_Weapon_shotgun(x, y, xd, yd: Integer; SpawnerUID: Word;
   Silent: Boolean = False);
 var
-  i, j: Integer;
+  i, j, k: Integer;
 begin
   if not Silent then
     if gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', x, y);
 
   for i := 0 to 9 do
   begin
-    j := Random(17)-8; // -8 .. 8
-    g_Weapon_gun(x, y+j, xd, yd+j, IfThen(i mod 2 <> 0, 1, 0), 3, SpawnerUID, i=0);
+    j := 0; k := 0;
+    if ABS(x-xd) >= ABS(y-yd) then j := Random(17) - 8 else k := Random(17) - 8; // -8 .. 8
+    g_Weapon_gun(x+k, y+j, xd+k, yd+j, IfThen(i mod 2 <> 0, 1, 0), 3, SpawnerUID, i=0);
   end;
 end;
 
 procedure g_Weapon_dshotgun(x, y, xd, yd: Integer; SpawnerUID: Word;
   Silent: Boolean = False);
 var
-  a, i, j: Integer;
+  a, i, j, k: Integer;
 begin
   if not Silent then
     g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', x, y);
@@ -2147,8 +2164,9 @@ begin
   if gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF] then a := 25 else a := 20;
   for i := 0 to a do
   begin
-    j := Random(41)-20; // -20 .. 20
-    g_Weapon_gun(x, y+j, xd, yd+j, IfThen(i mod 3 <> 0, 0, 1), 3, SpawnerUID, i=0);
+    j := 0; k := 0;
+    if ABS(x-xd) >= ABS(y-yd) then j := Random(41) - 20 else k := Random(41) - 20; // -20 .. 20
+    g_Weapon_gun(x+k, y+j, xd+k, yd+j, IfThen(i mod 3 <> 0, 0, 1), 3, SpawnerUID, i=0);
   end;
 end;
 
@@ -2259,19 +2277,17 @@ begin
 
           // Â âîäå øëåéô - ïóçûðè, â âîçäóõå øëåéô - äûì:
             if WordBool(st and MOVE_INWATER) then
-              g_GFX_Bubbles(Obj.X+(Obj.Rect.Width div 2),
-                            Obj.Y+(Obj.Rect.Height div 2),
-                            1+Random(3), 16, 16)
-            else
-              if g_Frames_Get(_id, 'FRAMES_SMOKE') then
-              begin
-                Anim := TAnimation.Create(_id, False, 3);
-                Anim.Alpha := 150;
-                g_GFX_OnceAnim(Obj.X-14+Random(9),
-                               Obj.Y+(Obj.Rect.Height div 2)-20+Random(9),
-                               Anim, ONCEANIM_SMOKE);
-                Anim.Free();
-              end;
+            begin
+              g_Game_Effect_Bubbles(cx, cy, 1+Random(3), 16, 16);
+            end
+            else if g_Frames_Get(_id, 'FRAMES_SMOKE') then
+            begin
+              Anim := TAnimation.Create(_id, False, 3);
+              Anim.Alpha := 150;
+              g_GFX_OnceAnim(Obj.X-14+Random(9), cy-20+Random(9),
+                             Anim, ONCEANIM_SMOKE);
+              Anim.Free();
+            end;
 
           // Ïîïàëè â êîãî-òî èëè â ñòåíó:
             if WordBool(st and (MOVE_HITWALL or MOVE_HITLAND or MOVE_HITCEIL)) or
@@ -2394,7 +2410,8 @@ begin
                 end;
               end
               else
-                g_GFX_Bubbles(cx, cy, 1+Random(3), 16, 16);
+                g_Game_Effect_Bubbles(cx, cy, 1+Random(3), 16, 16);
+
               ShotType := 0;
               Continue;
             end;
@@ -2596,6 +2613,12 @@ begin
         p.X := Obj.Rect.Width div 2;
         p.Y := Obj.Rect.Height div 2;
 
+        if Shots[i].ShotType = WEAPON_BFG then
+        begin
+          DEC(fX, 6);
+          DEC(fY, 7);
+        end;
+
         if Animation <> nil then
           begin
             if (Shots[i].ShotType = WEAPON_BARON_FIRE) or