X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=362c2833ecbe9a7393caf11622c1ccb5bbfdb67e;hb=cb61300b61ba18d486d19edf315f05b5b494fac3;hp=db39cb84b0961e1260f840fb8a885e710648b1a8;hpb=dffafd305d0df029f317cc92c1968ba0065c0cd8;p=d2df-sdl.git diff --git a/src/game/g_player.pas b/src/game/g_player.pas index db39cb8..362c283 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -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,