DEADSOFTWARE

purge cl_interp from the code
[d2df-sdl.git] / src / game / g_player.pas
index db39cb84b0961e1260f840fb8a885e710648b1a8..362c2833ecbe9a7393caf11622c1ccb5bbfdb67e 100644 (file)
@@ -171,7 +171,6 @@ type
     FLastSpawnerUID: Word;
     FLastHit:   Byte;
     FObj:       TObj;
-    FXTo, FYTo: Integer;
     FSpectatePlayer: Integer;
     FFirePainTime:   Integer;
     FFireAttacker:   Word;
@@ -188,6 +187,7 @@ type
     FFireAngle: SmallInt;
     FIncCamOld:      Integer;
     FIncCam:         Integer;
+    FSlopeOld:       Integer;
     FShellTimer:     Integer;
     FShellType:      Byte;
     FSawSound:       TPlayableSound;
@@ -334,8 +334,6 @@ type
     procedure   LoadState (st: TStream); virtual;
     procedure   PauseSounds(Enable: Boolean);
     procedure   NetFire(Wpn: Byte; X, Y, AX, AY: Integer; WID: Integer = -1);
-    procedure   DoLerp(Level: Integer = 2);
-    procedure   SetLerp(XTo, YTo: Integer);
     procedure   QueueWeaponSwitch(Weapon: Byte);
     procedure   RealizeCurrentWeapon();
     procedure   FlamerOn;
@@ -382,6 +380,7 @@ type
     property    GameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
     property    IncCam: Integer read FIncCam write FIncCam;
     property    IncCamOld: Integer read FIncCamOld write FIncCamOld;
+    property    SlopeOld: Integer read FSlopeOld write FSlopeOld;
     property    UID: Word read FUID write FUID;
     property    JustTeleported: Boolean read FJustTeleported write FJustTeleported;
     property    NetTime: LongWord read FNetTime write FNetTime;
@@ -2362,7 +2361,7 @@ end;
 
 procedure TPlayer.DrawIndicator(Color: TRGB);
 var
-  indX, indY, fX, fY: Integer;
+  indX, indY, fX, fY, fSlope: Integer;
   indW, indH: Word;
   indA: Single;
   a: TDFPoint;
@@ -2373,6 +2372,8 @@ begin
   if FAlive then
   begin
     FObj.lerp(gLerpFactor, fX, fY);
+    fSlope := nlerp(FSlopeOld, FObj.slopeUpLeft, gLerpFactor);
+
     case gPlayerIndicatorStyle of
       0:
         begin
@@ -2410,6 +2411,7 @@ begin
               indY := fY - indH;
             end;
 
+            indY := indY + fSlope;
             indX := EnsureRange(indX, 0, Max(gMapInfo.Width, gPlayerScreenSize.X) - indW);
             indY := EnsureRange(indY, 0, Max(gMapInfo.Height, gPlayerScreenSize.Y) - indH);
 
@@ -2424,7 +2426,7 @@ begin
         begin
           e_TextureFontGetSize(gStdFont, nW, nH);
           indX := fX + FObj.Rect.X + (FObj.Rect.Width - Length(FName) * nW) div 2;
-          indY := fY - nH;
+          indY := fY - nH + fSlope;
           e_TextureFontPrintEx(indX, indY, FName, gStdFont, Color.R, Color.G, Color.B, 1.0, True);
         end;
     end;
@@ -2519,9 +2521,10 @@ var
   w, h: Word;
   dr: Boolean;
   Mirror: TMirrorType;
-  fX, fY: Integer;
+  fX, fY, fSlope: Integer;
 begin
   FObj.lerp(gLerpFactor, fX, fY);
+  fSlope := nlerp(FSlopeOld, FObj.slopeUpLeft, gLerpFactor);
 
   if FAlive then
   begin
@@ -2533,7 +2536,7 @@ begin
     if FPunchAnim <> nil then
     begin
       FPunchAnim.Draw(fX+IfThen(Direction = TDirection.D_LEFT, 15-FObj.Rect.X, FObj.Rect.X-15),
-                      fY+FObj.Rect.Y-11, Mirror);
+                      fY+fSlope+FObj.Rect.Y-11, Mirror);
       if FPunchAnim.played then
       begin
         FPunchAnim.Free;
@@ -2547,10 +2550,10 @@ begin
         e_GetTextureSize(ID, @w, @h);
         if FDirection = TDirection.D_LEFT then
           e_Draw(ID, fX+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)+4,
-                     fY+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False)
+                     fY+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+fSlope, 0, True, False)
         else
           e_Draw(ID, fX+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)-2,
-                     fY+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False);
+                     fY+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+fSlope, 0, True, False);
       end;
 
     if FMegaRulez[MR_INVIS] > gTime then
@@ -2563,15 +2566,15 @@ begin
         else
           dr := True;
         if dr then
-          FModel.Draw(fX, fY+FObj.slopeUpLeft, 200)
+          FModel.Draw(fX, fY+fSlope, 200)
         else
-          FModel.Draw(fX, fY+FObj.slopeUpLeft);
+          FModel.Draw(fX, fY+fSlope);
       end
       else
-        FModel.Draw(fX, fY+FObj.slopeUpLeft, 254);
+        FModel.Draw(fX, fY+fSlope, 254);
     end
     else
-      FModel.Draw(fX, fY+FObj.slopeUpLeft);
+      FModel.Draw(fX, fY+fSlope);
   end;
 
   if g_debug_Frames then
@@ -4427,6 +4430,7 @@ begin
   ReleaseKeys();
 
   FDamageBuffer := 0;
+  FSlopeOld := 0;
   FIncCamOld := 0;
   FIncCam := 0;
   FBFGFireCounter := -1;
@@ -4596,6 +4600,7 @@ var
   Anim: TAnimation;
   ID: DWORD;
 begin
+  FSlopeOld := 0;
   FIncCamOld := 0;
   FIncCam := 0;
   FBFGFireCounter := -1;
@@ -4776,8 +4781,6 @@ begin
     GameX := gMapInfo.Width div 2;
     GameY := gMapInfo.Height div 2;
   end;
-  FXTo := GameX;
-  FYTo := GameY;
 
   FAlive := False;
   FSpectator := True;
@@ -4810,11 +4813,7 @@ begin
     Exit;
   FGhost := not FGhost;
   FPhysics := not FGhost;
-  if FGhost then
-  begin
-    FXTo := FObj.X;
-    FYTo := FObj.Y;
-  end else
+  if not FGhost then
   begin
     FObj.Accel.X := 0;
     FObj.Accel.Y := 0;
@@ -4959,11 +4958,6 @@ begin
   FObj.Y := Y-PLAYER_RECT.Y;
   FObj.oldX := FObj.X; // don't interpolate after respawn
   FObj.oldY := FObj.Y;
-  if FAlive and FGhost then
-  begin
-    FXTo := FObj.X;
-    FYTo := FObj.Y;
-  end;
 
   if not g_Game_IsNet then
   begin
@@ -5043,6 +5037,7 @@ end;
 
 procedure TPlayer.PreUpdate();
 begin
+  FSlopeOld := FObj.slopeUpLeft;
   FIncCamOld := FIncCam;
   FObj.oldX := FObj.X;
   FObj.oldY := FObj.Y;
@@ -5060,9 +5055,6 @@ begin
   NetServer := g_Game_IsNet and g_Game_IsServer;
   AnyServer := g_Game_IsServer;
 
-  if FGhost then
-    DoLerp(4);
-
   if NetServer then
     if FClientID >= 0 then
     begin
@@ -5225,33 +5217,33 @@ begin
   begin
     if FKeys[KEY_UP].Pressed or FKeys[KEY_JUMP].Pressed then
     begin
-      FYTo := FObj.Y - 32;
+      FObj.Y := FObj.Y - 32;
       FSpectatePlayer := -1;
     end;
     if FKeys[KEY_DOWN].Pressed then
     begin
-      FYTo := FObj.Y + 32;
+      FObj.Y := FObj.Y + 32;
       FSpectatePlayer := -1;
     end;
     if FKeys[KEY_LEFT].Pressed then
     begin
-      FXTo := FObj.X - 32;
+      FObj.X := FObj.X - 32;
       FSpectatePlayer := -1;
     end;
     if FKeys[KEY_RIGHT].Pressed then
     begin
-      FXTo := FObj.X + 32;
+      FObj.X := FObj.X + 32;
       FSpectatePlayer := -1;
     end;
 
-    if (FXTo < -64) then
-      FXTo := -64
-    else if (FXTo > gMapInfo.Width + 32) then
-      FXTo := gMapInfo.Width + 32;
-    if (FYTo < -72) then
-      FYTo := -72
-    else if (FYTo > gMapInfo.Height + 32) then
-      FYTo := gMapInfo.Height + 32;
+    if (FObj.X < -64) then
+      FObj.X := -64
+    else if (FObj.X > gMapInfo.Width + 32) then
+      FObj.X := gMapInfo.Width + 32;
+    if (FObj.Y < -72) then
+      FObj.Y := -72
+    else if (FObj.Y > gMapInfo.Height + 32) then
+      FObj.Y := gMapInfo.Height + 32;
   end;
 
   if FPhysics then
@@ -5269,8 +5261,8 @@ begin
         if gPlayers[FSpectatePlayer] <> nil then
           if gPlayers[FSpectatePlayer].alive then
           begin
-            FXTo := gPlayers[FSpectatePlayer].GameX;
-            FYTo := gPlayers[FSpectatePlayer].GameY;
+            FObj.X := gPlayers[FSpectatePlayer].GameX;
+            FObj.Y := gPlayers[FSpectatePlayer].GameY;
           end;
   end;
 
@@ -5729,35 +5721,6 @@ begin
       else if (FAngle = ANGLE_LEFTUP) or (FAngle = ANGLE_RIGHTUP) then SetAction(A_ATTACKUP);
 end;
 
-procedure TPlayer.DoLerp(Level: Integer = 2);
-begin
-  if FObj.X <> FXTo then FObj.X := Lerp(FObj.X, FXTo, Level);
-  if FObj.Y <> FYTo then FObj.Y := Lerp(FObj.Y, FYTo, Level);
-end;
-
-procedure TPlayer.SetLerp(XTo, YTo: Integer);
-var
-  AX, AY: Integer;
-begin
-  if NetInterpLevel < 1 then
-  begin
-    FObj.X := XTo;
-    FObj.Y := YTo;
-  end
-  else
-  begin
-    FXTo := XTo;
-    FYTo := YTo;
-
-    AX := Abs(FXTo - FObj.X);
-    AY := Abs(FYTo - FObj.Y);
-    if (AX > 32) or (AX <= NetInterpLevel) then
-      FObj.X := FXTo;
-    if (AY > 32) or (AY <= NetInterpLevel) then
-      FObj.Y := FYTo;
-  end;
-end;
-
 function TPlayer.FullInLift(XInc, YInc: Integer): Integer;
 begin
   if g_Map_CollidePanel(FObj.X+PLAYER_RECT.X+XInc, FObj.Y+PLAYER_RECT.Y+YInc,