X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=ca0bea81dcbceb186b04afd137886b03d74542a6;hb=82fc44046c22d1b60695f3b1f7abfb48f18bea48;hp=4a79f98ebfd67d496271b8ed577b844402f19b2c;hpb=be2ad7bf5e09b4ee91a0c5ee741503ace8c7887c;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 4a79f98..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 @@ -3769,10 +3778,6 @@ begin else gPlayers[i].DrawIndicator(gPlayers[i].GetColor); end; - if p.FSpectator then - e_TextureFontPrintEx(p.GameX + PLAYER_RECT_CX - 4, - p.GameY + PLAYER_RECT_CY - 4, - 'X', gStdFont, 255, 255, 255, 1, True); { for a := 0 to High(gCollideMap) do for b := 0 to High(gCollideMap[a]) do @@ -4255,15 +4260,16 @@ 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 begin if NetPlrUID1 > -1 then - begin MC_SEND_CheatRequest(NET_CHEAT_SPECTATE); - gPlayer1 := g_Player_Get(NetPlrUID1); - end; Exit; end; @@ -4337,8 +4343,12 @@ begin g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True); g_Player_Remove(Pl.UID); g_Net_Slist_ServerPlayerLeaves(); - end else + end + else + begin + gSpectLatchPID2 := Pl.UID; gPlayer2 := nil; + end; Exit; end; Pl := gPlayer1; @@ -4353,6 +4363,7 @@ begin g_Net_Slist_ServerPlayerLeaves(); end else begin + gSpectLatchPID1 := Pl.UID; gPlayer1 := nil; MC_SEND_CheatRequest(NET_CHEAT_SPECTATE); end; @@ -4396,6 +4407,11 @@ begin gGameSettings.Options := gGameSettings.Options + GAME_OPTION_BOTVSMONSTER; gSwitchGameMode := GM_SINGLE; + gLMSRespawn := LMS_RESPAWN_NONE; + gLMSRespawnTime := 0; + gSpectLatchPID1 := 0; + gSpectLatchPID2 := 0; + g_Game_ExecuteEvent('ongamestart'); // Óñòàíîâêà ðàçìåðîâ îêîí èãðîêîâ: @@ -4475,6 +4491,11 @@ begin gAimLine := False; gShowMap := False; + gLMSRespawn := LMS_RESPAWN_NONE; + gLMSRespawnTime := 0; + gSpectLatchPID1 := 0; + gSpectLatchPID2 := 0; + g_Game_ExecuteEvent('ongamestart'); // Óñòàíîâêà ðàçìåðîâ îêîí èãðîêîâ: @@ -4574,6 +4595,11 @@ begin gAimLine := False; gShowMap := False; + gLMSRespawn := LMS_RESPAWN_NONE; + gLMSRespawnTime := 0; + gSpectLatchPID1 := 0; + gSpectLatchPID2 := 0; + g_Game_ExecuteEvent('ongamestart'); // Óñòàíîâêà ðàçìåðîâ îêíà èãðîêà @@ -4700,6 +4726,11 @@ begin // create (or update) map/resource databases g_Res_CreateDatabases(true); + gLMSRespawn := LMS_RESPAWN_NONE; + gLMSRespawnTime := 0; + gSpectLatchPID1 := 0; + gSpectLatchPID2 := 0; + // Ñòàðòóåì êëèåíò if not g_Net_Connect(Addr, Port) then begin @@ -4839,9 +4870,6 @@ begin Exit; end; - gLMSRespawn := LMS_RESPAWN_NONE; - gLMSRespawnTime := 0; - g_Player_Init(); NetState := NET_STATE_GAME; MC_SEND_FullStateRequest; @@ -4992,8 +5020,8 @@ begin NetTimeToUpdate := 1; NetTimeToReliable := 0; NetTimeToMaster := NetMasterRate; - gLMSRespawn := LMS_RESPAWN_NONE; - gLMSRespawnTime := 0; + gSpectLatchPID1 := 0; + gSpectLatchPID2 := 0; gMissionFailed := False; gNextMap := ''; @@ -5011,15 +5039,21 @@ begin g_Game_SpectateCenterView(); - if (gGameSettings.MaxLives > 0) and (gGameSettings.WarmupTime > 0) then + if g_Game_IsServer then begin - gLMSRespawn := LMS_RESPAWN_WARMUP; - gLMSRespawnTime := gTime + gGameSettings.WarmupTime*1000; - gLMSSoftSpawn := True; - if NetMode = NET_SERVER then - MH_SEND_GameEvent(NET_EV_LMS_WARMUP, (gLMSRespawnTime - gTime) div 1000) + if (gGameSettings.MaxLives > 0) and (gGameSettings.WarmupTime > 0) then + begin + gLMSRespawn := LMS_RESPAWN_WARMUP; + gLMSRespawnTime := gTime + gGameSettings.WarmupTime*1000; + gLMSSoftSpawn := True; + if g_Game_IsNet then + MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime); + end else - g_Console_Add(Format(_lc[I_MSG_WARMUP_START], [(gLMSRespawnTime - gTime) div 1000]), True); + begin + gLMSRespawn := LMS_RESPAWN_NONE; + gLMSRespawnTime := 0; + end; end; if NetMode = NET_SERVER then @@ -5168,13 +5202,6 @@ end; procedure g_Game_RestartRound(NoMapRestart: Boolean = False); var i, n, nb, nr: Integer; - - function monRespawn (mon: TMonster): Boolean; - begin - result := false; // don't stop - if not mon.FNoRespawn then mon.Respawn(); - end; - begin if not g_Game_IsServer then Exit; if gLMSRespawn = LMS_RESPAWN_NONE then Exit; @@ -5200,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 + 1000; + gLMSRespawnTime := gTime + gGameSettings.WarmupTime*1000; gLMSSoftSpawn := NoMapRestart; + if g_Game_IsNet then + MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime); Exit; end; @@ -5235,17 +5264,14 @@ begin gPlayers[i].Frags := 0; gPlayers[i].RecallState; end; - if (gPlayer1 = nil) and (gLMSPID1 > 0) then - gPlayer1 := g_Player_Get(gLMSPID1); - if (gPlayer2 = nil) and (gLMSPID2 > 0) then - gPlayer2 := g_Player_Get(gLMSPID2); + if (gPlayer1 = nil) and (gSpectLatchPID1 > 0) then + gPlayer1 := g_Player_Get(gSpectLatchPID1); + if (gPlayer2 = nil) and (gSpectLatchPID2 > 0) then + gPlayer2 := g_Player_Get(gSpectLatchPID2); end; g_Items_RestartRound(); - - g_Mons_ForEach(monRespawn); - gLMSSoftSpawn := False; end; @@ -5498,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; @@ -7202,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); @@ -7210,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