DEADSOFTWARE

Player: Propagate valid SpawnerUID for corpse kills
[d2df-sdl.git] / src / game / g_weapons.pas
index 3949fe93e8a6036274670ca635e1f6bf6dec6140..79f6f2566ae93038ec519b1f4e2726f1c8036de3 100644 (file)
@@ -72,6 +72,7 @@ procedure g_Weapon_dshotgun(x, y, xd, yd: Integer; SpawnerUID: Word; Silent: Boo
 
 function g_Weapon_Explode(X, Y: Integer; rad: Integer; SpawnerUID: Word): Boolean;
 procedure g_Weapon_BFG9000(X, Y: Integer; SpawnerUID: Word);
+procedure g_Weapon_PreUpdate();
 procedure g_Weapon_Update();
 procedure g_Weapon_Draw();
 function g_Weapon_Danger(UID: Word; X, Y: Integer; Width, Height: Word; Time: Byte): Boolean;
@@ -461,12 +462,12 @@ begin
     if (t <> HIT_FLAME) or (m.FFireTime = 0) or (vx <> 0) or (vy <> 0) then
       Result := m.Damage(d, vx, vy, SpawnerUID, t)
     else
-      Result := True;
+      Result := (gLMSRespawn = LMS_RESPAWN_NONE); // don't hit monsters when it's warmup time
     if t = HIT_FLAME then
       m.CatchFire(SpawnerUID);
   end
   else
-    Result := True;
+    Result := (gLMSRespawn = LMS_RESPAWN_NONE); // don't hit monsters when it's warmup time
 end;
 
 
@@ -526,7 +527,7 @@ begin
               g_TraceVector(X, Y, Obj.X+Obj.Rect.X+(Obj.Rect.Width div 2),
                             Obj.Y+Obj.Rect.Y+(Obj.Rect.Height div 2)) then
           begin
-            Damage(50, 0, 0);
+            Damage(50, SpawnerUID, 0, 0);
             g_Weapon_BFGHit(Obj.X+Obj.Rect.X+(Obj.Rect.Width div 2),
                             Obj.Y+Obj.Rect.Y+(Obj.Rect.Height div 2));
           end;
@@ -737,6 +738,8 @@ begin
     end;
   end;
 
+  Shots[find_id].Obj.oldX := X;
+  Shots[find_id].Obj.oldY := Y;
   Shots[find_id].Obj.X := X;
   Shots[find_id].Obj.Y := Y;
   Shots[find_id].Obj.Vel.X := XV;
@@ -762,6 +765,8 @@ begin
   if a = 0 then
     a := 1;
 
+  Shots[i].Obj.oldX := x;
+  Shots[i].Obj.oldY := y;
   Shots[i].Obj.X := x;
   Shots[i].Obj.Y := y;
   Shots[i].Obj.Vel.X := (xd*s) div a;
@@ -871,8 +876,8 @@ begin
            g_Obj_Collide(obj, @gCorpses[i].Obj) then
         begin
           // Ðàñïèëèâàåì òðóï:
-          gCorpses[i].Damage(d, (obj^.Vel.X+obj^.Accel.X) div 4,
-                                (obj^.Vel.Y+obj^.Accel.Y) div 4);
+          gCorpses[i].Damage(d, SpawnerUID, (obj^.Vel.X+obj^.Accel.X) div 4,
+                                            (obj^.Vel.Y+obj^.Accel.Y) div 4);
           Result := 1;
         end;
   end;
@@ -1045,7 +1050,7 @@ begin
             mm := Max(abs(dx), abs(dy));
             if mm = 0 then mm := 1;
 
-            Damage(Round(100*(rad-m)/rad), (dx*10) div mm, (dy*10) div mm);
+            Damage(Round(100*(rad-m)/rad), SpawnerUID, (dx*10) div mm, (dy*10) div mm);
           end;
         end;
 
@@ -2093,6 +2098,19 @@ begin
   end;
 end;
 
+procedure g_Weapon_PreUpdate();
+var
+  i: Integer;
+begin
+  if Shots = nil then Exit;
+  for i := 0 to High(Shots) do
+    if Shots[i].ShotType <> 0 then
+    begin
+      Shots[i].Obj.oldX := Shots[i].Obj.X;
+      Shots[i].Obj.oldY := Shots[i].Obj.Y;
+    end;
+end;
+
 procedure g_Weapon_Update();
 var
   i, a, h, cx, cy, oldvx, oldvy, tf: Integer;
@@ -2501,7 +2519,7 @@ end;
 
 procedure g_Weapon_Draw();
 var
-  i: Integer;
+  i, fX, fY: Integer;
   a: SmallInt;
   p: TDFPoint;
 begin
@@ -2520,6 +2538,7 @@ begin
         else
           a := 0;
 
+        Obj.lerp(gLerpFactor, fX, fY);
         p.X := Obj.Rect.Width div 2;
         p.Y := Obj.Rect.Height div 2;
 
@@ -2528,16 +2547,16 @@ begin
             if (Shots[i].ShotType = WEAPON_BARON_FIRE) or
                (Shots[i].ShotType = WEAPON_MANCUB_FIRE) or
                (Shots[i].ShotType = WEAPON_SKEL_FIRE) then
-              Animation.DrawEx(Obj.X, Obj.Y, TMirrorType.None, p, a)
+              Animation.DrawEx(fX, fY, TMirrorType.None, p, a)
             else
-              Animation.Draw(Obj.X, Obj.Y, TMirrorType.None);
+              Animation.Draw(fX, fY, TMirrorType.None);
           end
         else if TextureID <> 0 then
           begin
             if (Shots[i].ShotType = WEAPON_ROCKETLAUNCHER) then
-              e_DrawAdv(TextureID, Obj.X, Obj.Y, 0, True, False, a, @p, TMirrorType.None)
+              e_DrawAdv(TextureID, fX, fY, 0, True, False, a, @p, TMirrorType.None)
             else if (Shots[i].ShotType <> WEAPON_FLAMETHROWER) then
-              e_Draw(TextureID, Obj.X, Obj.Y, 0, True, False);
+              e_Draw(TextureID, fX, fY, 0, True, False);
           end;
 
           if g_debug_Frames then