diff --git a/src/doomdef.h b/src/doomdef.h index 9529e1bb6..68bb81ab1 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -755,7 +755,7 @@ extern int // Exp #define EXP_STABLERATE 3*FRACUNIT/10 // how low is your placement before losing XP? 4*FRACUNIT/10 = top 40% of race will gain -#define EXP_POWER 3*FRACUNIT/100 // adjust to change overall xp volatility +#define EXP_POWER 2*FRACUNIT/100 // adjust to change overall xp volatility #define EXP_MIN 25 // The min value target #define EXP_TARGET 120 // Used for grading ... #define EXP_MAX 120 // The max value displayed by the hud and in the tally screen and GP results screen diff --git a/src/k_roulette.c b/src/k_roulette.c index 9e052ccaf..bfbe1ba73 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1412,11 +1412,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo roulette->preexpdist = K_GetItemRouletteDistance(player, roulette->playing); roulette->dist = roulette->preexpdist; - if ((gametyperules & GTR_CIRCUIT) && !K_Cooperative()) - { - roulette->dist = FixedMul(roulette->preexpdist, K_EffectiveGradingFactor(player)); - } - // =============================================================================== // Dynamic Roulette. Oh boy! // Alright, here's the broad plan: @@ -1428,6 +1423,9 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo // 6: Cram it all in fixed_t largegamescaler = roulette->playing * 14 + 100; // Spread out item odds in large games for a less insane experience. + if (franticitems) + largegamescaler = 100; // Except in Frantic, where you know what you're getting + UINT32 targetpower = 100 * roulette->dist / largegamescaler; // fill roulette with items around this value! UINT32 powers[NUMKARTRESULTS]; // how strong is each item? think of this as a "target distance" for this item to spawn at @@ -1436,6 +1434,22 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo UINT32 dupetolerance[NUMKARTRESULTS]; // how willing are we to select this item after already selecting it? higher values = lower dupe penalty boolean permit[NUMKARTRESULTS]; // is this item allowed? + UINT32 lonelinessSuppressor = DISTVAR; // This close to 1st? Dampen loneliness (you have a target!) + UINT32 maxEXPDistanceCut = 3*DISTVAR/2; // The maximum amount you can be displaced by EXP + + if ((gametyperules & GTR_CIRCUIT) && !K_Cooperative()) + { + roulette->dist = FixedMul(roulette->preexpdist, K_EffectiveGradingFactor(player)); + + if (roulette->dist < roulette->preexpdist) + { + if (roulette->preexpdist - roulette->dist > maxEXPDistanceCut) + { + roulette->dist = roulette->preexpdist - maxEXPDistanceCut; + } + } + } + boolean rival = (player->bot && (player->botvars.rival || cv_levelskull.value)); boolean filterweakitems = true; // strip unusually weak items from reel? UINT8 reelsize = 15; // How many items to attempt to add in prepass? @@ -1587,6 +1601,12 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo loneliness = Easing_InCubic(loneliness, 0, FRACUNIT); + // You are not lonely if you're super close to 1st, even if 3nd is far away. + if (roulette->preexpdist < lonelinessSuppressor) + { + loneliness = FixedRescale(roulette->preexpdist, 0, lonelinessSuppressor, Easing_InCubic, 0, loneliness); + } + // Give interaction items a nudge against initial selection if you're lonely.. for (i = 1; i < NUMKARTRESULTS; i++) { @@ -1732,10 +1752,10 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo UINT16 BASE_X = 280; UINT16 BASE_Y = 5+12*debugcount; INT32 FLAGS = V_SNAPTOTOP|V_SNAPTORIGHT; - V_DrawRightAlignedThinString(BASE_X - 12, 5, FLAGS, va("%d", targetpower/humanscaler)); - V_DrawRightAlignedThinString(BASE_X - 12, 5+12, FLAGS, va("%d", toFront)); - V_DrawRightAlignedThinString(BASE_X - 12, 5+24, FLAGS, va("%d", toBack)); - V_DrawRightAlignedThinString(BASE_X - 12, 5+36, FLAGS, va("%d", loneliness)); + V_DrawRightAlignedThinString(BASE_X - 12, 5, FLAGS, va("TP %d", targetpower/humanscaler)); + V_DrawRightAlignedThinString(BASE_X - 12, 5+12, FLAGS, va("FB %d / %d", toFront, toBack)); + V_DrawRightAlignedThinString(BASE_X - 12, 5+24, FLAGS, va("L %d", loneliness)); + V_DrawRightAlignedThinString(BASE_X - 12, 5+36, FLAGS, va("D %d / %d", roulette->preexpdist, roulette->dist)); for(UINT8 k = 0; k < candidates[i]; k++) V_DrawFixedPatch((BASE_X + 3*k)*FRACUNIT, (BASE_Y-7)*FRACUNIT, (FRACUNIT >> 1), FLAGS, K_GetSmallStaticCachedItemPatch(i), NULL); UINT8 amount = K_ItemResultToAmount(i, roulette); diff --git a/src/p_spec.c b/src/p_spec.c index bdd7733fa..d604fa9b5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1964,7 +1964,7 @@ static void K_HandleLapIncrement(player_t *player) if (!G_TimeAttackStart() && leveltime < starttime && !(gametyperules & GTR_ROLLINGSTART)) { // freeze 'em until fault penalty is over - player->mo->hitlag = starttime - leveltime + TICRATE; + player->mo->hitlag = starttime - leveltime + 2*TICRATE; P_ResetPlayer(player); player->pflags |= PF_VOID; player->mo->renderflags |= RF_DONTDRAW;