diff --git a/src/deh_tables.c b/src/deh_tables.c index c8da6cabd80a36e8f80879096b0cd3bd677a0bb7..1474296f9207ad1c64593f570047015795017a12 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -369,6 +369,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_KART_LEFTOVER", "S_KART_LEFTOVER_NOTIRES", + "S_KART_LEFTOVER_CUSTOM", "S_KART_TIRE1", "S_KART_TIRE2", diff --git a/src/info.c b/src/info.c index c639c7c3583a57fb47ddb58e8ae29337ca2c878e..ffdf5daf8d2f952e4fd5799991595f43142250fd 100644 --- a/src/info.c +++ b/src/info.c @@ -795,6 +795,7 @@ char spr2names[NUMPLAYERSPRITES][5] = "SIGN", "SIGL", "SSIG", // Finish signpost "XTRA", // Three Faces of Darkness "TALK", // Dialogue + "DKRT", // Kart husk }; playersprite_t free_spr2 = SPR2_FIRSTFREESLOT; @@ -839,13 +840,14 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = { SPR2_SIGN, // SPR2_SSIG 0, // SPR2_XTRA 0, // SPR2_TALK + 0, // SPR2_DKRT }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) state_t states[NUMSTATES] = { // frame is masked through FF_FRAMEMASK - // FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay) + // FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay) (var1 is ignored in P_SetupStateAnimation() if sprite is SPR_PLAY) // FF_FULLBRIGHT activates the fullbright colormap // use FF_TRANS10 - FF_TRANS90 for easy translucency // (or tr_trans10<<FF_TRANSSHIFT if you want to make it hard on yourself) @@ -903,6 +905,7 @@ state_t states[NUMSTATES] = {SPR_KART, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER {SPR_DIEF, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER_NOTIRES + {SPR_PLAY, SPR2_DKRT,3,{NULL},0,0,S_KART_LEFTOVER_CUSTOM},// S_KART_LEFTOVER_CUSTOM {SPR_TIRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE1 {SPR_TIRE, 1, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE2 diff --git a/src/info.h b/src/info.h index dc900685651968d243bba01b7aee3a3cc304bf9b..c1474dc01609db6417d92785711ca33c6f5eb7fa 100644 --- a/src/info.h +++ b/src/info.h @@ -1329,6 +1329,7 @@ typedef enum playersprite SPR2_SIGN, SPR2_SIGL, SPR2_SSIG, SPR2_XTRA, SPR2_TALK, + SPR2_DKRT, SPR2_FIRSTFREESLOT, SPR2_LASTFREESLOT = 0x7f, @@ -1389,6 +1390,7 @@ typedef enum state S_KART_LEFTOVER, S_KART_LEFTOVER_NOTIRES, + S_KART_LEFTOVER_CUSTOM, S_KART_TIRE1, S_KART_TIRE2, diff --git a/src/objects/destroyed-kart.cpp b/src/objects/destroyed-kart.cpp index b029d8304cebd5d80487e547385bbbff643e5e27..95782cf749615927728b21a57a54727be35d0b35 100644 --- a/src/objects/destroyed-kart.cpp +++ b/src/objects/destroyed-kart.cpp @@ -309,15 +309,34 @@ struct Kart : Mobj return true; } + if (health <= 1) { return false; } + Mobj* p = player(); + bool pValid = Mobj::valid(p) && p->player; + bool hasCustomHusk = pValid && skins[p->player->skin].sprites[SPR2_DKRT].numframes; + + if(hasCustomHusk) + { + skin = (void*)(&skins[p->player->skin]); + frame = 0; + } + Particle::spew(this); - scale(3 * scale() / 2); + scale(3*scale()/2); + + if(hasCustomHusk){ + flags |= MF_NOSQUISH; //K_Squish() automates spritexscale/spriteyscale & this flag prevents that at the cost of no squish visual when the kart husk hits the ground + fixed_t huskScale = FixedDiv(mapobjectscale, scale()); + spritexscale(FixedMul(spritexscale(), huskScale)); + spriteyscale(FixedMul(spriteyscale(), huskScale)); + } + health = 1; - state(S_KART_LEFTOVER_NOTIRES); + state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_CUSTOM); cooldown(20); burning(burn_duration()); @@ -326,9 +345,9 @@ struct Kart : Mobj voice(sfx_die00); } - if (Mobj* p = player(); Mobj::valid(p)) + if(pValid) { - if (p->player && skins[p->player->skin].flags & SF_BADNIK) + if((skins[p->player->skin].flags & SF_BADNIK)) { P_SpawnBadnikExplosion(p); p->spritescale({2*FRACUNIT, 2*FRACUNIT}); @@ -446,7 +465,7 @@ private: P_PlayDeathSound(p); } - // First tick after hitlag: destroyed kart appears! + // First tick after hitlag: destroyed kart appears! State will change away from S_INVISIBLE inside destroy() where S_INVISIBLE was set in static spawn() if (state()->num() == S_INVISIBLE) { destroy(); diff --git a/src/p_mobj.c b/src/p_mobj.c index 7941c228aafe0a8b10acb41d3e64f272324ac8cf..e5f0e542a411cff9397b3e1224300db8a4d9e177 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9880,10 +9880,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_KART_LEFTOVER: { Obj_DestroyedKartThink(mobj); + if (P_MobjWasRemoved(mobj)) { return false; } + break; }