Merge branch 'purple-spark' into 'master'

Purple sparks

See merge request KartKrew/Kart!424
This commit is contained in:
SteelT 2021-04-21 05:51:32 -04:00
commit 55bcfe48f4
12 changed files with 332 additions and 46 deletions

View file

@ -376,6 +376,7 @@ typedef struct player_s
SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn
fixed_t driftcharge; // Charge your drift so you can release a burst of speed fixed_t driftcharge; // Charge your drift so you can release a burst of speed
UINT8 driftboost; // (0 to 125) - Boost you get from drifting UINT8 driftboost; // (0 to 125) - Boost you get from drifting
UINT8 strongdriftboost; // (0 to 125) - While active, boost from drifting gives a stronger speed increase
SINT8 aizdriftstrat; // (-1 to 1) - Let go of your drift while boosting? Helper for the SICK STRATZ (sliptiding!) you have just unlocked SINT8 aizdriftstrat; // (-1 to 1) - Let go of your drift while boosting? Helper for the SICK STRATZ (sliptiding!) you have just unlocked
INT32 aizdrifttilt; INT32 aizdrifttilt;

View file

@ -3522,6 +3522,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_DRIFTWARNSPARK3", "S_DRIFTWARNSPARK3",
"S_DRIFTWARNSPARK4", "S_DRIFTWARNSPARK4",
// Drift electricity
"S_DRIFTELECTRICITY",
"S_DRIFTELECTRICSPARK",
// Fast lines // Fast lines
"S_FASTLINE1", "S_FASTLINE1",
"S_FASTLINE2", "S_FASTLINE2",
@ -5446,6 +5450,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_DRIFTSPARK", "MT_DRIFTSPARK",
"MT_BRAKEDRIFT", "MT_BRAKEDRIFT",
"MT_DRIFTDUST", "MT_DRIFTDUST",
"MT_DRIFTELECTRICITY",
"MT_DRIFTELECTRICSPARK",
"MT_ROCKETSNEAKER", // Rocket sneakers "MT_ROCKETSNEAKER", // Rocket sneakers

View file

@ -541,6 +541,8 @@ char sprnames[NUMSPRITES + 1][5] =
"DRIF", // Drift Sparks "DRIF", // Drift Sparks
"BDRF", // Brake drift sparks "BDRF", // Brake drift sparks
"DRWS", // Drift dust sparks "DRWS", // Drift dust sparks
"DREL", // Drift electricity
"DRES", // Drift electric sparks
// Kart Items // Kart Items
"RSHE", // Rocket sneaker "RSHE", // Rocket sneaker
@ -4096,6 +4098,9 @@ state_t states[NUMSTATES] =
{SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK4}, // S_DRIFTWARNSPARK3 {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK4}, // S_DRIFTWARNSPARK3
{SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTWARNSPARK4 {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTWARNSPARK4
{SPR_DREL, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|FF_GLOBALANIM, 2, {NULL}, 5, 2, S_NULL}, // S_DRIFTELECTRICITY
{SPR_DRES, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 20, {NULL}, 1, 10, S_NULL}, // S_DRIFTELECTRICSPARK
{SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_FASTLINE2}, // S_FASTLINE1 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_FASTLINE2}, // S_FASTLINE1
{SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FASTLINE3}, // S_FASTLINE2 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FASTLINE3}, // S_FASTLINE2
{SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FASTLINE4}, // S_FASTLINE3 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FASTLINE4}, // S_FASTLINE3
@ -23473,6 +23478,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_DRIFTELECTRICITY
-1, // doomednum
S_DRIFTELECTRICITY, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_DRIFTELECTRICSPARK
-1, // doomednum
S_DRIFTELECTRICSPARK, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
4*FRACUNIT, // speed
9*FRACUNIT, // radius
37*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_ROCKETSNEAKER { // MT_ROCKETSNEAKER
-1, // doomednum -1, // doomednum
S_ROCKETSNEAKER_L, // spawnstate S_ROCKETSNEAKER_L, // spawnstate

View file

@ -1083,6 +1083,8 @@ typedef enum sprite
SPR_DRIF, // Drift Sparks SPR_DRIF, // Drift Sparks
SPR_BDRF, // Brake drift sparks SPR_BDRF, // Brake drift sparks
SPR_DRWS, // Drift dust sparks SPR_DRWS, // Drift dust sparks
SPR_DREL, // Drift electricity
SPR_DRES, // Drift electric sparks
// Kart Items // Kart Items
SPR_RSHE, // Rocket sneaker SPR_RSHE, // Rocket sneaker
@ -4490,6 +4492,10 @@ typedef enum state
S_DRIFTWARNSPARK3, S_DRIFTWARNSPARK3,
S_DRIFTWARNSPARK4, S_DRIFTWARNSPARK4,
// Drift electricity
S_DRIFTELECTRICITY,
S_DRIFTELECTRICSPARK,
// Fast lines // Fast lines
S_FASTLINE1, S_FASTLINE1,
S_FASTLINE2, S_FASTLINE2,
@ -6452,6 +6458,8 @@ typedef enum mobj_type
MT_DRIFTSPARK, MT_DRIFTSPARK,
MT_BRAKEDRIFT, MT_BRAKEDRIFT,
MT_DRIFTDUST, MT_DRIFTDUST,
MT_DRIFTELECTRICITY,
MT_DRIFTELECTRICSPARK,
MT_ROCKETSNEAKER, MT_ROCKETSNEAKER,

View file

@ -1971,6 +1971,7 @@ void K_KartMoveAnimation(player_t *player)
SINT8 destGlanceDir = 0; SINT8 destGlanceDir = 0;
SINT8 drift = player->drift; SINT8 drift = player->drift;
// Uses turning over steering -- it's important to show player feedback immediately.
if (player->cmd.turning < -minturn) if (player->cmd.turning < -minturn)
{ {
turndir = -1; turndir = -1;
@ -2534,9 +2535,16 @@ static void K_GetKartBoostPower(player_t *player)
} }
if (player->driftboost) // Drift Boost if (player->driftboost) // Drift Boost
{
if (player->strongdriftboost) // Purple/Rainbow drift boost
{
ADDBOOST(FRACUNIT/3, 4*FRACUNIT, 0); // + 33% top speed, + 400% acceleration, +0% handling
}
else
{ {
ADDBOOST(FRACUNIT/4, 4*FRACUNIT, 0); // + 25% top speed, + 400% acceleration, +0% handling ADDBOOST(FRACUNIT/4, 4*FRACUNIT, 0); // + 25% top speed, + 400% acceleration, +0% handling
} }
}
if (player->ringboost) // Ring Boost if (player->ringboost) // Ring Boost
{ {
@ -3536,7 +3544,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
UINT16 K_DriftSparkColor(player_t *player, INT32 charge) UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
{ {
INT32 ds = K_GetKartDriftSparkValue(player); const INT32 dsone = K_GetKartDriftSparkValueForStage(player, 1);
const INT32 dstwo = K_GetKartDriftSparkValueForStage(player, 2);
const INT32 dsthree = K_GetKartDriftSparkValueForStage(player, 3);
const INT32 dsfour = K_GetKartDriftSparkValueForStage(player, 4);
UINT16 color = SKINCOLOR_NONE; UINT16 color = SKINCOLOR_NONE;
if (charge < 0) if (charge < 0)
@ -3544,10 +3556,10 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
// Stage 0: Yellow // Stage 0: Yellow
color = SKINCOLOR_GOLD; color = SKINCOLOR_GOLD;
} }
else if (charge >= ds*4) else if (charge >= dsfour)
{ {
// Stage 3: Rainbow // Stage 4: Rainbow
if (charge <= (ds*4)+(32*3)) if (charge <= dsfour+(32*3))
{ {
// transition // transition
color = SKINCOLOR_SILVER; color = SKINCOLOR_SILVER;
@ -3557,23 +3569,41 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
color = K_RainbowColor(leveltime); color = K_RainbowColor(leveltime);
} }
} }
else if (charge >= ds*2) else if (charge >= dsthree)
{
// Stage 3: Purple
if (charge <= dsthree+(16*3))
{
// transition 1
color = SKINCOLOR_TAFFY;
}
else if (charge <= dsthree+(32*3))
{
// transition 2
color = SKINCOLOR_MOONSET;
}
else
{
color = SKINCOLOR_PURPLE;
}
}
else if (charge >= dstwo)
{ {
// Stage 2: Blue // Stage 2: Blue
if (charge <= (ds*2)+(32*3)) if (charge <= dstwo+(32*3))
{ {
// transition // transition
color = SKINCOLOR_PURPLE; color = SKINCOLOR_NOVA;
} }
else else
{ {
color = SKINCOLOR_SAPPHIRE; color = SKINCOLOR_SAPPHIRE;
} }
} }
else if (charge >= ds) else if (charge >= dsone)
{ {
// Stage 1: Red // Stage 1: Red
if (charge <= (ds)+(32*3)) if (charge <= dsone+(32*3))
{ {
// transition // transition
color = SKINCOLOR_TANGERINE; color = SKINCOLOR_TANGERINE;
@ -3587,9 +3617,102 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
return color; return color;
} }
static void K_SpawnDriftElectricity(player_t *player)
{
UINT8 i;
UINT16 color = K_DriftSparkColor(player, player->driftcharge);
mobj_t *mo = player->mo;
fixed_t vr = FixedDiv(mo->radius/3, mo->scale); // P_SpawnMobjFromMobj will rescale
fixed_t horizontalradius = FixedDiv(5*mo->radius/3, mo->scale);
angle_t verticalangle = K_MomentumAngle(mo) + ANGLE_180; // points away from the momentum angle
for (i = 0; i < 2; i++)
{
// i == 0 is right, i == 1 is left
mobj_t *spark;
angle_t horizonatalangle = verticalangle + (i ? ANGLE_90 : ANGLE_270);
angle_t sparkangle = verticalangle + ANGLE_180;
fixed_t verticalradius = vr; // local version of the above so we can modify it
fixed_t scalefactor = 0; // positive values enlarge sparks, negative values shrink them
fixed_t x, y;
if (player->drift == 0)
; // idk what you're doing spawning drift sparks when you're not drifting but you do you
else
{
scalefactor = -(2*i - 1) * min(max(player->steering, -1), 1) * FRACUNIT;
if ((player->drift > 0) == !(i)) // inwards spark should be closer to the player
verticalradius = 0;
}
x = P_ReturnThrustX(mo, verticalangle, verticalradius)
+ P_ReturnThrustX(mo, horizonatalangle, horizontalradius);
y = P_ReturnThrustY(mo, verticalangle, verticalradius)
+ P_ReturnThrustY(mo, horizonatalangle, horizontalradius);
spark = P_SpawnMobjFromMobj(mo, x, y, 0, MT_DRIFTELECTRICITY);
spark->angle = sparkangle;
spark->color = color;
K_GenericExtraFlagsNoZAdjust(spark, mo);
spark->spritexscale += scalefactor/3;
spark->spriteyscale += scalefactor/8;
}
}
void K_SpawnDriftElectricSparks(player_t *player)
{
SINT8 hdir, vdir, i;
mobj_t *mo = player->mo;
angle_t momangle = K_MomentumAngle(mo) + ANGLE_180;
fixed_t radius = 2 * FixedDiv(mo->radius, mo->scale); // P_SpawnMobjFromMobj will rescale
fixed_t x = P_ReturnThrustX(mo, momangle, radius);
fixed_t y = P_ReturnThrustY(mo, momangle, radius);
fixed_t z = FixedDiv(mo->height, 2 * mo->scale); // P_SpawnMobjFromMobj will rescale
fixed_t sparkspeed = mobjinfo[MT_DRIFTELECTRICSPARK].speed;
fixed_t sparkradius = 2 * mobjinfo[MT_DRIFTELECTRICSPARK].radius;
UINT16 color = K_DriftSparkColor(player, player->driftcharge);
// if the sparks are spawned from first blood rather than drift boost, color will be SKINCOLOR_NONE. ew!
if (color == SKINCOLOR_NONE)
color = SKINCOLOR_SILVER;
for (hdir = -1; hdir <= 1; hdir += 2)
{
for (vdir = -1; vdir <= 1; vdir += 2)
{
fixed_t hspeed = FixedMul(hdir * sparkspeed, mo->scale); // P_InstaThrust treats speed as absolute
fixed_t vspeed = vdir * sparkspeed; // P_SetObjectMomZ scales speed with object scale
angle_t sparkangle = mo->angle + ANGLE_45;
for (i = 0; i < 4; i++)
{
fixed_t xoff = P_ReturnThrustX(mo, sparkangle, sparkradius);
fixed_t yoff = P_ReturnThrustY(mo, sparkangle, sparkradius);
mobj_t *spark = P_SpawnMobjFromMobj(mo, x + xoff, y + yoff, z, MT_DRIFTELECTRICSPARK);
spark->angle = sparkangle;
spark->color = color;
P_InstaThrust(spark, mo->angle + ANGLE_90, hspeed);
P_SetObjectMomZ(spark, vspeed, false);
spark->momx += mo->momx; // copy player speed
spark->momy += mo->momy;
sparkangle += ANGLE_90;
}
}
}
S_StartSound(mo, sfx_s3k45);
}
static void K_SpawnDriftSparks(player_t *player) static void K_SpawnDriftSparks(player_t *player)
{ {
INT32 ds = K_GetKartDriftSparkValue(player); const INT32 dsone = K_GetKartDriftSparkValueForStage(player, 1);
const INT32 dstwo = K_GetKartDriftSparkValueForStage(player, 2);
const INT32 dsthree = K_GetKartDriftSparkValueForStage(player, 3);
const INT32 dsfour = K_GetKartDriftSparkValueForStage(player, 4);
fixed_t newx; fixed_t newx;
fixed_t newy; fixed_t newy;
mobj_t *spark; mobj_t *spark;
@ -3604,7 +3727,7 @@ static void K_SpawnDriftSparks(player_t *player)
return; return;
if (!player->drift if (!player->drift
|| (player->driftcharge < ds && !(player->driftcharge < 0))) || (player->driftcharge < dsone && !(player->driftcharge < 0)))
return; return;
travelangle = player->mo->angle-(ANGLE_45/5)*player->drift; travelangle = player->mo->angle-(ANGLE_45/5)*player->drift;
@ -3634,13 +3757,13 @@ static void K_SpawnDriftSparks(player_t *player)
// Stage 0: Yellow // Stage 0: Yellow
size = 0; size = 0;
} }
else if (player->driftcharge >= ds*4) else if (player->driftcharge >= dsfour)
{ {
// Stage 3: Rainbow // Stage 4: Rainbow
size = 2; size = 2;
trail = 2; trail = 2;
if (player->driftcharge <= (ds*4)+(32*3)) if (player->driftcharge <= (dsfour)+(32*3))
{ {
// transition // transition
P_SetScale(spark, (spark->destscale = spark->scale*3/2)); P_SetScale(spark, (spark->destscale = spark->scale*3/2));
@ -3651,13 +3774,25 @@ static void K_SpawnDriftSparks(player_t *player)
spark->colorized = true; spark->colorized = true;
} }
} }
else if (player->driftcharge >= ds*2) else if (player->driftcharge >= dsthree)
{
// Stage 3: Purple
size = 2;
trail = 1;
if (player->driftcharge <= dsthree+(32*3))
{
// transition
P_SetScale(spark, (spark->destscale = spark->scale*3/2));
}
}
else if (player->driftcharge >= dstwo)
{ {
// Stage 2: Blue // Stage 2: Blue
size = 2; size = 2;
trail = 1; trail = 1;
if (player->driftcharge <= (ds*2)+(32*3)) if (player->driftcharge <= dstwo+(32*3))
{ {
// transition // transition
P_SetScale(spark, (spark->destscale = spark->scale*3/2)); P_SetScale(spark, (spark->destscale = spark->scale*3/2));
@ -3668,15 +3803,15 @@ static void K_SpawnDriftSparks(player_t *player)
// Stage 1: Red // Stage 1: Red
size = 1; size = 1;
if (player->driftcharge <= (ds)+(32*3)) if (player->driftcharge <= dsone+(32*3))
{ {
// transition // transition
P_SetScale(spark, (spark->destscale = spark->scale*2)); P_SetScale(spark, (spark->destscale = spark->scale*2));
} }
} }
if ((player->drift > 0 && player->cmd.turning > 0) // Inward drifts if ((player->drift > 0 && player->steering > 0) // Inward drifts
|| (player->drift < 0 && player->cmd.turning < 0)) || (player->drift < 0 && player->steering < 0))
{ {
if ((player->drift < 0 && (i & 1)) if ((player->drift < 0 && (i & 1))
|| (player->drift > 0 && !(i & 1))) || (player->drift > 0 && !(i & 1)))
@ -3689,8 +3824,8 @@ static void K_SpawnDriftSparks(player_t *player)
size--; size--;
} }
} }
else if ((player->drift > 0 && player->cmd.turning < 0) // Outward drifts else if ((player->drift > 0 && player->steering < 0) // Outward drifts
|| (player->drift < 0 && player->cmd.turning > 0)) || (player->drift < 0 && player->steering > 0))
{ {
if ((player->drift < 0 && (i & 1)) if ((player->drift < 0 && (i & 1))
|| (player->drift > 0 && !(i & 1))) || (player->drift > 0 && !(i & 1)))
@ -3716,6 +3851,11 @@ static void K_SpawnDriftSparks(player_t *player)
K_MatchGenericExtraFlags(spark, player->mo); K_MatchGenericExtraFlags(spark, player->mo);
} }
if (player->driftcharge >= dsthree)
{
K_SpawnDriftElectricity(player);
}
} }
static void K_SpawnAIZDust(player_t *player) static void K_SpawnAIZDust(player_t *player)
@ -6397,6 +6537,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->driftboost) if (player->driftboost)
player->driftboost--; player->driftboost--;
if (player->strongdriftboost)
player->strongdriftboost--;
if (player->startboost) if (player->startboost)
player->startboost--; player->startboost--;
@ -7186,10 +7329,32 @@ INT32 K_GetKartDriftSparkValue(player_t *player)
return (26*4 + player->kartspeed*2 + (9 - player->kartweight))*8; return (26*4 + player->kartspeed*2 + (9 - player->kartweight))*8;
} }
INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage)
{
fixed_t mul = FRACUNIT;
// This code is function is pretty much useless now that the timing changes are linear but bleh.
switch (stage)
{
case 2:
mul = 2*FRACUNIT; // x2
break;
case 3:
mul = 3*FRACUNIT; // x3
break;
case 4:
mul = 4*FRACUNIT; // x4
break;
}
return (FixedMul(K_GetKartDriftSparkValue(player) * FRACUNIT, mul) / FRACUNIT);
}
/* /*
Stage 1: red sparks Stage 1: red sparks
Stage 2: blue sparks Stage 2: blue sparks
Stage 3: big large rainbow sparks Stage 3: purple sparks
Stage 4: big large rainbow sparks
Stage 0: air failsafe Stage 0: air failsafe
*/ */
void K_SpawnDriftBoostExplosion(player_t *player, int stage) void K_SpawnDriftBoostExplosion(player_t *player, int stage)
@ -7215,6 +7380,13 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage)
break; break;
case 3: case 3:
overlay->color = SKINCOLOR_PURPLE;
overlay->fuse = 48;
S_StartSound(player->mo, sfx_kc5b);
break;
case 4:
overlay->color = SKINCOLOR_SILVER; overlay->color = SKINCOLOR_SILVER;
overlay->fuse = 120; overlay->fuse = 120;
@ -7235,9 +7407,10 @@ static void K_KartDrift(player_t *player, boolean onground)
{ {
const fixed_t minspeed = (10 * player->mo->scale); const fixed_t minspeed = (10 * player->mo->scale);
const INT32 dsone = K_GetKartDriftSparkValue(player); const INT32 dsone = K_GetKartDriftSparkValueForStage(player, 1);
const INT32 dstwo = dsone*2; const INT32 dstwo = K_GetKartDriftSparkValueForStage(player, 2);
const INT32 dsthree = dstwo*2; const INT32 dsthree = K_GetKartDriftSparkValueForStage(player, 3);
const INT32 dsfour = K_GetKartDriftSparkValueForStage(player, 4);
const UINT16 buttons = K_GetKartButtons(player); const UINT16 buttons = K_GetKartButtons(player);
@ -7286,16 +7459,33 @@ static void K_KartDrift(player_t *player, boolean onground)
K_SpawnDriftBoostExplosion(player, 2); K_SpawnDriftBoostExplosion(player, 2);
} }
else if (player->driftcharge >= dsthree) else if (player->driftcharge < dsfour)
{ {
// Stage 3: Rainbow sparks // Stage 3: Purple sparks
if (!onground)
P_Thrust(player->mo, pushdir, ( 5 * player->speed ) / 12);
if (player->driftboost < 85)
player->driftboost = 85;
if (player->strongdriftboost < 85)
player->strongdriftboost = 85;
K_SpawnDriftBoostExplosion(player, 3);
K_SpawnDriftElectricSparks(player);
}
else if (player->driftcharge >= dsfour)
{
// Stage 4: Rainbow sparks
if (!onground) if (!onground)
P_Thrust(player->mo, pushdir, player->speed / 2); P_Thrust(player->mo, pushdir, player->speed / 2);
if (player->driftboost < 125) if (player->driftboost < 125)
player->driftboost = 125; player->driftboost = 125;
if (player->strongdriftboost < 125)
player->strongdriftboost = 125;
K_SpawnDriftBoostExplosion(player, 3); K_SpawnDriftBoostExplosion(player, 4);
K_SpawnDriftElectricSparks(player);
} }
} }
@ -7323,6 +7513,8 @@ static void K_KartDrift(player_t *player, boolean onground)
else if (player->speed > minspeed else if (player->speed > minspeed
&& (player->drift == 0 || (player->pflags & PF_DRIFTEND))) && (player->drift == 0 || (player->pflags & PF_DRIFTEND)))
{ {
// Uses turning over steering, since this is very binary.
// Using steering would cause a lot more "wrong drifts".
if (player->cmd.turning > 0) if (player->cmd.turning > 0)
{ {
// Starting left drift // Starting left drift
@ -7359,10 +7551,10 @@ static void K_KartDrift(player_t *player, boolean onground)
if (player->drift > 5) if (player->drift > 5)
player->drift = 5; player->drift = 5;
if (player->cmd.turning > 0) // Inward if (player->steering > 0) // Inward
driftadditive += abs(player->cmd.turning)/100; driftadditive += abs(player->steering)/100;
if (player->cmd.turning < 0) // Outward if (player->steering < 0) // Outward
driftadditive -= abs(player->cmd.turning)/75; driftadditive -= abs(player->steering)/75;
} }
else if (player->drift <= -1) // Drifting to the right else if (player->drift <= -1) // Drifting to the right
{ {
@ -7370,10 +7562,10 @@ static void K_KartDrift(player_t *player, boolean onground)
if (player->drift < -5) if (player->drift < -5)
player->drift = -5; player->drift = -5;
if (player->cmd.turning < 0) // Inward if (player->steering < 0) // Inward
driftadditive += abs(player->cmd.turning)/100; driftadditive += abs(player->steering)/100;
if (player->cmd.turning > 0) // Outward if (player->steering > 0) // Outward
driftadditive -= abs(player->cmd.turning)/75; driftadditive -= abs(player->steering)/75;
} }
// Disable drift-sparks until you're going fast enough // Disable drift-sparks until you're going fast enough
@ -7437,9 +7629,9 @@ static void K_KartDrift(player_t *player, boolean onground)
} }
if ((player->handleboost == 0) if ((player->handleboost == 0)
|| (!player->cmd.turning) || (!player->steering)
|| (!player->aizdriftstrat) || (!player->aizdriftstrat)
|| (player->cmd.turning > 0) != (player->aizdriftstrat > 0)) || (player->steering > 0) != (player->aizdriftstrat > 0))
{ {
if (!player->drift) if (!player->drift)
player->aizdriftstrat = 0; player->aizdriftstrat = 0;
@ -7772,7 +7964,7 @@ static void K_KartSpindash(player_t *player)
return; return;
} }
if (player->speed == 0 && cmd->turning != 0 && leveltime % 8 == 0) if (player->speed == 0 && player->steering != 0 && leveltime % 8 == 0)
{ {
// Rubber burn turn sfx // Rubber burn turn sfx
S_StartSound(player->mo, sfx_ruburn); S_StartSound(player->mo, sfx_ruburn);
@ -8609,7 +8801,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else if (!(player->pflags & PF_TRICKDELAY)) // don't allow tricking at the same frame you tumble obv else if (!(player->pflags & PF_TRICKDELAY)) // don't allow tricking at the same frame you tumble obv
{ {
// Uses cmd->turning over steering intentionally.
if (cmd->turning > 0) if (cmd->turning > 0)
{ {
P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*5/2)); P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*5/2));

View file

@ -85,7 +85,9 @@ boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
void K_UpdateSteeringValue(player_t *player, INT16 destSteering); void K_UpdateSteeringValue(player_t *player, INT16 destSteering);
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
INT32 K_GetKartDriftSparkValue(player_t *player); INT32 K_GetKartDriftSparkValue(player_t *player);
INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage);
void K_SpawnDriftBoostExplosion(player_t *player, int stage); void K_SpawnDriftBoostExplosion(player_t *player, int stage);
void K_SpawnDriftElectricSparks(player_t *player);
void K_KartUpdatePosition(player_t *player); void K_KartUpdatePosition(player_t *player);
mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 type, UINT8 amount); mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 type, UINT8 amount);
void K_DropItems(player_t *player); void K_DropItems(player_t *player);

View file

@ -150,7 +150,7 @@ void K_DoIngameRespawn(player_t *player)
K_DoFault(player); K_DoFault(player);
player->ringboost = 0; player->ringboost = 0;
player->driftboost = 0; player->driftboost = player->strongdriftboost = 0;
// If player was tumbling, set variables so that they don't tumble like crazy after they're done respawning // If player was tumbling, set variables so that they don't tumble like crazy after they're done respawning
if (player->tumbleBounces > 0) if (player->tumbleBounces > 0)

View file

@ -244,6 +244,8 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->driftcharge); lua_pushinteger(L, plr->driftcharge);
else if (fastcmp(field,"driftboost")) else if (fastcmp(field,"driftboost"))
lua_pushinteger(L, plr->driftboost); lua_pushinteger(L, plr->driftboost);
else if (fastcmp(field,"strongdriftboost"))
lua_pushinteger(L, plr->strongdriftboost);
else if (fastcmp(field,"aizdriftstraft")) else if (fastcmp(field,"aizdriftstraft"))
lua_pushinteger(L, plr->aizdriftstrat); lua_pushinteger(L, plr->aizdriftstrat);
else if (fastcmp(field,"aizdrifttilt")) else if (fastcmp(field,"aizdrifttilt"))

View file

@ -1865,7 +1865,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
} }
player->sneakertimer = player->numsneakers = 0; player->sneakertimer = player->numsneakers = 0;
player->driftboost = 0; player->driftboost = player->strongdriftboost = 0;
player->ringboost = 0; player->ringboost = 0;
switch (type) switch (type)

View file

@ -5602,6 +5602,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
mobj->renderflags ^= RF_DONTDRAW; mobj->renderflags ^= RF_DONTDRAW;
break; break;
case MT_SPINDASHWIND: case MT_SPINDASHWIND:
case MT_DRIFTELECTRICSPARK:
mobj->renderflags ^= RF_DONTDRAW; mobj->renderflags ^= RF_DONTDRAW;
break; break;
case MT_VWREF: case MT_VWREF:
@ -6473,7 +6474,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
} }
else if (mobj->fuse <= 32) else if (mobj->fuse <= 32)
mobj->color = SKINCOLOR_SAPPHIRE; mobj->color = SKINCOLOR_SAPPHIRE;
else if (mobj->fuse > 32) else if (mobj->fuse <= 48)
mobj->color = SKINCOLOR_PURPLE;
else if (mobj->fuse > 48)
mobj->color = K_RainbowColor( mobj->color = K_RainbowColor(
(SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state (SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state
+ ((mobj->fuse - 32) * 2) // Make the color flashing slow down while it runs out + ((mobj->fuse - 32) * 2) // Make the color flashing slow down while it runs out
@ -6481,7 +6484,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
switch (mobj->extravalue1) switch (mobj->extravalue1)
{ {
case 3:/* rainbow boost */ case 4:/* rainbow boost */
/* every 20 tics, bang! */ /* every 20 tics, bang! */
if (( 120 - mobj->fuse ) % 10 == 0) if (( 120 - mobj->fuse ) % 10 == 0)
{ {
@ -6490,6 +6493,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
} }
break; break;
case 3:/* purple boost */
if ((mobj->fuse == 32)/* to blue*/
|| (mobj->fuse == 16))/* to red*/
K_SpawnDriftBoostClip(mobj->target->player);
break;
case 2:/* blue boost */ case 2:/* blue boost */
if (mobj->fuse == 16)/* to red*/ if (mobj->fuse == 16)/* to red*/
K_SpawnDriftBoostClip(mobj->target->player); K_SpawnDriftBoostClip(mobj->target->player);
@ -7675,6 +7684,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
break; break;
} }
// Uses cmd.turning over steering intentionally.
if (abs(player->cmd.turning) > 100) if (abs(player->cmd.turning) > 100)
{ {
INT32 lastsign = 0; INT32 lastsign = 0;
@ -7831,6 +7841,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
break; break;
} }
// Uses cmd.turning over steering intentionally.
if (abs(player->cmd.turning) > 100) if (abs(player->cmd.turning) > 100)
{ {
INT32 lastsign = 0; INT32 lastsign = 0;

View file

@ -233,6 +233,7 @@ static void P_NetArchivePlayers(void)
WRITESINT8(save_p, players[i].drift); WRITESINT8(save_p, players[i].drift);
WRITEFIXED(save_p, players[i].driftcharge); WRITEFIXED(save_p, players[i].driftcharge);
WRITEUINT8(save_p, players[i].driftboost); WRITEUINT8(save_p, players[i].driftboost);
WRITEUINT8(save_p, players[i].strongdriftboost);
WRITESINT8(save_p, players[i].aizdriftstrat); WRITESINT8(save_p, players[i].aizdriftstrat);
WRITEINT32(save_p, players[i].aizdrifttilt); WRITEINT32(save_p, players[i].aizdrifttilt);
@ -484,6 +485,7 @@ static void P_NetUnArchivePlayers(void)
players[i].drift = READSINT8(save_p); players[i].drift = READSINT8(save_p);
players[i].driftcharge = READFIXED(save_p); players[i].driftcharge = READFIXED(save_p);
players[i].driftboost = READUINT8(save_p); players[i].driftboost = READUINT8(save_p);
players[i].strongdriftboost = READUINT8(save_p);
players[i].aizdriftstrat = READSINT8(save_p); players[i].aizdriftstrat = READSINT8(save_p);
players[i].aizdrifttilt = READINT32(save_p); players[i].aizdrifttilt = READINT32(save_p);

View file

@ -1896,7 +1896,10 @@ static void K_HandleLapIncrement(player_t *player)
{ {
S_StartSound(player->mo, sfx_s23c); S_StartSound(player->mo, sfx_s23c);
player->startboost = 125; player->startboost = 125;
K_SpawnDriftBoostExplosion(player, 3);
K_SpawnDriftBoostExplosion(player, 4);
K_SpawnDriftElectricSparks(player);
rainbowstartavailable = false; rainbowstartavailable = false;
} }