diff --git a/src/g_game.c b/src/g_game.c index bd3acb7f0..d9c8c1551 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3257,7 +3257,7 @@ void G_BeginLevelExit(void) g_exit.losing = true; g_exit.retry = false; - if (!G_GametypeAllowsRetrying() || skipstats != 0) + if (!G_GametypeAllowsRetrying() || skipstats != 0 || (grandprixinfo.gp && grandprixinfo.gamespeed == KARTSPEED_EASY)) { g_exit.losing = false; // never force a retry } @@ -3618,7 +3618,7 @@ boolean G_GametypeUsesLives(void) if (modeattacking) // NOT in Record Attack return false; - if (grandprixinfo.gp == true) // In Grand Prix + if (grandprixinfo.gp == true && grandprixinfo.gamespeed != KARTSPEED_EASY) // In Grand Prix return true; return false; @@ -4738,7 +4738,7 @@ static void G_DoCompleted(void) } } - if (grandprixinfo.gp == true && grandprixinfo.wonround == true && player->exiting && !retrying) + if (grandprixinfo.gp == true && grandprixinfo.wonround == true && player->exiting && (!retrying || grandprixinfo.gamespeed == KARTSPEED_EASY)) { if (player->bot == true) { diff --git a/src/k_grandprix.cpp b/src/k_grandprix.cpp index 004ae6013..1dac5a69a 100644 --- a/src/k_grandprix.cpp +++ b/src/k_grandprix.cpp @@ -389,8 +389,9 @@ void K_UpdateGrandPrixBots(void) if (players[i].botvars.diffincrease) { + // CONS_Printf("in %d inc %d", players[i].botvars.difficulty, players[i].botvars.diffincrease); if (players[i].botvars.diffincrease < 0) - players[i].botvars.difficulty = std::max(1, players[i].botvars.difficulty - players[i].botvars.diffincrease); + players[i].botvars.difficulty = std::max(1, players[i].botvars.difficulty + players[i].botvars.diffincrease); else players[i].botvars.difficulty += players[i].botvars.diffincrease; @@ -400,6 +401,7 @@ void K_UpdateGrandPrixBots(void) } players[i].botvars.diffincrease = 0; + // CONS_Printf("out %d\n", players[i].botvars.difficulty); } if (players[i].botvars.rival) @@ -630,13 +632,37 @@ void K_IncreaseBotDifficulty(player_t *bot) rankNudge = 0; break; case GRADE_A: - if (grandprixinfo.gp && grandprixinfo.gamespeed == KARTSPEED_EASY) - rankNudge = 0; - else - rankNudge = 1; + rankNudge = 1; break; } + // RELAXED MODE: + // Continues don't drop bot difficulty, because we always advance. + // Bots will still level up from standard advancement; we need a + // much steeper rank nudge to keep difficulty at the right level. + if (grandprixinfo.gamespeed == KARTSPEED_EASY) + { + switch(averageRank) + { + case GRADE_E: + rankNudge = -4; + break; + case GRADE_D: + rankNudge = -3; + break; + case GRADE_C: + rankNudge = -2; + break; + case GRADE_B: + rankNudge = -1; + break; + case GRADE_A: + rankNudge = 0; + break; + } + } + + increase += rankNudge; if (increase <= 0) diff --git a/src/k_rank.cpp b/src/k_rank.cpp index f36e4f40a..9cafd98a8 100644 --- a/src/k_rank.cpp +++ b/src/k_rank.cpp @@ -646,6 +646,9 @@ fixed_t K_CalculateGPPercent(gpRank_t *rankData) rankData->scoreRings + rankData->scoreContinues; + if (rankData->scoreTotal < 0) + rankData->scoreTotal = 0; + const fixed_t percent = FixedDiv(rankData->scoreTotal, total); return percent; diff --git a/src/k_tally.cpp b/src/k_tally.cpp index aaf96de61..bfbc64dbb 100644 --- a/src/k_tally.cpp +++ b/src/k_tally.cpp @@ -618,7 +618,8 @@ boolean level_tally_t::IncrementLine(void) value = &displayStat[i]; lives_check = ( - stats[i] == TALLY_STAT_TOTALRINGS // Rings also shows the Lives. + grandprixinfo.gamespeed != KARTSPEED_EASY + && stats[i] == TALLY_STAT_TOTALRINGS // Rings also shows the Lives. && livesAdded < owner->xtralife // Don't check if we've maxxed out! ); @@ -1294,41 +1295,44 @@ void level_tally_t::Draw(void) case TALLY_STAT_TOTALRINGS: { drawer_text - .x(184.0 * frac) + .x((G_GametypeUsesLives() ? 184.0 : 200.0) * frac) .align(srb2::Draw::Align::kCenter) .text(va("%d", displayStat[i])); - srb2::Draw lives_drawer = drawer_text - .xy(221.0 * frac, -1.0 * frac); - - const skincolornum_t color = static_cast(owner->skincolor); - lives_drawer - .x(r_splitscreen ? -7.0 : -2.0) - .colormap(owner->skin, color) - .patch(faceprefix[owner->skin][r_splitscreen ? FACE_MINIMAP : FACE_RANK]); - - UINT8 lives_num = std::min(owner->lives + livesAdded, 10); - if (xtraBlink > 0 && (xtraBlink & 1) == 0 && livesAdded > 0) + if (G_GametypeUsesLives()) { - lives_num = 0; - } + srb2::Draw lives_drawer = drawer_text + .xy(221.0 * frac, -1.0 * frac); - if (lives_num > 0) - { - if (r_splitscreen) + const skincolornum_t color = static_cast(owner->skincolor); + lives_drawer + .x(r_splitscreen ? -7.0 : -2.0) + .colormap(owner->skin, color) + .patch(faceprefix[owner->skin][r_splitscreen ? FACE_MINIMAP : FACE_RANK]); + + UINT8 lives_num = std::min(owner->lives + livesAdded, 10); + if (xtraBlink > 0 && (xtraBlink & 1) == 0 && livesAdded > 0) { - lives_drawer = lives_drawer - .xy(6.0, 2.0) - .align(srb2::Draw::Align::kLeft); - } - else - { - lives_drawer = lives_drawer - .xy(17.0, 1.0) - .font(srb2::Draw::Font::kThinTimer); + lives_num = 0; } - lives_drawer.text("{}", lives_num); + if (lives_num > 0) + { + if (r_splitscreen) + { + lives_drawer = lives_drawer + .xy(6.0, 2.0) + .align(srb2::Draw::Align::kLeft); + } + else + { + lives_drawer = lives_drawer + .xy(17.0, 1.0) + .font(srb2::Draw::Font::kThinTimer); + } + + lives_drawer.text("{}", lives_num); + } } break; diff --git a/src/menus/play-local-race-difficulty.c b/src/menus/play-local-race-difficulty.c index 5793e76c4..e2f0a13fc 100644 --- a/src/menus/play-local-race-difficulty.c +++ b/src/menus/play-local-race-difficulty.c @@ -188,10 +188,10 @@ void Dummygpdifficulty_OnChange(void) switch (cv_dummygpdifficulty.value) { case KARTSPEED_EASY: - tooltip = "Low-stakes racing at \x83Gear 1""\x80"". Take a drive and \x83""enjoy the sights!"; + tooltip = "Low-stakes racing at \x83Gear 1""\x80"". \x83No placement requirements\x80."; break; case KARTSPEED_NORMAL: - tooltip = "Aim for the prize at\x82 Gear 2\x80. Can you \x82surpass your limits?"; + tooltip = "Aim for the prize at\x82 Gear 2\x80. Place \x82""4th or better\x80 to advance!"; break; case KARTSPEED_HARD: tooltip = "Challenge fierce competition at\x87 Gear 3\x80. For\x87 thrill-seekers!";