diff --git a/src/d_player.h b/src/d_player.h index 5d71a2715..b3baa57cf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -41,6 +41,8 @@ typedef enum { SF_HIRES = 1, // Draw the sprite at different size? SF_MACHINE = 1<<1, // Beep boop. Are you a robot? + SF_NOGIBS = 1<<2, // Does this kart smash into pieces? + SF_OLDDEATH = 1<<3, // Kart V1 styled death animation // free up to and including 1<<31 } skinflags_t; diff --git a/src/p_inter.c b/src/p_inter.c index 902168f96..0d4e173a8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1394,76 +1394,84 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget target->fuse = 2*TICRATE; // timer before mobj disappears from view (even if not an actual player) target->momx = target->momy = target->momz = 0; - angle_t playerFlingAngle; - angle_t kartFlingAngle; - - if (source && !P_MobjWasRemoved(source)) + if (target->player && !(skins[target->player->skin].flags & SF_NOGIBS)) { - playerFlingAngle = kartFlingAngle = R_PointToAngle2( - source->x - source->momx, source->y - source->momy, - target->x, target->y - ); - } - else - { - kartFlingAngle = target->angle; + angle_t playerFlingAngle; + angle_t kartFlingAngle; - if (P_RandomByte() & 1) + if (source && !P_MobjWasRemoved(source)) { - kartFlingAngle -= ANGLE_45; + playerFlingAngle = kartFlingAngle = R_PointToAngle2( + source->x - source->momx, source->y - source->momy, + target->x, target->y + ); } else { - kartFlingAngle += ANGLE_45; + kartFlingAngle = target->angle; + + if (P_RandomByte() & 1) + { + kartFlingAngle -= ANGLE_45; + } + else + { + kartFlingAngle += ANGLE_45; + } + + playerFlingAngle = kartFlingAngle + ANGLE_180; } - playerFlingAngle = kartFlingAngle + ANGLE_180; - } + // Spawn kart frame + mobj_t *kart = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_KART_LEFTOVER); - // Spawn kart frame - mobj_t *kart = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_KART_LEFTOVER); - - if (kart && !P_MobjWasRemoved(kart)) - { - kart->angle = target->angle; - kart->color = target->color; - kart->extravalue1 = target->player->kartweight; - kart->fuse = 2*TICRATE; - - // Copy interp data - kart->old_angle = target->old_angle; - kart->old_x = target->old_x; - kart->old_y = target->old_y; - kart->old_z = target->old_z; - - P_InstaThrust(kart, kartFlingAngle, 1 * kart->scale); - P_SetObjectMomZ(kart, 10*FRACUNIT, false); - - const angle_t aOffset = ANGLE_22h; - - UINT8 i; - angle_t tireAngle; - mobj_t *tire; - - // Spawn tires - tireAngle = kartFlingAngle - ANGLE_90 - ANGLE_22h; - for (i = 0; i < 4; i++) + if (kart && !P_MobjWasRemoved(kart)) { - if (i == 2) tireAngle += ANGLE_90; + kart->angle = target->angle; + kart->color = target->color; + kart->extravalue1 = target->player->kartweight; + kart->fuse = 2*TICRATE; - tire = P_SpawnMobjFromMobj(kart, 0, 0, 0, MT_KART_TIRE); - tire->fuse = 2*TICRATE; + // Copy interp data + kart->old_angle = target->old_angle; + kart->old_x = target->old_x; + kart->old_y = target->old_y; + kart->old_z = target->old_z; - tire->angle = tireAngle; - P_InstaThrust(tire, tireAngle, 3 * tire->scale); - P_SetObjectMomZ(tire, 10*FRACUNIT, false); + P_InstaThrust(kart, kartFlingAngle, 1 * kart->scale); + P_SetObjectMomZ(kart, 10*FRACUNIT, false); - tireAngle += (aOffset * 2); + const angle_t aOffset = ANGLE_22h; + + UINT8 i; + angle_t tireAngle; + mobj_t *tire; + + // Spawn tires + tireAngle = kartFlingAngle - ANGLE_90 - ANGLE_22h; + for (i = 0; i < 4; i++) + { + if (i == 2) tireAngle += ANGLE_90; + + tire = P_SpawnMobjFromMobj(kart, 0, 0, 0, MT_KART_TIRE); + tire->fuse = 2*TICRATE; + + tire->angle = tireAngle; + P_InstaThrust(tire, tireAngle, 3 * tire->scale); + P_SetObjectMomZ(tire, 10*FRACUNIT, false); + + tireAngle += (aOffset * 2); + } } + + P_InstaThrust(target, playerFlingAngle, 4 * target->scale); + P_SetObjectMomZ(target, 14*FRACUNIT, false); } - P_InstaThrust(target, playerFlingAngle, 4 * target->scale); - P_SetObjectMomZ(target, 14*FRACUNIT, false); + if (target->player && (skins[target->player->skin].flags & SF_OLDDEATH)) + { + P_SetObjectMomZ(target, 14*FRACUNIT, false); + } P_PlayDeathSound(target); } diff --git a/src/p_mobj.c b/src/p_mobj.c index f62ef15d1..1e0f5d89a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6427,6 +6427,11 @@ static boolean P_MobjDeadThink(mobj_t *mobj) else // Apply gravity to fall downwards. { P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true); + + if (mobj->player && (skins[mobj->player->skin].flags && SF_OLDDEATH)) + { + mobj->player->drawangle -= ANGLE_22h; + } } break; case MT_METALSONIC_RACE: diff --git a/src/r_skins.c b/src/r_skins.c index c13e54e8f..aa722a168 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -429,6 +429,7 @@ static UINT8 KART_TO_SPR2[][2] = { S('O', DRRN) S('P', DRRN) S('Q', SPIN) + S('Q', DEAD) S('R', KART) S('S', SIGN) }; @@ -534,6 +535,9 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski } R_AddKartFaces(skin); + + skin->flags |= SF_OLDDEATH|SF_NOGIBS; + } if (skin->sprites[0].numframes == 0)