diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 37f6abc16..70337b60f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -429,6 +429,8 @@ consvar_t cv_kartwalltransfer = CVAR_INIT ("BG_forcewalltransfer", "Off", CV_NET consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL); +consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL); + static CV_PossibleValue_t kartdebugitem_cons_t[] = { #define FOREACH( name, n ) { n, #name } diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 89826b6c8..dfc50c3b4 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -91,6 +91,7 @@ extern consvar_t cv_karteliminatelast; extern consvar_t cv_kartusepwrlv; extern consvar_t cv_kartrings; extern consvar_t cv_kartwalltransfer; +extern consvar_t cv_kartpurpledrift; extern consvar_t cv_votetime; diff --git a/src/k_kart.c b/src/k_kart.c index 154be2fdd..e67838efc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -249,6 +249,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_newspeedometer); CV_RegisterVar(&cv_kartwalltransfer); + + CV_RegisterVar(&cv_kartpurpledrift); } //} @@ -4192,7 +4194,7 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) } else if (charge >= ds*4) { - // Stage 3: Rainbow + // Stage 4: Rainbow if (charge <= (ds*4)+(32*3)) { // transition @@ -4203,6 +4205,19 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) color = K_RainbowColor(leveltime); } } + else if (cv_kartpurpledrift.value && charge >= ds*3) + { + // Stage 3: Purple + if (charge <= (ds*3)+(32*3)) + { + // transition + color = SKINCOLOR_VIOLET; + } + else + { + color = SKINCOLOR_PURPLE; + } + } else if (charge >= ds*2) { // Stage 2: Red @@ -4222,7 +4237,7 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) if (charge <= (ds)+(32*3)) { // transition - color = SKINCOLOR_PURPLE; + color = SKINCOLOR_MAGENTA; } else { @@ -4271,8 +4286,7 @@ static void K_SpawnDriftSparks(player_t *player) if (player->driftcharge >= K_GetKartDriftSparkValue(player)*4) { - spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - + spark->color = 1 + (leveltime % (numskincolors-1)); if (player->driftcharge <= K_GetKartDriftSparkValue(player)*4+(32*3)) { @@ -4280,6 +4294,20 @@ static void K_SpawnDriftSparks(player_t *player) P_SetScale(spark, (spark->destscale = spark->scale*3/2)); } + } + else if (cv_kartpurpledrift.value && player->driftcharge >= K_GetKartDriftSparkValue(player)*3) + { + if (player->driftcharge <= (K_GetKartDriftSparkValue(player)*3)+(24*3)) + spark->color = SKINCOLOR_VIOLET; // transition + else + spark->color = SKINCOLOR_PURPLE; + + if (player->driftcharge <= K_GetKartDriftSparkValue(player)*3+(32*3)) + { + // transition + P_SetScale(spark, (spark->destscale = spark->scale*3/2)); + } + } else if (player->driftcharge >= K_GetKartDriftSparkValue(player)*2) { @@ -8435,23 +8463,14 @@ static void K_SpawnDriftEFX(player_t *player,SINT8 level) P_SetTarget(&overlay->target, player->mo); P_SetScale(overlay, (overlay->destscale = player->mo->scale)); K_FlipFromObject(overlay, player->mo); - overlay->extravalue1 = 1; + overlay->extravalue1 = level; if (level == 1) - { overlay->color = SKINCOLOR_SAPPHIRE; - overlay->tics = overlay->tics/2; // Less time for blue drift - } else if (level == 2) - { overlay->color = SKINCOLOR_KETCHUP; - } else if (level == 3) - { - overlay->extravalue2 = 1; - overlay->tics = 5*overlay->tics/2; // More time for rainbow drift - } - + overlay->color = SKINCOLOR_PURPLE; } static void K_KartDrift(player_t *player, boolean onground) @@ -8460,7 +8479,8 @@ static void K_KartDrift(player_t *player, boolean onground) fixed_t driftadditive = 24; INT32 dsone = K_GetKartDriftSparkValue(player); INT32 dstwo = dsone*2; - INT32 dsthree = dstwo*2; + INT32 dsthree = cv_kartpurpledrift.value ? dsone*3 : dsone*4; + INT32 dsfour = dsone*4; // Grown players taking yellow spring panels will go below minspeed for one tic, // and will then wrongdrift or have their sparks removed because of this. @@ -8489,7 +8509,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->driftcharge = 0; } else if ((player->drift != -5 && player->drift != 5) - && player->driftcharge < dsthree + && (player->driftcharge >= dstwo && player->driftcharge < dsthree) && onground) { if (player->driftboost < 50) @@ -8500,14 +8520,26 @@ static void K_KartDrift(player_t *player, boolean onground) player->driftcharge = 0; } else if ((player->drift != -5 && player->drift != 5) - && player->driftcharge >= dsthree + && player->driftcharge < dsfour + && 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); + K_SpawnDriftEFX(player, 3); + player->driftcharge = 0; + } + else if ((player->drift != -5 && player->drift != 5) + && player->driftcharge >= dsfour && onground) { if (player->driftboost < 125) player->driftboost = 125; S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_kc3c); - K_SpawnDriftEFX(player, 3); + S_StartSound(player->mo, sfx_kc4d); + K_SpawnDriftEFX(player, 4); player->driftcharge = 0; } @@ -8579,7 +8611,8 @@ static void K_KartDrift(player_t *player, boolean onground) // Sound whenever you get a different tier of sparks if ((player->driftcharge < dsone && player->driftcharge+driftadditive >= dsone) || (player->driftcharge < dstwo && player->driftcharge+driftadditive >= dstwo) - || (player->driftcharge < dsthree && player->driftcharge+driftadditive >= dsthree)) + || (player->driftcharge < dsthree && player->driftcharge+driftadditive >= dsthree) + || (player->driftcharge < dsfour && player->driftcharge+driftadditive >= dsfour)) { if (P_IsDisplayPlayer(player)) // UGHGHGH... S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh... diff --git a/src/p_mobj.c b/src/p_mobj.c index 4bc25f581..c8c2036da 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7148,13 +7148,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) return false; } - mobj->angle = 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); - P_SetScale(mobj, mobj->target->scale); - - mobj->roll = mobj->target->roll; - mobj->pitch = mobj->target->pitch; { player_t *p = NULL; @@ -7163,14 +7156,40 @@ static boolean P_MobjRegularThink(mobj_t *mobj) else if (mobj->target->player) p = mobj->target->player; + 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); + P_SetScale(mobj, mobj->target->scale); + + mobj->roll = mobj->target->roll; + mobj->pitch = mobj->target->pitch; + if (p) { if (mobj->extravalue1) { if (p->driftboost > mobj->movecount) + { P_SetMobjState(mobj, S_DRIFTBOOSTFLAME); + if (mobj->extravalue1 == 1) + mobj->tics /= 2; // Less time for blue drift + else if (mobj->extravalue1 == 3) + mobj->tics = 3*mobj->tics/2; // A little longer for purple drift + else if (mobj->extravalue1 == 4) + mobj->tics *= 2; // More time for rainbow drift + } mobj->movecount = p->driftboost; + if (mobj->extravalue1 == 4) + P_SetScale(mobj, max(10, mobj->tics - 3*TICRATE/2)*mobj->scale/10); + + // larger karts need larger flames + if (mobj->target->skin && !wadfiles[((skin_t *)mobj->target->skin)->wadnum]->compatmode) + { + P_SetScale(mobj, 9*mobj->scale/8); + mobj->spriteyoffset = -6*FRACUNIT; + } + if (p->driftboost == 0) { P_RemoveMobj(mobj); @@ -7198,7 +7217,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->frame &= ~FF_TRANS60; } - if (mobj->extravalue2) + if (mobj->extravalue1 == 4) { mobj->color = K_RainbowColor(leveltime); }