diff --git a/src/d_player.h b/src/d_player.h index b7cc5d967..ddd752049 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -717,6 +717,7 @@ struct player_t UINT8 confirmVictim; // Player ID that you dealt damage to UINT8 confirmVictimDelay; // Delay before playing the sound + INT32 interpoints; // BlanKart (port from SRB2Kart CEP): override for number of points earned in intermission UINT32 roundscore; // battle score this round UINT8 emeralds; UINT8 bumper; diff --git a/src/g_game.c b/src/g_game.c index be2340a10..3617d4d54 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5117,6 +5117,8 @@ void G_InitNew(UINT8 pencoremode, INT32 map, boolean resetplayer, boolean skippr players[i].totalring = 0; players[i].score = 0; } + + players[i].interpoints = 0; } // Reset unlockable triggers diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 8ed5ba76b..c6a452c0c 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -307,6 +307,7 @@ enum player_e player_breathTimer, player_lastsafelap, player_lastsafestarpost, + player_interpoints, player_roundscore, player_marescore, player_emeralds, @@ -486,6 +487,7 @@ static const char *const player_opt[] = { "breathTimer", "lastsafelap", "lastsafestarpost", + "interpoints", "roundscore", "marescore", "emeralds", @@ -913,6 +915,8 @@ static int player_get(lua_State *L) case player_lastsafestarpost: lua_pushinteger(L, plr->lastsafestarpost); break; + case player_interpoints: + lua_pushinteger(L, plr->interpoints); case player_roundscore: case player_marescore: lua_pushinteger(L, plr->roundscore); @@ -1537,6 +1541,8 @@ static int player_set(lua_State *L) case player_lastsafestarpost: plr->lastsafestarpost = luaL_checkinteger(L, 3); break; + case player_interpoints: + plr->interpoints = luaL_checkinteger(L, 3); case player_roundscore: case player_marescore: plr->roundscore = luaL_checkinteger(L, 3); diff --git a/src/p_saveg.c b/src/p_saveg.c index 4cc9c47a5..868014901 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -354,6 +354,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].confirmVictim); WRITEUINT8(save->p, players[i].confirmVictimDelay); + WRITEINT32(save->p, players[i].interpoints); WRITEUINT32(save->p, players[i].roundscore); WRITEUINT8(save->p, players[i].emeralds); WRITEUINT8(save->p, players[i].bumper); @@ -691,6 +692,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].confirmVictim = READUINT8(save->p); players[i].confirmVictimDelay = READUINT8(save->p); + players[i].interpoints = READINT32(save->p); players[i].roundscore = READUINT32(save->p); players[i].emeralds = READUINT8(save->p); players[i].bumper = READUINT8(save->p); diff --git a/src/y_inter.c b/src/y_inter.c index a98d87205..eb5fef9b0 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -71,7 +71,7 @@ typedef struct char levelstring[64]; // holds levelnames up to 64 characters // SRB2kart - INT16 increase[MAXPLAYERS]; // how much did the score increase by? + INT32 increase[MAXPLAYERS]; // how much did the score increase by? UINT8 jitter[MAXPLAYERS]; // wiggle UINT32 val[MAXPLAYERS]; // Gametype-specific value @@ -211,7 +211,7 @@ static void Y_CompareScore(INT32 i) static void Y_CompareRank(INT32 i) { - INT16 increase = ((data.increase[i] == INT16_MIN) ? 0 : data.increase[i]); + INT32 increase = ((data.increase[i] == INT32_MIN) ? 0 : data.increase[i]); UINT32 score = players[i].score; if (powertype != PWRLV_DISABLED) @@ -291,12 +291,12 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) if (!playeringame[i] || players[i].spectator) { - data.increase[i] = INT16_MIN; + data.increase[i] = INT32_MIN; continue; } if (!rankingsmode) - data.increase[i] = INT16_MIN; + data.increase[i] = INT32_MIN; numplayersingame++; } @@ -336,11 +336,11 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) if (!rankingsmode) { if ((powertype == PWRLV_DISABLED) - && !(players[i].pflags & PF_NOCONTEST) + && (!(players[i].pflags & PF_NOCONTEST) || players[i].interpoints) && (data.pos[data.numplayers] < (numplayersingame + spectateGriefed))) { // Online rank is handled further below in this file. - data.increase[i] = K_CalculateGPRankPoints(data.pos[data.numplayers], numplayersingame + spectateGriefed); + data.increase[i] = players[i].interpoints ? players[i].interpoints : K_CalculateGPRankPoints(data.pos[data.numplayers], numplayersingame + spectateGriefed); players[i].score += data.increase[i]; } @@ -681,9 +681,15 @@ void Y_IntermissionDrawer(void) } else { - if (data.increase[data.num[i]] != INT16_MIN) + if (data.increase[data.num[i]] != INT32_MIN) { - snprintf(strtime, sizeof strtime, "(%d)", data.increase[data.num[i]]); + // Checking player.interpoints so when "negative increase" reaches 0, it keeps the - + char sign = players[data.num[i]].interpoints < 0 ? '-' : '+'; + + if (powertype == PWRLV_DISABLED) + snprintf(strtime, sizeof strtime, "(%c%02d)", sign, abs(data.increase[data.num[i]])); + else + snprintf(strtime, sizeof strtime, "(%d)", data.increase[data.num[i]]); if (data.numplayers > NUMFORNEWCOLUMN) V_DrawRightAlignedThinString(x+133+gutter, y-1, V_6WIDTHSPACE, strtime); @@ -862,7 +868,7 @@ void Y_Ticker(void) { if (data.num[q] == MAXPLAYERS || !data.increase[data.num[q]] - || data.increase[data.num[q]] == INT16_MIN) + || data.increase[data.num[q]] == INT32_MIN) { continue; } @@ -900,8 +906,19 @@ void Y_Ticker(void) // Basic bitch points if (data.increase[data.num[q]]) { - if (--data.increase[data.num[q]]) + INT32 diff = 1; + INT32 increase = data.increase[data.num[q]]; + if (increase > 25) + diff = increase/10; + // This is wordy... But allows negative "increase" + if (increase < 0) + increase += diff; + else + increase -= diff; + + if (increase) kaching = false; + data.increase[data.num[q]] = increase; } } }