diff --git a/src/d_player.h b/src/d_player.h index 2465b90ef..57cbca3cc 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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; diff --git a/src/dehacked.c b/src/dehacked.c index 247101a80..b822ca4d1 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8594,7 +8594,9 @@ static const char *const KARTSTUFF_LIST[] = { "SPRINGSTARS", "SPRINGCOLOR", "KILLFIELD", - "WRONGWAY" + "WRONGWAY", + + "BOTITEMDELAY" }; #endif diff --git a/src/k_bot.c b/src/k_bot.c index c36ff832b..2c9956d46 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -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; + } + } } diff --git a/src/k_kart.c b/src/k_kart.c index 76c532db1..1ce211447 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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;