diff --git a/src/deh_tables.c b/src/deh_tables.c index 1025c8d58..5a087fcb0 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3899,6 +3899,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_TRICKINDICATOR_UNDERLAY_ARROW2", "S_SIDETRICK", + "S_BACKTRICK", // DEZ Ring Shooter "S_TIREGRABBER", diff --git a/src/info.c b/src/info.c index da38478cf..a5fc9677d 100644 --- a/src/info.c +++ b/src/info.c @@ -637,6 +637,7 @@ char sprnames[NUMSPRITES + 1][5] = "TRK3", "TRK4", "TRK5", + "TRK6", "TIRG", // Tire grabbers "RSHT", // DEZ Ring Shooter @@ -4676,6 +4677,7 @@ state_t states[NUMSTATES] = {SPR_TRK4, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 13, {NULL}, 12, 1, S_INVISIBLE}, // S_TRICKINDICATOR_UNDERLAY_ARROW2, {SPR_TRK5, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SIDETRICK, + {SPR_TRK6, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_BACKTRICK, {SPR_TIRG, FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_TIREGRABBER {SPR_RSHT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_RINGSHOOTER_SIDE diff --git a/src/info.h b/src/info.h index 0963e1c93..01642bb20 100644 --- a/src/info.h +++ b/src/info.h @@ -1194,6 +1194,7 @@ typedef enum sprite SPR_TRK3, SPR_TRK4, SPR_TRK5, + SPR_TRK6, SPR_TIRG, // Tire grabbers SPR_RSHT, // DEZ Ring Shooter @@ -5120,6 +5121,7 @@ typedef enum state S_TRICKINDICATOR_UNDERLAY_ARROW2, S_SIDETRICK, + S_BACKTRICK, // DEZ Ring Shooter S_TIREGRABBER, diff --git a/src/k_kart.c b/src/k_kart.c index 53aaaf58a..351fbb112 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -12190,16 +12190,18 @@ 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 { + // For tornado trick effects + angle_t tornadotrickspeed = ANG30; + const angle_t angledelta = FixedAngle(36*FRACUNIT); + angle_t baseangle = player->mo->angle + angledelta/2; + boolean fronttrick = false; + INT16 aimingcompare = abs(cmd->throwdir) - abs(cmd->turning); // Uses cmd->turning over steering intentionally. #define TRICKTHRESHOLD (KART_FULLTURN/4) if (aimingcompare < -TRICKTHRESHOLD) // side trick { - angle_t sidetrickspeed = ANG30; - const angle_t angledelta = FixedAngle(36*FRACUNIT); - angle_t baseangle = player->mo->angle + angledelta/2; - S_StartSound(player->mo, sfx_trick0); player->dotrickfx = true; @@ -12226,39 +12228,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->trickIndicator->rollangle = ANGLE_90; } - sidetrickspeed = InvAngle(sidetrickspeed); + tornadotrickspeed = InvAngle(tornadotrickspeed); player->drawangle += ANGLE_45; P_SetPlayerMobjState(player->mo, S_KART_FAST_LOOK_R); } - - INT32 j; - - for (j = 0; j < 8; j++, baseangle += angledelta) - { - mobj_t *swipe = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SIDETRICK); - P_SetTarget(&swipe->target, player->mo); - swipe->hitlag = TRICKLAG; - swipe->color = player->trickIndicator->color; - swipe->angle = baseangle + ANGLE_90; - swipe->renderflags |= RF_DONTDRAW; - swipe->flags2 |= MF2_AMBUSH; // don't interp on first think - swipe->movedir = sidetrickspeed; - swipe->frame |= (j % 4); - - // This is so they make a 10-sided shape with one-sprite gap - if (j != 3) - continue; - - baseangle += angledelta; - } } else if (aimingcompare > TRICKTHRESHOLD) // forward/back trick { S_StartSound(player->mo, sfx_trick0); player->dotrickfx = true; - if (cmd->throwdir > 0) // back trick + if (cmd->throwdir > 0) // forward trick { if (player->mo->momz * P_MobjFlip(player->mo) > 0) { @@ -12272,8 +12253,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->trickIndicator->rollangle = 0; } + + P_SetPlayerMobjState(player->mo, S_KART_FAST); + + fronttrick = true; } - else if (cmd->throwdir < 0) + else if (cmd->throwdir < 0) // back trick { player->mo->momx /= 3; player->mo->momy /= 3; @@ -12296,6 +12281,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->trickIndicator->rollangle = ANGLE_180; } + + //tornadotrickspeed = InvAngle(tornadotrickspeed); + + //player->drawangle += ANGLE_45; + P_SetPlayerMobjState(player->mo, S_KART_FAST); } } #undef TRICKTHRESHOLD @@ -12311,6 +12301,34 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->karthud[khud_trickcool] = TICRATE; } + INT32 j; + + if (fronttrick == true) + ; // Not yet sprited + else for (j = 0; j < 8; j++, baseangle += angledelta) + { + mobj_t *swipe = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SIDETRICK); + + if (player->trickpanel == 4) + P_SetMobjState(swipe, S_BACKTRICK); + + P_SetTarget(&swipe->target, player->mo); + swipe->hitlag = TRICKLAG; + swipe->color = player->trickIndicator->color; + swipe->angle = baseangle + ANGLE_90; + swipe->renderflags |= RF_DONTDRAW; + swipe->flags2 |= MF2_AMBUSH; // don't interp on first think + swipe->movedir = tornadotrickspeed; + swipe->frame |= (j % 4); + swipe->threshold = 0; + + // This is so they make a 10-sided shape with one-sprite gap + if (j != 3) + continue; + + baseangle += angledelta; + } + if (P_MobjWasRemoved(player->trickIndicator) == false) { K_TrickCatholocismBlast(player->trickIndicator, player->trickIndicator->scale*10, 0); diff --git a/src/p_mobj.c b/src/p_mobj.c index 546d447aa..46c42d9ca 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8454,9 +8454,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (!mobj->target || !mobj->target->health || !mobj->target->player - || (mobj->target->player->trickpanel != 2 - && mobj->target->player->trickpanel != 3) - ) + || mobj->target->player->trickpanel <= 1) { P_RemoveMobj(mobj); return false; @@ -8478,6 +8476,38 @@ static boolean P_MobjRegularThink(mobj_t *mobj) fixed_t scale = mobj->target->scale; + // sweeping effect + if (mobj->target->player->trickpanel == 4) + { + const fixed_t saferange = (20*FRACUNIT)/21; + if (mobj->threshold < -saferange) + { + mobj->threshold = -saferange; + mobj->flags2 |= MF2_AMBUSH; + } + else while (mobj->threshold > saferange) + { + mobj->threshold -= 2*saferange; + mobj->flags2 |= MF2_AMBUSH; + } + + scale = P_ReturnThrustX(mobj, FixedAngle(90*mobj->threshold), scale); + + // This funny dealie is to make it so default + // scale is placed as standard, + // but variant threshold shifts upwards + fixed_t extraoffset = FixedMul(mobj->info->height, mobj->target->scale - scale); + if (mobj->threshold < 0) + extraoffset /= 2; + + // And this makes it swooce across the object. + extraoffset += FixedMul(mobj->threshold, mobj->target->height); + + zoff += P_MobjFlip(mobj) * extraoffset; + + mobj->threshold += (saferange/8); + } + mobj->angle += mobj->movedir; P_InstaScale(mobj, scale);