From 00aa69ca0a16d1c76a324a805124ef87edbeef03 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Tue, 21 Feb 2023 23:00:56 -0700 Subject: [PATCH] Buff eggbox speed, allow contact transfers --- src/d_player.h | 2 ++ src/k_kart.c | 34 +++++++++++++++++++++++++++++++++- src/k_kart.h | 2 ++ src/k_roulette.c | 2 +- src/p_map.c | 8 ++++++++ src/p_saveg.c | 4 ++++ 6 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index c0e3a361a..e71063fe4 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -659,6 +659,8 @@ struct player_t UINT8 shrinkLaserDelay; + UINT8 eggmanTransferDelay; + mobj_t *stumbleIndicator; #ifdef HWRENDER diff --git a/src/k_kart.c b/src/k_kart.c index 5a73a74bc..1622ce27d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1231,6 +1231,9 @@ static boolean K_HasInfiniteTether(player_t *player) return true; } + if (player->eggmanexplode > 0) + return true; + return false; } @@ -3150,7 +3153,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->eggmanexplode) // Ready-to-explode { - ADDBOOST(3*FRACUNIT/20, FRACUNIT, 0); // + 15% top speed, + 100% acceleration, +0% handling + ADDBOOST(6*FRACUNIT/20, FRACUNIT, 0); // + 30% top speed, + 100% acceleration, +0% handling } if (player->draftpower > 0) // Drafting @@ -7708,6 +7711,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->shrinkLaserDelay) player->shrinkLaserDelay--; + if (player->eggmanTransferDelay) + player->eggmanTransferDelay--; + if (player->ringdelay) player->ringdelay--; @@ -7895,6 +7901,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) else { player->eggmanexplode--; + if (player->eggmanexplode == 5*TICRATE/2) + S_StartSound(player->mo, sfx_s3k53); if (player->eggmanexplode <= 0) { mobj_t *eggsexplode; @@ -11304,4 +11312,28 @@ void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount) } } +void K_EggmanTransfer(player_t *source, player_t *victim) +{ + if (victim->eggmanTransferDelay) + return; + if (victim->eggmanexplode) + return; + + K_AddHitLag(victim->mo, 2, true); + victim->eggmanexplode = 4*TICRATE; + victim->itemRoulette.eggman = false; + victim->itemRoulette.active = false; + + if (P_IsDisplayPlayer(victim) && !demo.freecam) + S_StartSound(NULL, sfx_itrole); + + K_AddHitLag(source->mo, 2, true); + source->eggmanexplode = 0; + source->itemRoulette.eggman = false; + source->itemRoulette.active = false; + source->eggmanTransferDelay = 10; + + S_StopSoundByID(source->mo, sfx_s3k53); +} + //} diff --git a/src/k_kart.h b/src/k_kart.h index 209301301..391b90a3a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -201,6 +201,8 @@ void K_UnsetItemOut(player_t *player); void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount); +void K_EggmanTransfer(player_t *source, player_t *victim); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/k_roulette.c b/src/k_roulette.c index 7eeffc95d..7cbf48d51 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1434,7 +1434,7 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) if (roulette->elapsed > TICRATE>>1) // Prevent accidental immediate item confirm { - if (roulette->elapsed > TICRATE<<4) + if (roulette->elapsed > TICRATE<<4 || (roulette->eggman && roulette->elapsed > TICRATE*4)) { // Waited way too long, forcefully confirm the item. confirmItem = true; diff --git a/src/p_map.c b/src/p_map.c index ed45c1caa..1f7051c10 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1410,6 +1410,14 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) K_PvPTouchDamage(tm.thing, thing); } + if (thing->player->eggmanexplode) + { + K_EggmanTransfer(thing->player, tm.thing->player); + } else if (tm.thing->player->eggmanexplode) + { + K_EggmanTransfer(tm.thing->player, thing->player); + } + return BMIT_CONTINUE; } else if (thing->type == MT_SPECIAL_UFO) diff --git a/src/p_saveg.c b/src/p_saveg.c index 0420d0520..86c4ac3b3 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -393,6 +393,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].shrinkLaserDelay); + WRITEUINT8(save->p, players[i].eggmanTransferDelay); + // respawnvars_t WRITEUINT8(save->p, players[i].respawn.state); WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].respawn.wp)); @@ -746,6 +748,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].shrinkLaserDelay = READUINT8(save->p); + players[i].eggmanTransferDelay = READUINT8(save->p); + // respawnvars_t players[i].respawn.state = READUINT8(save->p); players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save->p);