diff --git a/src/cvars.cpp b/src/cvars.cpp index 5737da301..5dce97985 100644 --- a/src/cvars.cpp +++ b/src/cvars.cpp @@ -873,6 +873,10 @@ consvar_t cv_1pswap = PlayerCheat("1pswap", "1").min_max(1, MAXSPLITSCREENPLAYER consvar_t cv_debugfinishline = PlayerCheat("debugfinishline", "Off").on_off().description("Highlight finish lines, respawn lines, death pits and instakill planes with high contrast colors"); consvar_t cv_debughudtracker = PlayerCheat("debughudtracker", "Off").on_off().description("Highlight overlapping HUD tracker blocks"); +#ifdef DEVELOP + consvar_t cv_debugprisoncd = PlayerCheat("debugprisoncd", "Off").on_off().description("Always drop a CD from breaking Prisons"); +#endif + consvar_t cv_debugrank = PlayerCheat("debugrank", "Off").description("Show GP rank state on the HUD; optionally force a rank grade").values({ {0, "Off"}, {1, "On"}, diff --git a/src/deh_tables.c b/src/deh_tables.c index da0e50972..7a80db60b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -506,6 +506,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Prison Egg Drops "S_PRISONEGGDROP_CD", + "S_PRISONEGGDROP_FLAREA1", + "S_PRISONEGGDROP_FLAREA2", + "S_PRISONEGGDROP_FLAREB1", + "S_PRISONEGGDROP_FLAREB2", // Bubble Source "S_BUBBLES1", diff --git a/src/info.c b/src/info.c index 8d8e72053..13250ba4f 100644 --- a/src/info.c +++ b/src/info.c @@ -1013,6 +1013,10 @@ state_t states[NUMSTATES] = // Prison Egg Drops {SPR_ALTM, 0|FF_PAPERSPRITE|FF_SEMIBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PRISONEGGDROP_CD + {SPR_LENS, 14|FF_FULLBRIGHT|FF_ADD|FF_TRANS10, 1, {NULL}, 0, 0, S_PRISONEGGDROP_FLAREA2}, // S_PRISONEGGDROP_FLAREA1 + {SPR_NULL, 0, 1, {NULL}, 0, 0, S_PRISONEGGDROP_FLAREA1}, // S_PRISONEGGDROP_FLAREA2 + {SPR_LENS, 11|FF_FULLBRIGHT|FF_ADD|FF_TRANS10|FF_ANIMATE, 16, {NULL}, 7, 2, S_PRISONEGGDROP_FLAREB2}, // S_PRISONEGGDROP_FLAREB1 + {SPR_LENS, 19|FF_FULLBRIGHT|FF_ADD|FF_TRANS10|FF_ANIMATE, 6, {NULL}, 1, 2, S_NULL}, // S_PRISONEGGDROP_FLAREB2 // Bubble Source {SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1 diff --git a/src/info.h b/src/info.h index fd062e658..3b26cfefc 100644 --- a/src/info.h +++ b/src/info.h @@ -1499,6 +1499,10 @@ typedef enum state // Prison Egg Drops S_PRISONEGGDROP_CD, + S_PRISONEGGDROP_FLAREA1, + S_PRISONEGGDROP_FLAREA2, + S_PRISONEGGDROP_FLAREB1, + S_PRISONEGGDROP_FLAREB2, // Bubble Source S_BUBBLES1, diff --git a/src/m_cond.c b/src/m_cond.c index 5789e8482..72a9f7792 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1019,6 +1019,32 @@ cacheprisoneggpickup: } //CONS_Printf("thisprisoneggpickup = %u (MAXCONDITIONSETS is %u)\n", gamedata->thisprisoneggpickup, MAXCONDITIONSETS); + +#ifdef DEVELOP + extern consvar_t cv_debugprisoncd; + // If all drops are collected, just force the first valid one. + if (cv_debugprisoncd.value && gamedata->thisprisoneggpickup_cached == NULL) + { + for (i = 0; gamedata->thisprisoneggpickup_cached == NULL && + i < gamedata->numprisoneggpickups; i++) + { + c = &conditionSets[gamedata->prisoneggpickups[i]]; + if (c->numconditions) + { + for (j = 0; j < c->numconditions; ++j) + { + cn = &c->condition[j]; + if (cn->type != UC_PRISONEGGCD) + continue; + + gamedata->thisprisoneggpickup = gamedata->prisoneggpickups[i]; + gamedata->thisprisoneggpickup_cached = cn; + break; + } + } + } + } +#endif } static void M_PrecacheLevelLocks(void) diff --git a/src/p_inter.c b/src/p_inter.c index 86a2a2094..048034486 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1198,13 +1198,21 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) secretextratime = TICRATE/2; } - if ( + +#ifdef DEVELOP + extern consvar_t cv_debugprisoncd; +#endif + if (( grandprixinfo.gp == true // Bonus Round && demo.playback == false // Not playback && netgame == false // game design + makes it easier to implement && gamedata->thisprisoneggpickup_cached != NULL && gamedata->prisoneggstothispickup == 0 && gamedata->thisprisoneggpickupgrabbed == false + ) +#ifdef DEVELOP + || (cv_debugprisoncd.value && gamedata->thisprisoneggpickup_cached != NULL) +#endif ) { // Will be 0 for the next level @@ -1218,6 +1226,10 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) if (secretpickup) { + // Grab attention with a long sound effect. + target->hitlag += 56; + S_StartSound(target, sfx_s3k85); + secretpickup->hitlag = target->hitlag; secretpickup->z -= secretpickup->height/2; @@ -1244,6 +1256,26 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) secretpickup, secretpickup->angle, P_ReturnThrustX(secretpickup, launchangle, launchmomentum) ); + + mobj_t *flare = P_SpawnMobj( + target->x, target->y, + target->z + target->height/2, + MT_SPARK + ); + + if (flare) + { + // Will flicker in place until secretpickup exits hitlag. + flare->colorized = true; + flare->renderflags |= RF_ALWAYSONTOP; + P_InstaScale(flare, 4 * flare->scale); + P_SetTarget(&secretpickup->target, flare); + P_SetMobjStateNF(flare, S_PRISONEGGDROP_FLAREA1); + } + + // Darken the level for roughly how long it takes until the last sound effect stops playing. + g_darkness.start = leveltime; + g_darkness.end = leveltime + target->hitlag + TICRATE + DARKNESS_FADE_TIME; } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 7a3083a8d..ce279a0d4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7499,6 +7499,10 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->z += P_MobjFlip(mobj); mobj->flags2 |= MF2_AMBUSH; + + // Finish flare animation. + if (mobj->target && !P_MobjWasRemoved(mobj->target)) + P_SetMobjStateNF(mobj->target, S_PRISONEGGDROP_FLAREB1); } if (teststate == S_PRISONEGGDROP_CD) @@ -7538,6 +7542,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj) sparkle->color = M_RandomChance(FRACUNIT/2) ? SKINCOLOR_ULTRAMARINE : SKINCOLOR_MAGENTA; sparkle->momz += 8 * mobj->scale * P_MobjFlip(mobj); + sparkle->scale = 3 * sparkle->scale; + sparkle->scalespeed = abs(sparkle->scale - sparkle->destscale) / 16; + + // Colorize flare. + if (mobj->target && !P_MobjWasRemoved(mobj->target)) + mobj->target->color = sparkle->color; } } } diff --git a/src/sounds.c b/src/sounds.c index 14ccca9cb..e9c3eff9c 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -534,7 +534,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k82", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Burst"}, {"s3k83", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Collapsing"}, {"s3k84", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Powering up"}, - {"s3k85", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Powering down"}, + {"s3k85", false, 64, 24, -1, NULL, 0, -1, -1, LUMPERROR, "Powering down"}, {"s3k86", false, 128, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Alarm"}, {"s3k87", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bounce"}, {"s3k88", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Metallic squeak"},