DEADSOFTWARE

game: disable corpses for server
[d2df-sdl.git] / src / game / g_monsters.pas
index e3374e496ebcf7001c9094dc5476720411ab7884..9877ece2b6bb4a7ce11584deff04a3dd9f287204 100644 (file)
@@ -87,8 +87,10 @@ type
       FBloodBlue: Byte;
       FBloodKind: Byte;
     {$ENDIF}
-    FShellTimer: Integer;
-    FShellType: Byte;
+    {$IFDEF ENABLE_SHELLS}
+      FShellTimer: Integer;
+      FShellType: Byte;
+    {$ENDIF}
     FFirePainTime: Integer;
     FFireAttacker: Word;
     vilefire: TAnimationState;
@@ -529,6 +531,15 @@ uses
   {$IFDEF ENABLE_GFX}
     g_gfx,
   {$ENDIF}
+  {$IFDEF ENABLE_GIBS}
+    g_gibs,
+  {$ENDIF}
+  {$IFDEF ENABLE_SHELLS}
+    g_shells,
+  {$ENDIF}
+  {$IFDEF ENABLE_CORPSES}
+    g_corpses,
+  {$ENDIF}
   e_log, g_sound, g_player, g_game,
   g_weapons, g_triggers, g_items, g_options,
   g_console, g_map, Math, wadreader,
@@ -1588,7 +1599,9 @@ begin
   FDieTriggers := nil;
   FWaitAttackAnim := False;
   FChainFire := False;
-  FShellTimer := -1;
+  {$IFDEF ENABLE_SHELLS}
+    FShellTimer := -1;
+  {$ENDIF}
 
   FState := MONSTATE_SLEEP;
   FCurAnim := ANIM_SLEEP;
@@ -1625,7 +1638,9 @@ begin
   FChainFire := False;
   FStartID := aID;
   FNoRespawn := False;
-  FShellTimer := -1;
+  {$IFDEF ENABLE_SHELLS}
+    FShellTimer := -1;
+  {$ENDIF}
   FBehaviour := BH_NORMAL;
   FFireTime := 0;
   FFirePainTime := 0;
@@ -2058,14 +2073,20 @@ begin
 end;
 
 procedure TMonster.Update();
-var
-  a, b, sx, sy, wx, wy, oldvelx: Integer;
-  st: Word;
-  o, co: TObj;
-  fall: Boolean;
-  mon: TMonster;
-  mit: PMonster;
-  it: TMonsterGrid.Iter;
+  {$IFDEF ENABLE_CORPSES}
+    var co: TObj;
+  {$ENDIF}
+  {$IF DEFINED(ENABLE_GIBS) OR DEFINED(ENABLE_CORPSES)}
+    var b: Integer;
+  {$ENDIF}
+  var
+    a, sx, sy, wx, wy, oldvelx: Integer;
+    st: Word;
+    o: TObj;
+    fall: Boolean;
+    mon: TMonster;
+    mit: PMonster;
+    it: TMonsterGrid.Iter;
 label
   _end;
 begin
@@ -2240,25 +2261,35 @@ begin
 // Таймер - ждем после потери цели:
   FTargetTime := FTargetTime + 1;
 
-// Гильзы
+{$IFDEF ENABLE_SHELLS}
+  // Гильзы
   if FShellTimer > -1 then
+  begin
     if FShellTimer = 0 then
     begin
       if FShellType = SHELL_SHELL then
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+      begin
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX, GameVelY-2, SHELL_SHELL)
+      end
       else if FShellType = SHELL_DBLSHELL then
       begin
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX-1, GameVelY-2, SHELL_SHELL);
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX+1, GameVelY-2, SHELL_SHELL);
       end;
       FShellTimer := -1;
-    end else Dec(FShellTimer);
+    end
+    else
+    begin
+      Dec(FShellTimer);
+    end;
+  end;
+{$ENDIF}
 
 // Пробуем увернуться от летящей пули:
   if fall then
@@ -2523,48 +2554,52 @@ begin
           end
         else // "Наземные" монстры
           begin
-          // Возможно, пинаем куски:
-            if (FObj.Vel.X <> 0) and (gGibs <> nil) then
-            begin
-              b := Abs(FObj.Vel.X);
-              if b > 1 then b := b * (Random(8 div b) + 1);
-              for a := 0 to High(gGibs) do
+            {$IFDEF ENABLE_GIBS}
+              // Возможно, пинаем куски:
+              if (FObj.Vel.X <> 0) and (gGibs <> nil) then
               begin
-                if gGibs[a].alive and
-                   g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
-                                 FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then
+                b := Abs(FObj.Vel.X);
+                if b > 1 then b := b * (Random(8 div b) + 1);
+                for a := 0 to High(gGibs) do
                 begin
-                  // Пинаем куски
-                  if FObj.Vel.X < 0 then
+                  if gGibs[a].alive and
+                     g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
+                                   FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then
                   begin
-                    g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
-                  end
-                  else
-                  begin
-                    g_Obj_PushA(@gGibs[a].Obj, b, Random(61));    // направо
-                  end;
-                end;
-              end;
-            end;
-          // Боссы могут пинать трупы:
-            if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
-               (FObj.Vel.X <> 0) and (gCorpses <> nil) then
-            begin
-              b := Abs(FObj.Vel.X);
-              if b > 1 then b := b * (Random(8 div b) + 1);
-              for a := 0 to High(gCorpses) do
-                if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then
-                begin
-                  co := gCorpses[a].Obj;
-                  if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
-                                   FObj.Rect.Width, 8, @co) and (Random(3) = 0) then
-                    // Пинаем трупы
+                    // Пинаем куски
                     if FObj.Vel.X < 0 then
-                      gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево
+                    begin
+                      g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
+                    end
                     else
-                      gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо
+                    begin
+                      g_Obj_PushA(@gGibs[a].Obj, b, Random(61));    // направо
+                    end;
+                  end;
                 end;
-            end;
+              end;
+            {$ENDIF}
+            {$IFDEF ENABLE_CORPSES}
+              // Боссы могут пинать трупы:
+              if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
+                 (FObj.Vel.X <> 0) and (gCorpses <> nil) then
+              begin
+                b := Abs(FObj.Vel.X);
+                if b > 1 then b := b * (Random(8 div b) + 1);
+                for a := 0 to High(gCorpses) do
+                  if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then
+                  begin
+                    co := gCorpses[a].Obj;
+                    if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
+                                     FObj.Rect.Width, 8, @co) and (Random(3) = 0) then
+                      // Пинаем трупы
+                      if FObj.Vel.X < 0 then
+                        gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево
+                      else
+                        gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо
+                  end;
+              end;
+            {$ENDIF}
           // Если цель высоко, то, возможно, прыгаем:
             if sy < -40 then
               if g_Obj_CollideLevel(@FObj, 0, 1) or g_Obj_StayOnStep(@FObj) then
@@ -2937,20 +2972,26 @@ _end:
                   begin
                     g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', wx, wy);
                     g_Weapon_gun(wx, wy, tx, ty, 1, 3, FUID, True);
-                    g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET);
+                    {$IFDEF ENABLE_SHELLS}
+                      g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET);
+                    {$ENDIF}
                   end;
                 MONSTER_SERG:
                   begin
                     g_Weapon_shotgun(wx, wy, tx, ty, FUID);
                     if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', wx, wy);
-                    FShellTimer := 10;
-                    FShellType := SHELL_SHELL;
+                    {$IFDEF ENABLE_SHELLS}
+                      FShellTimer := 10;
+                      FShellType := SHELL_SHELL;
+                    {$ENDIF}
                   end;
                 MONSTER_MAN:
                   begin
                     g_Weapon_dshotgun(wx, wy, tx, ty, FUID);
-                    FShellTimer := 13;
-                    FShellType := SHELL_DBLSHELL;
+                    {$IFDEF ENABLE_SHELLS}
+                      FShellTimer := 13;
+                      FShellType := SHELL_DBLSHELL;
+                    {$ENDIF}
                     FAmmo := -36;
                   end;
                 MONSTER_CYBER:
@@ -2964,13 +3005,17 @@ _end:
                   begin
                     g_Weapon_mgun(wx, wy, tx, ty, FUID);
                     if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy);
-                    g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET);
+                    {$IFDEF ENABLE_SHELLS}
+                      g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET);
+                    {$ENDIF}
                   end;
                 MONSTER_SPIDER:
                   begin
                     g_Weapon_mgun(wx, wy, tx, ty, FUID);
                     if not gSoundEffectsDF then g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy);
-                    g_Player_CreateShell(wx, wy, 0, -2, SHELL_SHELL);
+                    {$IFDEF ENABLE_SHELLS}
+                      g_Shells_Create(wx, wy, 0, -2, SHELL_SHELL);
+                    {$ENDIF}
                   end;
                 MONSTER_BSP:
                   g_Weapon_aplasma(wx, wy, tx, ty, FUID);
@@ -3080,11 +3125,14 @@ begin
 end;
 
 procedure TMonster.ClientUpdate();
-var
-  a, b, sx, sy, oldvelx: Integer;
-  st: Word;
-  o, co: TObj;
-  fall: Boolean;
+  {$IFDEF ENABLE_CORPSES}
+    var a, b: Integer; co: TObj;
+  {$ENDIF}
+  var
+    sx, sy, oldvelx: Integer;
+    st: Word;
+    o: TObj;
+    fall: Boolean;
 label
   _end;
 begin
@@ -3229,24 +3277,34 @@ begin
 // Таймер - ждем после потери цели:
   FTargetTime := FTargetTime + 1;
 
+{$IFDEF ENABLE_SHELLS}
   if FShellTimer > -1 then
+  begin
     if FShellTimer = 0 then
     begin
       if FShellType = SHELL_SHELL then
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+      begin
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX, GameVelY-2, SHELL_SHELL)
+      end
       else if FShellType = SHELL_DBLSHELL then
       begin
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX-1, GameVelY-2, SHELL_SHELL);
-        g_Player_CreateShell(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
+        g_Shells_Create(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
                              FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
                              GameVelX+1, GameVelY-2, SHELL_SHELL);
       end;
       FShellTimer := -1;
-    end else Dec(FShellTimer);
+    end
+    else
+    begin
+      Dec(FShellTimer);
+    end;
+  end;
+{$ENDIF}
 
 // Пробуем увернуться от летящей пули:
   if fall then
@@ -3400,49 +3458,53 @@ begin
           end
         else // "Наземные" монстры
           begin
-          // Возможно, пинаем куски:
-            if (FObj.Vel.X <> 0) and (gGibs <> nil) then
-            begin
-              b := Abs(FObj.Vel.X);
-              if b > 1 then b := b * (Random(8 div b) + 1);
-              for a := 0 to High(gGibs) do
+            {$IFDEF ENBALE_GIBS}
+              // Возможно, пинаем куски:
+              if (FObj.Vel.X <> 0) and (gGibs <> nil) then
               begin
-                if gGibs[a].alive and
-                   g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
-                                 FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then
+                b := Abs(FObj.Vel.X);
+                if b > 1 then b := b * (Random(8 div b) + 1);
+                for a := 0 to High(gGibs) do
                 begin
-                  // Пинаем куски
-                  if FObj.Vel.X < 0 then
-                  begin
-                    g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
-                  end
-                  else
+                  if gGibs[a].alive and
+                     g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
+                                   FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then
                   begin
-                    g_Obj_PushA(@gGibs[a].Obj, b, Random(61));    // направо
-                  end;
-                  positionChanged(); // this updates spatial accelerators
-                end;
-              end;
-            end;
-          // Боссы могут пинать трупы:
-            if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
-               (FObj.Vel.X <> 0) and (gCorpses <> nil) then
-            begin
-              b := Abs(FObj.Vel.X);
-              if b > 1 then b := b * (Random(8 div b) + 1);
-              for a := 0 to High(gCorpses) do
-                if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then
-                begin
-                  co := gCorpses[a].Obj;
-                  if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
-                                   FObj.Rect.Width, 8, @co) and (Random(3) = 0) then
-                    // Пинаем трупы
+                    // Пинаем куски
                     if FObj.Vel.X < 0 then
-                      gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево
+                    begin
+                      g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево
+                    end
                     else
-                      gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо
+                    begin
+                      g_Obj_PushA(@gGibs[a].Obj, b, Random(61));    // направо
+                    end;
+                    positionChanged(); // this updates spatial accelerators
+                  end;
                 end;
-            end;
+              end;
+            {$ENDIF}
+            {$IFDEF ENABLE_CORPSES}
+              // Боссы могут пинать трупы:
+              if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
+                 (FObj.Vel.X <> 0) and (gCorpses <> nil) then
+              begin
+                b := Abs(FObj.Vel.X);
+                if b > 1 then b := b * (Random(8 div b) + 1);
+                for a := 0 to High(gCorpses) do
+                  if (gCorpses[a] <> nil) and (gCorpses[a].State > 0) then
+                  begin
+                    co := gCorpses[a].Obj;
+                    if g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4,
+                                     FObj.Rect.Width, 8, @co) and (Random(3) = 0) then
+                      // Пинаем трупы
+                      if FObj.Vel.X < 0 then
+                        gCorpses[a].Damage(b*2, FUID, -b, Random(7)) // налево
+                      else
+                        gCorpses[a].Damage(b*2, FUID, b, Random(7)); // направо
+                  end;
+              end;
+            {$ENDIF}
           end;
 
         FSleep := FSleep + 1;
@@ -3786,24 +3848,32 @@ begin
     MONSTER_ZOMBY:
     begin
       g_Sound_PlayExAt('SOUND_WEAPON_FIREPISTOL', wx, wy);
-      g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET);
+      {$IFDEF ENABLE_SHELLS}
+        g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET);
+      {$ENDIF}
     end;
     MONSTER_SERG:
     begin
       g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN', wx, wy);
-      FShellTimer := 10;
-      FShellType := SHELL_SHELL;
+      {$IFDEF ENABLE_SHELLS}
+        FShellTimer := 10;
+        FShellType := SHELL_SHELL;
+      {$ENDIF}
     end;
     MONSTER_MAN:
     begin
       g_Sound_PlayExAt('SOUND_WEAPON_FIRESHOTGUN2', wx, wy);
-      FShellTimer := 13;
-      FShellType := SHELL_DBLSHELL;
+      {$IFDEF ENABLE_SHELLS}
+        FShellTimer := 13;
+        FShellType := SHELL_DBLSHELL;
+      {$ENDIF}
     end;
     MONSTER_CGUN, MONSTER_SPIDER:
     begin
       g_Sound_PlayExAt('SOUND_WEAPON_FIRECGUN', wx, wy);
-      g_Player_CreateShell(wx, wy, 0, -2, SHELL_BULLET);
+      {$IFDEF ENABLE_SHELLS}
+        g_Shells_Create(wx, wy, 0, -2, SHELL_BULLET);
+      {$ENDIF}
     end;
     MONSTER_IMP:
       g_Weapon_ball1(wx, wy, atx, aty, FUID);