diff --git a/src/d_player.h b/src/d_player.h index 48cd80532..47a9e1bdf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -982,6 +982,9 @@ struct player_t icecubevars_t icecube; level_tally_t tally; + + tic_t darkness_start; + tic_t darkness_end; }; // WARNING FOR ANYONE ABOUT TO ADD SOMETHING TO THE PLAYER STRUCT, G_PlayerReborn WANTS YOU TO SUFFER diff --git a/src/doomstat.h b/src/doomstat.h index 458fd004e..20ab4069b 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -807,7 +807,7 @@ extern exitcondition_t g_exit; extern struct darkness_t { tic_t start, end; - fixed_t value; + fixed_t value[MAXSPLITSCREENPLAYERS]; } g_darkness; #define DEFAULT_GRAVITY (4*FRACUNIT/5) diff --git a/src/p_saveg.c b/src/p_saveg.c index 9d7f9aba5..ea9b91275 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -787,6 +787,10 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].icecube.wiggle); WRITEUINT32(save->p, players[i].icecube.frozenat); WRITEUINT8(save->p, players[i].icecube.shaketimer); + + // darkness + WRITEUINT32(save->p, players[i].darkness_start); + WRITEUINT32(save->p, players[i].darkness_end); } TracyCZoneEnd(__zone); @@ -1358,6 +1362,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].icecube.frozenat = READUINT32(save->p); players[i].icecube.shaketimer = READUINT8(save->p); + // darkness + players[i].darkness_start = READUINT32(save->p); + players[i].darkness_end = READUINT32(save->p); + //players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point } diff --git a/src/p_tick.c b/src/p_tick.c index 8a016597f..d8e26624f 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -768,6 +768,43 @@ void P_RunChaseCameras(void) } } +static fixed_t P_GetDarkness(tic_t start, tic_t end) +{ + if (leveltime <= end) + { + tic_t fade = end - DARKNESS_FADE_TIME; + tic_t t; + + if (leveltime < fade) // dark or darkening + { + t = leveltime - start; + t = min(t, DARKNESS_FADE_TIME); + } + else // lightening + { + t = end - leveltime; + } + + return Easing_Linear((t * FRACUNIT) / DARKNESS_FADE_TIME, 0, FRACUNIT/7); + } + + return 0; +} + +static void P_TickDarkness(void) +{ + const fixed_t globalValue = P_GetDarkness(g_darkness.start, g_darkness.end); + UINT8 i; + + for (i = 0; i <= r_splitscreen; ++i) + { + const player_t *p = &players[displayplayers[i]]; + fixed_t value = P_GetDarkness(p->darkness_start, p->darkness_end); + + g_darkness.value[i] = value ? value : globalValue; + } +} + // // P_Ticker // @@ -1046,27 +1083,7 @@ void P_Ticker(boolean run) if (racecountdown > 1) racecountdown--; - if (leveltime <= g_darkness.end) - { - tic_t fade = g_darkness.end - DARKNESS_FADE_TIME; - tic_t t; - - if (leveltime < fade) // dark or darkening - { - t = leveltime - g_darkness.start; - t = min(t, DARKNESS_FADE_TIME); - } - else // lightening - { - t = g_darkness.end - leveltime; - } - - g_darkness.value = Easing_Linear((t * FRACUNIT) / DARKNESS_FADE_TIME, 0, FRACUNIT/7); - } - else // light - { - g_darkness.value = 0; - } + P_TickDarkness(); if (exitcountdown >= 1) { diff --git a/src/r_debug.cpp b/src/r_debug.cpp index b4f2409b7..6cc42a50c 100644 --- a/src/r_debug.cpp +++ b/src/r_debug.cpp @@ -18,6 +18,7 @@ #include "i_time.h" #include "m_fixed.h" #include "r_draw.h" +#include "r_fps.h" #include "r_main.h" #include "g_game.h" @@ -43,7 +44,7 @@ INT32 R_AdjustLightLevel(INT32 light) if (!debugrender_highlight && cv_debugrender_contrast.value == 0) { - const fixed_t darken = FixedMul(FixedMul(g_darkness.value, mapheaderinfo[gamemap-1]->darkness), kRange); + const fixed_t darken = FixedMul(FixedMul(g_darkness.value[R_GetViewNumber()], mapheaderinfo[gamemap-1]->darkness), kRange); return std::clamp((light * FRACUNIT) - darken, 0, kRange) / FRACUNIT; }