diff --git a/src/d_player.h b/src/d_player.h index 65bfdd2b9..4676f1076 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -433,6 +433,9 @@ struct roundconditions_t tic_t continuousdraft; tic_t continuousdraft_best; + UINT8 consecutive_grow_lasers; + UINT8 best_consecutive_grow_lasers; + mobjeflag_t wet_player; // 32 triggers, one bit each, for map execution diff --git a/src/deh_soc.c b/src/deh_soc.c index 2e88c8107..0d21c7a76 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3015,6 +3015,18 @@ static void readcondition(UINT16 set, UINT32 id, char *word2) return; } } + else if (fastcmp(params[0], "GROWCONSECUTIVEBEAMS")) + { + PARAMCHECK(1); + ty = UCRP_GROWCONSECUTIVEBEAMS; + re = get_number(params[1]); + + if (re < 2 || re > UINT8_MAX) + { + deh_warning("Touch count %d out of range (2 - %u) for condition ID %d", re, UINT8_MAX, id+1); + return; + } + } else if (fastcmp(params[0], "TRIGGER")) { PARAMCHECK(1); diff --git a/src/k_kart.c b/src/k_kart.c index 405e9ff70..688f96471 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3842,6 +3842,7 @@ void K_RemoveGrowShrink(player_t *player) } player->growshrinktimer = 0; + player->roundconditions.consecutive_grow_lasers = 0; } boolean K_IsBigger(mobj_t *compare, mobj_t *other) diff --git a/src/m_cond.c b/src/m_cond.c index aacb6b609..095b44598 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1643,6 +1643,8 @@ boolean M_CheckCondition(condition_t *cn, player_t *player) return (player->roundconditions.maxspeed >= cn->requirement); case UCRP_DRAFTDURATION: return (player->roundconditions.continuousdraft_best >= ((tic_t)cn->requirement)*TICRATE); + case UCRP_GROWCONSECUTIVEBEAMS: + return (player->roundconditions.best_consecutive_grow_lasers >= cn->requirement); case UCRP_TRIGGER: // requires map trigger set return !!(player->roundconditions.unlocktriggers & (1 << cn->requirement)); @@ -2457,6 +2459,8 @@ static const char *M_GetConditionString(condition_t *cn) ); case UCRP_DRAFTDURATION: return va("consistently draft off other racers for %u seconds", cn->requirement); + case UCRP_GROWCONSECUTIVEBEAMS: + return va("touch the blue beams from your own Shrink at least %u times before returning to normal size", cn->requirement); case UCRP_TRIGGER: return "do something special"; diff --git a/src/m_cond.h b/src/m_cond.h index 7cfc0685a..7b9a9e3ec 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -118,6 +118,7 @@ typedef enum UCRP_SPEEDOMETER, // >= [percentage] UCRP_DRAFTDURATION, // >= [time, seconds] + UCRP_GROWCONSECUTIVEBEAMS, // touch more than n times consecutively UCRP_TRIGGER, // Map execution trigger [id] diff --git a/src/objects/shrink.c b/src/objects/shrink.c index 23613ff52..04b703328 100644 --- a/src/objects/shrink.c +++ b/src/objects/shrink.c @@ -547,6 +547,16 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim) victim->player->growshrinktimer += 6*TICRATE; S_StartSound(victim, sfx_kc5a); + if (victim->player->roundconditions.consecutive_grow_lasers < UINT8_MAX) + { + victim->player->roundconditions.consecutive_grow_lasers++; + if (victim->player->roundconditions.consecutive_grow_lasers > victim->player->roundconditions.best_consecutive_grow_lasers) + { + victim->player->roundconditions.best_consecutive_grow_lasers + = victim->player->roundconditions.consecutive_grow_lasers; + } + } + if (prevTimer <= 0) { victim->scalespeed = mapobjectscale/TICRATE;