From 724690035f3575b7311139e9b82a5307e71e63dd Mon Sep 17 00:00:00 2001 From: Wumbo <58399748+WumboSpasm@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:20:59 -0400 Subject: [PATCH] Improve death animation --- src/deh_tables.c | 5 ++++ src/info.c | 57 +++++++++++++++++++++++++++++++++++++++++++ src/info.h | 7 ++++++ src/k_kart.c | 8 ++++++ src/p_enemy.c | 7 ++++++ src/p_inter.c | 63 +++++++++++++++++++++++++++++++++++++++++------- src/p_mobj.c | 5 ++++ 7 files changed, 143 insertions(+), 9 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 1d94e4e04..30b27d56e 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -407,6 +407,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // technically the player goes here but it's an infinite tic state "S_OBJPLACE_DUMMY", + "S_KART_LEFTOVER", + "S_KART_TIRE", + // Blue Crawla "S_POSS_STND", "S_POSS_RUN1", @@ -4389,6 +4392,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_THOK", // Thok! mobj "MT_SHADOW", // Linkdraw Shadow (for invisible objects) "MT_PLAYER", + "MT_KART_LEFTOVER", + "MT_KART_TIRE", // Enemies "MT_BLUECRAWLA", // Crawla (Blue) diff --git a/src/info.c b/src/info.c index 1471f91a0..ec29a9c5e 100644 --- a/src/info.c +++ b/src/info.c @@ -876,6 +876,9 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, // S_OBJPLACE_DUMMY + {SPR_KART, 0, 1, {A_DeathSpin}, ANG15, 0, S_KART_LEFTOVER}, // S_KART_LEFTOVER + {SPR_TIRE, 0, 1, {A_DeathSpin}, ANG30, 0, S_KART_TIRE}, // S_KART_TIRE + // Blue Crawla {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND {SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1 @@ -5113,6 +5116,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = (statenum_t)MT_THOK // raisestate }, + { // MT_KART_LEFTOVER + 4095, // doomednum + S_KART_LEFTOVER, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // 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 + 1, // speed + 16*FRACUNIT, // radius + 48*FRACUNIT, // height + -1, // display offset + 1000, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags + S_NULL // raisestate + }, + + { // MT_KART_TIRE + -1, // doomednum + S_KART_TIRE, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // 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 + 1, // speed + 6*FRACUNIT, // radius + 12*FRACUNIT, // height + -1, // display offset + 1000, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags + S_NULL // raisestate + }, + { // MT_BLUECRAWLA 100, // doomednum S_POSS_STND, // spawnstate diff --git a/src/info.h b/src/info.h index de8357e35..4e4f33c79 100644 --- a/src/info.h +++ b/src/info.h @@ -563,6 +563,7 @@ void A_ReaperThinker(); void A_MementosTPParticles(); void A_FlameShieldPaper(); void A_InvincSparkleRotate(); +void A_DeathSpin(); extern boolean actionsoverridden[NUMACTIONS]; @@ -1376,6 +1377,9 @@ typedef enum state // technically the player goes here but it's an infinite tic state S_OBJPLACE_DUMMY, + S_KART_LEFTOVER, + S_KART_TIRE, + // Blue Crawla S_POSS_STND, S_POSS_RUN1, @@ -5396,6 +5400,9 @@ typedef enum mobj_type MT_THOK, // Thok! mobj MT_SHADOW, // Linkdraw Shadow (for invisible objects) MT_PLAYER, + MT_KART_LEFTOVER, + MT_KART_TIRE, + // Enemies MT_BLUECRAWLA, // Crawla (Blue) MT_REDCRAWLA, // Crawla (Red) diff --git a/src/k_kart.c b/src/k_kart.c index a45e394fd..4e2e9ad6f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1198,6 +1198,14 @@ fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) break; weight = K_PlayerWeight(mobj, against); break; + case MT_KART_LEFTOVER: + weight = 5*FRACUNIT/2; + + if (mobj->extravalue1 > 0) + { + weight = mobj->extravalue1 * (FRACUNIT >> 1); + } + break; case MT_BUBBLESHIELD: weight = K_PlayerWeight(mobj->target, against); break; diff --git a/src/p_enemy.c b/src/p_enemy.c index 4efd27460..229015971 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -325,6 +325,7 @@ void A_ReaperThinker(mobj_t *actor); void A_MementosTPParticles(mobj_t *actor); void A_FlameShieldPaper(mobj_t *actor); void A_InvincSparkleRotate(mobj_t *actor); +void A_DeathSpin(mobj_t *actor); //for p_enemy.c @@ -14323,3 +14324,9 @@ void A_InvincSparkleRotate(mobj_t *actor) ghost->fuse = 4; } } + +void A_DeathSpin(mobj_t *actor) +{ + INT32 locvar1 = var1; + actor->angle += locvar1; +} \ No newline at end of file diff --git a/src/p_inter.c b/src/p_inter.c index 298f8897b..b13835830 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1284,34 +1284,79 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget case MT_PLAYER: if (damagetype != DMG_SPECTATOR) { - angle_t flingAngle; - mobj_t *kart; - - target->fuse = TICRATE*3; // timer before mobj disappears from view (even if not an actual player) + 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)) { - flingAngle = R_PointToAngle2( + playerFlingAngle = kartFlingAngle = R_PointToAngle2( source->x - source->momx, source->y - source->momy, target->x, target->y ); } else { - flingAngle = target->angle + ANGLE_180; + kartFlingAngle = target->angle; if (P_RandomByte() & 1) { - flingAngle -= ANGLE_45; + kartFlingAngle -= ANGLE_45; } else { - flingAngle += ANGLE_45; + kartFlingAngle += ANGLE_45; + } + + playerFlingAngle = kartFlingAngle + ANGLE_180; + } + + // 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 fixed_t tireOffset = 32; + 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; + + P_InitAngle(tire, tireAngle); + P_InstaThrust(tire, tireAngle, 3 * tire->scale); + P_SetObjectMomZ(tire, 10*FRACUNIT, false); + + tireAngle += (aOffset * 2); } } - P_InstaThrust(target, flingAngle, 14 * target->scale); + P_InstaThrust(target, playerFlingAngle, 4 * target->scale); P_SetObjectMomZ(target, 14*FRACUNIT, false); P_PlayDeathSound(target); diff --git a/src/p_mobj.c b/src/p_mobj.c index 839734f66..6e337374f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9554,6 +9554,8 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) switch (thing->type) { case MT_PLAYER: + thing->shadowscale = FRACUNIT; + break; case MT_SMALLMACE: case MT_BIGMACE: case MT_PUMA: @@ -9887,6 +9889,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_POGOSPRING: P_SetScale(mobj, (mobj->destscale = 3 * mobj->destscale / 2)); break; + case MT_KART_LEFTOVER: + mobj->color = SKINCOLOR_RED; + break; case MT_EGGROBO1: mobj->movecount = P_RandomKey(13); mobj->color = FIRSTRAINBOWCOLOR + P_RandomKey(FIRSTSUPERCOLOR - FIRSTRAINBOWCOLOR);