diff --git a/src/doomstat.h b/src/doomstat.h index 92f4dce2d..458fd004e 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -803,8 +803,12 @@ struct exitcondition_t extern tic_t racecountdown, exitcountdown, musiccountdown; extern exitcondition_t g_exit; -extern tic_t darktimer; -extern fixed_t darkness; +#define DARKNESS_FADE_TIME (8) +extern struct darkness_t +{ + tic_t start, end; + fixed_t value; +} g_darkness; #define DEFAULT_GRAVITY (4*FRACUNIT/5) extern fixed_t gravity; diff --git a/src/g_game.c b/src/g_game.c index 2dfa5a1bc..877840150 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -277,8 +277,7 @@ UINT8 useSeal = 1; tic_t racecountdown, exitcountdown, musiccountdown; // for racing exitcondition_t g_exit; -tic_t darktimer; -fixed_t darkness; +darkness_t g_darkness; fixed_t gravity; fixed_t mapobjectscale; diff --git a/src/g_game.h b/src/g_game.h index f66b665f0..d1378ce30 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -85,9 +85,6 @@ extern boolean pausebreakkey; extern boolean promptactive; -extern tic_t darktimer; -extern fixed_t darkness; - extern consvar_t cv_tutorialprompt; extern consvar_t cv_chatwidth, cv_chatnotifications, cv_chatheight, cv_chattime, cv_consolechat, cv_chatbacktint, cv_chatspamprotection; diff --git a/src/k_kart.c b/src/k_kart.c index def73ecfd..eff55c946 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -116,7 +116,7 @@ static void K_SpawnDuelOnlyItems(void) void K_TimerReset(void) { starttime = introtime = 0; - darkness = darktimer = 0; + memset(&g_darkness, 0, sizeof g_darkness); numbulbs = 1; inDuel = rainbowstartavailable = false; linecrossed = 0; diff --git a/src/objects/shrink.c b/src/objects/shrink.c index 04b703328..58b6cf856 100644 --- a/src/objects/shrink.c +++ b/src/objects/shrink.c @@ -749,7 +749,8 @@ void Obj_CreateShrinkPohbees(player_t *owner) ownerPos = owner->position; - darktimer = POHBEE_TIME; + g_darkness.start = leveltime; + g_darkness.end = leveltime + POHBEE_TIME + DARKNESS_FADE_TIME; for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/p_saveg.c b/src/p_saveg.c index 7aa5dfd02..9d7f9aba5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -6477,8 +6477,8 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) WRITEUINT32(save->p, g_pointlimit); - WRITEUINT32(save->p, darktimer); - WRITEFIXED(save->p, darkness); + WRITEUINT32(save->p, g_darkness.start); + WRITEUINT32(save->p, g_darkness.end); WRITEUINT16(save->p, numchallengedestructibles); @@ -6662,8 +6662,8 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading) g_pointlimit = READUINT32(save->p); - darktimer = READUINT32(save->p); - darkness = READFIXED(save->p); + g_darkness.start = READUINT32(save->p); + g_darkness.end = READUINT32(save->p); numchallengedestructibles = READUINT16(save->p); diff --git a/src/p_tick.c b/src/p_tick.c index 15bcd0baa..8a016597f 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -46,6 +46,7 @@ #include "k_objects.h" #include "music.h" #include "k_dialogue.h" +#include "m_easing.h" #include "lua_profile.h" @@ -1045,21 +1046,26 @@ void P_Ticker(boolean run) if (racecountdown > 1) racecountdown--; - const fixed_t darkdelta = FRACUNIT/50; - const fixed_t maxdark = FRACUNIT/7; - if (darktimer) // dark or darkening + if (leveltime <= g_darkness.end) { - darktimer--; - darkness += darkdelta; - darkness = min(darkness, maxdark); - } - else if (darkness >= darkdelta) // lightening - { - darkness -= darkdelta; + 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 { - darkness = 0; + g_darkness.value = 0; } if (exitcountdown >= 1) diff --git a/src/r_debug.cpp b/src/r_debug.cpp index f4774f9fc..b4f2409b7 100644 --- a/src/r_debug.cpp +++ b/src/r_debug.cpp @@ -43,7 +43,7 @@ INT32 R_AdjustLightLevel(INT32 light) if (!debugrender_highlight && cv_debugrender_contrast.value == 0) { - const fixed_t darken = FixedMul(FixedMul(darkness, mapheaderinfo[gamemap-1]->darkness), kRange); + const fixed_t darken = FixedMul(FixedMul(g_darkness.value, mapheaderinfo[gamemap-1]->darkness), kRange); return std::clamp((light * FRACUNIT) - darken, 0, kRange) / FRACUNIT; } diff --git a/src/typedef.h b/src/typedef.h index be029d99a..77625d4cd 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -141,6 +141,7 @@ TYPEDEF (tolinfo_t); TYPEDEF (cupheader_t); TYPEDEF (unloaded_cupheader_t); TYPEDEF (exitcondition_t); +TYPEDEF (darkness_t); // font.h TYPEDEF (font_t);