diff --git a/src/deh_tables.c b/src/deh_tables.c index 8b25029b6..8a2713bad 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3755,6 +3755,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Caked-Up Booty-Sheet Ghost "S_HYUDORO", + // Grow + "S_GROW_PARTICLE", + // Shrink "S_SHRINK_GUN", "S_SHRINK_LASER", @@ -5342,6 +5345,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_HYUDORO", "MT_HYUDORO_CENTER", + "MT_GROW_PARTICLE", + "MT_SHRINK_POHBEE", "MT_SHRINK_GUN", "MT_SHRINK_CHAIN", diff --git a/src/info.c b/src/info.c index 0b390cf0a..7f1840092 100644 --- a/src/info.c +++ b/src/info.c @@ -573,6 +573,7 @@ char sprnames[NUMSPRITES + 1][5] = "FLML", // Flame Shield speed lines "FLMF", // Flame Shield flash "HYUU", // Hyudoro + "GRWP", // Grow "SHRG", // Shrink gun / laser "SINK", // Kitchen Sink "SITR", // Kitchen Sink Trail @@ -4315,6 +4316,8 @@ state_t states[NUMSTATES] = {SPR_HYUU, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_HYUDORO + {SPR_GRWP, FF_ADD|FF_FULLBRIGHT|FF_ANIMATE, 13, {NULL}, 7, 1, S_NULL}, // S_GROW_PARTICLE + {SPR_SHRG, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHRINK_GUN {SPR_SHRG, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_NULL}, // S_SHRINK_LASER {SPR_SHRG, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_NULL}, // S_SHRINK_PARTICLE @@ -24041,6 +24044,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_GROW_PARTICLE + -1, // doomednum + S_GROW_PARTICLE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // 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 + 4*FRACUNIT, // radius + 8*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_SHRINK_POHBEE -1, // doomednum S_HYUDORO, // spawnstate diff --git a/src/info.h b/src/info.h index 0ff8f7f93..ca7264dba 100644 --- a/src/info.h +++ b/src/info.h @@ -1119,6 +1119,7 @@ typedef enum sprite SPR_FLML, // Flame Shield speed lines SPR_FLMF, // Flame Shield flash SPR_HYUU, // Hyudoro + SPR_GRWP, // Grow SPR_SHRG, // Shrink gun / laser SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail @@ -4746,6 +4747,9 @@ typedef enum state // Caked-Up Booty-Sheet Ghost S_HYUDORO, + // Grow + S_GROW_PARTICLE, + // Shrink S_SHRINK_GUN, S_SHRINK_LASER, @@ -6369,6 +6373,8 @@ typedef enum mobj_type MT_HYUDORO, MT_HYUDORO_CENTER, + MT_GROW_PARTICLE, + MT_SHRINK_POHBEE, MT_SHRINK_GUN, MT_SHRINK_CHAIN, diff --git a/src/k_kart.c b/src/k_kart.c index 3b9de17da..19a2dc3e6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2284,6 +2284,57 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->destscale = 6*((mo->player->invincibilitytimer/TICRATE)*FRACUNIT)/8; } +static void K_SpawnGrowShrinkParticles(mobj_t *mo, INT32 timer) +{ + const boolean shrink = (timer < 0); + const INT32 maxTime = (10*TICRATE); + INT32 spawnFreq = 1; + + mobj_t *particle = NULL; + fixed_t particleSpeed = 0; + + spawnFreq = (maxTime - min(maxTime, abs(timer))) / TICRATE / 2; + if (spawnFreq == 0) + { + spawnFreq++; + } + + if (leveltime % spawnFreq != 0) + { + return; + } + + particle = P_SpawnMobjFromMobj( + mo, + P_RandomRange(-32, 32) * FRACUNIT, + P_RandomRange(-32, 32) * FRACUNIT, + (shrink ? P_RandomRange(24, 48) : P_RandomRange(0, 24)) * FRACUNIT, + MT_GROW_PARTICLE + ); + + P_SetTarget(&particle->target, mo); + + particle->momx = mo->momx; + particle->momy = mo->momy; + particle->momz = P_GetMobjZMovement(mo); + + K_MatchGenericExtraFlags(particle, mo); + + particleSpeed = particle->scale * 4 * P_MobjFlip(mo); + + if (shrink == true) + { + particle->color = SKINCOLOR_KETCHUP; + particle->momz -= particleSpeed; + particle->renderflags |= RF_VERTICALFLIP; + } + else + { + particle->color = SKINCOLOR_SAPPHIRE; + particle->momz += particleSpeed; + } +} + void K_SpawnBumpEffect(mobj_t *mo) { mobj_t *fx = P_SpawnMobj(mo->x, mo->y, mo->z, MT_BUMP); @@ -7325,6 +7376,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if (player->growshrinktimer != 0) + { + K_SpawnGrowShrinkParticles(player->mo, player->growshrinktimer); + } + if (gametype == GT_RACE && player->rings <= 0) // spawn ring debt indicator { mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy,