diff --git a/src/d_player.h b/src/d_player.h index 873559136..afa232991 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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; diff --git a/src/deh_tables.c b/src/deh_tables.c index 001af8ce4..75b667e66 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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 diff --git a/src/info.c b/src/info.c index a4ede835c..eaa800ebc 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index a5499cafb..697d206c6 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_kart.c b/src/k_kart.c index 5a8e09c34..dedf9dddc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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)); diff --git a/src/k_kart.h b/src/k_kart.h index 9051f712f..ad254822c 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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); diff --git a/src/k_respawn.c b/src/k_respawn.c index 61d872e62..fcce1b632 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -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) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 6ec909300..a76eb1990 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -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")) diff --git a/src/p_inter.c b/src/p_inter.c index c125a1af7..a73c688f4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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) diff --git a/src/p_mobj.c b/src/p_mobj.c index a855f9d5b..f3711f819 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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; diff --git a/src/p_saveg.c b/src/p_saveg.c index 8730a3ef3..35f68be29 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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); diff --git a/src/p_spec.c b/src/p_spec.c index b08614b35..16823916e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -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; }