diff --git a/src/doomstat.h b/src/doomstat.h index 26ea96cdb..fbbd72e3a 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -777,6 +777,9 @@ struct exitcondition_t extern tic_t racecountdown, exitcountdown, musiccountdown; extern exitcondition_t g_exit; +extern tic_t darktimer; +extern fixed_t darkness; + #define DEFAULT_GRAVITY (4*FRACUNIT/5) extern fixed_t gravity; extern fixed_t mapobjectscale; diff --git a/src/g_game.c b/src/g_game.c index b01856ba2..dd4b95c4d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -279,6 +279,9 @@ mobj_t *hunt3; tic_t racecountdown, exitcountdown, musiccountdown; // for racing exitcondition_t g_exit; +tic_t darktimer; +fixed_t darkness; + fixed_t gravity; fixed_t mapobjectscale; diff --git a/src/g_game.h b/src/g_game.h index 9d9593ce5..885c7a44b 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -86,6 +86,8 @@ extern boolean pausebreakkey; extern boolean promptactive; +extern tic_t darktimer; +extern fixed_t darkness; extern consvar_t cv_tutorialprompt; diff --git a/src/k_kart.c b/src/k_kart.c index 7577ce31d..03dffd662 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -101,6 +101,7 @@ static void K_SpawnDuelOnlyItems(void) void K_TimerReset(void) { starttime = introtime = 0; + darkness = darktimer = 0; numbulbs = 1; inDuel = rainbowstartavailable = false; timelimitintics = extratimeintics = secretextratime = 0; diff --git a/src/objects/shrink.c b/src/objects/shrink.c index e5dd2b8c6..23613ff52 100644 --- a/src/objects/shrink.c +++ b/src/objects/shrink.c @@ -32,7 +32,7 @@ // ██║░░░░░██║██╔╝╚██╗██║░╚═╝░██║███████╗ // ╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░░░░░╚═╝╚══════╝ // -// vertical flip +// FIXME (because it was completely unsearchable): vertical flip // #define POHBEE_HOVER (128 << FRACBITS) @@ -544,7 +544,7 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim) K_RemoveGrowShrink(victim->player); } - victim->player->growshrinktimer += 3*TICRATE; + victim->player->growshrinktimer += 6*TICRATE; S_StartSound(victim, sfx_kc5a); if (prevTimer <= 0) @@ -739,6 +739,8 @@ void Obj_CreateShrinkPohbees(player_t *owner) ownerPos = owner->position; + darktimer = POHBEE_TIME; + for (i = 0; i < MAXPLAYERS; i++) { player_t *player = NULL; diff --git a/src/p_saveg.c b/src/p_saveg.c index dba172f72..e9e17f65e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5875,6 +5875,9 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) WRITEUINT32(save->p, g_pointlimit); + WRITEUINT32(save->p, darktimer); + WRITEUINT32(save->p, darkness); + // Is it paused? if (paused) WRITEUINT8(save->p, 0x2f); @@ -6054,6 +6057,9 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading) g_pointlimit = READUINT32(save->p); + darktimer = READUINT32(save->p); + darkness = READUINT32(save->p); + // Is it paused? if (READUINT8(save->p) == 0x2f) paused = true; diff --git a/src/p_tick.c b/src/p_tick.c index b478a6668..ebcee3991 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -942,6 +942,23 @@ void P_Ticker(boolean run) if (racecountdown > 1) racecountdown--; + + const fixed_t darkdelta = FRACUNIT/50; + if (darktimer) // dark or darkening + { + darktimer--; + darkness += darkdelta; + darkness = min(darkness, FRACUNIT/6); + } + else if (darkness >= darkdelta) // lightening + { + darkness -= darkdelta; + } + else // light + { + darkness = 0; + } + if (exitcountdown > 1) { exitcountdown--; diff --git a/src/r_debug.cpp b/src/r_debug.cpp index b7f88a561..500816305 100644 --- a/src/r_debug.cpp +++ b/src/r_debug.cpp @@ -19,6 +19,7 @@ #include "m_fixed.h" #include "r_draw.h" #include "r_main.h" +#include "g_game.h" using namespace srb2::r_debug; @@ -38,12 +39,14 @@ void R_CheckDebugHighlight(debugrender_highlight_t k) INT32 R_AdjustLightLevel(INT32 light) { + constexpr fixed_t kRange = (LIGHTLEVELS - 1) * FRACUNIT; + if (!debugrender_highlight && cv_debugrender_contrast.value == 0) { - return light; + const fixed_t darken = FixedMul(darkness, kRange); + return std::clamp((light * FRACUNIT) - darken, 0, kRange) / FRACUNIT; } - constexpr fixed_t kRange = (LIGHTLEVELS - 1) * FRACUNIT; const fixed_t adjust = FixedMul(cv_debugrender_contrast.value, kRange); if (debugrender_highlight)