From a2cfacfc2ab3f4d28434a57e02a0b079824333af Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 17:34:25 -0700 Subject: [PATCH 1/6] Rebalanced Invinc --- src/d_player.h | 1 + src/k_kart.c | 13 +++++++++++-- src/lua_playerlib.c | 4 ++++ src/p_inter.c | 8 ++++++++ src/p_saveg.c | 2 ++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 304dcb7bb..48cd80532 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -771,6 +771,7 @@ struct player_t INT16 growshrinktimer; // > 0 = Big, < 0 = small UINT16 rocketsneakertimer; // Rocket Sneaker duration timer UINT16 invincibilitytimer; // Invincibility timer + UINT16 invincibilityextensions; // Used to control invinc time gains when it's already been extended. UINT8 eggmanexplode; // Fake item recieved, explode in a few seconds SINT8 eggmanblame; // (-1 to 15) - Fake item recieved, who set this fake diff --git a/src/k_kart.c b/src/k_kart.c index 3f0c7e48e..211d5f3f0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3281,7 +3281,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->invincibilitytimer) // Invincibility { - ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5% top speed, + 300% acceleration, +25% handling + ADDBOOST(3*FRACUNIT/8 + (FRACUNIT / 1750 * (player->invincibilitytimer)), 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5 + ?% top speed, + 300% acceleration, +25% handling } if (player->growshrinktimer > 0) // Grow @@ -8594,6 +8594,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->invincibilitytimer && onground == true) player->invincibilitytimer--; + if (!player->invincibilitytimer) + player->invincibilityextensions = 0; + if (player->preventfailsafe) player->preventfailsafe--; @@ -11729,7 +11732,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) case KITEM_INVINCIBILITY: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) // Doesn't hold your item slot hostage normally, so you're free to waste it if you have multiple { - K_DoInvincibility(player, 10 * TICRATE); + UINT32 behind = K_GetItemRouletteDistance(player, player->itemRoulette.playing); + UINT32 behindScaled = behind * TICRATE / 2000; + behindScaled = min(behindScaled, 10*TICRATE); + + CONS_Printf("awarding %d from %d distance\n", behindScaled, K_GetItemRouletteDistance(player, player->itemRoulette.playing)); + + K_DoInvincibility(player, 10 * TICRATE + behindScaled); K_PlayPowerGloatSound(player->mo); player->itemamount--; player->botvars.itemconfirm = 0; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 7283b91dc..be0e0b9d3 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -413,6 +413,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->rocketsneakertimer); else if (fastcmp(field,"invincibilitytimer")) lua_pushinteger(L, plr->invincibilitytimer); + else if (fastcmp(field,"invincibilityextensions")) + lua_pushinteger(L, plr->invincibilityextensions); else if (fastcmp(field,"eggmanexplode")) lua_pushinteger(L, plr->eggmanexplode); else if (fastcmp(field,"eggmanblame")) @@ -911,6 +913,8 @@ static int player_set(lua_State *L) plr->rocketsneakertimer = luaL_checkinteger(L, 3); else if (fastcmp(field,"invincibilitytimer")) plr->invincibilitytimer = luaL_checkinteger(L, 3); + else if (fastcmp(field,"invincibilityextensions")) + plr->invincibilityextensions = luaL_checkinteger(L, 3); else if (fastcmp(field,"eggmanexplode")) plr->eggmanexplode = luaL_checkinteger(L, 3); else if (fastcmp(field,"eggmanblame")) diff --git a/src/p_inter.c b/src/p_inter.c index d8512e194..194c394b4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3196,7 +3196,15 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else kinvextend = 5*TICRATE; + // Reduce the value of subsequent invinc extensions + kinvextend = 3 * kinvextend / (3 + source->player->invincibilityextensions); // 75%, 60%, 50%[...] + kinvextend = max(kinvextend, TICRATE); + + source->player->invincibilityextensions++; + source->player->invincibilitytimer += kinvextend; + // This has a scaling boost type now, don't let it get too crazy + source->player->invincibilitytimer = max(source->player->invincibilitytimer, 20*TICRATE); } K_TryHurtSoundExchange(target, source); diff --git a/src/p_saveg.c b/src/p_saveg.c index 176b521f1..04b59c277 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -512,6 +512,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEINT16(save->p, players[i].growshrinktimer); WRITEUINT16(save->p, players[i].rocketsneakertimer); WRITEUINT16(save->p, players[i].invincibilitytimer); + WRITEUINT16(save->p, players[i].invincibilityextensions); WRITEUINT8(save->p, players[i].eggmanexplode); WRITESINT8(save->p, players[i].eggmanblame); @@ -1066,6 +1067,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].growshrinktimer = READINT16(save->p); players[i].rocketsneakertimer = READUINT16(save->p); players[i].invincibilitytimer = READUINT16(save->p); + players[i].invincibilityextensions = READUINT16(save->p); players[i].eggmanexplode = READUINT8(save->p); players[i].eggmanblame = READSINT8(save->p); From e8f0e7b9ebec912b1bf3b2122cae581606b3b8cc Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 17:37:04 -0700 Subject: [PATCH 2/6] Remove invinc scaling debug print --- src/k_kart.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 211d5f3f0..1f7c2d710 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11736,8 +11736,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) UINT32 behindScaled = behind * TICRATE / 2000; behindScaled = min(behindScaled, 10*TICRATE); - CONS_Printf("awarding %d from %d distance\n", behindScaled, K_GetItemRouletteDistance(player, player->itemRoulette.playing)); - K_DoInvincibility(player, 10 * TICRATE + behindScaled); K_PlayPowerGloatSound(player->mo); player->itemamount--; From c3496feb5a69b010ec87c804306c884939d448e0 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 18:07:22 -0700 Subject: [PATCH 3/6] Invinc: More speed, less time --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1f7c2d710..2ebc91b31 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3281,7 +3281,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->invincibilitytimer) // Invincibility { - ADDBOOST(3*FRACUNIT/8 + (FRACUNIT / 1750 * (player->invincibilitytimer)), 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5 + ?% top speed, + 300% acceleration, +25% handling + ADDBOOST(3*FRACUNIT/8 + (FRACUNIT / 1400 * (player->invincibilitytimer)), 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5 + ?% top speed, + 300% acceleration, +25% handling } if (player->growshrinktimer > 0) // Grow @@ -11733,7 +11733,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) // Doesn't hold your item slot hostage normally, so you're free to waste it if you have multiple { UINT32 behind = K_GetItemRouletteDistance(player, player->itemRoulette.playing); - UINT32 behindScaled = behind * TICRATE / 2000; + UINT32 behindScaled = behind * TICRATE / 4000; behindScaled = min(behindScaled, 10*TICRATE); K_DoInvincibility(player, 10 * TICRATE + behindScaled); From 6bedafc02882227604ed216bbcfeb7727ea57f1d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 18:34:39 -0700 Subject: [PATCH 4/6] Invinc: GUNSTAR SOUND BABY --- src/p_inter.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index 194c394b4..3b14f17a0 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3205,6 +3205,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da source->player->invincibilitytimer += kinvextend; // This has a scaling boost type now, don't let it get too crazy source->player->invincibilitytimer = max(source->player->invincibilitytimer, 20*TICRATE); + + if (P_IsDisplayPlayer(source->player)) + S_StartSound(NULL, sfx_gsha7); } K_TryHurtSoundExchange(target, source); From 288a0a389f7b91ac9984bc66b83187acb880afa1 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 18:44:36 -0700 Subject: [PATCH 5/6] Reduce base invinc hit extension --- src/p_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 3b14f17a0..d8b8b652d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3194,7 +3194,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (gametyperules & GTR_CLOSERPLAYERS) kinvextend = 2*TICRATE; else - kinvextend = 5*TICRATE; + kinvextend = 3*TICRATE; // Reduce the value of subsequent invinc extensions kinvextend = 3 * kinvextend / (3 + source->player->invincibilityextensions); // 75%, 60%, 50%[...] From a3e09b3c7f9026cade1bfb3c2022ef98c7033f11 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 31 Dec 2023 19:01:51 -0700 Subject: [PATCH 6/6] Further nerf invinc time return --- src/p_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index d8b8b652d..1f2583000 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3197,7 +3197,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da kinvextend = 3*TICRATE; // Reduce the value of subsequent invinc extensions - kinvextend = 3 * kinvextend / (3 + source->player->invincibilityextensions); // 75%, 60%, 50%[...] + kinvextend = kinvextend / (1 + source->player->invincibilityextensions); // 50%, 33%, 25%[...] kinvextend = max(kinvextend, TICRATE); source->player->invincibilityextensions++;