stacking part 6: Implement customization cvars
This commit is contained in:
parent
a68eb51465
commit
945704849f
15 changed files with 274 additions and 48 deletions
|
|
@ -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}};
|
||||
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
//#define NOMD5
|
||||
#define NOMD5
|
||||
|
||||
// Uncheck this to compile debugging code
|
||||
//#define RANGECHECK
|
||||
|
|
|
|||
|
|
@ -1054,6 +1054,9 @@ _(kdtrg1)
|
|||
_(kdtrg2)
|
||||
_(kdtrg3)
|
||||
|
||||
// Chaining Sound
|
||||
_(bstchn)
|
||||
|
||||
// Shout message sound effect
|
||||
_(sysmsg)
|
||||
|
||||
|
|
|
|||
151
src/k_kart.c
151
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;
|
||||
}
|
||||
|
|
|
|||
39
src/k_kart.h
39
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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
35
src/p_mobj.c
35
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue