mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-28 13:21:10 +00:00
Beyond a certain threshold, forcefully give 2nd a SPB if one's not already out.
This commit is contained in:
parent
0a00a0cebb
commit
b3b5b3f81d
1 changed files with 43 additions and 32 deletions
75
src/k_kart.c
75
src/k_kart.c
|
@ -493,31 +493,31 @@ boolean K_IsPlayerWanted(player_t *player)
|
||||||
#define NUMKARTODDS 80
|
#define NUMKARTODDS 80
|
||||||
|
|
||||||
// Less ugly 2D arrays
|
// Less ugly 2D arrays
|
||||||
static INT32 K_KartItemOddsRace[NUMKARTRESULTS][9] =
|
static INT32 K_KartItemOddsRace[NUMKARTRESULTS][10] =
|
||||||
{
|
{
|
||||||
//P-Odds 0 1 2 3 4 5 6 7 8
|
//P-Odds 0 1 2 3 4 5 6 7 8 9
|
||||||
/*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0 }, // Sneaker
|
/*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0, 0 }, // Sneaker
|
||||||
/*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Rocket Sneaker
|
/*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3, 0 }, // Rocket Sneaker
|
||||||
/*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14 }, // Invincibility
|
/*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14, 0 }, // Invincibility
|
||||||
/*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana
|
/*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana
|
||||||
/*Eggman Monitor*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0 }, // Eggman Monitor
|
/*Eggman Monitor*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0, 0 }, // Eggman Monitor
|
||||||
/*Orbinaut*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0 }, // Orbinaut
|
/*Orbinaut*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0, 0 }, // Orbinaut
|
||||||
/*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz
|
/*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0, 0 }, // Jawz
|
||||||
/*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine
|
/*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0, 0 }, // Mine
|
||||||
/*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog
|
/*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0, 0 }, // Ballhog
|
||||||
/*Self-Propelled Bomb*/ { 0, 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb
|
/*Self-Propelled Bomb*/ { 0, 0, 1, 2, 3, 4, 2, 2, 0,20 }, // Self-Propelled Bomb
|
||||||
/*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Grow
|
/*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3, 0 }, // Grow
|
||||||
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink
|
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // Shrink
|
||||||
/*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield
|
/*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0 }, // Thunder Shield
|
||||||
/*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro
|
/*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0, 0 }, // Hyudoro
|
||||||
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
|
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
|
||||||
/*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink
|
/*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink
|
||||||
/*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0 }, // Sneaker x3
|
/*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0, 0 }, // Sneaker x3
|
||||||
/*Banana x3*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3
|
/*Banana x3*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, // Banana x3
|
||||||
/*Banana x10*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0 }, // Banana x10
|
/*Banana x10*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // Banana x10
|
||||||
/*Orbinaut x3*/ { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // Orbinaut x3
|
/*Orbinaut x3*/ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // Orbinaut x3
|
||||||
/*Orbinaut x4*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // Orbinaut x4
|
/*Orbinaut x4*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Orbinaut x4
|
||||||
/*Jawz x2*/ { 0, 0, 0, 1, 2, 0, 0, 0, 0 } // Jawz x2
|
/*Jawz x2*/ { 0, 0, 0, 1, 2, 0, 0, 0, 0, 0 } // Jawz x2
|
||||||
};
|
};
|
||||||
|
|
||||||
static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] =
|
static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] =
|
||||||
|
@ -706,12 +706,13 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed)
|
||||||
break;
|
break;
|
||||||
case KITEM_SPB:
|
case KITEM_SPB:
|
||||||
//POWERITEMODDS(newodds);
|
//POWERITEMODDS(newodds);
|
||||||
if ((!cv_selfpropelledbomb.value)
|
if (((!cv_selfpropelledbomb.value)
|
||||||
|| (indirectitemcooldown > 0)
|
|| (indirectitemcooldown > 0)
|
||||||
|| (pexiting > 0)
|
|| (pexiting > 0)
|
||||||
|| (secondist/distvar < (4+gamespeed)))
|
|| (secondist/distvar < 3))
|
||||||
|
&& (pos != 9)) // Force SPB
|
||||||
newodds = 0;
|
newodds = 0;
|
||||||
newodds *= min((secondist/distvar)-(3+gamespeed), 3);
|
newodds *= min((secondist/distvar)-4, 3);
|
||||||
break;
|
break;
|
||||||
case KITEM_GROW:
|
case KITEM_GROW:
|
||||||
POWERITEMODDS(newodds);
|
POWERITEMODDS(newodds);
|
||||||
|
@ -770,16 +771,16 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed)
|
||||||
|
|
||||||
//{ SRB2kart Roulette Code - Distance Based, no waypoints
|
//{ SRB2kart Roulette Code - Distance Based, no waypoints
|
||||||
|
|
||||||
static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT32 bestbumper, boolean spbrush)
|
static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT32 bestbumper, boolean spbrush, boolean dontforcespb)
|
||||||
{
|
{
|
||||||
const INT32 distvar = (64*14);
|
const INT32 distvar = (64*14);
|
||||||
INT32 i;
|
INT32 i;
|
||||||
INT32 pdis = 0, useodds = 0;
|
INT32 pdis = 0, useodds = 0;
|
||||||
UINT8 disttable[14];
|
UINT8 disttable[14];
|
||||||
UINT8 distlen = 0;
|
UINT8 distlen = 0;
|
||||||
boolean oddsvalid[9];
|
boolean oddsvalid[10];
|
||||||
|
|
||||||
for (i = 0; i < 9; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
INT32 j;
|
INT32 j;
|
||||||
boolean available = false;
|
boolean available = false;
|
||||||
|
@ -860,6 +861,10 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3
|
||||||
useodds = 0;
|
useodds = 0;
|
||||||
else if (pdis <= 0) // (64*14) * 0 = 0
|
else if (pdis <= 0) // (64*14) * 0 = 0
|
||||||
useodds = disttable[0];
|
useodds = disttable[0];
|
||||||
|
else if (player->kartstuff[k_position] == 2 && pdis > (distvar*6)
|
||||||
|
&& spbplace == -1 && !indirectitemcooldown && !dontforcespb
|
||||||
|
&& oddsvalid[9]) // Force SPB in 2nd
|
||||||
|
useodds = 9;
|
||||||
else if (pdis > distvar * ((12 * distlen) / 14)) // (64*14) * 12 = 10752
|
else if (pdis > distvar * ((12 * distlen) / 14)) // (64*14) * 12 = 10752
|
||||||
useodds = disttable[distlen-1];
|
useodds = disttable[distlen-1];
|
||||||
else
|
else
|
||||||
|
@ -892,6 +897,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||||
INT32 chance = 0, numchoices = 0;
|
INT32 chance = 0, numchoices = 0;
|
||||||
INT32 bestbumper = 0;
|
INT32 bestbumper = 0;
|
||||||
fixed_t mashed = 0;
|
fixed_t mashed = 0;
|
||||||
|
boolean dontforcespb = false;
|
||||||
|
|
||||||
// This makes the roulette cycle through items - if this is 0, you shouldn't be here.
|
// This makes the roulette cycle through items - if this is 0, you shouldn't be here.
|
||||||
if (player->kartstuff[k_itemroulette])
|
if (player->kartstuff[k_itemroulette])
|
||||||
|
@ -905,6 +911,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||||
if (!playeringame[i] || players[i].spectator)
|
if (!playeringame[i] || players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
pingame++;
|
pingame++;
|
||||||
|
if (players[i].exiting)
|
||||||
|
dontforcespb = true;
|
||||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||||
bestbumper = players[i].kartstuff[k_bumper];
|
bestbumper = players[i].kartstuff[k_bumper];
|
||||||
}
|
}
|
||||||
|
@ -987,7 +995,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||||
spawnchance[i] = 0;
|
spawnchance[i] = 0;
|
||||||
|
|
||||||
// Split into another function for a debug function below
|
// Split into another function for a debug function below
|
||||||
useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (spbplace != -1 && player->kartstuff[k_position] == spbplace+1));
|
useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (spbplace != -1 && player->kartstuff[k_position] == spbplace+1), dontforcespb);
|
||||||
|
|
||||||
#define SETITEMRESULT(itemnum) \
|
#define SETITEMRESULT(itemnum) \
|
||||||
for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \
|
for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \
|
||||||
|
@ -7983,6 +7991,7 @@ static void K_drawDistributionDebugger(void)
|
||||||
INT32 pingame = 0, bestbumper = 0;
|
INT32 pingame = 0, bestbumper = 0;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
INT32 x = -9, y = -9;
|
INT32 x = -9, y = -9;
|
||||||
|
boolean dontforcespb = false;
|
||||||
|
|
||||||
if (stplyr != &players[displayplayer]) // only for p1
|
if (stplyr != &players[displayplayer]) // only for p1
|
||||||
return;
|
return;
|
||||||
|
@ -7993,11 +8002,13 @@ static void K_drawDistributionDebugger(void)
|
||||||
if (!playeringame[i] || players[i].spectator)
|
if (!playeringame[i] || players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
pingame++;
|
pingame++;
|
||||||
|
if (players[i].exiting)
|
||||||
|
dontforcespb = true;
|
||||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||||
bestbumper = players[i].kartstuff[k_bumper];
|
bestbumper = players[i].kartstuff[k_bumper];
|
||||||
}
|
}
|
||||||
|
|
||||||
useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (spbplace != -1 && stplyr->kartstuff[k_position] == spbplace+1));
|
useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (spbplace != -1 && stplyr->kartstuff[k_position] == spbplace+1), dontforcespb);
|
||||||
|
|
||||||
for (i = 1; i < NUMKARTRESULTS; i++)
|
for (i = 1; i < NUMKARTRESULTS; i++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue