diff --git a/src/deh_tables.c b/src/deh_tables.c index 5fc9b90aa..7f3ac6310 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1576,6 +1576,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BAIL", "S_BAIB", + "S_BAIC", "S_BAILCHARGE", "S_AMPRING", @@ -3570,6 +3571,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BAIL", "MT_BAILCHARGE", + "MT_BAILSPARKLE", "MT_AMPRING", "MT_AMPBODY", diff --git a/src/info.c b/src/info.c index ed3849587..d3bad37b5 100644 --- a/src/info.c +++ b/src/info.c @@ -336,6 +336,7 @@ char sprnames[NUMSPRITES + 1][5] = "BAIL", // Bail charge "BAIB", // Bail after effect + "BAIC", // Bail sparkle "TECH", // Bail tech charge "TRC1", // Charge aura @@ -2166,6 +2167,7 @@ state_t states[NUMSTATES] = {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 8, {NULL}, 8, 1, S_BAIB}, // S_BAIL {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB + {SPR_BAIC, FF_FULLBRIGHT|FF_ANIMATE|0, 11, {NULL}, 10, 1, S_NULL}, // S_BAIC {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING @@ -13776,7 +13778,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, @@ -13803,7 +13805,34 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_BAILSPARKLE + -1, // doomednum + S_BAIC, // spawnstate + 1000, // 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 + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/info.h b/src/info.h index 05f3ef121..3a3354263 100644 --- a/src/info.h +++ b/src/info.h @@ -877,6 +877,7 @@ typedef enum sprite SPR_BAIL, // Bail charge SPR_BAIB, // Bail after effect + SPR_BAIC, // Bail sparkle SPR_TECH, // Bail tech charge SPR_TRC1, // Charge aura @@ -2635,6 +2636,7 @@ typedef enum state S_BAIL, S_BAIB, + S_BAIC, S_BAILCHARGE, S_AMPRING, @@ -4656,6 +4658,7 @@ typedef enum mobj_type MT_BAIL, MT_BAILCHARGE, + MT_BAILSPARKLE, MT_AMPRING, MT_AMPBODY, diff --git a/src/k_kart.c b/src/k_kart.c index 78aeabf17..b94e74757 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10001,6 +10001,35 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Extra tripwire leniency for the end of invincibility if (player->invincibilitytimer <= 0) { player->tripwireLeniency = max( player->tripwireLeniency, TICRATE ); + } + + if (player->baildrop) + { + mobj_t *pmo = player->mo; + // particle spawn + #define BAILSPARKLE_MAXBAIL 61 // amount of bail rings needed for max sparkle spawn frequency + UINT32 baildropinversefreq = BAILSPARKLE_MAXBAIL - min(player->baildrop, BAILSPARKLE_MAXBAIL-6); + UINT32 baildropmodulo = baildropinversefreq *5/3 /10; + if ((leveltime % (1+baildropmodulo)) == 0) + { + mobj_t *sparkle = P_SpawnMobj(pmo->x + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + pmo->y + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + pmo->z + (pmo->height/2) + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + MT_BAILSPARKLE); + + sparkle->scale = pmo->scale; + sparkle->angle = pmo->angle; + sparkle->momx = 3*pmo->momx/4; + sparkle->momy = 3*pmo->momy/4; + sparkle->momz = 3*P_GetMobjZMovement(pmo)/4; + K_MatchGenericExtraFlags(sparkle, pmo); + sparkle->renderflags = (pmo->renderflags & ~RF_TRANSMASK);//|RF_TRANS20|RF_ADD; + } + + if ((player->baildrop % BAIL_DROPFREQUENCY) == 0) + { + P_FlingBurst(player, K_MomentumAngle(pmo), MT_FLINGRING, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); + S_StartSound(pmo, sfx_gshad); } }