mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-11-17 10:11:12 +00:00
Removed drown, maybe extended post-race time so it doesn't jump to results immediately
Added experimental player distance based items
This commit is contained in:
parent
1ad993236f
commit
1372cf55c9
2 changed files with 167 additions and 11 deletions
170
src/k_kart.c
170
src/k_kart.c
|
@ -302,13 +302,13 @@ void K_RegisterKartStuff(void)
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//{ SRB2kart Roulette Code
|
//{ SRB2kart Roulette Code - Position Based
|
||||||
|
|
||||||
#define NUMKARTITEMS 18
|
#define NUMKARTITEMS 18
|
||||||
#define NUMKARTODDS 40
|
#define NUMKARTODDS 40
|
||||||
|
|
||||||
// Ugly ol' 3D array
|
// Ugly ol' 3D arrays
|
||||||
static INT32 K_KartItemOdds_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] =
|
static INT32 K_KartItemOddsPosition_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] =
|
||||||
{
|
{
|
||||||
// 1 Active Player
|
// 1 Active Player
|
||||||
{ //1st //
|
{ //1st //
|
||||||
|
@ -663,6 +663,30 @@ static INT32 K_KartItemOdds_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] =
|
||||||
} //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t 16t //
|
} //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t 16t //
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Less ugly 2D arrays
|
||||||
|
static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] =
|
||||||
|
{
|
||||||
|
/*Magnet*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet
|
||||||
|
/*Boo*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo
|
||||||
|
/*Mushroom*/ {20, 0, 0, 3, 5, 5, 0, 0, 0 }, // Mushroom
|
||||||
|
/*Triple Mushroom*/ { 0, 0, 0, 1, 3, 7, 6, 4, 0 }, // Triple Mushroom
|
||||||
|
/*Mega Mushroom*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0 }, // Mega Mushroom
|
||||||
|
/*Gold Mushroom*/ { 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom
|
||||||
|
/*Star*/ { 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star
|
||||||
|
|
||||||
|
/*Triple Banana*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana
|
||||||
|
/*Fake Item*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0 }, // Fake Item
|
||||||
|
/*Banana*/ { 0, 9, 6, 2, 1, 0, 0, 0, 0 }, // Banana
|
||||||
|
/*Green Shell*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0 }, // Green Shell
|
||||||
|
/*Red Shell*/ { 0, 0, 1, 4, 3, 1, 0, 0, 0 }, // Red Shell
|
||||||
|
/*Triple Green Shell*/ { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell
|
||||||
|
/*Bob-omb*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Bob-omb
|
||||||
|
/*Blue Shell*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Blue Shell
|
||||||
|
/*Fire Flower*/ { 0, 0, 0, 0, 1, 1, 1, 0, 0 }, // Fire Flower
|
||||||
|
/*Triple Red Shell*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0 }, // Triple Red Shell
|
||||||
|
/*Lightning*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning
|
||||||
|
};
|
||||||
|
|
||||||
/** \brief Item Roulette for Kart
|
/** \brief Item Roulette for Kart
|
||||||
|
|
||||||
\param player player
|
\param player player
|
||||||
|
@ -755,7 +779,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro
|
||||||
|
|
||||||
\return void
|
\return void
|
||||||
*/
|
*/
|
||||||
static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
static void K_KartItemRouletteByPosition(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
INT32 pingame = 0, pexiting = 0;
|
INT32 pingame = 0, pexiting = 0;
|
||||||
|
@ -807,7 +831,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||||
if (ppos < 0) ppos = 0;
|
if (ppos < 0) ppos = 0;
|
||||||
|
|
||||||
#define SETITEMRESULT(pos, numplayers, itemnum) \
|
#define SETITEMRESULT(pos, numplayers, itemnum) \
|
||||||
for (chance = 0; chance < K_KartItemOdds_Retro[numplayers-1][itemnum-1][pos]; chance++) spawnchance[numchoices++] = itemnum
|
for (chance = 0; chance < K_KartItemOddsPosition_Retro[numplayers-1][itemnum-1][pos]; chance++) spawnchance[numchoices++] = itemnum
|
||||||
|
|
||||||
// Check the game type to differentiate odds.
|
// Check the game type to differentiate odds.
|
||||||
//if (gametype == GT_RETRO)
|
//if (gametype == GT_RETRO)
|
||||||
|
@ -882,6 +906,130 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
//{ SRB2kart Roulette Code - Distance Based, no waypoints
|
||||||
|
|
||||||
|
static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
INT32 pingame = 0, pexiting = 0;
|
||||||
|
INT32 roulettestop;
|
||||||
|
INT32 prandom;
|
||||||
|
//INT32 ppos = player->kartstuff[k_position] - 1; // TODO: Delete
|
||||||
|
INT32 pdis = 0, useodds = 0;
|
||||||
|
INT32 spawnchance[NUMKARTITEMS * NUMKARTODDS];
|
||||||
|
INT32 chance = 0, numchoices = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// This makes the roulette cycle through items - if this is 0, you shouldn't be here.
|
||||||
|
if (player->kartstuff[k_itemroulette])
|
||||||
|
player->kartstuff[k_itemroulette]++;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
// This makes the roulette produce the random noises.
|
||||||
|
if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsLocalPlayer(player))
|
||||||
|
S_StartSound(NULL,sfx_mkitm1 + ((player->kartstuff[k_itemroulette] / 3) % 8));
|
||||||
|
|
||||||
|
// Initializes existing spawnchance values
|
||||||
|
for (i = 0; i < (NUMKARTITEMS * NUMKARTODDS); i++)
|
||||||
|
spawnchance[i] = 0;
|
||||||
|
|
||||||
|
// Gotta check how many players are active at this moment.
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (playeringame[i] && !players[i].spectator)
|
||||||
|
pingame++;
|
||||||
|
if (players[i].exiting)
|
||||||
|
pexiting++;
|
||||||
|
}
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (playeringame[i] && !players[i].spectator && players[i].kartstuff[k_position] < player->kartstuff[k_position])
|
||||||
|
pdis = P_AproxDistance(P_AproxDistance( players[i].mo->x - player->mo->x,
|
||||||
|
players[i].mo->y - player->mo->y),
|
||||||
|
players[i].mo->z - player->mo->z) / FRACUNIT
|
||||||
|
* (pingame - players[i].kartstuff[k_position])
|
||||||
|
/ ((pingame - 1) * (pingame + 1) / 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
roulettestop = (TICRATE*1) + (3*(pingame - player->kartstuff[k_position]));
|
||||||
|
|
||||||
|
// If the roulette finishes or the player presses BT_ATTACK, stop the roulette and calculate the item.
|
||||||
|
// I'm returning via the exact opposite, however, to forgo having another bracket embed. Same result either way, I think.
|
||||||
|
// Finally, if you get past this check, now you can actually start calculating what item you get.
|
||||||
|
if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3)
|
||||||
|
|| ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_itemroulette] >= roulettestop)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cmd->buttons & BT_ATTACK)
|
||||||
|
player->pflags |= PF_ATTACKDOWN;
|
||||||
|
|
||||||
|
player->kartstuff[k_itemclose] = 0; // Reset the item window closer.
|
||||||
|
|
||||||
|
if (pingame == 1) useodds = 0;
|
||||||
|
else if (pdis <= 0) useodds = 1;
|
||||||
|
else if (pdis <= 1000) useodds = 2;
|
||||||
|
else if (pdis <= 2000) useodds = 3;
|
||||||
|
else if (pdis <= 3500) useodds = 4;
|
||||||
|
else if (pdis <= 5500) useodds = 5;
|
||||||
|
else if (pdis <= 8000) useodds = 6;
|
||||||
|
else if (pdis <= 11000) useodds = 7;
|
||||||
|
else useodds = 8;
|
||||||
|
|
||||||
|
CONS_Printf("pdis = %d\n", pdis);
|
||||||
|
CONS_Printf("useodds = %d\n", useodds);
|
||||||
|
|
||||||
|
#define SETITEMRESULT(pos, itemnum) \
|
||||||
|
for (chance = 0; chance < K_KartItemOddsDistance_Retro[itemnum-1][pos]; chance++) spawnchance[numchoices++] = itemnum
|
||||||
|
|
||||||
|
// Check the game type to differentiate odds.
|
||||||
|
//if (gametype == GT_RETRO)
|
||||||
|
//{
|
||||||
|
if (cv_magnet.value) SETITEMRESULT(useodds, 1); // Magnet
|
||||||
|
if (cv_boo.value) SETITEMRESULT(useodds, 2); // Boo
|
||||||
|
if (cv_mushroom.value) SETITEMRESULT(useodds, 3); // Mushroom
|
||||||
|
if (cv_mushroom.value) SETITEMRESULT(useodds, 4); // Triple Mushroom
|
||||||
|
if (cv_megashroom.value) SETITEMRESULT(useodds, 5); // Mega Mushroom
|
||||||
|
if (cv_goldshroom.value) SETITEMRESULT(useodds, 6); // Gold Mushroom
|
||||||
|
if (cv_star.value) SETITEMRESULT(useodds, 7); // Star
|
||||||
|
if (cv_triplebanana.value) SETITEMRESULT(useodds, 8); // Triple Banana
|
||||||
|
if (cv_fakeitem.value) SETITEMRESULT(useodds, 9); // Fake Item
|
||||||
|
if (cv_banana.value) SETITEMRESULT(useodds, 10); // Banana
|
||||||
|
if (cv_greenshell.value) SETITEMRESULT(useodds, 11); // Green Shell
|
||||||
|
if (cv_redshell.value) SETITEMRESULT(useodds, 12); // Red Shell
|
||||||
|
if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell
|
||||||
|
if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb
|
||||||
|
if (cv_blueshell.value && pexiting == 0) SETITEMRESULT(useodds, 15); // Blue Shell
|
||||||
|
//if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower
|
||||||
|
if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell
|
||||||
|
if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning
|
||||||
|
|
||||||
|
prandom = P_RandomKey(numchoices);
|
||||||
|
|
||||||
|
// Award the player whatever power is rolled
|
||||||
|
if (numchoices > 0)
|
||||||
|
K_KartGetItemResult(player, spawnchance[prandom], true);
|
||||||
|
else
|
||||||
|
CONS_Printf("ERROR: P_KartItemRoulette - There were no choices given by the roulette (useodds = %d).\n", useodds);
|
||||||
|
//}
|
||||||
|
/*else if (gametype == GT_NEO)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CONS_Printf("ERROR: P_KartItemRoulette - There's no applicable game type!\n");
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef SETITEMRESULT
|
||||||
|
|
||||||
|
player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number
|
||||||
|
|
||||||
|
if (P_IsLocalPlayer(player))
|
||||||
|
S_StartSound(NULL, sfx_mkitmF);
|
||||||
|
}
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
//{ SRB2kart p_user.c Stuff
|
//{ SRB2kart p_user.c Stuff
|
||||||
|
|
||||||
boolean K_IsTouching(mobj_t *mobj1, mobj_t *mobj2)
|
boolean K_IsTouching(mobj_t *mobj1, mobj_t *mobj2)
|
||||||
|
@ -971,10 +1119,14 @@ void K_KartBouncer(void)
|
||||||
for (j = 0; j < MAXPLAYERS; j++)
|
for (j = 0; j < MAXPLAYERS; j++)
|
||||||
players[i].collide[j] = false;
|
players[i].collide[j] = false;
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)
|
||||||
|
&& !players[i].kartstuff[k_growshrinktimer]
|
||||||
|
&& !players[i].kartstuff[k_squishedtimer])
|
||||||
{
|
{
|
||||||
for (j = i+1; j < MAXPLAYERS; j++)
|
for (j = i+1; j < MAXPLAYERS; j++)
|
||||||
if (playeringame[j] && players[j].mo && !P_MobjWasRemoved(players[j].mo))
|
if (playeringame[j] && players[j].mo && !P_MobjWasRemoved(players[j].mo)
|
||||||
|
&& !players[i].kartstuff[k_squishedtimer]
|
||||||
|
&& !players[j].kartstuff[k_growshrinktimer])
|
||||||
{
|
{
|
||||||
if (players[j].mo == players[i].mo)
|
if (players[j].mo == players[i].mo)
|
||||||
break;
|
break;
|
||||||
|
@ -1163,7 +1315,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
else
|
else
|
||||||
player->kartstuff[k_jmp] = 0;
|
player->kartstuff[k_jmp] = 0;
|
||||||
|
|
||||||
K_KartItemRoulette(player, cmd); // Roulette Code
|
// Roulette Code
|
||||||
|
//K_KartItemRouletteByPosition(player, cmd); // Old, position-based
|
||||||
|
K_KartItemRouletteByDistance(player, cmd); // New, distance-based
|
||||||
|
|
||||||
// Stopping of the horrible star SFX
|
// Stopping of the horrible star SFX
|
||||||
if (player->mo->health <= 0 || player->mo->player->kartstuff[k_startimer] <= 0
|
if (player->mo->health <= 0 || player->mo->player->kartstuff[k_startimer] <= 0
|
||||||
|
|
|
@ -9022,6 +9022,7 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
// If 10 seconds are left on the timer,
|
// If 10 seconds are left on the timer,
|
||||||
// begin the drown music for countdown!
|
// begin the drown music for countdown!
|
||||||
|
/*
|
||||||
if (countdown == 11*TICRATE - 1)
|
if (countdown == 11*TICRATE - 1)
|
||||||
{
|
{
|
||||||
if (P_IsLocalPlayer(player))
|
if (P_IsLocalPlayer(player))
|
||||||
|
@ -9030,7 +9031,8 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
// If you've hit the countdown and you haven't made
|
// If you've hit the countdown and you haven't made
|
||||||
// it to the exit, you're a goner!
|
// it to the exit, you're a goner!
|
||||||
else if (countdown == 1 && !player->exiting && player->lives > 0)
|
else */
|
||||||
|
if (countdown == 1 && !player->exiting && player->lives > 0)
|
||||||
{
|
{
|
||||||
if (netgame && player->health > 0)
|
if (netgame && player->health > 0)
|
||||||
CONS_Printf(M_GetText("%s ran out of time.\n"), player_names[player-players]);
|
CONS_Printf(M_GetText("%s ran out of time.\n"), player_names[player-players]);
|
||||||
|
@ -9054,11 +9056,11 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
// If it is set, start subtracting
|
// If it is set, start subtracting
|
||||||
// Don't allow it to go back to 0
|
// Don't allow it to go back to 0
|
||||||
if (player->exiting > 1 && player->exiting < 3*TICRATE)
|
if (player->exiting > 1 && player->exiting < 3*TICRATE && player->exiting > 1) // SRB2kart - " && player->exiting > 1"
|
||||||
player->exiting--;
|
player->exiting--;
|
||||||
|
|
||||||
if (player->exiting && countdown2)
|
if (player->exiting && countdown2)
|
||||||
player->exiting = 5;
|
player->exiting = 99; // SRB2kart
|
||||||
|
|
||||||
if (player->exiting == 2 || countdown2 == 2)
|
if (player->exiting == 2 || countdown2 == 2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue