Stacking pt 1

This commit is contained in:
NepDisk 2025-03-21 12:12:23 -04:00
parent 1e47df835a
commit 7069c920df
7 changed files with 120 additions and 23 deletions

View file

@ -150,6 +150,7 @@ static void KartEncore_OnChange(void);
static void KartComeback_OnChange(void);
static void KartEliminateLast_OnChange(void);
static void KartRings_OnChange(void);
static void KartStacking_OnChange(void);
static void Schedule_OnChange(void);
@ -430,20 +431,21 @@ static CV_PossibleValue_t kartbot_cons_t[] = {
};
consvar_t cv_kartbot = CVAR_INIT ("kartbot", "0", CV_NETVAR, kartbot_cons_t, NULL);
consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVAR|CV_CHEAT|CV_CALL, CV_YesNo, KartEliminateLast_OnChange);
consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVAR|CV_CALL, CV_YesNo, KartEliminateLast_OnChange);
// Toggles for new features
consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_YesNo, KartRings_OnChange);
consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartRings_OnChange);
consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange);
consvar_t cv_kartwalltransfer = CVAR_INIT ("BG_forcewalltransfer", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL);
consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR, CV_YesNo, NULL);
consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL);
consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR, CV_YesNo, NULL);
consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "No", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL);
consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "No", CV_NETVAR, CV_YesNo, NULL);
consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "No", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL);
consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "No", CV_NETVAR, CV_YesNo, NULL);
static CV_PossibleValue_t kartdebugitem_cons_t[] =
{
@ -6903,6 +6905,23 @@ static void KartRings_OnChange(void)
}
}
static void KartStacking_OnChange(void)
{
if (K_CanChangeRules() == false)
{
return;
}
if (cv_kartstacking.value)
{
CONS_Printf(M_GetText("Boost Stacking will be turned \"On\" Next Round.\n"));
}
else
{
CONS_Printf(M_GetText("Boost Stacking will be turned \"Off\" Next Round.\n"));
}
}
static void Schedule_OnChange(void)
{
size_t i;

View file

@ -96,6 +96,7 @@ extern consvar_t cv_kartbot;
extern consvar_t cv_karteliminatelast;
extern consvar_t cv_kartusepwrlv;
extern consvar_t cv_kartrings;
extern consvar_t cv_kartstacking;
extern consvar_t cv_kartwalltransfer;
extern consvar_t cv_kartpurpledrift;
extern consvar_t cv_kartbumpspark;

View file

@ -581,6 +581,8 @@ struct player_t
fixed_t boostpower; // Base boost value, for offroad
fixed_t speedboost; // Boost value smoothing for max speed
INT32 numsneakers; // Number of stacked sneakers
INT32 numboosts; // Number of Boosts stacking this frame
fixed_t accelboost; // Boost value smoothing for acceleration
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.

View file

@ -251,6 +251,7 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_lessflicker);
CV_RegisterVar(&cv_kartrings);
CV_RegisterVar(&cv_kartstacking);
CV_RegisterVar(&cv_newspeedometer);
CV_RegisterVar(&cv_showinput);
@ -3297,11 +3298,26 @@ static inline fixed_t K_GetSneakerBoostSpeed(void)
}
}
// Precalculated constants for stacked boost diminishing
// *Somewhat* matches old calc but doesn't use arrays, which makes it faster and more memory efficent
#define CALC_ARG_OFFSET 32*FRACUNIT/100
#define CALC_RET_OFFSET FixedSqrt(CALC_ARG_OFFSET)
#define MAXVANILLABOOST 3*FRACUNIT/8
#define SPEEDBOOSTDROPOFF FloatToFixed(0.01)
#define SPEEDBOOSTDROPOFF_BRAKE FloatToFixed(0.05)
static fixed_t diminish(fixed_t speedboost)
{
return FixedSqrt(speedboost + CALC_ARG_OFFSET) - CALC_RET_OFFSET;
}
// sets boostpower, speedboost and accelboost to whatever we need it to be
static void K_GetKartBoostPower(player_t *player)
{
fixed_t boostpower = FRACUNIT;
fixed_t speedboost = 0, accelboost = 0;
fixed_t nonstack_speedboost = 0, speedboost = 0, accelboost = 0;
INT32 numboosts = 0;
fixed_t prevspeedboost = player->speedboost ? player->speedboost : 0;
if (player->spinouttimer && player->wipeoutslow == 1) // Slow down after you've been bumped
{
@ -3327,26 +3343,40 @@ static void K_GetKartBoostPower(player_t *player)
S_StartSound(player->mo, sfx_cdfm70);
}
#define ADDBOOST(s,a) { \
#define ADDBOOST(s,a,st) { \
if (stackingactive) \
{ \
if (st) \
{ \
numboosts++; \
speedboost += s; \
} \
else \
nonstack_speedboost = max(speedboost,s); \
accelboost = max(accelboost,a); \
} \
else \
{ \
speedboost = max(speedboost,s); \
accelboost = max(accelboost,a); \
} \
}
if (player->sneakertimer) // Sneaker
{
fixed_t sneakerspeedboost = K_GetSneakerBoostSpeed();
ADDBOOST(sneakerspeedboost, 8*FRACUNIT); // + ???% top speed, + 800% acceleration
ADDBOOST(sneakerspeedboost, 8*FRACUNIT, true); // + ???% top speed, + 800% acceleration
}
if (player->invincibilitytimer) // Invincibility
{
ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration
ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT, false); // + 37.5% top speed, + 300% acceleration
}
if (player->growshrinktimer > 0) // Grow
{
ADDBOOST(FRACUNIT/5, 0); // + 20% top speed, + 0% acceleration
ADDBOOST(FRACUNIT/5, 0, false); // + 20% top speed, + 0% acceleration
}
if (player->flamestore) // Flame Shield dash
@ -3360,33 +3390,65 @@ static void K_GetKartBoostPower(player_t *player)
intermediate = FixedDiv(FixedMul(val, FRACUNIT*-1/2) - FRACUNIT/4,-val+FRACUNIT/2);
boost = FixedMul(val,(FRACUNIT-FixedDiv(FRACUNIT,(dash+intermediate))));
ADDBOOST(boost, accel);
ADDBOOST(boost, accel, false);
}
if (player->startboost) // Startup Boost
{
ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 300% acceleration
ADDBOOST(FRACUNIT/4, 6*FRACUNIT, true); // + 25% top speed, + 300% acceleration
}
if (player->driftboost) // Drift Boost
{
ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 25% top speed, + 400% acceleration
ADDBOOST(FRACUNIT/4, 4*FRACUNIT, true); // + 25% top speed, + 400% acceleration
}
if (player->ringboost) // Ring Boost
{
ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration
ADDBOOST(FRACUNIT/5, 4*FRACUNIT, true); // + 20% top speed, + 400% acceleration
}
// This should always remain the last boost stack before tethering
// This should always remain the last boost
if (player->botvars.rubberband > FRACUNIT && K_PlayerUsesBotMovement(player) == true)
{
ADDBOOST(player->botvars.rubberband - FRACUNIT, 0);
ADDBOOST(player->botvars.rubberband - FRACUNIT, 0, false);
}
player->boostpower = boostpower;
if (stackingactive)
{
// Combine nonstack and stacking boosts here.
speedboost = max(nonstack_speedboost ? nonstack_speedboost : 0, diminish(speedboost));
}
// value smoothing
if (stackingactive)
{
// value smoothing
if (player->offroad && K_ApplyOffroad(player))
{
player->speedboost = max(speedboost, player->speedboost)/2;
player->accelboost = max(accelboost, player->accelboost)/2;
}
else if (speedboost >= prevspeedboost)
{
player->speedboost = max(player->speedboost, speedboost);
player->accelboost = max(accelboost, player->accelboost);
}
else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE))
{
player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST));
player->accelboost = max(accelboost, player->accelboost);
}
else
{
player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF, player->speedboost);
player->accelboost = max(accelboost, player->accelboost);
}
}
else
{
if (speedboost > player->speedboost)
{
player->speedboost = speedboost;
@ -3395,8 +3457,10 @@ static void K_GetKartBoostPower(player_t *player)
{
player->speedboost += (speedboost - player->speedboost) / (TICRATE/2);
}
}
player->accelboost = accelboost;
player->numboosts = numboosts;
}
// Returns value based on being Grown or Shrunk otherwise returns FRACUNIT
@ -5177,6 +5241,7 @@ void K_DoSneaker(player_t *player, INT32 type)
}
player->sneakertimer = sneakertime;
player->numsneakers++;
// set angle for spun out players:
player->boostangle = player->mo->angle;
@ -5207,6 +5272,7 @@ void K_DoWaterRunPanel(player_t *player)
}
player->sneakertimer = TICRATE*2;
player->numsneakers++;
player->mo->flags2 |= MF2_WATERRUN;
// set angle for spun out players:

View file

@ -578,6 +578,7 @@ extern UINT16 emeraldspawndelay;
extern INT32 numstarposts;
extern INT32 numbosswaypoints;
extern boolean ringsactive;
extern boolean stackingactive;
extern UINT16 bossdisabled;
extern boolean stoppedclock;

View file

@ -5022,6 +5022,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending)
WRITEINT16(save->p, lastmap);
WRITEUINT16(save->p, bossdisabled);
WRITEUINT8(save->p, ringsactive);
WRITEUINT8(save->p, stackingactive);
for (i = 0; i < 4; i++)
{
@ -5191,6 +5192,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool
lastmap = READINT16(save->p);
bossdisabled = READUINT16(save->p);
ringsactive = READUINT8(save->p);
stackingactive = READUINT8(save->p);
for (i = 0; i < 4; i++)
{

View file

@ -143,6 +143,7 @@ side_t *spawnsides;
INT32 numstarposts;
INT32 numbosswaypoints;
boolean ringsactive;
boolean stackingactive;
UINT16 bossdisabled;
boolean stoppedclock;
boolean levelloading;
@ -7883,6 +7884,11 @@ static void P_InitLevelSettings(boolean reloadinggamestate)
else
ringsactive = false;
if (cv_kartstacking.value)
stackingactive = true;
else
stackingactive = false;
// emerald hunt
hunt1 = hunt2 = hunt3 = NULL;