UCRP_FINISHGRADE A

"get grade A or better"
Not for Podium, use PodiumCup instead for that
This commit is contained in:
toaster 2023-10-20 13:03:45 +01:00
parent 48bb2e1b3c
commit a1f93b4c60
4 changed files with 62 additions and 0 deletions

View file

@ -2973,6 +2973,32 @@ static void readcondition(UINT16 set, UINT32 id, char *word2)
return; return;
} }
} }
else if (fastcmp(params[0], "FINISHGRADE"))
{
PARAMCHECK(1);
ty = UCRP_FINISHGRADE;
re = -1;
if (!params[1][1])
{
switch (params[1][0])
{
case 'E': { re = GRADE_E; break; }
case 'D': { re = GRADE_D; break; }
case 'C': { re = GRADE_C; break; }
case 'B': { re = GRADE_B; break; }
case 'A': { re = GRADE_A; break; }
case 'S': { re = GRADE_S; break; }
default: { break; }
}
}
if (re == -1)
{
deh_warning("Invalid grade %s for condition ID %d", params[1], id+1);
return;
}
}
else if ((offset=0) || fastcmp(params[0], "FINISHTIME") else if ((offset=0) || fastcmp(params[0], "FINISHTIME")
|| (++offset && fastcmp(params[0], "FINISHTIMEEXACT")) || (++offset && fastcmp(params[0], "FINISHTIMEEXACT"))
|| (++offset && fastcmp(params[0], "FINISHTIMELEFT"))) || (++offset && fastcmp(params[0], "FINISHTIMELEFT")))

View file

@ -800,6 +800,9 @@ void level_tally_t::Tick(void)
transition = 0; transition = 0;
transitionTime = TICRATE/7; transitionTime = TICRATE/7;
delay = TICRATE/2; delay = TICRATE/2;
// for UCRP_FINISHGRADE
owner->roundconditions.checkthisframe = true;
} }
else else
{ {

View file

@ -1623,6 +1623,14 @@ boolean M_CheckCondition(condition_t *cn, player_t *player)
&& !(player->pflags & PF_NOCONTEST) && !(player->pflags & PF_NOCONTEST)
&& M_NotFreePlay() && M_NotFreePlay()
&& player->position == cn->requirement); && player->position == cn->requirement);
case UCRP_FINISHGRADE:
return (player->exiting
&& !(player->pflags & PF_NOCONTEST)
&& M_NotFreePlay()
&& (player->tally.active == true)
&& (player->tally.state >= TALLY_ST_GRADE_APPEAR)
&& (player->tally.state < TALLY_ST_DONE)
&& (player->tally.rank >= cn->requirement));
case UCRP_FINISHTIME: case UCRP_FINISHTIME:
return (player->exiting return (player->exiting
&& !(player->pflags & PF_NOCONTEST) && !(player->pflags & PF_NOCONTEST)
@ -2446,6 +2454,29 @@ static const char *M_GetConditionString(condition_t *cn)
return va("finish in %d%s%s", cn->requirement, M_GetNthType(cn->requirement), return va("finish in %d%s%s", cn->requirement, M_GetNthType(cn->requirement),
((cn->type == UCRP_FINISHPLACE && cn->requirement > 1) ((cn->type == UCRP_FINISHPLACE && cn->requirement > 1)
? " or better" : "")); ? " or better" : ""));
case UCRP_FINISHGRADE:
{
char gradeletter = '?';
const char *orbetter = "";
switch (cn->requirement)
{
case GRADE_E: { gradeletter = 'E'; break; }
case GRADE_D: { gradeletter = 'D'; break; }
case GRADE_C: { gradeletter = 'C'; break; }
case GRADE_B: { gradeletter = 'B'; break; }
case GRADE_A: { gradeletter = 'A'; break; }
case GRADE_S: { gradeletter = 'S'; break; }
default: { break; }
}
if (cn->requirement < GRADE_S)
orbetter = " or better";
return va("get grade %c%s",
gradeletter, orbetter
);
}
case UCRP_FINISHTIME: case UCRP_FINISHTIME:
return va("finish in %i:%02i.%02i", return va("finish in %i:%02i.%02i",
G_TicsToMinutes(cn->requirement, true), G_TicsToMinutes(cn->requirement, true),

View file

@ -110,6 +110,8 @@ typedef enum
UCRP_FINISHPLACE, // Finish at least [place] UCRP_FINISHPLACE, // Finish at least [place]
UCRP_FINISHPLACEEXACT, // Finish at [place] exactly UCRP_FINISHPLACEEXACT, // Finish at [place] exactly
UCRP_FINISHGRADE, // Finish with at least grade [grade]
UCRP_FINISHTIME, // Finish <= [time, tics] UCRP_FINISHTIME, // Finish <= [time, tics]
UCRP_FINISHTIMEEXACT, // Finish == [time, tics] UCRP_FINISHTIMEEXACT, // Finish == [time, tics]
UCRP_FINISHTIMELEFT, // Finish with at least [time, tics] to spare UCRP_FINISHTIMELEFT, // Finish with at least [time, tics] to spare