DEADSOFTWARE

game: disable gibs for server
[d2df-sdl.git] / src / game / g_monsters.pas
index 9690b745bd93ac05cfde1b9b75fbb2dfa25cda33..78ae1a409ab05f1c629a6fb5d3cbdd9d63b79a3e 100644 (file)
@@ -81,10 +81,12 @@ type
     tx, ty: Integer;
     FStartID: Integer;
     FObj: TObj;
-    FBloodRed: Byte;
-    FBloodGreen: Byte;
-    FBloodBlue: Byte;
-    FBloodKind: Byte;
+    {$IFDEF ENABLE_GFX}
+      FBloodRed: Byte;
+      FBloodGreen: Byte;
+      FBloodBlue: Byte;
+      FBloodKind: Byte;
+    {$ENDIF}
     FShellTimer: Integer;
     FShellType: Byte;
     FFirePainTime: Integer;
@@ -521,9 +523,18 @@ var
 implementation
 
 uses
-  e_log, g_sound, g_gfx, g_player, g_game,
+  {$IFDEF ENABLE_MENU}
+    g_menu,
+  {$ENDIF}
+  {$IFDEF ENABLE_GFX}
+    g_gfx,
+  {$ENDIF}
+  {$IFDEF ENABLE_GIBS}
+    g_gibs,
+  {$ENDIF}
+  e_log, g_sound, g_player, g_game,
   g_weapons, g_triggers, g_items, g_options,
-  g_console, g_map, Math, g_menu, wadreader,
+  g_console, g_map, Math, wadreader,
   g_language, g_netmsg, idpool, utils, xstreams;
 
 
@@ -1630,6 +1641,7 @@ begin
   mplatCheckFrameId := 0;
   mNeedSend := false;
 
+{$IFDEF ENABLE_GFX}
   if FMonsterType in [MONSTER_ROBO, MONSTER_BARREL] then
     FBloodKind := BLOOD_SPARKS
   else
@@ -1652,6 +1664,7 @@ begin
     FBloodGreen := 0;
     FBloodBlue := 0;
   end;
+{$ENDIF}
 
   SetLength(FAnim, Length(ANIMTABLE));
   for a := ANIM_SLEEP to ANIM_PAIN do
@@ -1660,7 +1673,7 @@ begin
     FAnim[a, TDirection.D_LEFT] := TAnimationState.Create(ANIMTABLE[a].loop, MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a], MONSTER_ANIMTABLE[MonsterType].AnimCount[a]);
   end;
   if MonsterType = MONSTER_VILE then
-    vilefire := TAnimationState.Create(True, 2, 0); // !!! len
+    vilefire := TAnimationState.Create(True, 2, 8);
 end;
 
 function TMonster.Damage(aDamage: Word; VelX, VelY: Integer; SpawnerUID: Word; t: Byte): Boolean;
@@ -1885,6 +1898,7 @@ end;
 
 procedure TMonster.MakeBloodSimple(Count: Word);
 begin
+{$IFDEF ENABLE_GFX}
   g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)+8,
               FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
               Count div 2, 3, -1, 16, (FObj.Rect.Height*2 div 3),
@@ -1893,14 +1907,17 @@ begin
               FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
               Count div 2, -3, -1, 16, (FObj.Rect.Height*2) div 3,
               FBloodRed, FBloodGreen, FBloodBlue, FBloodKind);
+{$ENDIF}
 end;
 
 procedure TMonster.MakeBloodVector(Count: Word; VelX, VelY: Integer);
 begin
+{$IFDEF ENABLE_GFX}
   g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
               FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2),
               Count, VelX, VelY, 16, (FObj.Rect.Height*2) div 3,
               FBloodRed, FBloodGreen, FBloodBlue, FBloodKind);
+{$ENDIF}
 end;
 
 procedure TMonster.Push(vx, vy: Integer);
@@ -1984,12 +2001,13 @@ begin
   if not silent then
   begin
     g_Sound_PlayExAt('SOUND_GAME_TELEPORT', Obj.X, Obj.Y);
+{$IFDEF ENABLE_GFX}
     g_GFX_QueueEffect(
       R_GFX_TELEPORT,
       FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
       FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32
     );
-
+{$ENDIF}
     if g_Game_IsServer and g_Game_IsNet then
       MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
                      FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 1,
@@ -2019,12 +2037,13 @@ begin
 // Эффект телепорта в точке назначения:
   if not silent then
   begin
+{$IFDEF ENABLE_GFX}
     g_GFX_QueueEffect(
       R_GFX_TELEPORT,
       FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
       FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32
     );
-
+{$ENDIF}
     if g_Game_IsServer and g_Game_IsNet then
      MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32,
                     FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 0,
@@ -2154,15 +2173,43 @@ begin
   if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then
     case FMonsterType of
       MONSTER_FISH:
-        if Random(4) = 0 then
-          g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
-                        FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
+      begin
+        {$IFDEF ENABLE_GFX}
+          if Random(4) = 0 then
+          begin
+            g_GFX_Bubbles(
+              FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+              FObj.Y + FObj.Rect.Y + Random(4),
+              1,
+              0,
+              0
+            );
+          end;
+        {$ENDIF}
+      end;
       MONSTER_ROBO, MONSTER_BARREL:
-        g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
-                      FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
-      else begin
-        g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4),
-                      FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4);
+      begin
+        {$IFDEF ENABLE_GFX}
+          g_GFX_Bubbles(
+            FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+            FObj.Y + FObj.Rect.Y + Random(4),
+            1,
+            0,
+            0
+          );
+        {$ENDIF}
+      end;
+      else
+      begin
+        {$IFDEF ENABLE_GFX}
+          g_GFX_Bubbles(
+            FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4),
+            FObj.Y+FObj.Rect.Y + Random(4),
+            5,
+            4,
+            4
+          );
+        {$ENDIF}
         if Random(2) = 0 then
           g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
         else
@@ -2479,29 +2526,31 @@ 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));    // направо
+                    // Пинаем куски
+                    if FObj.Vel.X < 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;
-            end;
+            {$ENDIF}
           // Боссы могут пинать трупы:
             if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
                (FObj.Vel.X <> 0) and (gCorpses <> nil) then
@@ -3115,15 +3164,43 @@ begin
   if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then
     case FMonsterType of
       MONSTER_FISH:
-        if Random(4) = 0 then
-          g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
-                        FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
+      begin
+        {$IFDEF ENABLE_GFX}
+          if Random(4) = 0 then
+          begin
+            g_GFX_Bubbles(
+              FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+              FObj.Y + FObj.Rect.Y + Random(4),
+              1,
+              0,
+              0
+            );
+          end;
+        {$ENDIF}
+      end;
       MONSTER_ROBO, MONSTER_BARREL:
-        g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width),
-                      FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0);
-      else begin
-        g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4),
-                      FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4);
+      begin
+        {$IFDEF ENABLE_GFX}
+          g_GFX_Bubbles(
+            FObj.X + FObj.Rect.X + Random(FObj.Rect.Width),
+            FObj.Y + FObj.Rect.Y + Random(4),
+            1,
+            0,
+            0
+          );
+        {$ENDIF}
+      end;
+      else
+      begin
+        {$IFDEF ENABLE_GFX}
+          g_GFX_Bubbles(
+            FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4),
+            FObj.Y + FObj.Rect.Y + Random(4),
+            5,
+            4,
+            4
+          );
+        {$ENDIF}
         if Random(2) = 0 then
           g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y)
         else
@@ -3328,30 +3405,32 @@ 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));    // направо
+                    // Пинаем куски
+                    if FObj.Vel.X < 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;
+                    positionChanged(); // this updates spatial accelerators
                   end;
-                  positionChanged(); // this updates spatial accelerators
                 end;
               end;
-            end;
+            {$ENDIF}
           // Боссы могут пинать трупы:
             if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and
                (FObj.Vel.X <> 0) and (gCorpses <> nil) then
@@ -4137,7 +4216,7 @@ begin
   anim := (vilefire <> nil);
   utils.writeBool(st, anim);
   // Если есть - сохраняем:
-  if anim then vilefire.SaveState(st);
+  if anim then vilefire.SaveState(st, 0, False);
   // Анимации
   for i := ANIM_SLEEP to ANIM_PAIN do
   begin
@@ -4145,12 +4224,12 @@ begin
     anim := (FAnim[i, TDirection.D_LEFT] <> nil);
     utils.writeBool(st, anim);
     // Если есть - сохраняем
-    if anim then FAnim[i, TDirection.D_LEFT].SaveState(st);
+    if anim then FAnim[i, TDirection.D_LEFT].SaveState(st, 0, False);
     // Есть ли правая анимация
     anim := (FAnim[i, TDirection.D_RIGHT] <> nil);
     utils.writeBool(st, anim);
     // Если есть - сохраняем
-    if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st);
+    if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st, 0, False);
   end;
 end;
 
@@ -4158,8 +4237,8 @@ end;
 procedure TMonster.LoadState (st: TStream);
 var
   i: Integer;
-  b: Byte;
-  anim: Boolean;
+  b, alpha: Byte;
+  anim, blending: Boolean;
 begin
   assert(st <> nil);
 
@@ -4219,7 +4298,7 @@ begin
   if anim then
   begin
     Assert(vilefire <> nil, 'TMonster.LoadState: no vilefire anim');
-    vilefire.LoadState(st);
+    vilefire.LoadState(st, alpha, blending);
   end;
   // Анимации
   for i := ANIM_SLEEP to ANIM_PAIN do
@@ -4230,7 +4309,7 @@ begin
     if anim then
     begin
       Assert(FAnim[i, TDirection.D_LEFT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_left anim');
-      FAnim[i, TDirection.D_LEFT].LoadState(st);
+      FAnim[i, TDirection.D_LEFT].LoadState(st, alpha, blending);
     end;
     // Есть ли правая анимация
      anim := utils.readBool(st);
@@ -4238,7 +4317,7 @@ begin
     if anim then
     begin
       Assert(FAnim[i, TDirection.D_RIGHT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_right anim');
-      FAnim[i, TDirection.D_RIGHT].LoadState(st);
+      FAnim[i, TDirection.D_RIGHT].LoadState(st, alpha, blending);
     end;
   end;
 end;
@@ -4284,17 +4363,20 @@ begin
 end;
 
 procedure TMonster.OnFireFlame(Times: DWORD = 1);
-  var i: DWORD; x, y: Integer;
+  {$IFDEF ENABLE_GFX}
+    var i: DWORD; x, y: Integer;
+  {$ENDIF}
 begin
-  if (Random(10) = 1) and (Times = 1) then
-    Exit;
-
-  for i := 1 to Times do
-  begin
-    x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2);
-    y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0);
-    g_GFX_QueueEffect(R_GFX_FLAME, x, y);
-  end;
+  {$IFDEF ENABLE_GFX}
+    if (Random(10) = 1) and (Times = 1) then
+      Exit;
+    for i := 1 to Times do
+    begin
+      x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2);
+      y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0);
+      g_GFX_QueueEffect(R_GFX_FLAME, x, y);
+    end;
+  {$ENDIF}
 end;