diff --git a/src/dehacked.c b/src/dehacked.c index 8a8a159db..0c5324551 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6347,6 +6347,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSPARK_B1", "S_DRIFTSPARK_C1", "S_DRIFTSPARK_C2", + "S_DRIFTSPARK_D1", + "S_DRIFTSPARK_D2", // Brake drift sparks "S_BRAKEDRIFT", @@ -6357,6 +6359,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTDUST3", "S_DRIFTDUST4", + // Drift Sparkles + "S_DRIFTWARNSPARK1", + "S_DRIFTWARNSPARK2", + "S_DRIFTWARNSPARK3", + "S_DRIFTWARNSPARK4", + // Fast lines "S_FASTLINE1", "S_FASTLINE2", @@ -6373,7 +6381,11 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FASTDUST6", "S_FASTDUST7", - // Thunder Shield Burst + // Drift boost effect + "S_DRIFTEXPLODE1", + "S_DRIFTEXPLODE2", + "S_DRIFTEXPLODE3", + "S_DRIFTEXPLODE4", // Sneaker boost effect "S_BOOSTFLAME", @@ -7734,6 +7746,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_FASTLINE", "MT_FASTDUST", + "MT_DRIFTEXPLODE", "MT_BOOSTFLAME", "MT_BOOSTSMOKE", "MT_SNEAKERTRAIL", diff --git a/src/info.c b/src/info.c index ad08c348f..135af682e 100644 --- a/src/info.c +++ b/src/info.c @@ -57,10 +57,10 @@ char sprnames[NUMSPRITES + 1][5] = "SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites "RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE","KINV","KINF", - "WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN","JAWZ","SSMN", - "KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL","POKE", - "AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO","CRAB", - "BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO","ITEM", + "WIPD","DRIF","BDRF","DUST","DRWS","RSHE","FITM","BANA","ORBN","JAWZ", + "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", + "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", + "CRAB","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO","ITEM", "ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3","RETI","AIDU", "KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SBUS","MARB","FUFO", "RUST","BLON","VAPE","HTZA","HTZB","SGVA","SGVB","SGVC","PGTR","PGF1", @@ -70,7 +70,7 @@ char sprnames[NUMSPRITES + 1][5] = "DUCK","GTRE","CHES","CHIM","DRGN","LZMN","PGSS","ZTCH","MKMA","MKMP", "RTCH","BOWL","BOWH","BRRL","BRRR","HRSE","TOAH","BFRT","OFRT","RFRT", "PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN","FWRK","MXCL","RGSP", - "DRAF","GRES","OTFG","XMS4","XMS5","VIEW" + "DRAF","GRES","OTFG","DBOS","XMS4","XMS5","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2587,6 +2587,9 @@ state_t states[NUMSTATES] = {SPR_DRIF, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_DRIFTSPARK_C2}, // S_DRIFTSPARK_C1 {SPR_DRIF, FF_FULLBRIGHT|FF_TRANS20, 1, {NULL}, 0, 0, S_DRIFTSPARK_A3}, // S_DRIFTSPARK_C2 (Loop back to A3) + {SPR_DRIF, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_DRIFTSPARK_D2}, // S_DRIFTSPARK_D1 + {SPR_DRIF, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_DRIFTSPARK_A2}, // S_DRIFTSPARK_D2 (Loop back to A2) + {SPR_BDRF, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 5, 2, S_BRAKEDRIFT}, // S_BRAKEDRIFT {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 @@ -2594,6 +2597,11 @@ state_t states[NUMSTATES] = {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 {SPR_DUST, FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTDUST4 + {SPR_DRWS, FF_FULLBRIGHT|0, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK2}, // S_DRIFTWARNSPARK1 + {SPR_DRWS, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK3}, // S_DRIFTWARNSPARK2 + {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_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 @@ -2608,6 +2616,11 @@ state_t states[NUMSTATES] = {SPR_DSHR, FF_PAPERSPRITE|5, 1, {NULL}, 0, 0, S_FASTDUST7}, // S_FASTDUST6 {SPR_DSHR, FF_PAPERSPRITE|6, 1, {NULL}, 0, 0, S_NULL}, // S_FASTDUST7 + {SPR_DBOS, FF_FULLBRIGHT, 2, {NULL}, 6, 1, S_DRIFTEXPLODE2}, // S_DRIFTEXPLODE1 + {SPR_DBOS, FF_FULLBRIGHT|1, 2, {NULL}, 6, 1, S_DRIFTEXPLODE3}, // S_DRIFTEXPLODE2 + {SPR_DBOS, FF_FULLBRIGHT|2, 2, {NULL}, 6, 1, S_DRIFTEXPLODE4}, // S_DRIFTEXPLODE3 + {SPR_DBOS, FF_FULLBRIGHT|3, 2, {NULL}, 6, 1, S_DRIFTEXPLODE1}, // S_DRIFTEXPLODE4 + {SPR_BOST, FF_FULLBRIGHT|FF_ANIMATE, TICRATE, {NULL}, 6, 1, S_BOOSTSMOKESPAWNER}, // S_BOOSTFLAME {SPR_NULL, 0, TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_BOOSTSMOKESPAWNER @@ -15210,6 +15223,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_DRIFTEXPLODE + -1, // doomednum + S_DRIFTEXPLODE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // 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 + 8, // speed + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_BOOSTFLAME -1, // doomednum S_BOOSTFLAME, // spawnstate diff --git a/src/info.h b/src/info.h index b6cc0e7ff..a20875c68 100644 --- a/src/info.h +++ b/src/info.h @@ -608,6 +608,7 @@ typedef enum sprite SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks SPR_DUST, // Drift Dust + SPR_DRWS, // Drift dust sparks // Kart Items SPR_RSHE, // Rocket sneaker @@ -785,6 +786,8 @@ typedef enum sprite SPR_OTFG, + SPR_DBOS, // Drift boost flame + // Xmas-specific sprites that don't fit aboxe SPR_XMS4, SPR_XMS5, @@ -3236,6 +3239,8 @@ typedef enum state S_DRIFTSPARK_B1, S_DRIFTSPARK_C1, S_DRIFTSPARK_C2, + S_DRIFTSPARK_D1, + S_DRIFTSPARK_D2, // Brake drift sparks S_BRAKEDRIFT, @@ -3246,6 +3251,12 @@ typedef enum state S_DRIFTDUST3, S_DRIFTDUST4, + // Drift Sparkles + S_DRIFTWARNSPARK1, + S_DRIFTWARNSPARK2, + S_DRIFTWARNSPARK3, + S_DRIFTWARNSPARK4, + // Fast lines S_FASTLINE1, S_FASTLINE2, @@ -3262,7 +3273,11 @@ typedef enum state S_FASTDUST6, S_FASTDUST7, - // Magnet Burst + // Drift boost effect + S_DRIFTEXPLODE1, + S_DRIFTEXPLODE2, + S_DRIFTEXPLODE3, + S_DRIFTEXPLODE4, // Sneaker boost effect S_BOOSTFLAME, @@ -4655,6 +4670,7 @@ typedef enum mobj_type MT_FASTLINE, MT_FASTDUST, + MT_DRIFTEXPLODE, MT_BOOSTFLAME, MT_BOOSTSMOKE, MT_SNEAKERTRAIL, diff --git a/src/k_kart.c b/src/k_kart.c index 4d3a2eed2..344e240de 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3133,8 +3133,62 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I return NULL; } +UINT8 K_DriftSparkColor(player_t *player, INT32 charge) +{ + INT32 ds = K_GetKartDriftSparkValue(player); + UINT8 color = SKINCOLOR_NONE; + + if (charge < 0) + { + // Stage 0: Yellow + color = SKINCOLOR_GOLD; + } + else if (charge >= ds*4) + { + // Stage 3: Rainbow + if (charge <= (ds*4)+(32*3)) + { + // transition + color = SKINCOLOR_SILVER; + } + else + { + color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + } + } + else if (charge >= ds*2) + { + // Stage 2: Blue + if (charge <= (ds*2)+(32*3)) + { + // transition + color = SKINCOLOR_PURPLE; + } + else + { + color = SKINCOLOR_SAPPHIRE; + } + } + else if (charge >= ds) + { + // Stage 1: Red + if (charge <= (ds)+(32*3)) + { + // transition + color = SKINCOLOR_TANGERINE; + } + else + { + color = SKINCOLOR_KETCHUP; + } + } + + return color; +} + static void K_SpawnDriftSparks(player_t *player) { + INT32 ds = K_GetKartDriftSparkValue(player); fixed_t newx; fixed_t newy; mobj_t *spark; @@ -3148,16 +3202,17 @@ static void K_SpawnDriftSparks(player_t *player) if (leveltime % 2 == 1) return; - if (!P_IsObjectOnGround(player->mo)) - return; - - if (!player->kartstuff[k_drift] || player->kartstuff[k_driftcharge] < K_GetKartDriftSparkValue(player)) + if (!player->kartstuff[k_drift] + || (player->kartstuff[k_driftcharge] < ds && !(player->kartstuff[k_driftcharge] < 0))) return; travelangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift]; for (i = 0; i < 2; i++) { + SINT8 size = 1; + UINT8 trail = 0; + newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); spark = P_SpawnMobj(newx, newy, player->mo->z, MT_DRIFTSPARK); @@ -3171,20 +3226,51 @@ static void K_SpawnDriftSparks(player_t *player) spark->momy = player->mo->momy/2; //spark->momz = player->mo->momz/2; - if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*4) + spark->color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); + + if (player->kartstuff[k_driftcharge] < 0) { - spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + // Stage 0: Yellow + size = 0; } - else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*2) + else if (player->kartstuff[k_driftcharge] >= ds*4) { - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(24*3)) - spark->color = SKINCOLOR_RASPBERRY; // transition + // Stage 3: Rainbow + size = 2; + trail = 2; + + if (player->kartstuff[k_driftcharge] <= (ds*4)+(32*3)) + { + // transition + P_SetScale(spark, (spark->destscale = spark->scale*3/2)); + } else - spark->color = SKINCOLOR_KETCHUP; + { + spark->colorized = true; + } + } + else if (player->kartstuff[k_driftcharge] >= ds*2) + { + // Stage 2: Blue + size = 2; + trail = 1; + + if (player->kartstuff[k_driftcharge] <= (ds*2)+(32*3)) + { + // transition + P_SetScale(spark, (spark->destscale = spark->scale*3/2)); + } } else { - spark->color = SKINCOLOR_SAPPHIRE; + // Stage 1: Red + size = 1; + + if (player->kartstuff[k_driftcharge] <= (ds)+(32*3)) + { + // transition + P_SetScale(spark, (spark->destscale = spark->scale*2)); + } } if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn > 0) // Inward drifts @@ -3192,22 +3278,40 @@ static void K_SpawnDriftSparks(player_t *player) { if ((player->kartstuff[k_drift] < 0 && (i & 1)) || (player->kartstuff[k_drift] > 0 && !(i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_A1); + { + size++; + } else if ((player->kartstuff[k_drift] < 0 && !(i & 1)) || (player->kartstuff[k_drift] > 0 && (i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_C1); + { + size--; + } } else if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn < 0) // Outward drifts || (player->kartstuff[k_drift] < 0 && player->cmd.driftturn > 0)) { if ((player->kartstuff[k_drift] < 0 && (i & 1)) || (player->kartstuff[k_drift] > 0 && !(i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_C1); + { + size--; + } else if ((player->kartstuff[k_drift] < 0 && !(i & 1)) || (player->kartstuff[k_drift] > 0 && (i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_A1); + { + size++; + } } + if (size == 2) + P_SetMobjState(spark, S_DRIFTSPARK_A1); + else if (size < 1) + P_SetMobjState(spark, S_DRIFTSPARK_C1); + else if (size > 2) + P_SetMobjState(spark, S_DRIFTSPARK_D1); + + if (trail > 0) + spark->tics += trail; + K_MatchGenericExtraFlags(spark, player->mo); } } @@ -3469,7 +3573,7 @@ void K_SpawnDraftDust(mobj_t *mo) void K_DriftDustHandling(mobj_t *spawner) { angle_t anglediff; - const INT16 spawnrange = spawner->radius>>FRACBITS; + const INT16 spawnrange = spawner->radius >> FRACBITS; if (!P_IsObjectOnGround(spawner) || leveltime % 2 != 0) return; @@ -3486,7 +3590,7 @@ void K_DriftDustHandling(mobj_t *spawner) { angle_t playerangle = spawner->angle; - if (spawner->player->speed < 5<player->speed < 5*spawner->scale) return; if (spawner->player->cmd.forwardmove < 0) @@ -3497,7 +3601,7 @@ void K_DriftDustHandling(mobj_t *spawner) } else { - if (P_AproxDistance(spawner->momx, spawner->momy) < 5<momx, spawner->momy) < 5*spawner->scale) return; anglediff = abs((signed)(spawner->angle - R_PointToAngle2(0, 0, spawner->momx, spawner->momy))); @@ -3508,12 +3612,12 @@ void K_DriftDustHandling(mobj_t *spawner) if (anglediff > ANG10*4) // Trying to turn further than 40 degrees { - fixed_t spawnx = P_RandomRange(-spawnrange, spawnrange)<x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); - dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange)<scale)/4); - dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange)<scale)/4); + dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4); + dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4); dust->momz = P_MobjFlip(spawner) * (P_RandomRange(1, 4) * (spawner->scale)); P_SetScale(dust, spawner->scale/2); dust->destscale = spawner->scale * 3; @@ -3523,6 +3627,35 @@ void K_DriftDustHandling(mobj_t *spawner) S_StartSound(spawner, sfx_screec); K_MatchGenericExtraFlags(dust, spawner); + + // Sparkle-y warning for when you're about to change drift sparks! + if (spawner->player && spawner->player->kartstuff[k_drift]) + { + INT32 driftval = K_GetKartDriftSparkValue(spawner->player); + INT32 warntime = driftval/3; + INT32 dc = spawner->player->kartstuff[k_driftcharge]; + UINT8 c = SKINCOLOR_NONE; + boolean rainbow = false; + + if (dc >= 0) + { + dc += warntime; + } + + c = K_DriftSparkColor(spawner->player, dc); + + if (dc > (4*driftval)+(32*3)) + { + rainbow = true; + } + + if (c != SKINCOLOR_NONE) + { + P_SetMobjState(dust, S_DRIFTWARNSPARK1); + dust->color = c; + dust->colorized = rainbow; + } + } } } @@ -5729,42 +5862,57 @@ static void K_KartDrift(player_t *player, boolean onground) // Drift Release (Moved here so you can't "chain" drifts) if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] < dsone && onground) { - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) - && onground) - { - if (player->kartstuff[k_driftboost] < 20) - player->kartstuff[k_driftboost] = 20; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] < dsthree - && onground) - { - if (player->kartstuff[k_driftboost] < 50) - player->kartstuff[k_driftboost] = 50; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] >= dsthree - && onground) - { - if (player->kartstuff[k_driftboost] < 125) - player->kartstuff[k_driftboost] = 125; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); + if (player->kartstuff[k_driftcharge] < 0 || player->kartstuff[k_driftcharge] >= dsone) + { + //mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFTEXPLODE); + //P_SetTarget(&overlay->target, player->mo); + //P_SetScale(overlay, (overlay->destscale = player->mo->scale)); + //K_FlipFromObject(overlay, player->mo); + + S_StartSound(player->mo, sfx_s23c); + //K_SpawnDashDustRelease(player); + + if (player->kartstuff[k_driftcharge] < 0) + { + // Stage 0: Yellow sparks + if (player->kartstuff[k_driftboost] < 15) + player->kartstuff[k_driftboost] = 15; + + //overlay->color = SKINCOLOR_GOLD; + //overlay->fuse = 8; + } + else if (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) + { + // Stage 1: Red sparks + if (player->kartstuff[k_driftboost] < 20) + player->kartstuff[k_driftboost] = 20; + + //overlay->color = SKINCOLOR_KETCHUP; + //overlay->fuse = 16; + } + else if (player->kartstuff[k_driftcharge] < dsthree) + { + // Stage 2: Blue sparks + if (player->kartstuff[k_driftboost] < 50) + player->kartstuff[k_driftboost] = 50; + + //overlay->color = SKINCOLOR_SAPPHIRE; + //overlay->fuse = 32; + } + else if (player->kartstuff[k_driftcharge] >= dsthree) + { + // Stage 3: Rainbow sparks + if (player->kartstuff[k_driftboost] < 125) + player->kartstuff[k_driftboost] = 125; + + //overlay->color = SKINCOLOR_SILVER; + //overlay->fuse = 120; + } + } + + // Remove charge player->kartstuff[k_driftcharge] = 0; } @@ -5800,71 +5948,107 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - - // Incease/decrease the drift value to continue drifting in that direction - if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) + if (player->kartstuff[k_spinouttimer] > 0 || player->speed == 0) { + // Stop drifting + player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; + player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; + player->kartstuff[k_getsparks] = 0; + } + else if (player->kartstuff[k_jmp] == 1 && player->kartstuff[k_drift] != 0) + { + // Incease/decrease the drift value to continue drifting in that direction fixed_t driftadditive = 24; + boolean playsound = false; - if (player->kartstuff[k_drift] >= 1) // Drifting to the left + if (onground) { - player->kartstuff[k_drift]++; - if (player->kartstuff[k_drift] > 5) - player->kartstuff[k_drift] = 5; + if (player->kartstuff[k_drift] >= 1) // Drifting to the left + { + player->kartstuff[k_drift]++; + if (player->kartstuff[k_drift] > 5) + player->kartstuff[k_drift] = 5; - if (player->cmd.driftturn > 0) // Inward - driftadditive += abs(player->cmd.driftturn)/100; - if (player->cmd.driftturn < 0) // Outward - driftadditive -= abs(player->cmd.driftturn)/75; + if (player->cmd.driftturn > 0) // Inward + driftadditive += abs(player->cmd.driftturn)/100; + if (player->cmd.driftturn < 0) // Outward + driftadditive -= abs(player->cmd.driftturn)/75; + } + else if (player->kartstuff[k_drift] <= -1) // Drifting to the right + { + player->kartstuff[k_drift]--; + if (player->kartstuff[k_drift] < -5) + player->kartstuff[k_drift] = -5; + + if (player->cmd.driftturn < 0) // Inward + driftadditive += abs(player->cmd.driftturn)/100; + if (player->cmd.driftturn > 0) // Outward + driftadditive -= abs(player->cmd.driftturn)/75; + } + + // Disable drift-sparks until you're going fast enough + if (player->kartstuff[k_getsparks] == 0 + || (player->kartstuff[k_offroad] + && !player->kartstuff[k_invincibilitytimer] + && !player->kartstuff[k_hyudorotimer] + && !EITHERSNEAKER(player))) + driftadditive = 0; + + // Inbetween minspeed and minspeed*2, it'll keep your previous drift-spark state. + if (player->speed > minspeed*2) + { + player->kartstuff[k_getsparks] = 1; + + if (player->kartstuff[k_driftcharge] <= -1) + { + player->kartstuff[k_driftcharge] = dsone; // Back to red + playsound = true; + } + } + else if (player->speed <= minspeed) + { + player->kartstuff[k_getsparks] = 0; + driftadditive = 0; + + if (player->kartstuff[k_driftcharge] >= dsone) + { + player->kartstuff[k_driftcharge] = -1; // Set yellow sparks + playsound = true; + } + } } - else if (player->kartstuff[k_drift] <= -1) // Drifting to the right + else { - player->kartstuff[k_drift]--; - if (player->kartstuff[k_drift] < -5) - player->kartstuff[k_drift] = -5; - - if (player->cmd.driftturn < 0) // Inward - driftadditive += abs(player->cmd.driftturn)/100; - if (player->cmd.driftturn > 0) // Outward - driftadditive -= abs(player->cmd.driftturn)/75; - } - - // Disable drift-sparks until you're going fast enough - if (player->kartstuff[k_getsparks] == 0 - || (player->kartstuff[k_offroad] - && !player->kartstuff[k_invincibilitytimer] - && !player->kartstuff[k_hyudorotimer] - && !EITHERSNEAKER(player))) driftadditive = 0; - if (player->speed > minspeed*2) - player->kartstuff[k_getsparks] = 1; + } // This spawns the drift sparks - if (player->kartstuff[k_driftcharge] + driftadditive >= dsone) + if ((player->kartstuff[k_driftcharge] + driftadditive >= dsone) + || (player->kartstuff[k_driftcharge] < 0)) + { K_SpawnDriftSparks(player); + } + + if ((player->kartstuff[k_driftcharge] < dsone && player->kartstuff[k_driftcharge]+driftadditive >= dsone) + || (player->kartstuff[k_driftcharge] < dstwo && player->kartstuff[k_driftcharge]+driftadditive >= dstwo) + || (player->kartstuff[k_driftcharge] < dsthree && player->kartstuff[k_driftcharge]+driftadditive >= dsthree)) + { + playsound = true; + } // Sound whenever you get a different tier of sparks - if (P_IsDisplayPlayer(player) // UGHGHGH... - && ((player->kartstuff[k_driftcharge] < dsone && player->kartstuff[k_driftcharge]+driftadditive >= dsone) - || (player->kartstuff[k_driftcharge] < dstwo && player->kartstuff[k_driftcharge]+driftadditive >= dstwo) - || (player->kartstuff[k_driftcharge] < dsthree && player->kartstuff[k_driftcharge]+driftadditive >= dsthree))) + if (playsound && P_IsDisplayPlayer(player)) { - //S_StartSound(player->mo, sfx_s3ka2); - S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh... + if (player->kartstuff[k_driftcharge] == -1) + S_StartSoundAtVolume(player->mo, sfx_sploss, 192); // Yellow spark sound + else + S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); } player->kartstuff[k_driftcharge] += driftadditive; player->kartstuff[k_driftend] = 0; } - // Stop drifting - if (player->kartstuff[k_spinouttimer] > 0 || player->speed < minspeed) - { - player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; - player->kartstuff[k_getsparks] = 0; - } - if ((!EITHERSNEAKER(player)) || (!player->cmd.driftturn) || (!player->kartstuff[k_aizdriftstrat]) @@ -9645,57 +9829,44 @@ static void K_drawKartFirstPerson(void) if (stplyr->mo) { - INT32 dsone = K_GetKartDriftSparkValue(stplyr); - INT32 dstwo = dsone*2; - INT32 dsthree = dstwo*2; + UINT8 driftcolor = K_DriftSparkColor(stplyr, stplyr->kartstuff[k_driftcharge]); + const angle_t ang = R_PointToAngle2(0, 0, stplyr->rmomx, stplyr->rmomy) - stplyr->frameangle; + // yes, the following is correct. no, you do not need to swap the x and y. + fixed_t xoffs = -P_ReturnThrustY(stplyr->mo, ang, (BASEVIDWIDTH<<(FRACBITS-2))/2); + fixed_t yoffs = -(P_ReturnThrustX(stplyr->mo, ang, 4*FRACUNIT) - 4*FRACUNIT); -#ifndef DONTLIKETOASTERSFPTWEAKS + if (splitscreen) + xoffs = FixedMul(xoffs, scale); + + xoffs -= (tn)*scale; + xoffs -= (dr)*scale; + + if (stplyr->frameangle == stplyr->mo->angle) { - const angle_t ang = R_PointToAngle2(0, 0, stplyr->rmomx, stplyr->rmomy) - stplyr->frameangle; - // yes, the following is correct. no, you do not need to swap the x and y. - fixed_t xoffs = -P_ReturnThrustY(stplyr->mo, ang, (BASEVIDWIDTH<<(FRACBITS-2))/2); - fixed_t yoffs = -(P_ReturnThrustX(stplyr->mo, ang, 4*FRACUNIT) - 4*FRACUNIT); + const fixed_t mag = FixedDiv(stplyr->speed, 10*stplyr->mo->scale); - if (splitscreen) - xoffs = FixedMul(xoffs, scale); - - xoffs -= (tn)*scale; - xoffs -= (dr)*scale; - - if (stplyr->frameangle == stplyr->mo->angle) + if (mag < FRACUNIT) { - const fixed_t mag = FixedDiv(stplyr->speed, 10*stplyr->mo->scale); - - if (mag < FRACUNIT) - { - xoffs = FixedMul(xoffs, mag); - if (!splitscreen) - yoffs = FixedMul(yoffs, mag); - } + xoffs = FixedMul(xoffs, mag); + if (!splitscreen) + yoffs = FixedMul(yoffs, mag); } - - if (stplyr->mo->momz > 0) // TO-DO: Draw more of the kart so we can remove this if! - yoffs += stplyr->mo->momz/3; - - if (encoremode) - x -= xoffs; - else - x += xoffs; - if (!splitscreen) - y += yoffs; } - // drift sparks! - if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dsthree)) - colmap = R_GetTranslationColormap(TC_RAINBOW, (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))), GTC_CACHE); - else if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dstwo)) - colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_KETCHUP, GTC_CACHE); - else if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dsone)) - colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SAPPHIRE, GTC_CACHE); + if (stplyr->mo->momz > 0) // TO-DO: Draw more of the kart so we can remove this if! + yoffs += stplyr->mo->momz/3; + + if (encoremode) + x -= xoffs; else -#endif - // invincibility/grow/shrink! - if (stplyr->mo->colorized && stplyr->mo->color) + x += xoffs; + if (!splitscreen) + y += yoffs; + + + if ((leveltime & 1) && (driftcolor != SKINCOLOR_NONE)) // drift sparks! + colmap = R_GetTranslationColormap(TC_RAINBOW, driftcolor, GTC_CACHE); + else if (stplyr->mo->colorized && stplyr->mo->color) // invincibility/grow/shrink! colmap = R_GetTranslationColormap(TC_RAINBOW, stplyr->mo->color, GTC_CACHE); } diff --git a/src/k_kart.h b/src/k_kart.h index b91e8c8a1..119b3f9a7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -40,6 +40,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); void K_StealBumper(player_t *player, player_t *victim, boolean force); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color); +UINT8 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); diff --git a/src/p_map.c b/src/p_map.c index 00b33cd1a..3bdc42e87 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3667,8 +3667,6 @@ void P_BouncePlayerMove(mobj_t *mo) mmomx = mo->player->rmomx; mmomy = mo->player->rmomy; - mo->player->kartstuff[k_drift] = 0; - mo->player->kartstuff[k_driftcharge] = 0; mo->player->kartstuff[k_pogospring] = 0; // trace along the three leading corners diff --git a/src/p_mobj.c b/src/p_mobj.c index a532dddc5..50bb4009a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8289,6 +8289,37 @@ void P_MobjThinker(mobj_t *mobj) S_StartSound(mobj, sfx_s3k4e); mobj->health--; break; + case MT_DRIFTEXPLODE: + if (!mobj->target || !mobj->target->health) + { + P_RemoveMobj(mobj); + return; + } + + mobj->angle = mobj->target->angle; + P_TeleportMove(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->flags2 ^= MF2_DONTDRAW; +#ifdef HWRENDER + mobj->modeltilt = mobj->target->modeltilt; +#endif + + { + player_t *p = NULL; + if (mobj->target->target && mobj->target->target->player) + p = mobj->target->target->player; + else if (mobj->target->player) + p = mobj->target->player; + + if (p) + { + if (p->kartstuff[k_driftboost] > mobj->movecount) + ; // reset animation + mobj->movecount = p->kartstuff[k_driftboost]; + } + } + break; case MT_BOOSTFLAME: if (!mobj->target || !mobj->target->health) { @@ -8363,6 +8394,7 @@ void P_MobjThinker(mobj_t *mobj) } else { + UINT8 driftcolor = K_DriftSparkColor(mobj->target->player, mobj->target->player->kartstuff[k_driftcharge]); fixed_t newx, newy; angle_t travelangle; @@ -8375,12 +8407,8 @@ void P_MobjThinker(mobj_t *mobj) mobj->angle = travelangle - ((ANGLE_90/5)*mobj->target->player->kartstuff[k_drift]); P_SetScale(mobj, (mobj->destscale = mobj->target->scale)); - if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*4) - mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*2) - mobj->color = SKINCOLOR_KETCHUP; - else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) - mobj->color = SKINCOLOR_SAPPHIRE; + if (driftcolor != SKINCOLOR_NONE) + mobj->color = driftcolor; else mobj->color = SKINCOLOR_SILVER; diff --git a/src/p_user.c b/src/p_user.c index 031a607c1..5ac789e54 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7526,7 +7526,14 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (player->kartstuff[k_drift] != 0) { fixed_t panmax = (dist/5); - pan = FixedDiv(FixedMul(min((fixed_t)player->kartstuff[k_driftcharge], K_GetKartDriftSparkValue(player)), panmax), K_GetKartDriftSparkValue(player)); + INT32 driftval = K_GetKartDriftSparkValue(player); + INT32 dc = player->kartstuff[k_driftcharge]; + + if (dc > driftval || dc < 0) + dc = driftval; + + pan = FixedDiv(FixedMul((fixed_t)dc, panmax), driftval); + if (pan > panmax) pan = panmax; if (player->kartstuff[k_drift] < 0) diff --git a/src/sounds.c b/src/sounds.c index ef150d7a5..adae99df5 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -817,6 +817,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"toada", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Arid Sands Toad scream {"bhurry", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // v1.0.2 Battle overtime {"bsnipe", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR}, // Banana sniping + {"sploss", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Down to yellow sparks {"itfree", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // :shitsfree: {"dbgsal", false, 255, 8, -1, NULL, 0, -1, -1, LUMPERROR}, // Debug notification diff --git a/src/sounds.h b/src/sounds.h index 8b9ca609e..e3a8560ca 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -892,6 +892,7 @@ typedef enum sfx_toada, sfx_bhurry, sfx_bsnipe, + sfx_sploss, sfx_itfree, sfx_dbgsal,