Rudimentary item usage code

This commit is contained in:
Sally Cochenour 2020-03-29 19:56:05 -04:00
parent 102aca3ab4
commit 774c85d660
4 changed files with 79 additions and 12 deletions

View file

@ -347,6 +347,8 @@ typedef enum
k_killfield, // How long have you been in the kill field, stay in too long and lose a bumper
k_wrongway, // Display WRONG WAY on screen
k_botitemdelay,
NUMKARTSTUFF
} kartstufftype_t;

View file

@ -8594,7 +8594,9 @@ static const char *const KARTSTUFF_LIST[] = {
"SPRINGSTARS",
"SPRINGCOLOR",
"KILLFIELD",
"WRONGWAY"
"WRONGWAY",
"BOTITEMDELAY"
};
#endif

View file

@ -21,6 +21,7 @@
#include "d_net.h" // nodetoplayer
#include "k_kart.h"
#include "z_zone.h"
#include "i_system.h"
void K_AddBots(SINT8 numbots)
{
@ -174,6 +175,10 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
if (!player->mo)
return;
cmd->forwardmove = 0;
cmd->driftturn = 0;
cmd->buttons = 0;
if (player->playerstate == PST_DEAD)
{
cmd->buttons |= BT_ACCELERATE;
@ -188,7 +193,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
if (leveltime <= starttime)
{
if (leveltime >= starttime-50)
if (leveltime >= starttime-35)
cmd->buttons |= BT_ACCELERATE;
return;
}
@ -268,5 +273,34 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
Z_Free(predict);
}
if (player->kartstuff[k_userings] == 1 && !player->exiting)
{
if (player->kartstuff[k_rings] > 10)
cmd->buttons |= BT_ATTACK;
}
else
{
if (player->kartstuff[k_botitemdelay])
return;
switch (player->kartstuff[k_itemtype])
{
case KITEM_SNEAKER:
if (player->kartstuff[k_offroad] || K_GetWaypointIsShortcut(player->nextwaypoint) == true)
cmd->buttons |= BT_ATTACK;
break;
case KITEM_INVINCIBILITY:
case KITEM_SPB:
case KITEM_GROW:
case KITEM_SHRINK:
case KITEM_HYUDORO:
case KITEM_SUPERRING:
cmd->buttons |= BT_ATTACK;
break;
default:
break;
}
}
}

View file

@ -762,6 +762,8 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem)
if (getitem == KITEM_HYUDORO) // Hyudoro cooldown
hyubgone = 5*TICRATE;
player->kartstuff[k_botitemdelay] = TICRATE;
switch (getitem)
{
// Special roulettes first, then the generic ones are handled by default
@ -810,7 +812,7 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem)
\return void
*/
static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush)
static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush, boolean bot)
{
INT32 newodds;
INT32 i;
@ -896,6 +898,27 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp
#define COOLDOWNONSTART (leveltime < (30*TICRATE)+starttime)
if (bot)
{
// TODO: Item use on bots should all be passed-in functions.
// Instead of manually inserting these, it should return 0
// for any items without an item use function supplied
switch (item)
{
case KITEM_SNEAKER:
case KITEM_INVINCIBILITY:
case KITEM_SPB:
case KITEM_GROW:
case KITEM_SHRINK:
case KITEM_HYUDORO:
case KITEM_SUPERRING:
break;
default:
return 0;
}
}
switch (item)
{
case KITEM_ROCKETSNEAKER:
@ -987,7 +1010,7 @@ static UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8
for (j = 1; j < NUMKARTRESULTS; j++)
{
if (K_KartGetItemOdds(i, j, mashed, spbrush) > 0)
if (K_KartGetItemOdds(i, j, mashed, spbrush, player->bot) > 0)
{
available = true;
break;
@ -1275,7 +1298,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
useodds = K_FindUseodds(player, mashed, pdis, bestbumper, spbrush);
for (i = 1; i < NUMKARTRESULTS; i++)
spawnchance[i] = (totalspawnchance += K_KartGetItemOdds(useodds, i, mashed, spbrush));
spawnchance[i] = (totalspawnchance += K_KartGetItemOdds(useodds, i, mashed, spbrush, player->bot));
// Award the player whatever power is rolled
if (totalspawnchance > 0)
@ -2513,6 +2536,13 @@ void K_MomentumToFacing(player_t *player)
player->mo->momy = FixedMul(player->mo->momy - player->cmomy, player->mo->friction) + player->cmomy;
}
static boolean K_ApplyOffroad(player_t *player)
{
if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player))
return false;
return true;
}
// sets k_boostpower, k_speedboost, and k_accelboost to whatever we need it to be
static void K_GetKartBoostPower(player_t *player)
{
@ -2527,8 +2557,7 @@ static void K_GetKartBoostPower(player_t *player)
}
// Offroad is separate, it's difficult to factor it in with a variable value anyway.
if (!(player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player))
&& player->kartstuff[k_offroad] >= 0)
if (K_ApplyOffroad(player) && player->kartstuff[k_offroad] >= 0)
boostpower = FixedDiv(boostpower, FixedMul(player->kartstuff[k_offroad], K_GetKartGameSpeedScalar(gamespeed)) + FRACUNIT);
if (player->kartstuff[k_bananadrag] > TICRATE)
@ -5985,6 +6014,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->powers[pw_flashing]--;
}
if (player->kartstuff[k_botitemdelay])
player->kartstuff[k_botitemdelay]--;
if (player->kartstuff[k_spinouttimer])
{
if ((P_IsObjectOnGround(player->mo)
@ -6866,10 +6898,7 @@ static void K_KartDrift(player_t *player, boolean onground)
// Disable drift-sparks until you're going fast enough
if (player->kartstuff[k_getsparks] == 0
|| (player->kartstuff[k_offroad]
&& !player->kartstuff[k_invincibilitytimer]
&& !player->kartstuff[k_hyudorotimer]
&& !EITHERSNEAKER(player)))
|| (player->kartstuff[k_offroad] && K_ApplyOffroad(player)))
driftadditive = 0;
// Inbetween minspeed and minspeed*2, it'll keep your previous drift-spark state.
@ -11056,7 +11085,7 @@ static void K_drawDistributionDebugger(void)
for (i = 1; i < NUMKARTRESULTS; i++)
{
const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0, spbrush);
const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0, spbrush, stplyr->bot);
if (itemodds <= 0)
continue;