Add Panel Stack toggle for hardcode stacking

This commit is contained in:
NepDisk 2025-11-20 20:38:00 -05:00
parent 6fc5eb11f8
commit 616e0ecb88
8 changed files with 35 additions and 4 deletions

View file

@ -459,6 +459,9 @@ consvar_t cv_kartstacking_sneaker_expertspeedboost = CVAR_INIT ("vanillaboost_sn
consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_Natural, NULL);
consvar_t cv_kartstacking_sneaker_stackable = CVAR_INIT ("vanillaboost_sneaker_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL);
consvar_t cv_kartstacking_panel_separate = CVAR_INIT ("vanillaboost_panel_separate", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL);
consvar_t cv_kartstacking_panel_maxgrade = CVAR_INIT ("vanillaboost_panel_maxgrade", "2", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_Natural, NULL);
consvar_t cv_kartstacking_invincibility_legacyspeedboost = CVAR_INIT ("vanillaboost_invincibility_legacyspeedboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartstacking_invincibility_legacyaccelboost = CVAR_INIT ("vanillaboost_invincibility_legacyaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL);

View file

@ -109,6 +109,9 @@ extern consvar_t cv_kartstacking_sneaker_expertspeedboost;
extern consvar_t cv_kartstacking_sneaker_accelboost;
extern consvar_t cv_kartstacking_sneaker_maxgrade;
extern consvar_t cv_kartstacking_sneaker_stackable;
extern consvar_t cv_kartstacking_panel_separate;
extern consvar_t cv_kartstacking_panel_maxgrade;
extern consvar_t cv_kartstacking_invincibility_legacyspeedboost;
extern consvar_t cv_kartstacking_invincibility_legacyaccelboost;

View file

@ -589,6 +589,7 @@ struct player_t
angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted.
boostinfo_t boostinfo; // Stores values used for setting speed and accel boosts.
UINT8 numsneakers; // Number of stacked sneakers
UINT8 numpanels; // Number of stacked panels, used for panel stack toggle
UINT8 numboosts; // Number of Boosts stacking this frame
fixed_t draftpower; // (0 to FRACUNIT) - Drafting power, doubles your top speed & acceleration at max

View file

@ -303,6 +303,8 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartstacking_sneaker_accelboost);
CV_RegisterVar(&cv_kartstacking_sneaker_maxgrade);
CV_RegisterVar(&cv_kartstacking_sneaker_stackable);
CV_RegisterVar(&cv_kartstacking_panel_separate);
CV_RegisterVar(&cv_kartstacking_panel_maxgrade);
CV_RegisterVar(&cv_kartstacking_invincibility_legacyspeedboost);
CV_RegisterVar(&cv_kartstacking_invincibility_legacyaccelboost);
@ -2655,7 +2657,7 @@ static void K_GetKartBoostPower(player_t *player)
{
UINT8 i;
fixed_t sneakerspeedboost = K_GetSneakerBoostSpeed();
UINT8 numsneakers = player->numsneakers ? player->numsneakers : 1;
UINT8 numsneakers = max(player->numsneakers + player->numpanels, 1);
for (i = 0; i < numsneakers; i++)
{
@ -4741,9 +4743,19 @@ void K_DoSneaker(player_t *player, INT32 type)
player->sneakertimer = sneakerduration;
player->realsneakertimer = sneakerduration;
if (player->sneakertimer && (player->floorboost == 0 || player->floorboost == 3))
if (SEPARATEPANELS && (type == SNEAKERTYPE_PANEL || type == SNEAKERTYPE_WATERPANEL))
{
player->numsneakers = CLAMP(player->numsneakers+1, 0, stackingactive ? MAXSNEAKERSTACK : 1);
if (player->sneakertimer && (player->floorboost == 0 || player->floorboost == 3))
{
player->numpanels = CLAMP(player->numpanels+1, 0, stackingactive ? MAXPANELSTACK : 1);
}
}
else
{
if (player->sneakertimer && (player->floorboost == 0 || player->floorboost == 3))
{
player->numsneakers = CLAMP(player->numsneakers+1, 0, stackingactive ? MAXSNEAKERSTACK : 1);
}
}
if (type == SNEAKERTYPE_WATERPANEL)
@ -7029,6 +7041,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
{
player->mo->flags2 &= ~MF2_WATERRUN;
player->numsneakers = 0;
player->numpanels = 0;
}
if (player->realsneakertimer)

View file

@ -108,6 +108,8 @@ extern vector3_t clusterpoint, clusterdtf;
#define SNEAKERACCELBOOST CV_Get(&cv_kartstacking_sneaker_accelboost)
#define MAXSNEAKERSTACK CV_Get(&cv_kartstacking_sneaker_maxgrade)
#define SNEAKERSTACKABLE CV_Get(&cv_kartstacking_sneaker_stackable)
#define SEPARATEPANELS CV_Get(&cv_kartstacking_panel_separate)
#define MAXPANELSTACK CV_Get(&cv_kartstacking_panel_maxgrade)
#define INVINSPEEDBOOSTLGC CV_Get(&cv_kartstacking_invincibility_legacyspeedboost)
#define INVINACCELBOOSTLGC CV_Get(&cv_kartstacking_invincibility_legacyaccelboost)

View file

@ -304,6 +304,7 @@ enum player_e
player_boostangle,
player_boostinfo,
player_numsneakers,
player_numpanels,
player_numboosts,
player_draftpower,
player_draftleeway,
@ -519,6 +520,7 @@ static const char *const player_opt[] = {
"boostangle",
"boostinfo",
"numsneakers",
"numpanels",
"numboosts",
"draftpower",
"draftleeway",
@ -906,6 +908,9 @@ static int player_get(lua_State *L)
case player_numsneakers:
lua_pushinteger(L, plr->numsneakers);
break;
case player_numpanels:
lua_pushinteger(L, plr->numpanels);
break;
case player_numboosts:
lua_pushinteger(L, plr->numboosts);
break;
@ -1653,6 +1658,9 @@ static int player_set(lua_State *L)
case player_numsneakers:
plr->numsneakers = luaL_checkinteger(L, 3);
break;
case player_numpanels:
plr->numpanels = luaL_checkinteger(L, 3);
break;
case player_numboosts:
plr->numboosts = luaL_checkinteger(L, 3);
break;

View file

@ -2314,7 +2314,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|| inflictor->type == MT_JAWZ || inflictor->type == MT_JAWZ_SHIELD || inflictor->type == MT_JAWZ_DUD
|| inflictor->type == MT_SMK_THWOMP || inflictor->player)))
{
player->sneakertimer = player->numsneakers = 0;
player->sneakertimer = player->numsneakers = player->numpanels = 0;
player->flamestore = player->flamedash = 0;
player->bubbleboost = 0;
player->mo->flags2 &= ~MF2_WATERRUN;

View file

@ -611,6 +611,7 @@ static void P_NetSyncPlayers(savebuffer_t *save)
SYNC(players[i].accelboost);
SYNC(players[i].boostangle);
SYNC(players[i].numsneakers);
SYNC(players[i].numpanels);
SYNC(players[i].numboosts);
SYNC(players[i].draftpower);