X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=ca0bea81dcbceb186b04afd137886b03d74542a6;hb=82fc44046c22d1b60695f3b1f7abfb48f18bea48;hp=bc645b0a57fd12de70a6888d4e8c4c32ec9c52fd;hpb=2c147b5a7106a74252a3f71de731adff9c472070;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index bc645b0..ca0bea8 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -240,6 +240,7 @@ var gPlayer2: TPlayer = nil; gPlayerDrawn: TPlayer = nil; gTime: LongWord; + gLerpFactor: Single = 1.0; gSwitchGameMode: Byte = GM_DM; gHearPoint1, gHearPoint2: THearPoint; gSoundEffectsDF: Boolean = False; @@ -2161,6 +2162,13 @@ begin end; end; + // these are in separate PreUpdate functions because they can interact during Update() + // we don't care that much about corpses and gibs + g_Player_PreUpdate(); + g_Monsters_PreUpdate(); + g_Items_PreUpdate(); + g_Weapon_PreUpdate(); + // Îáíîâëÿåì âñå îñòàëüíîå: g_Map_Update(); g_Items_Update(); @@ -3621,7 +3629,7 @@ end; procedure DrawPlayer(p: TPlayer); var - px, py, a, b, c, d, i: Integer; + px, py, a, b, c, d, i, fX, fY: Integer; //R: TRect; begin if (p = nil) or (p.FDummy) then @@ -3639,8 +3647,9 @@ begin glPushMatrix(); - px := p.GameX + PLAYER_RECT_CX; - py := p.GameY + PLAYER_RECT_CY+p.Obj.slopeUpLeft; + p.Obj.lerp(gLerpFactor, fX, fY); + px := fX + PLAYER_RECT_CX; + py := fY + PLAYER_RECT_CY+nlerp(p.SlopeOld, p.Obj.slopeUpLeft, gLerpFactor); if (g_dbg_scale = 1.0) and (not g_dbg_ignore_bounds) then begin @@ -3697,7 +3706,7 @@ begin p.IncCam := nclamp(p.IncCam, min(0, -120 - i), 0); end; - sY := sY - p.IncCam; + sY := sY - nlerp(p.IncCamOld, p.IncCam, gLerpFactor); if (not g_dbg_ignore_bounds) then begin @@ -4251,6 +4260,10 @@ begin if ((not gGameOn) and (gState <> STATE_INTERCUSTOM)) or (not (gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT])) then Exit; + + if (gGameSettings.MaxLives > 0) and (gLMSRespawn = LMS_RESPAWN_NONE) then + Exit; + if gPlayer1 = nil then begin if g_Game_IsClient then @@ -5214,12 +5227,14 @@ begin else if gPlayers[i].Team = TEAM_BLUE then Inc(nb) end; - if (n < 2) or ((gGameSettings.GameMode = GM_TDM) and ((nr = 0) or (nb = 0))) then + if (n < 1) or ((gGameSettings.GameMode = GM_TDM) and ((nr = 0) or (nb = 0))) then begin // wait a second until the fuckers finally decide to join gLMSRespawn := LMS_RESPAWN_WARMUP; gLMSRespawnTime := gTime + gGameSettings.WarmupTime*1000; gLMSSoftSpawn := NoMapRestart; + if g_Game_IsNet then + MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime); Exit; end; @@ -5509,6 +5524,12 @@ begin if g_Game_IsServer then begin gGameSettings.WarmupTime := gsWarmupTime; + // extend warmup if it's already going + if gLMSRespawn = LMS_RESPAWN_WARMUP then + begin + gLMSRespawnTime := gTime + gsWarmupTime * 1000; + if g_Game_IsNet then MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime); + end; if g_Game_IsNet then MH_SEND_GameSettings; end; end; @@ -7213,7 +7234,6 @@ begin end; 'r_reset': begin - sys_EnableVSync(gVSync); gRC_Width := Max(1, gRC_Width); gRC_Height := Max(1, gRC_Height); gBPP := Max(1, gBPP); @@ -7221,6 +7241,19 @@ begin e_LogWriteln('resolution changed') else e_LogWriteln('resolution not changed'); + sys_EnableVSync(gVSync); + end; + 'r_maxfps': + begin + if Length(p) = 2 then + begin + gMaxFPS := StrToIntDef(p[1], gMaxFPS); + if gMaxFPS > 0 then + gFrameTime := 1000 div gMaxFPS + else + gFrameTime := 0; + end; + e_LogWritefln('r_maxfps %d', [gMaxFPS]); end; 'g_language': begin