From 26fb34d94b5106b81d98fe0911e8de15cd743fa4 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 25 Feb 2023 17:42:43 -0700 Subject: [PATCH] Roulette reel lag compensation --- src/k_roulette.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/k_roulette.c b/src/k_roulette.c index 078dd8f85..e3f5f8d18 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1469,6 +1469,26 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) } else { + // D2 fudge factor. Roulette was originally designed and tested with this delay. + UINT8 fudgedDelay = (player->cmd.latency <= 2) ? 0 : player->cmd.latency - 2; + while (fudgedDelay > 0) + { + UINT8 gap = (roulette->speed - roulette->tics); // How long has the roulette been on this entry? + if (fudgedDelay > gap) // Did the roulette tick over in-flight? + { + fudgedDelay = fudgedDelay - gap; // We're compensating for this gap's worth of delay, so cut it down. + roulette->index = roulette->index == 0 ? roulette->itemListLen - 1 : roulette->index - 1; // Roll the roulette index back... + roulette->tics = 0; // And just in case our delay is SO high that a fast roulette needs to roll back again... + } + else + { + break; + } + } + + // And one more nudge for the remaining delay. + roulette->tics = (roulette->tics + fudgedDelay) % roulette->speed; + kartitems_t finalItem = roulette->itemList[ roulette->index ]; K_KartGetItemResult(player, finalItem);