UCRP_DRAFTDURATION

"consistently draft off other racers for [parameter] seconds"
Actually counts leniency tics too, but if the leniency hits 0 it gets reset.
This commit is contained in:
toaster 2023-10-18 02:32:46 +01:00
parent 0f06807c65
commit a6ef8d357c
5 changed files with 31 additions and 4 deletions

View file

@ -429,6 +429,9 @@ struct roundconditions_t
fixed_t maxspeed; fixed_t maxspeed;
tic_t continuousdraft;
tic_t continuousdraft_best;
mobjeflag_t wet_player; mobjeflag_t wet_player;
// 32 triggers, one bit each, for map execution // 32 triggers, one bit each, for map execution

View file

@ -2966,6 +2966,18 @@ static void readcondition(UINT16 set, UINT32 id, char *word2)
return; 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")) else if (fastcmp(params[0], "TRIGGER"))
{ {
PARAMCHECK(1); PARAMCHECK(1);

View file

@ -1466,7 +1466,8 @@ static void K_UpdateDraft(player_t *player)
if (K_TryDraft(player, otherPlayer->mo, minDist, draftdistance, leniency) == true) 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->draftpower = 0;
player->lastdraft = -1; 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) void K_KartPainEnergyFling(player_t *player)

View file

@ -1611,6 +1611,8 @@ boolean M_CheckCondition(condition_t *cn, player_t *player)
case UCRP_SPEEDOMETER: case UCRP_SPEEDOMETER:
return (player->roundconditions.maxspeed >= cn->requirement); 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 case UCRP_TRIGGER: // requires map trigger set
return !!(player->roundconditions.unlocktriggers & (1 << cn->requirement)); return !!(player->roundconditions.unlocktriggers & (1 << cn->requirement));
@ -2359,6 +2361,8 @@ static const char *M_GetConditionString(condition_t *cn)
if (!gamedata->everseenspecial) if (!gamedata->everseenspecial)
return NULL; return NULL;
return "smash the UFO Catcher"; return "smash the UFO Catcher";
case UCRP_CHASEDBYSPB:
return "while chased by a Self-Propelled Bomb";
case UCRP_MAKERETIRE: case UCRP_MAKERETIRE:
{ {
@ -2402,9 +2406,8 @@ static const char *M_GetConditionString(condition_t *cn)
? "" : "at least", ? "" : "at least",
cn->requirement cn->requirement
); );
case UCRP_DRAFTDURATION:
case UCRP_CHASEDBYSPB: return va("consistently draft off other racers for %u seconds", cn->requirement);
return "while chased by a Self-Propelled Bomb";
case UCRP_TRIGGER: case UCRP_TRIGGER:
return "do something special"; return "do something special";

View file

@ -115,6 +115,7 @@ typedef enum
UCRP_RINGSEXACT, // == [rings] UCRP_RINGSEXACT, // == [rings]
UCRP_SPEEDOMETER, // >= [percentage] UCRP_SPEEDOMETER, // >= [percentage]
UCRP_DRAFTDURATION, // >= [time, seconds]
UCRP_TRIGGER, // Map execution trigger [id] UCRP_TRIGGER, // Map execution trigger [id]