mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Back Trick effect
A rising tornado swirling the opposite direction. Sprites do not currently exist, but it's a one-line emergency-break-glass change if there's any danger of not shopping with them
This commit is contained in:
parent
c1f7546f99
commit
c3d34e9377
5 changed files with 84 additions and 31 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
74
src/k_kart.c
74
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);
|
||||
|
|
|
|||
36
src/p_mobj.c
36
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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue