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 f1b24c4c12994c99afd0a4498a56819b6a854983..3b64bd0a55a6d956314198adf48d0c693f6764df 100644 --- a/src/info.c +++ b/src/info.c @@ -847,7 +847,7 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = { 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) @@ -905,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 3246580ffa0a2f49d3dbd55907a3a95838517151..c1474dc01609db6417d92785711ca33c6f5eb7fa 100644 --- a/src/info.h +++ b/src/info.h @@ -1390,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 c8e0994670550e9cbd28a9f9b62340f7d90f69f1..342953ffc3c035efb5f6e24194d75c48c311601b 100644 --- a/src/objects/destroyed-kart.cpp +++ b/src/objects/destroyed-kart.cpp @@ -252,11 +252,6 @@ struct Kart : Mobj Mobj* player() const { return Mobj::target(); } void player(Mobj* n) { Mobj::target(n); } - //use cvmem as a surrogate in this class to hold the number of frames in the player's skin's SPR2_DKRT - //any value above 0 means they have SPR2_DKRT - int dkrtframecount() const { return cvmem; } - void dkrtframecount(int n) {mobj_t::cvmem = n; } - static void spawn(Mobj* target) { SRB2_ASSERT(target->player != nullptr); @@ -279,15 +274,6 @@ struct Kart : Mobj kart->exact_hitlag(15, true); kart->player(target); - kart->dkrtframecount(0); - - if (Mobj* p = kart->player(); Mobj::valid(p) && p->player) - { - skin_t *playerSkin = &skins[p->player->skin]; - spritedef_t * dkrtInfo = &playerSkin->sprites[SPR2_DKRT]; - kart->dkrtframecount(dkrtInfo->numframes); - } - Obj_SpawnCustomBrolyKi(target, kart->hitlag() - 2, 32 * mapobjectscale, 0); target->exact_hitlag(kart->hitlag() + 1, true); @@ -313,57 +299,43 @@ struct Kart : Mobj timer(timer() - 1); animate(); } - - //animate SPR2_DKRT to advance a frame every 3 tics (same as SPR2_DEAD as of 06/09/24) - if(dkrtframecount() && leveltime%3==0) - frame = (frame+1) % dkrtframecount(); } bool destroy() { if (cooldown()) - { - // no-op P_DamageMobj - return true; - } + return true; // no-op P_DamageMobj if (health <= 1) - { return false; + + Mobj* p = player(); + bool pValid = Mobj::valid(p); + bool hasCustomHusk = pValid && p->player && 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(!hasCustomHusk ? (3 * scale() / 2):(int)(p->scale())); health = 1; - state(S_KART_LEFTOVER_NOTIRES); + state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_CUSTOM); cooldown(20); burning(burn_duration()); if (!cv_reducevfx.value) - { voice(sfx_die00); - } - if (Mobj* p = player(); Mobj::valid(p)) + if(pValid) { - if (p->player) + if((skins[p->player->skin].flags & SF_BADNIK)) { - //undo S_KART_LEFTOVER_NOTIRES setting a skin of its own if SPR2_DKRT is present - //also making sure the husk is the same scale as the player that made it if SPR2_DKRT is defined for consistency's sake - if(dkrtframecount()){ - skin = (void*)(&skins[p->player->skin]); - sprite = SPR_PLAY; - sprite2 = SPR2_DKRT; - frame = 0; - scale(p->scale()); - } - - if(skins[p->player->skin].flags & SF_BADNIK){ - P_SpawnBadnikExplosion(p); - p->spritescale({2*FRACUNIT, 2*FRACUNIT}); - p->flags |= MF_NOSQUISH; - } - + P_SpawnBadnikExplosion(p); + p->spritescale({2*FRACUNIT, 2*FRACUNIT}); + p->flags |= MF_NOSQUISH; } p->state(S_KART_DEAD);