diff --git a/src/d_player.h b/src/d_player.h index d17d84868..1a82272e3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -429,6 +429,9 @@ struct roundconditions_t fixed_t maxspeed; + tic_t continuousdraft; + tic_t continuousdraft_best; + 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 e1d147f8c..377eccb7f 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2966,6 +2966,18 @@ static void readcondition(UINT16 set, UINT32 id, char *word2) return; } } + else if (fastcmp(params[0], "DRAFTDURATION")) + { + PARAMCHECK(1); + ty = UCRP_DRAFTDURATION; + re = get_number(params[1]); + + if (re < 5) + { + deh_warning("Duration %d seconds too low for condition ID %d", re, id+1); + return; + } + } else if (fastcmp(params[0], "TRIGGER")) { PARAMCHECK(1); diff --git a/src/k_kart.c b/src/k_kart.c index 1304e2b58..00bc70862 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1466,7 +1466,8 @@ static void K_UpdateDraft(player_t *player) if (K_TryDraft(player, otherPlayer->mo, minDist, draftdistance, leniency) == true) { - return; // Finished doing our draft. + //return; + goto draftdurationhandling; // Finished doing our draft. } } } @@ -1501,7 +1502,14 @@ static void K_UpdateDraft(player_t *player) { player->draftpower = 0; player->lastdraft = -1; + player->roundconditions.continuousdraft = 0; + return; } + +draftdurationhandling: + player->roundconditions.continuousdraft++; + if (player->roundconditions.continuousdraft > player->roundconditions.continuousdraft_best) + player->roundconditions.continuousdraft_best = player->roundconditions.continuousdraft; } void K_KartPainEnergyFling(player_t *player) diff --git a/src/m_cond.c b/src/m_cond.c index a621c6704..02a935d6a 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1611,6 +1611,8 @@ boolean M_CheckCondition(condition_t *cn, player_t *player) case UCRP_SPEEDOMETER: return (player->roundconditions.maxspeed >= cn->requirement); + case UCRP_DRAFTDURATION: + return (player->roundconditions.continuousdraft_best >= ((tic_t)cn->requirement)*TICRATE); case UCRP_TRIGGER: // requires map trigger set return !!(player->roundconditions.unlocktriggers & (1 << cn->requirement)); @@ -2359,6 +2361,8 @@ static const char *M_GetConditionString(condition_t *cn) if (!gamedata->everseenspecial) return NULL; return "smash the UFO Catcher"; + case UCRP_CHASEDBYSPB: + return "while chased by a Self-Propelled Bomb"; case UCRP_MAKERETIRE: { @@ -2402,9 +2406,8 @@ static const char *M_GetConditionString(condition_t *cn) ? "" : "at least", cn->requirement ); - - case UCRP_CHASEDBYSPB: - return "while chased by a Self-Propelled Bomb"; + case UCRP_DRAFTDURATION: + return va("consistently draft off other racers for %u seconds", cn->requirement); case UCRP_TRIGGER: return "do something special"; diff --git a/src/m_cond.h b/src/m_cond.h index 989a7a3ff..bcf77fe21 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -115,6 +115,7 @@ typedef enum UCRP_RINGSEXACT, // == [rings] UCRP_SPEEDOMETER, // >= [percentage] + UCRP_DRAFTDURATION, // >= [time, seconds] UCRP_TRIGGER, // Map execution trigger [id]