diff --git a/src/deh_tables.c b/src/deh_tables.c index 6a5255e8ee7671a7e09a5d49956c34e0367481a9..3effaa3725d22d934bbae4a3a5e2a3f906858e3a 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -369,7 +369,17 @@ 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_LEFTOVER_PARTICLE_CUSTOM_A", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_B", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_C", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_D", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_E", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_F", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_G", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_H", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_I", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_J", + "S_KART_LEFTOVER_PARTICLE_CUSTOM_K", "S_KART_TIRE1", "S_KART_TIRE2", diff --git a/src/info.c b/src/info.c index 67cbf3fab370169431e504ad85d2b32eb55edd30..5921127d4a356d1c24157d1520b6643946e3e78d 100644 --- a/src/info.c +++ b/src/info.c @@ -795,7 +795,17 @@ char spr2names[NUMPLAYERSPRITES][5] = "SIGN", "SIGL", "SSIG", // Finish signpost "XTRA", // Three Faces of Darkness "TALK", // Dialogue - "DKRT", // Kart husk + "DKRA", // Kart husk particle (A) + "DKRB", // Kart husk particle (B) + "DKRC", // Kart husk particle (C) + "DKRD", // Kart husk particle (D) + "DKRE", // Kart husk particle (E) + "DKRF", // Kart husk particle (F) AKA The kart husk itself + "DKRG", // Kart husk particle (G) + "DKRH", // Kart husk particle (H) + "DKRI", // Kart husk particle (I) + "DKRJ", // Kart husk particle (J) + "DKRK", // Kart husk particle (K) }; playersprite_t free_spr2 = SPR2_FIRSTFREESLOT; @@ -840,7 +850,17 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = { SPR2_SIGN, // SPR2_SSIG 0, // SPR2_XTRA 0, // SPR2_TALK - 0, // SPR2_DKRT + 0, // SPR2_DKRA + 0, // SPR2_DKRB + 0, // SPR2_DKRC + 0, // SPR2_DKRD + 0, // SPR2_DKRE + 0, // SPR2_DKRF + 0, // SPR2_DKRG + 0, // SPR2_DKRH + 0, // SPR2_DKRI + 0, // SPR2_DKRJ + 0, // SPR2_DKRK }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -905,7 +925,17 @@ 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_PLAY, SPR2_DKRA, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_A}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_A + {SPR_PLAY, SPR2_DKRB, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_B}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_B + {SPR_PLAY, SPR2_DKRC, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_C}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_C + {SPR_PLAY, SPR2_DKRD, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_D}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_D + {SPR_PLAY, SPR2_DKRE, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_E}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_E + {SPR_PLAY, SPR2_DKRF, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_F},// S_KART_LEFTOVER_PARTICLE_CUSTOM_F + {SPR_PLAY, SPR2_DKRG, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_G}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_G + {SPR_PLAY, SPR2_DKRH, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_H}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_H + {SPR_PLAY, SPR2_DKRI, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_I}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_I + {SPR_PLAY, SPR2_DKRJ, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_J}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_J + {SPR_PLAY, SPR2_DKRK, 3, {NULL}, 0, 0, S_KART_LEFTOVER_PARTICLE_CUSTOM_K}, // S_KART_LEFTOVER_PARTICLE_CUSTOM_K {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 884dd3781686305163ee3ba0f172cbbae930f5e0..4fab2f20750a20620e44332bd7b76622aabe5fc8 100644 --- a/src/info.h +++ b/src/info.h @@ -1329,7 +1329,17 @@ typedef enum playersprite SPR2_SIGN, SPR2_SIGL, SPR2_SSIG, SPR2_XTRA, SPR2_TALK, - SPR2_DKRT, + SPR2_DKRA, + SPR2_DKRB, + SPR2_DKRC, + SPR2_DKRD, + SPR2_DKRE, + SPR2_DKRF, + SPR2_DKRG, + SPR2_DKRH, + SPR2_DKRI, + SPR2_DKRJ, + SPR2_DKRK, SPR2_FIRSTFREESLOT, SPR2_LASTFREESLOT = 0x7f, @@ -1390,7 +1400,17 @@ typedef enum state S_KART_LEFTOVER, S_KART_LEFTOVER_NOTIRES, - S_KART_LEFTOVER_CUSTOM, + S_KART_LEFTOVER_PARTICLE_CUSTOM_A, + S_KART_LEFTOVER_PARTICLE_CUSTOM_B, + S_KART_LEFTOVER_PARTICLE_CUSTOM_C, + S_KART_LEFTOVER_PARTICLE_CUSTOM_D, + S_KART_LEFTOVER_PARTICLE_CUSTOM_E, + S_KART_LEFTOVER_PARTICLE_CUSTOM_F, + S_KART_LEFTOVER_PARTICLE_CUSTOM_G, + S_KART_LEFTOVER_PARTICLE_CUSTOM_H, + S_KART_LEFTOVER_PARTICLE_CUSTOM_I, + S_KART_LEFTOVER_PARTICLE_CUSTOM_J, + S_KART_LEFTOVER_PARTICLE_CUSTOM_K, S_KART_TIRE1, S_KART_TIRE2, diff --git a/src/objects/destroyed-kart.cpp b/src/objects/destroyed-kart.cpp index c6a5a09461c85dac232d3325e8643f62010b2f25..20c5a9a09cf95d2b6cf2cc8ee2dda4e49d1847ef 100644 --- a/src/objects/destroyed-kart.cpp +++ b/src/objects/destroyed-kart.cpp @@ -55,16 +55,32 @@ struct Particle : Mobj bool is_shrapnel() const { return sprite == SPR_KRBM; } - static void spew(Mobj* source) + static void spew(Mobj* source,int pskin) { - auto generic = [&](spritenum_t sprite, int degr, Fixed scale, int momx, const Vec2<int>& momz) + auto generic = [&](spritenum_t sprite, int pskinn, statenum_t spr2state, int degr, Fixed scale, int momx, const Vec2<int>& momz) { Particle* x = source->spawn_from<Particle>({}, MT_KART_PARTICLE); if (x) { - x->sprite = sprite; + if(pskinn >= 0 && pskinn < numskins + && spr2state > S_NULL && spr2state < NUMSTATES && + states[spr2state].frame >= 0 && states[spr2state].frame < NUMPLAYERSPRITES * 2 && //'NUMPLAYERSPRITES * 2' being the length of the 'skin_t.sprites' array member + skins[pskinn].sprites[states[spr2state].frame].numframes > 0) + { + + x->skin = (void*)(&skins[pskinn]); + x->state(spr2state); + //frame will be set by state() + } + else{ + //state will be set by mapthing definition + x->sprite = sprite; + x->frame = 0; + } + + x->frame |=FF_SEMIBRIGHT; + x->color = source->color; - x->frame = FF_SEMIBRIGHT; x->lightlevel = 112; x->scale(scale * x->scale()); @@ -79,34 +95,34 @@ struct Particle : Mobj return x; }; - auto part = [&](spritenum_t sprite, int degr, Fixed scale) + auto part = [&](spritenum_t sprite, int pskinn, statenum_t spr2state, int degr, Fixed scale) { - return generic(sprite, degr, scale, 2, {8, 16}); + return generic(sprite, pskinn, spr2state, degr, scale, 2, {8, 16}); }; - auto radial = [&](spritenum_t sprite, int ofs, int spokes, Fixed scale) + auto radial = [&](spritenum_t sprite, int pskinn, statenum_t spr2state, int ofs, int spokes, Fixed scale) { - radial_generic(ofs, spokes, [&](int ang) { part(sprite, ang, scale); }); + radial_generic(ofs, spokes, [&](int ang) { part(sprite, pskinn, spr2state, ang, scale); }); }; constexpr Fixed kSmall = 3*FRACUNIT/2; constexpr Fixed kMedium = 7*FRACUNIT/4; constexpr Fixed kLarge = 2*FRACUNIT; - part(SPR_DIEE, 0, kLarge); // steering wheel - part(SPR_DIEK, 180 + 45, kLarge); // engine + part(SPR_DIEE, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_E, 0, kLarge); // steering wheel + part(SPR_DIEK, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_K, 180 + 45, kLarge); // engine - part(SPR_DIEG, 90, kLarge); // left pedal base - part(SPR_DIED, -90, kLarge); // right pedal base + part(SPR_DIEG, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_G, 90, kLarge); // left pedal base + part(SPR_DIED, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_D, -90, kLarge); // right pedal base - radial(SPR_DIEI, 90, 2, kLarge); // wheel axle bars - radial(SPR_DIEC, 90, 2, kLarge); // pedal tips - radial(SPR_DIEA, 45, 4, kMedium); // tires - radial(SPR_DIEH, 45, 4, kMedium); // struts / springs - radial(SPR_DIEB, 360/12, 6, kSmall); // pipeframe bars - radial(SPR_DIEJ, 360/16, 8, kSmall); // screws + radial(SPR_DIEI, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_I, 90, 2, kLarge); // wheel axle bars + radial(SPR_DIEC, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_C, 90, 2, kLarge); // pedal tips + radial(SPR_DIEA, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_A, 45, 4, kMedium); // tires + radial(SPR_DIEH, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_H, 45, 4, kMedium); // struts / springs + radial(SPR_DIEB, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_B, 360/12, 6, kSmall); // pipeframe bars + radial(SPR_DIEJ, pskin, S_KART_LEFTOVER_PARTICLE_CUSTOM_J, 360/16, 8, kSmall); // screws - radial_generic(0, 6, [&](int degr) { generic(SPR_KRBM, degr, kSmall, 8, {22, 28}); }); // shrapnel + radial_generic(0, 6, [&](int degr) { generic(SPR_KRBM, -1, S_NULL, degr, kSmall, 8, {22, 28}); }); // shrapnel // explosion radial_generic( @@ -317,15 +333,15 @@ struct Kart : Mobj Mobj* p = player(); bool pValid = Mobj::valid(p) && p->player; - bool hasCustomHusk = pValid && skins[p->player->skin].sprites[SPR2_DKRT].numframes; + int pSkin = pValid ? p->player->skin : -1; //rip lyman lineface :-1 + bool hasCustomHusk = pSkin >=0 && pSkin < numskins && skins[pSkin].sprites[SPR2_DKRF].numframes; if(hasCustomHusk) { - skin = (void*)(&skins[p->player->skin]); - frame = 0; + skin = (void*)(&skins[pSkin]); } - Particle::spew(this); + Particle::spew(this,pSkin); scale(3*scale()/2); if(hasCustomHusk){ @@ -336,7 +352,7 @@ struct Kart : Mobj } health = 1; - state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_CUSTOM); + state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_PARTICLE_CUSTOM_F); cooldown(20); burning(burn_duration());