diff --git a/src/dehacked.c b/src/dehacked.c index 8f4bd5083..7f6be7e6d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9318,6 +9318,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_WATERTRAILUNDERLAY8", "S_SPINDASHDUST", + "S_SPINDASHWIND", #ifdef SEENAMES "S_NAMECHECK", @@ -10400,6 +10401,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_WATERTRAILUNDERLAY", "MT_SPINDASHDUST", + "MT_SPINDASHWIND", #ifdef SEENAMES "MT_NAMECHECK", diff --git a/src/info.c b/src/info.c index 91cb1cb59..ab581d5a4 100644 --- a/src/info.c +++ b/src/info.c @@ -732,6 +732,7 @@ char sprnames[NUMSPRITES + 1][5] = "DBST", // Drift boost plume "SDDS", // Spindash dust + "SDWN", // Spindash wind }; char spr2names[NUMPLAYERSPRITES][5] = @@ -5029,6 +5030,7 @@ state_t states[NUMSTATES] = {SPR_WTRL, FF_TRANS50|FF_PAPERSPRITE|15, 2, {NULL}, 0, 0, S_NULL}, // S_WATERTRAILUNDERLAY8 {SPR_SDDS, FF_ANIMATE, 9, {NULL}, 9, 1, S_NULL}, // S_SPINDASHDUST + {SPR_SDWN, FF_ANIMATE|FF_PAPERSPRITE, 18, {NULL}, 9, 2, S_NULL}, // S_SPINDASHWIND #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK @@ -28706,6 +28708,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SPINDASHWIND + -1, // doomednum + S_SPINDASHWIND, // 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 + 0, // speed + 12*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index b8e2908e2..8e8a05ca3 100644 --- a/src/info.h +++ b/src/info.h @@ -1003,6 +1003,7 @@ typedef enum sprite SPR_DBST, // Drift boost plume SPR_SDDS, // Spindash dust + SPR_SDWN, // Spindash wind SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, @@ -5180,6 +5181,7 @@ typedef enum state S_WATERTRAILUNDERLAY8, S_SPINDASHDUST, + S_SPINDASHWIND, #ifdef SEENAMES S_NAMECHECK, @@ -6282,6 +6284,7 @@ typedef enum mobj_type MT_WATERTRAILUNDERLAY, MT_SPINDASHDUST, + MT_SPINDASHWIND, #ifdef SEENAMES MT_NAMECHECK, diff --git a/src/k_kart.c b/src/k_kart.c index 1197706ae..ddbab8fe1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6790,12 +6790,11 @@ boolean K_PlayerEBrake(player_t *player) static void K_KartSpindashDust(mobj_t *parent) { - fixed_t rad = FixedHypot(parent->radius, parent->radius); + fixed_t rad = FixedDiv(FixedHypot(parent->radius, parent->radius), parent->scale); INT32 i; for (i = 0; i < 2; i++) { - fixed_t hmomentum = P_RandomRange(6, 12) * parent->scale; fixed_t vmomentum = P_RandomRange(2, 6) * parent->scale; @@ -6822,10 +6821,34 @@ static void K_KartSpindashDust(mobj_t *parent) } } +static void K_KartSpindashWind(mobj_t *parent) +{ + mobj_t *wind = P_SpawnMobjFromMobj(parent, + P_RandomRange(-36,36) * FRACUNIT, + P_RandomRange(-36,36) * FRACUNIT, + FixedDiv(parent->height / 2, parent->scale) + (P_RandomRange(-20,20) * FRACUNIT), + MT_SPINDASHWIND + ); + + P_SetTarget(&wind->target, parent); + + if (parent->momx || parent->momy) + wind->angle = R_PointToAngle2(0, 0, parent->momx, parent->momy); + else + wind->angle = parent->player->drawangle; + + wind->momx = 3 * parent->momx / 4; + wind->momy = 3 * parent->momy / 4; + wind->momz = 3 * parent->momz / 4; + + K_MatchGenericExtraFlags(wind, parent); +} + static void K_KartSpindash(player_t *player) { const INT16 MAXCHARGETIME = K_GetSpindashChargeTime(player); ticcmd_t *cmd = &player->cmd; + boolean spawnWind = (leveltime % 2 == 0); if (player->kartstuff[k_spindash] > 0 && (cmd->buttons & (BT_DRIFT|BT_BRAKE)) != (BT_DRIFT|BT_BRAKE)) { @@ -6851,6 +6874,12 @@ static void K_KartSpindash(player_t *player) S_StartSound(player->mo, sfx_s23c); } + + if ((player->kartstuff[k_spindashboost] > 0) && (spawnWind == true)) + { + K_KartSpindashWind(player->mo); + } + if (player->kartstuff[k_spindashboost] > (TICRATE/2)) { K_KartSpindashDust(player->mo); @@ -6878,6 +6907,11 @@ static void K_KartSpindash(player_t *player) spawnOldEffect = false; } + if (chargetime <= (MAXCHARGETIME / 4) && spawnWind == true) + { + K_KartSpindashWind(player->mo); + } + if (chargetime > 0) { UINT16 soundcharge = 0; @@ -6896,13 +6930,6 @@ static void K_KartSpindash(player_t *player) { P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL); } - else - { - if (player->kartstuff[k_spindash] % 4 == 0) - { - K_FlameDashLeftoverSmoke(player->mo); - } - } } } else diff --git a/src/p_mobj.c b/src/p_mobj.c index be907321e..1f3648ac1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5623,6 +5623,9 @@ static void P_MobjSceneryThink(mobj_t *mobj) if (mobj->tics > 0) mobj->drawflags ^= MFD_DONTDRAW; break; + case MT_SPINDASHWIND: + mobj->drawflags ^= MFD_DONTDRAW; + break; case MT_VWREF: case MT_VWREB: {