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
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 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
INT32 aizdrifttilt;

View file

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

View file

@ -541,6 +541,8 @@ char sprnames[NUMSPRITES + 1][5] =
"DRIF", // Drift Sparks
"BDRF", // Brake drift sparks
"DRWS", // Drift dust sparks
"DREL", // Drift electricity
"DRES", // Drift electric sparks
// Kart Items
"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|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, 1, {NULL}, 0, 0, S_FASTLINE3}, // S_FASTLINE2
{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
},
{ // 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
-1, // doomednum
S_ROCKETSNEAKER_L, // spawnstate

View file

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

View file

@ -1971,6 +1971,7 @@ void K_KartMoveAnimation(player_t *player)
SINT8 destGlanceDir = 0;
SINT8 drift = player->drift;
// Uses turning over steering -- it's important to show player feedback immediately.
if (player->cmd.turning < -minturn)
{
turndir = -1;
@ -2535,7 +2536,14 @@ static void K_GetKartBoostPower(player_t *player)
if (player->driftboost) // Drift Boost
{
ADDBOOST(FRACUNIT/4, 4*FRACUNIT, 0); // + 25% top speed, + 400% acceleration, +0% handling
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
}
}
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)
{
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;
if (charge < 0)
@ -3544,10 +3556,10 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
// Stage 0: Yellow
color = SKINCOLOR_GOLD;
}
else if (charge >= ds*4)
else if (charge >= dsfour)
{
// Stage 3: Rainbow
if (charge <= (ds*4)+(32*3))
// Stage 4: Rainbow
if (charge <= dsfour+(32*3))
{
// transition
color = SKINCOLOR_SILVER;
@ -3557,23 +3569,41 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
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
if (charge <= (ds*2)+(32*3))
if (charge <= dstwo+(32*3))
{
// transition
color = SKINCOLOR_PURPLE;
color = SKINCOLOR_NOVA;
}
else
{
color = SKINCOLOR_SAPPHIRE;
}
}
else if (charge >= ds)
else if (charge >= dsone)
{
// Stage 1: Red
if (charge <= (ds)+(32*3))
if (charge <= dsone+(32*3))
{
// transition
color = SKINCOLOR_TANGERINE;
@ -3587,9 +3617,102 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
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)
{
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 newy;
mobj_t *spark;
@ -3604,7 +3727,7 @@ static void K_SpawnDriftSparks(player_t *player)
return;
if (!player->drift
|| (player->driftcharge < ds && !(player->driftcharge < 0)))
|| (player->driftcharge < dsone && !(player->driftcharge < 0)))
return;
travelangle = player->mo->angle-(ANGLE_45/5)*player->drift;
@ -3634,13 +3757,13 @@ static void K_SpawnDriftSparks(player_t *player)
// Stage 0: Yellow
size = 0;
}
else if (player->driftcharge >= ds*4)
else if (player->driftcharge >= dsfour)
{
// Stage 3: Rainbow
// Stage 4: Rainbow
size = 2;
trail = 2;
if (player->driftcharge <= (ds*4)+(32*3))
if (player->driftcharge <= (dsfour)+(32*3))
{
// transition
P_SetScale(spark, (spark->destscale = spark->scale*3/2));
@ -3651,13 +3774,25 @@ static void K_SpawnDriftSparks(player_t *player)
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
size = 2;
trail = 1;
if (player->driftcharge <= (ds*2)+(32*3))
if (player->driftcharge <= dstwo+(32*3))
{
// transition
P_SetScale(spark, (spark->destscale = spark->scale*3/2));
@ -3668,15 +3803,15 @@ static void K_SpawnDriftSparks(player_t *player)
// Stage 1: Red
size = 1;
if (player->driftcharge <= (ds)+(32*3))
if (player->driftcharge <= dsone+(32*3))
{
// transition
P_SetScale(spark, (spark->destscale = spark->scale*2));
}
}
if ((player->drift > 0 && player->cmd.turning > 0) // Inward drifts
|| (player->drift < 0 && player->cmd.turning < 0))
if ((player->drift > 0 && player->steering > 0) // Inward drifts
|| (player->drift < 0 && player->steering < 0))
{
if ((player->drift < 0 && (i & 1))
|| (player->drift > 0 && !(i & 1)))
@ -3689,8 +3824,8 @@ static void K_SpawnDriftSparks(player_t *player)
size--;
}
}
else if ((player->drift > 0 && player->cmd.turning < 0) // Outward drifts
|| (player->drift < 0 && player->cmd.turning > 0))
else if ((player->drift > 0 && player->steering < 0) // Outward drifts
|| (player->drift < 0 && player->steering > 0))
{
if ((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);
}
if (player->driftcharge >= dsthree)
{
K_SpawnDriftElectricity(player);
}
}
static void K_SpawnAIZDust(player_t *player)
@ -6397,6 +6537,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->driftboost)
player->driftboost--;
if (player->strongdriftboost)
player->strongdriftboost--;
if (player->startboost)
player->startboost--;
@ -7186,10 +7329,32 @@ INT32 K_GetKartDriftSparkValue(player_t *player)
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 2: blue sparks
Stage 3: big large rainbow sparks
Stage 3: purple sparks
Stage 4: big large rainbow sparks
Stage 0: air failsafe
*/
void K_SpawnDriftBoostExplosion(player_t *player, int stage)
@ -7215,6 +7380,13 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage)
break;
case 3:
overlay->color = SKINCOLOR_PURPLE;
overlay->fuse = 48;
S_StartSound(player->mo, sfx_kc5b);
break;
case 4:
overlay->color = SKINCOLOR_SILVER;
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 INT32 dsone = K_GetKartDriftSparkValue(player);
const INT32 dstwo = dsone*2;
const INT32 dsthree = dstwo*2;
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);
const UINT16 buttons = K_GetKartButtons(player);
@ -7286,16 +7459,33 @@ static void K_KartDrift(player_t *player, boolean onground)
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)
P_Thrust(player->mo, pushdir, player->speed / 2);
if (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
&& (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)
{
// Starting left drift
@ -7359,10 +7551,10 @@ static void K_KartDrift(player_t *player, boolean onground)
if (player->drift > 5)
player->drift = 5;
if (player->cmd.turning > 0) // Inward
driftadditive += abs(player->cmd.turning)/100;
if (player->cmd.turning < 0) // Outward
driftadditive -= abs(player->cmd.turning)/75;
if (player->steering > 0) // Inward
driftadditive += abs(player->steering)/100;
if (player->steering < 0) // Outward
driftadditive -= abs(player->steering)/75;
}
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)
player->drift = -5;
if (player->cmd.turning < 0) // Inward
driftadditive += abs(player->cmd.turning)/100;
if (player->cmd.turning > 0) // Outward
driftadditive -= abs(player->cmd.turning)/75;
if (player->steering < 0) // Inward
driftadditive += abs(player->steering)/100;
if (player->steering > 0) // Outward
driftadditive -= abs(player->steering)/75;
}
// 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)
|| (!player->cmd.turning)
|| (!player->steering)
|| (!player->aizdriftstrat)
|| (player->cmd.turning > 0) != (player->aizdriftstrat > 0))
|| (player->steering > 0) != (player->aizdriftstrat > 0))
{
if (!player->drift)
player->aizdriftstrat = 0;
@ -7772,7 +7964,7 @@ static void K_KartSpindash(player_t *player)
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
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
{
// Uses cmd->turning over steering intentionally.
if (cmd->turning > 0)
{
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);
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
INT32 K_GetKartDriftSparkValue(player_t *player);
INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage);
void K_SpawnDriftBoostExplosion(player_t *player, int stage);
void K_SpawnDriftElectricSparks(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);
void K_DropItems(player_t *player);

View file

@ -150,7 +150,7 @@ void K_DoIngameRespawn(player_t *player)
K_DoFault(player);
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->tumbleBounces > 0)

View file

@ -244,6 +244,8 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->driftcharge);
else if (fastcmp(field,"driftboost"))
lua_pushinteger(L, plr->driftboost);
else if (fastcmp(field,"strongdriftboost"))
lua_pushinteger(L, plr->strongdriftboost);
else if (fastcmp(field,"aizdriftstraft"))
lua_pushinteger(L, plr->aizdriftstrat);
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->driftboost = 0;
player->driftboost = player->strongdriftboost = 0;
player->ringboost = 0;
switch (type)

View file

@ -5602,6 +5602,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
mobj->renderflags ^= RF_DONTDRAW;
break;
case MT_SPINDASHWIND:
case MT_DRIFTELECTRICSPARK:
mobj->renderflags ^= RF_DONTDRAW;
break;
case MT_VWREF:
@ -6473,7 +6474,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
else if (mobj->fuse <= 32)
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(
(SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state
+ ((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)
{
case 3:/* rainbow boost */
case 4:/* rainbow boost */
/* every 20 tics, bang! */
if (( 120 - mobj->fuse ) % 10 == 0)
{
@ -6490,6 +6493,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
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 */
if (mobj->fuse == 16)/* to red*/
K_SpawnDriftBoostClip(mobj->target->player);
@ -7675,6 +7684,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
break;
}
// Uses cmd.turning over steering intentionally.
if (abs(player->cmd.turning) > 100)
{
INT32 lastsign = 0;
@ -7831,6 +7841,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
break;
}
// Uses cmd.turning over steering intentionally.
if (abs(player->cmd.turning) > 100)
{
INT32 lastsign = 0;

View file

@ -233,6 +233,7 @@ static void P_NetArchivePlayers(void)
WRITESINT8(save_p, players[i].drift);
WRITEFIXED(save_p, players[i].driftcharge);
WRITEUINT8(save_p, players[i].driftboost);
WRITEUINT8(save_p, players[i].strongdriftboost);
WRITESINT8(save_p, players[i].aizdriftstrat);
WRITEINT32(save_p, players[i].aizdrifttilt);
@ -484,6 +485,7 @@ static void P_NetUnArchivePlayers(void)
players[i].drift = READSINT8(save_p);
players[i].driftcharge = READFIXED(save_p);
players[i].driftboost = READUINT8(save_p);
players[i].strongdriftboost = READUINT8(save_p);
players[i].aizdriftstrat = READSINT8(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);
player->startboost = 125;
K_SpawnDriftBoostExplosion(player, 3);
K_SpawnDriftBoostExplosion(player, 4);
K_SpawnDriftElectricSparks(player);
rainbowstartavailable = false;
}