diff --git a/src/command.c b/src/command.c index 133bcfd69..66a5e0182 100644 --- a/src/command.c +++ b/src/command.c @@ -74,6 +74,7 @@ static char * COM_Purge (char *text, int *lenp); CV_PossibleValue_t CV_OnOff[] = {{0, "Off"}, {1, "On"}, {0, NULL}}; CV_PossibleValue_t CV_YesNo[] = {{0, "No"}, {1, "Yes"}, {0, NULL}}; +CV_PossibleValue_t CV_Signed[] = {{-999999999, "MIN"}, {999999999, "MAX"}, {0, NULL}}; CV_PossibleValue_t CV_Unsigned[] = {{0, "MIN"}, {999999999, "MAX"}, {0, NULL}}; CV_PossibleValue_t CV_Natural[] = {{1, "MIN"}, {999999999, "MAX"}, {0, NULL}}; diff --git a/src/command.h b/src/command.h index 9aba7d707..1e5a1a19c 100644 --- a/src/command.h +++ b/src/command.h @@ -170,6 +170,7 @@ struct consvar_t //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NULL extern CV_PossibleValue_t CV_OnOff[]; extern CV_PossibleValue_t CV_YesNo[]; +extern CV_PossibleValue_t CV_Signed[]; extern CV_PossibleValue_t CV_Unsigned[]; extern CV_PossibleValue_t CV_Natural[]; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5bfebc63f..a80c36e5c 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -442,8 +442,41 @@ consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVA // Toggles for new features consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartRings_OnChange); + +// Stacking related consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange); +consvar_t cv_kartstacking_calc_arg_offset = CVAR_INIT ("kartstacking_calcargoffset", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_maxvanillaboost = CVAR_INIT ("kartstacking_maxvanillaboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_speedboostdropoff = CVAR_INIT ("kartstacking_speedboostdropoff", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_speedboostdropoff_brake = CVAR_INIT ("kartstacking_speedboostdropoff_brake", "0.05", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +// Vanilla Stacking boosts. +consvar_t cv_kartstacking_sneaker_easyspeedboost = CVAR_INIT ("vanillaboost_sneaker_easyspeedboost", "0.8317", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_normalspeedboost = CVAR_INIT ("vanillaboost_sneaker_normalspeedboost", "0.5", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_hardspeedboost = CVAR_INIT ("vanillaboost_sneaker_hardspeedboost", "0.2756", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT, CV_Natural, NULL); + +consvar_t cv_kartstacking_invincibility_speedboost = CVAR_INIT ("vanillaboost_invincibility_speedboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_accelboost = CVAR_INIT ("vanillaboost_invincibility_accelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +consvar_t cv_kartstacking_grow_speedboost = CVAR_INIT ("vanillaboost_grow_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_grow_accelboost = CVAR_INIT ("vanillaboost_grow_accelboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.80", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +consvar_t cv_kartstacking_start_speedboost = CVAR_INIT ("vanillaboost_start_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_start_accelboost = CVAR_INIT ("vanillaboost_start_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +consvar_t cv_kartstacking_drift_speedboost = CVAR_INIT ("vanillaboost_drift_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drift_accelboost = CVAR_INIT ("vanillaboost_drift_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + +consvar_t cv_kartstacking_ring_speedboost = CVAR_INIT ("vanillaboost_ring_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); + consvar_t cv_kartchaining = CVAR_INIT ("kartchaining", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartChaining_OnChange); +consvar_t cv_kartchainingoffroad = CVAR_INIT ("kartchaining_chainoffroad", "No", CV_NETVAR, CV_YesNo, NULL); consvar_t cv_kartitembreaker = CVAR_INIT ("kartitembreaker", "No", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_YesNo, KartItemBreaker_OnChange); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 35914b448..0fc16f637 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -96,8 +96,40 @@ 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_kartstacking_calc_arg_offset; +extern consvar_t cv_kartstacking_maxvanillaboost; +extern consvar_t cv_kartstacking_speedboostdropoff; +extern consvar_t cv_kartstacking_speedboostdropoff_brake; + +extern consvar_t cv_kartstacking_sneaker_easyspeedboost; +extern consvar_t cv_kartstacking_sneaker_normalspeedboost; +extern consvar_t cv_kartstacking_sneaker_hardspeedboost; +extern consvar_t cv_kartstacking_sneaker_accelboost; +extern consvar_t cv_kartstacking_sneaker_maxgrade; + +extern consvar_t cv_kartstacking_invincibility_speedboost; +extern consvar_t cv_kartstacking_invincibility_accelboost; + +extern consvar_t cv_kartstacking_flame_speedval; +extern consvar_t cv_kartstacking_flame_accelboost; + +extern consvar_t cv_kartstacking_grow_speedboost; +extern consvar_t cv_kartstacking_grow_accelboost; + +extern consvar_t cv_kartstacking_start_speedboost; +extern consvar_t cv_kartstacking_start_accelboost; + +extern consvar_t cv_kartstacking_drift_speedboost; +extern consvar_t cv_kartstacking_drift_accelboost; + +extern consvar_t cv_kartstacking_ring_speedboost; +extern consvar_t cv_kartstacking_ring_accelboost; + extern consvar_t cv_kartchaining; +extern consvar_t cv_kartchainingoffroad; + extern consvar_t cv_kartitembreaker; extern consvar_t cv_kartwalltransfer; extern consvar_t cv_kartpurpledrift; diff --git a/src/d_player.h b/src/d_player.h index 0866cc122..9c337042b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -632,6 +632,7 @@ struct player_t SINT8 stolentimer; // you are being stolen from UINT16 sneakertimer; // Duration of a Sneaker Boost (from Sneakers or level boosters) + UINT16 realsneakertimer;// Duration of a Sneaker Boosts acutal time that doesn't get chained.(used for chainoffroad and tripwires) UINT8 floorboost; // (0 to 3) - Prevents Sneaker sounds for a brief duration when triggered by a floor panel UINT16 chaintimer; // Stores current chain timer length. diff --git a/src/doomdef.h b/src/doomdef.h index 9888fe66e..34d131872 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -101,7 +101,7 @@ extern "C" { #endif -//#define NOMD5 +#define NOMD5 // Uncheck this to compile debugging code //#define RANGECHECK diff --git a/src/info/sounds.h b/src/info/sounds.h index f349a98e4..a1a04fa5e 100644 --- a/src/info/sounds.h +++ b/src/info/sounds.h @@ -1054,6 +1054,9 @@ _(kdtrg1) _(kdtrg2) _(kdtrg3) +// Chaining Sound +_(bstchn) + // Shout message sound effect _(sysmsg) diff --git a/src/k_kart.c b/src/k_kart.c index 6ecb25d65..32f6617d0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -49,6 +49,12 @@ #include "k_follower.h" #include "k_grandprix.h" +consvar_t cv_kartstacking_colorflame = CVAR_INIT ("kartstacking_colorflame", "On", 0, CV_OnOff, NULL); +consvar_t cv_kartstacking_sneakerstacksound = CVAR_INIT ("kartstacking_sneakerstacksound", "On", 0, CV_OnOff, NULL); +consvar_t cv_kartchainingsound = CVAR_INIT ("kartchaining_chainsound", "On", 0, CV_OnOff, NULL); +consvar_t cv_kartdriftsounds = CVAR_INIT ("kartdriftsounds", "On", 0, CV_OnOff, NULL); +consvar_t cv_kartdriftefx = CVAR_INIT ("kartdriftefx", "On", 0, CV_OnOff, NULL); + // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) // franticitems is Frantic Mode items, bool @@ -253,8 +259,44 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_lessflicker); CV_RegisterVar(&cv_kartrings); + + // Stacking CV_RegisterVar(&cv_kartstacking); + CV_RegisterVar(&cv_kartstacking_calc_arg_offset); + CV_RegisterVar(&cv_kartstacking_speedboostdropoff); + CV_RegisterVar(&cv_kartstacking_speedboostdropoff_brake); + CV_RegisterVar(&cv_kartstacking_colorflame); + CV_RegisterVar(&cv_kartstacking_sneakerstacksound); + + // Vanilla Boosts + CV_RegisterVar(&cv_kartstacking_sneaker_easyspeedboost); + CV_RegisterVar(&cv_kartstacking_sneaker_normalspeedboost); + CV_RegisterVar(&cv_kartstacking_sneaker_hardspeedboost); + CV_RegisterVar(&cv_kartstacking_sneaker_accelboost); + CV_RegisterVar(&cv_kartstacking_sneaker_maxgrade); + + CV_RegisterVar(&cv_kartstacking_invincibility_speedboost); + CV_RegisterVar(&cv_kartstacking_invincibility_accelboost); + + CV_RegisterVar(&cv_kartstacking_grow_speedboost); + CV_RegisterVar(&cv_kartstacking_grow_accelboost); + + CV_RegisterVar(&cv_kartstacking_flame_speedval); + CV_RegisterVar(&cv_kartstacking_flame_accelboost); + + CV_RegisterVar(&cv_kartstacking_start_speedboost); + CV_RegisterVar(&cv_kartstacking_start_accelboost); + + CV_RegisterVar(&cv_kartstacking_drift_speedboost); + CV_RegisterVar(&cv_kartstacking_drift_accelboost); + + CV_RegisterVar(&cv_kartstacking_ring_speedboost); + CV_RegisterVar(&cv_kartstacking_ring_accelboost); + CV_RegisterVar(&cv_kartchaining); + CV_RegisterVar(&cv_kartchainingoffroad); + CV_RegisterVar(&cv_kartchainingsound); + CV_RegisterVar(&cv_kartitembreaker); CV_RegisterVar(&cv_newspeedometer); @@ -267,6 +309,10 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartbumpspark); CV_RegisterVar(&cv_kartbumpspring); + + CV_RegisterVar(&cv_kartdriftsounds); + + CV_RegisterVar(&cv_kartdriftefx); } //} @@ -3070,7 +3116,9 @@ void K_MomentumToFacing(player_t *player) boolean K_ApplyOffroad(player_t *player) { - if (player->invincibilitytimer || player->hyudorotimer || player->sneakertimer) + boolean sneakertimer = CANTCHAINOFFROAD ? (player->sneakertimer && player->realsneakertimer) : player->sneakertimer; + + if (player->invincibilitytimer || player->hyudorotimer || sneakertimer) return false; return true; } @@ -3110,7 +3158,7 @@ tripwirepass_t K_TripwirePassConditions(player_t *player) { if ( player->invincibilitytimer || - player->sneakertimer + (player->sneakertimer && player->realsneakertimer) ) return TRIPWIRE_BLASTER; @@ -3302,25 +3350,17 @@ static inline fixed_t K_GetSneakerBoostSpeed(void) switch (gamespeed) { case 0: - return 53740+768; + return EASYSNEAKERSPEEDBOOST; break; case 2: - return 17294+768; + return HARDSNEAKERSPEEDBOOST; break; default: - return 32768; + return NORMALSNEAKERSPEEDBOOST; break; } } -// 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; @@ -3387,20 +3427,22 @@ static void K_GetKartBoostPower(player_t *player) { UINT8 i; fixed_t sneakerspeedboost = K_GetSneakerBoostSpeed(); - for (i = 0; i < player->numsneakers; i++) + UINT8 numsneakers = player->numsneakers ? player->numsneakers : 1; + + for (i = 0; i < numsneakers; i++) { - K_DoBoost(player, sneakerspeedboost, 8*FRACUNIT, true, true); // + ???% top speed, + 800% acceleration + K_DoBoost(player, sneakerspeedboost, SNEAKERACCELBOOST, true, true); // + ???% top speed, + 800% acceleration } } if (player->invincibilitytimer) // Invincibility { - K_DoBoost(player, 3*FRACUNIT/8, 3*FRACUNIT, false, false); // + 37.5% top speed, + 300% acceleration + K_DoBoost(player, INVINSPEEDBOOST, INVINACCELBOOST, false, false); // + 37.5% top speed, + 300% acceleration } if (player->growshrinktimer > 0) // Grow { - K_DoBoost(player, FRACUNIT/5, 0, false, false); // + 20% top speed, + 0% acceleration + K_DoBoost(player, GROWSPEEDBOOST, GROWACCELBOOST, false, false); // + 20% top speed, + 0% acceleration } if (player->flamestore) // Flame Shield dash @@ -3408,28 +3450,27 @@ static void K_GetKartBoostPower(player_t *player) fixed_t dash = K_FlameShieldDashVar(player->flamedash); fixed_t intermediate = 0; fixed_t boost = 0; - fixed_t val = 52428; // Rim idea: diminish starts around 1.2x sneaker speed and plateaus around 1.4-1.5x - fixed_t accel = 3*FRACUNIT; + fixed_t val = FLAMESPEEDVAL; // Rim idea: diminish starts around 1.2x sneaker speed and plateaus around 1.4-1.5x intermediate = FixedDiv(FixedMul(val, FRACUNIT*-1/2) - FRACUNIT/4,-val+FRACUNIT/2); boost = FixedMul(val,(FRACUNIT-FixedDiv(FRACUNIT,(dash+intermediate)))); - K_DoBoost(player, boost, accel, false, false); + K_DoBoost(player, boost, FLAMEACCELBOOST, false, false); } if (player->startboost) // Startup Boost { - K_DoBoost(player, FRACUNIT/4, 6*FRACUNIT, true, true); // + 25% top speed, + 300% acceleration + K_DoBoost(player, STARTSPEEDBOOST, STARTACCELBOOST, true, true); // + 25% top speed, + 600% acceleration } if (player->driftboost) // Drift Boost { - K_DoBoost(player, FRACUNIT/4, 4*FRACUNIT, true, true); // + 25% top speed, + 400% acceleration + K_DoBoost(player, DRIFTSPEEDBOOST, DRIFTACCELBOOST, true, true); // + 25% top speed, + 400% acceleration } if (player->ringboost) // Ring Boost { - K_DoBoost(player, FRACUNIT/5, 4*FRACUNIT, true, true); // + 20% top speed, + 400% acceleration + K_DoBoost(player, RINGSPEEDBOOST, RINGACCELBOOST, true, true); // + 20% top speed, + 400% acceleration } // This should always remain the last boost @@ -5284,6 +5325,7 @@ void K_DoSneaker(player_t *player, INT32 type) } player->sneakertimer = sneakertime; + player->realsneakertimer = sneakertime; if (player->sneakertimer && (player->floorboost == 0 || player->floorboost == 3)) { @@ -5309,6 +5351,7 @@ void K_DoWaterRunPanel(player_t *player) K_SneakerPanelEffect(player, 0); player->sneakertimer = TICRATE*2; + player->realsneakertimer = TICRATE*2; if (player->sneakertimer && (player->floorboost == 0 || player->floorboost == 3)) { @@ -7028,7 +7071,7 @@ static void K_TireGreaseEffect(player_t *player) S_StartSound(player->mo, sfx_screec); } -boolean K_BoostChain(player_t *player, INT32 timer) +boolean K_BoostChain(player_t *player, INT32 timer, boolean chainsound) { if (!chainingactive) { @@ -7039,6 +7082,15 @@ boolean K_BoostChain(player_t *player, INT32 timer) if (timer > player->chaintimer) { // Just what I needed! - Toad + if (cv_kartchainingsound.value && chainsound && player->chaintimer && player->sneakertimer) + { + if (player->mo) + { + // Chain Sound! + S_StartSound(player->mo, sfx_bstchn); + } + } + player->chaintimer = timer; } @@ -7052,11 +7104,11 @@ boolean K_BoostChain(player_t *player, INT32 timer) return false; } -INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement) +INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement, boolean chainsound) { timer -= deincrement; - if (K_BoostChain(player, timer)) + if (K_BoostChain(player, timer, chainsound)) { // Its time to chain. return max(1, timer); @@ -7140,8 +7192,6 @@ static void K_HandleRingDeincrement(player_t *player, boolean chainnerf) */ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { - const boolean onground = P_IsObjectOnGround(player->mo); - /* reset sprite offsets :) */ player->mo->sprxoff = 0; player->mo->spryoff = 0; @@ -7311,7 +7361,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->sneakertimer) { - player->sneakertimer = K_ChainOrDeincrementTime(player, player->sneakertimer, 1); + player->sneakertimer = K_ChainOrDeincrementTime(player, player->sneakertimer, 1, false); if (player->sneakertimer <= 0) { @@ -7320,6 +7370,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if (player->realsneakertimer) + player->realsneakertimer--; + if (player->sneakertimer && player->wipeoutslow > 0 && player->wipeoutslow < wipeoutslowtime+1) player->wipeoutslow = wipeoutslowtime+1; @@ -7327,10 +7380,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->floorboost--; if (player->driftboost) - player->driftboost = K_ChainOrDeincrementTime(player, player->driftboost, 1); + player->driftboost = K_ChainOrDeincrementTime(player, player->driftboost, 1, true); if (player->startboost > 0) - player->startboost = K_ChainOrDeincrementTime(player, player->startboost, 1); + player->startboost = K_ChainOrDeincrementTime(player, player->startboost, 1, false); if (player->invincibilitytimer) player->invincibilitytimer--; @@ -8808,6 +8861,12 @@ INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage) static void K_SpawnDriftEFX(player_t *player,SINT8 level) { + if (!cv_kartdriftefx.value) + { + // Not wanted sorry! + return; + } + mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BOOSTFLAME); P_SetMobjState(overlay, S_DRIFTBOOSTFLAME); P_SetTarget(&overlay->target, player->mo); @@ -8865,8 +8924,11 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->driftboost < 50) player->driftboost = 50; + + if (cv_kartdriftsounds.value) + S_StartSound(player->mo, sfx_kc5b); S_StartSound(player->mo, sfx_s23c); - S_StartSound(player->mo, sfx_kc5b); + K_SpawnDriftEFX(player, 2); player->driftcharge = 0; } @@ -8876,9 +8938,16 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->driftboost < 80) player->driftboost = 80; - S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_kc3c); - S_StartSound(player->mo, sfx_s3k47); + if (cv_kartdriftsounds.value) + { + S_StartSound(player->mo, sfx_kc5b); + S_StartSound(player->mo, sfx_kc3c); + S_StartSound(player->mo, sfx_s3k47); + } + else + { + S_StartSound(player->mo, sfx_s23c); + } K_SpawnDriftEFX(player, 3); player->driftcharge = 0; } @@ -8888,8 +8957,16 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->driftboost < 125) player->driftboost = 125; - S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_kc4d); + if (cv_kartdriftsounds.value) + { + S_StartSound(player->mo, sfx_kc5b); + S_StartSound(player->mo, sfx_kc4d); + } + else + { + S_StartSound(player->mo, sfx_s23c); + } + K_SpawnDriftEFX(player, 4); player->driftcharge = 0; } diff --git a/src/k_kart.h b/src/k_kart.h index 45e80b903..45a1e6d8a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -14,6 +14,12 @@ extern "C" { #endif +extern consvar_t cv_kartstacking_colorflame; +extern consvar_t cv_kartstacking_sneakerstacksound; +extern consvar_t cv_kartchainingsound; +extern consvar_t cv_kartdriftsounds; +extern consvar_t cv_kartdriftefx; + #define KART_FULLTURN 800 /* @@ -31,7 +37,34 @@ Make sure this matches the actual number of states #define FLAMESTOREMAX TICRATE*2 -#define MAXSNEAKERSTACK 3 +// 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 cv_kartstacking_calc_arg_offset.value +#define CALC_RET_OFFSET FixedSqrt(CALC_ARG_OFFSET) +#define MAXVANILLABOOST cv_kartstacking_maxvanillaboost.value +#define SPEEDBOOSTDROPOFF cv_kartstacking_speedboostdropoff.value +#define SPEEDBOOSTDROPOFF_BRAKE cv_kartstacking_speedboostdropoff_brake.value + +// Vanilla Boosts +#define EASYSNEAKERSPEEDBOOST cv_kartstacking_sneaker_easyspeedboost.value +#define NORMALSNEAKERSPEEDBOOST cv_kartstacking_sneaker_normalspeedboost.value +#define HARDSNEAKERSPEEDBOOST cv_kartstacking_sneaker_hardspeedboost.value +#define SNEAKERACCELBOOST cv_kartstacking_sneaker_accelboost.value +#define MAXSNEAKERSTACK cv_kartstacking_sneaker_maxgrade.value +#define INVINSPEEDBOOST cv_kartstacking_invincibility_speedboost.value +#define INVINACCELBOOST cv_kartstacking_invincibility_accelboost.value +#define GROWSPEEDBOOST cv_kartstacking_grow_speedboost.value +#define GROWACCELBOOST cv_kartstacking_grow_accelboost.value +#define FLAMESPEEDVAL cv_kartstacking_flame_speedval.value +#define FLAMEACCELBOOST cv_kartstacking_flame_accelboost.value +#define STARTSPEEDBOOST cv_kartstacking_start_speedboost.value +#define STARTACCELBOOST cv_kartstacking_start_accelboost.value +#define DRIFTSPEEDBOOST cv_kartstacking_drift_speedboost.value +#define DRIFTACCELBOOST cv_kartstacking_drift_accelboost.value +#define RINGSPEEDBOOST cv_kartstacking_ring_speedboost.value +#define RINGACCELBOOST cv_kartstacking_ring_accelboost.value + +#define CANTCHAINOFFROAD (cv_kartchaining.value && !cv_kartchainingoffroad.value) // Used for respawning checks. @@ -196,8 +229,8 @@ boolean K_SafeRespawnPosition(mobj_t * mo); boolean K_RingsActive(void); boolean K_StackingActive(void); boolean K_ChainingActive(void); -boolean K_BoostChain(player_t *player, INT32 timer); -INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement); +boolean K_BoostChain(player_t *player, INT32 timer, boolean chainsound); +INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement, boolean chainsound); boolean K_UsingLegacyCheckpoints(void); void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 6bcccd642..eb69ae4df 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4036,11 +4036,12 @@ static int lib_kBoostChain(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); INT32 timer = luaL_checkinteger(L, 2); + INT32 chainsound = lua_optboolean(L, 3); //HUDSAFE if (!player) return LUA_ErrInvalid(L, "player_t"); - lua_pushboolean(L, K_BoostChain(player, timer)); + lua_pushboolean(L, K_BoostChain(player, timer, chainsound)); return 1; } @@ -4049,11 +4050,12 @@ static int lib_kChainOrDeincrementTime(lua_State *L) player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); INT32 timer = luaL_checkinteger(L, 2); INT32 deincrement = luaL_checkinteger(L, 3); + INT32 chainsound = lua_optboolean(L, 4); //HUDSAFE if (!player) return LUA_ErrInvalid(L, "player_t"); - lua_pushinteger(L, K_ChainOrDeincrementTime(player, timer, deincrement)); + lua_pushinteger(L, K_ChainOrDeincrementTime(player, timer, deincrement, chainsound)); return 1; } diff --git a/src/lua_consolelib.c b/src/lua_consolelib.c index 233a7ee4c..d9cb4ef36 100644 --- a/src/lua_consolelib.c +++ b/src/lua_consolelib.c @@ -590,6 +590,8 @@ int LUA_ConsoleLib(lua_State *L) lua_setglobal(L, "CV_YesNo"); lua_pushlightuserdata(L, CV_Unsigned); lua_setglobal(L, "CV_Unsigned"); + lua_pushlightuserdata(L, CV_Signed); + lua_setglobal(L, "CV_Signed"); lua_pushlightuserdata(L, CV_Natural); lua_setglobal(L, "CV_Natural"); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0dc5ccf63..515c84032 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -263,6 +263,7 @@ enum player_e player_stealingtimer, player_stolentimer, player_sneakertimer, + player_realsneakertimer, player_floorboost, player_chaintimer, player_growshrinktimer, @@ -436,6 +437,7 @@ static const char *const player_opt[] = { "stealingtimer", "stolentimer", "sneakertimer", + "realsneakertimer", "floorboost", "chaintimer", "growshrinktimer", @@ -809,6 +811,9 @@ static int player_get(lua_State *L) case player_sneakertimer: lua_pushinteger(L, plr->sneakertimer); break; + case player_realsneakertimer: + lua_pushinteger(L, plr->realsneakertimer); + break; case player_floorboost: lua_pushinteger(L, plr->floorboost); break; @@ -1403,6 +1408,9 @@ static int player_set(lua_State *L) case player_sneakertimer: plr->sneakertimer = luaL_checkinteger(L, 3); break; + case player_realsneakertimer: + plr->realsneakertimer = luaL_checkinteger(L, 3); + break; case player_floorboost: plr->floorboost = luaL_checkinteger(L, 3); break; diff --git a/src/p_mobj.c b/src/p_mobj.c index ee531b4ff..2c3efefd2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7070,7 +7070,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) return false; } - { player_t *p = NULL; if (mobj->target->target && mobj->target->target->player) @@ -7080,7 +7079,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->angle = mobj->extravalue1 && p ? p->drawangle : mobj->target->angle; P_MoveOrigin(mobj, mobj->target->x + P_ReturnThrustX(mobj, mobj->angle+ANGLE_180, mobj->target->radius), - mobj->target->y + P_ReturnThrustY(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->z); + mobj->target->y + P_ReturnThrustY(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->z+5*mapobjectscale); K_FlipFromObject(mobj, mobj->target); P_SetScale(mobj, mobj->target->scale); @@ -7124,6 +7123,38 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } else { + if (stackingactive && cv_kartstacking_colorflame.value) + { + switch(p->numsneakers) + { + case 0: + case 1: + mobj->colorized = false; + break; + case 2: + mobj->colorized = true; + mobj->color = SKINCOLOR_BLUEBERRY; + break; + case 3: + mobj->colorized = true; + mobj->color = SKINCOLOR_PURPLE; + break; + case 4: + mobj->colorized = true; + mobj->color = SKINCOLOR_MOONSLAM; + break; + case 5: + mobj->colorized = true; + mobj->color = SKINCOLOR_WHITE; + break; + default: + mobj->colorized = true; + mobj->color = SKINCOLOR_WHITE; + break; + + } + } + if (p->sneakertimer > mobj->movecount) P_SetMobjState(mobj, S_BOOSTFLAME); mobj->movecount = p->sneakertimer; diff --git a/src/p_saveg.c b/src/p_saveg.c index 3a6bd771a..d05c02553 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -318,6 +318,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITESINT8(save->p, players[i].stealingtimer); WRITEUINT16(save->p, players[i].sneakertimer); + WRITEUINT16(save->p, players[i].realsneakertimer); WRITEUINT8(save->p, players[i].floorboost); WRITEUINT16(save->p, players[i].chaintimer); @@ -631,6 +632,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].stealingtimer = READSINT8(save->p); players[i].sneakertimer = READUINT16(save->p); + players[i].realsneakertimer = READUINT16(save->p); players[i].floorboost = READUINT8(save->p); players[i].chaintimer = READUINT16(save->p); diff --git a/src/p_setup.c b/src/p_setup.c index f45142c36..9977e7bf2 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -142,9 +142,9 @@ line_t *spawnlines; side_t *spawnsides; INT32 numstarposts; INT32 numbosswaypoints; -boolean ringsactive; -boolean stackingactive; -boolean chainingactive; +boolean ringsactive = false; +boolean stackingactive = false; +boolean chainingactive = false; UINT16 bossdisabled; boolean stoppedclock; boolean levelloading;