diff --git a/src/dehacked.c b/src/dehacked.c index 061eb9388..0c5324551 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6381,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", @@ -7742,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 df8f31061..ef878fe16 100644 --- a/src/info.c +++ b/src/info.c @@ -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) @@ -2616,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 @@ -15218,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 78902d297..a20875c68 100644 --- a/src/info.h +++ b/src/info.h @@ -786,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, @@ -3271,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, @@ -4664,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 ccace01f5..d32927c51 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3202,9 +3202,6 @@ 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] < ds && !(player->kartstuff[k_driftcharge] < 0))) return; @@ -5861,6 +5858,11 @@ static void K_KartDrift(player_t *player, boolean onground) { 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); @@ -5869,24 +5871,36 @@ static void K_KartDrift(player_t *player, boolean onground) // 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; } } @@ -5933,64 +5947,71 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; player->kartstuff[k_getsparks] = 0; } - else if (player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 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->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) + if (player->kartstuff[k_drift] >= 1) // Drifting to the left { - player->kartstuff[k_driftcharge] = dsone; // Back to red - playsound = true; + 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; + } + 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->speed <= minspeed) + else { - player->kartstuff[k_getsparks] = 0; driftadditive = 0; - - if (player->kartstuff[k_driftcharge] >= dsone) - { - player->kartstuff[k_driftcharge] = -1; // Set yellow sparks - playsound = true; - } } // This spawns the drift sparks diff --git a/src/p_mobj.c b/src/p_mobj.c index 9f688e369..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) {