diff --git a/src/p_user.c b/src/p_user.c index cd6a116ef05a42aa63f6f22a1f0236c2ff7af101..8e8194da0f064a329ca62f29279208efdc787a82 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6705,7 +6705,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad // static void P_DoNiGHTSCapsule(player_t *player) { - INT32 i, spherecount, totalduration, popduration, deductinterval, deductquantity, sphereresult, firstpoptic, startingspheres; + INT32 i, spherecount, totalduration, popduration, deductinterval, deductquantity, sphereresult, firstpoptic; INT32 tictimer = ++player->capsule->extravalue2; if (abs(player->mo->x-player->capsule->x) <= 3*FRACUNIT) @@ -6828,15 +6828,20 @@ static void P_DoNiGHTSCapsule(player_t *player) if (player->capsule->health > sphereresult && player->spheres > 0) { + // If spherecount isn't a multiple of deductquantity, the final deduction might steal too many spheres from the player + // E.g. with 80 capsule health, deductquantity is 3, 3*26 is 78, 78+3=81, and then it'll have stolen more than the 80 that it was meant to! + // So let's adjust deductquantity accordingly for the final deduction + deductquantity = min(deductquantity, player->capsule->health - sphereresult); + player->spheres -= deductquantity; player->capsule->health -= deductquantity; - } - if (player->spheres < 0) - player->spheres = 0; + if (player->spheres < 0) // This can't happen... without Lua, setrings, et cetera + player->spheres = 0; - if (player->capsule->health < sphereresult) - player->capsule->health = sphereresult; + //if (player->capsule->health < sphereresult) // This can't happen + //player->capsule->health = sphereresult; + } } // Spawn a 'pop' for every 2 tics @@ -6857,9 +6862,8 @@ static void P_DoNiGHTSCapsule(player_t *player) } else { - startingspheres = player->spheres - player->capsule->health; + player->spheres -= player->capsule->health; player->capsule->health = 0; - player->spheres = startingspheres; } }