diff --git a/src/d_player.h b/src/d_player.h index b2a513339..68b34a963 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -914,6 +914,7 @@ struct player_t UINT8 laps; // Number of laps (optional) UINT8 latestlap; UINT32 lapPoints; // Points given from laps + INT32 exp; INT32 cheatchecknum; // The number of the last cheatcheck you hit INT32 checkpointId; // Players respawn here, objects/checkpoint.cpp diff --git a/src/g_game.c b/src/g_game.c index e5f711253..4ba14b585 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2131,6 +2131,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) UINT8 laps; UINT8 latestlap; UINT32 lapPoints; + INT32 exp; UINT16 skincolor; INT32 skin; UINT8 availabilities[MAXAVAILABILITY]; @@ -2319,6 +2320,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) laps = 0; latestlap = 0; lapPoints = 0; + exp = FRACUNIT; roundscore = 0; exiting = 0; khudfinish = 0; @@ -2356,6 +2358,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) laps = players[player].laps; latestlap = players[player].latestlap; lapPoints = players[player].lapPoints; + exp = players[player].exp; roundscore = players[player].roundscore; @@ -2470,6 +2473,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->laps = laps; p->latestlap = latestlap; p->lapPoints = lapPoints; + p->exp = exp; p->totalring = totalring; for (i = 0; i < LAP__MAX; i++) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 8576d578c..c3e6576f0 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -6512,6 +6512,9 @@ void K_drawKartHUD(void) if (cv_kartdebugdistribution.value) K_drawDistributionDebugger(); + // temp debug + V_DrawSmallString(8, 2, V_SNAPTOTOP, va("Exp/Dist mult: %.2f", FixedToFloat(stplyr->exp))); + if (cv_kartdebugnodes.value) { UINT8 p; diff --git a/src/k_roulette.c b/src/k_roulette.c index 1a44f0b69..4bda7e7dd 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -423,13 +423,14 @@ static UINT32 K_UndoMapScaling(UINT32 distance) as well as Frantic Items. Input Arguments:- + player - The player to get the distance of. distance - Original distance. numPlayers - Number of players in the game. Return:- New distance after scaling. --------------------------------------------------*/ -static UINT32 K_ScaleItemDistance(UINT32 distance, UINT8 numPlayers) +static UINT32 K_ScaleItemDistance(const player_t* player, UINT32 distance, UINT8 numPlayers) { if (franticitems == true) { @@ -443,6 +444,9 @@ static UINT32 K_ScaleItemDistance(UINT32 distance, UINT8 numPlayers) FRACUNIT + (K_ItemOddsScale(numPlayers) / 2) ); + // Distance is reduced based on the player's exp + distance = FixedMul(distance, min(FRACUNIT, player->exp)); + return distance; } @@ -509,7 +513,7 @@ UINT32 K_GetItemRouletteDistance(const player_t *player, UINT8 numPlayers) } pdis = K_UndoMapScaling(pdis); - pdis = K_ScaleItemDistance(pdis, numPlayers); + pdis = K_ScaleItemDistance(player, pdis, numPlayers); if (player->bot && (player->botvars.rival || cv_levelskull.value)) { @@ -1150,7 +1154,7 @@ static void K_InitRoulette(itemroulette_t *const roulette) && roulette->secondDist > roulette->firstDist) { roulette->secondToFirst = roulette->secondDist - roulette->firstDist; - roulette->secondToFirst = K_ScaleItemDistance(roulette->secondToFirst, 16 - roulette->playing); // Reversed scaling + roulette->secondToFirst = K_ScaleItemDistance(&players[i], roulette->secondToFirst, 16 - roulette->playing); // Reversed scaling } } diff --git a/src/objects/checkpoint.cpp b/src/objects/checkpoint.cpp index c1170d3c9..8850db58a 100644 --- a/src/objects/checkpoint.cpp +++ b/src/objects/checkpoint.cpp @@ -669,12 +669,18 @@ void __attribute__((optimize("O0"))) Obj_CrossCheckpoints(player_t* player, fixe if (player->position == 1) { player->lapPoints += 2; + player->exp += FRACUNIT/10; } else { player->lapPoints += 1; + player->exp += FRACUNIT/20; } } + else if (K_IsPlayerLosing(player)) + { + player->exp -= FRACUNIT/20; + } } mobj_t* Obj_FindCheckpoint(INT32 id) diff --git a/src/p_saveg.c b/src/p_saveg.c index 8ca5c3d09..a9e811961 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -281,6 +281,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].laps); WRITEUINT8(save->p, players[i].latestlap); WRITEUINT32(save->p, players[i].lapPoints); + WRITEINT32(save->p, players[i].exp); WRITEINT32(save->p, players[i].cheatchecknum); WRITEINT32(save->p, players[i].checkpointId); @@ -937,6 +938,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].laps = READUINT8(save->p); // Number of laps (optional) players[i].latestlap = READUINT8(save->p); players[i].lapPoints = READUINT32(save->p); + players[i].exp = READINT32(save->p); players[i].cheatchecknum = READINT32(save->p); players[i].checkpointId = READINT32(save->p); diff --git a/src/p_spec.c b/src/p_spec.c index ef1427938..281ff57c9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2111,15 +2111,21 @@ static void K_HandleLapIncrement(player_t *player) if (inDuel == false && player->position == 1) // 1st place in 1v1 uses thumbs up { player->lapPoints += 2; + player->exp += FRACUNIT/10; } else { player->lapPoints++; + player->exp += FRACUNIT/20; } if (player->laps <= numlaps) K_SpawnAmps(player, 10*(D_NumPlayersInRace() - player->position), player->mo); } + else if (K_IsPlayerLosing(player)) + { + player->exp -= FRACUNIT/20; + } if (player->position == 1 && !(gametyperules & GTR_CHECKPOINTS)) {