M_CheckCondition, conditiontype_t, etc: More fine-grained control over your condition string

- UCRP_PREFIX_ISMAP: a prefix version of UCRP_ISMAP
    - The condition string for UC_EMBLEM has been updated to match other relevant prefixes.
- UC_COMMA: a second string-relevance-only condition, for inserting a comma where only a human could find it natural
This commit is contained in:
toaster 2023-03-03 15:40:10 +00:00
parent bd54a789a2
commit 06bde8b40e
3 changed files with 34 additions and 19 deletions

View file

@ -2487,10 +2487,11 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
//PARAMCHECK(1); //PARAMCHECK(1);
ty = UC_CRASH; ty = UC_CRASH;
} }
else if (fastcmp(params[0], "AND")) else if ((offset=0) || fastcmp(params[0], "AND")
|| (++offset && fastcmp(params[0], "COMMA")))
{ {
//PARAMCHECK(1); //PARAMCHECK(1);
ty = UC_AND; ty = UC_AND + offset;
} }
else if ((offset=0) || fastcmp(params[0], "PREFIX_GRANDPRIX") else if ((offset=0) || fastcmp(params[0], "PREFIX_GRANDPRIX")
|| (++offset && fastcmp(params[0], "PREFIX_BONUSROUND")) || (++offset && fastcmp(params[0], "PREFIX_BONUSROUND"))
@ -2501,10 +2502,11 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
//PARAMCHECK(1); //PARAMCHECK(1);
ty = UCRP_PREFIX_GRANDPRIX + offset; ty = UCRP_PREFIX_GRANDPRIX + offset;
} }
else if (fastcmp(params[0], "ISMAP")) else if ((offset=0) || fastcmp(params[0], "PREFIX_ISMAP")
|| (++offset && fastcmp(params[0], "ISMAP")))
{ {
PARAMCHECK(1); PARAMCHECK(1);
ty = UCRP_ISMAP; ty = UCRP_PREFIX_ISMAP + offset;
re = G_MapNumber(params[1]); re = G_MapNumber(params[1]);
if (re >= nummapheaders) if (re >= nummapheaders)

View file

@ -623,7 +623,9 @@ boolean M_CheckCondition(condition_t *cn, player_t *player)
} }
return false; return false;
case UC_AND: // Just for string building // Just for string building
case UC_AND:
case UC_COMMA:
return true; return true;
case UCRP_PREFIX_GRANDPRIX: case UCRP_PREFIX_GRANDPRIX:
@ -637,6 +639,7 @@ boolean M_CheckCondition(condition_t *cn, player_t *player)
case UCRP_PREFIX_SEALEDSTAR: case UCRP_PREFIX_SEALEDSTAR:
return (specialstageinfo.valid == true); return (specialstageinfo.valid == true);
case UCRP_PREFIX_ISMAP:
case UCRP_ISMAP: case UCRP_ISMAP:
return (gamemap == cn->requirement+1); return (gamemap == cn->requirement+1);
case UCRP_ISCHARACTER: case UCRP_ISCHARACTER:
@ -844,7 +847,7 @@ static const char *M_GetConditionString(condition_t *cn)
Z_Free(title); Z_Free(title);
return va("INVALID MEDAL COLOR \"%d:%d\"", cn->requirement, checkLevel); return va("INVALID MEDAL COLOR \"%d:%d\"", cn->requirement, checkLevel);
} }
work = va("Get the %s Medal for %s", skincolors[emblemlocations[i].color].name, title); work = va("TIME ATTACK: Get the %s Medal for %s", skincolors[emblemlocations[i].color].name, title);
break; break;
case ET_GLOBAL: case ET_GLOBAL:
{ {
@ -870,16 +873,16 @@ static const char *M_GetConditionString(condition_t *cn)
if (emblemlocations[i].flags & GE_TIMED) if (emblemlocations[i].flags & GE_TIMED)
{ {
work = va("Find %s%s%s in %s before %i:%02i.%02i", work = va("%s: Find %s%s%s before %i:%02i.%02i",
astr, colorstr, medalstr, title, title, astr, colorstr, medalstr,
G_TicsToMinutes(emblemlocations[i].var, true), G_TicsToMinutes(emblemlocations[i].var, true),
G_TicsToSeconds(emblemlocations[i].var), G_TicsToSeconds(emblemlocations[i].var),
G_TicsToCentiseconds(emblemlocations[i].var)); G_TicsToCentiseconds(emblemlocations[i].var));
} }
else else
{ {
work = va("Find %s%s%s in %s", work = va("%s: Find %s%s%s",
astr, colorstr, medalstr, title); title, astr, colorstr, medalstr);
} }
break; break;
} }
@ -903,6 +906,8 @@ static const char *M_GetConditionString(condition_t *cn)
case UC_AND: case UC_AND:
return "&"; return "&";
case UC_COMMA:
return ",";
case UCRP_PREFIX_GRANDPRIX: case UCRP_PREFIX_GRANDPRIX:
return "GRAND PRIX:"; return "GRAND PRIX:";
@ -917,12 +922,20 @@ static const char *M_GetConditionString(condition_t *cn)
case UCRP_PREFIX_SEALEDSTAR: case UCRP_PREFIX_SEALEDSTAR:
return "SEALED STAR:"; return "SEALED STAR:";
case UCRP_PREFIX_ISMAP:
if (cn->requirement >= nummapheaders || !mapheaderinfo[cn->requirement])
return va("INVALID MAP CONDITION \"%d:%d\"", cn->type, cn->requirement);
title = BUILDCONDITIONTITLE(cn->requirement);
work = va("%s:", title);
Z_Free(title);
return work;
case UCRP_ISMAP: case UCRP_ISMAP:
if (cn->requirement >= nummapheaders || !mapheaderinfo[cn->requirement]) if (cn->requirement >= nummapheaders || !mapheaderinfo[cn->requirement])
return va("INVALID MAP CONDITION \"%d:%d\"", cn->type, cn->requirement); return va("INVALID MAP CONDITION \"%d:%d\"", cn->type, cn->requirement);
title = BUILDCONDITIONTITLE(cn->requirement); title = BUILDCONDITIONTITLE(cn->requirement);
work = va("On %s,", title); work = va("On %s", title);
Z_Free(title); Z_Free(title);
return work; return work;
case UCRP_ISCHARACTER: case UCRP_ISCHARACTER:
@ -992,25 +1005,21 @@ char *M_BuildConditionSetString(UINT8 unlockid)
{ {
cn = &c->condition[i]; cn = &c->condition[i];
if (i > 0) if (i > 0 && (cn->type != UC_COMMA))
{ {
if (lastID != cn->id) if (lastID != cn->id)
{ {
worklen = 4; worklen = 4;
strncat(message, "\nOR ", len); strncat(message, "\nOR ", len);
} }
else //if (cn->type >= UCRP_REQUIRESPLAYING) else
{ {
worklen = 1; worklen = 1;
strncat(message, " ", len); strncat(message, " ", len);
} }
/*else
{
worklen = 3;
strncat(message, "\n& ", len);
}*/
len -= worklen; len -= worklen;
} }
lastID = cn->id; lastID = cn->id;
work = M_GetConditionString(cn); work = M_GetConditionString(cn);

View file

@ -45,7 +45,9 @@ typedef enum
UC_CRASH, // Hee ho ! UC_CRASH, // Hee ho !
UC_AND, // Just for string building // Just for string building
UC_AND,
UC_COMMA,
UCRP_REQUIRESPLAYING, // All conditions below this can only be checked if (Playing() && gamestate == GS_LEVEL). UCRP_REQUIRESPLAYING, // All conditions below this can only be checked if (Playing() && gamestate == GS_LEVEL).
@ -55,7 +57,9 @@ typedef enum
UCRP_PREFIX_BREAKTHECAPSULES, // BREAK THE CAPSULES: UCRP_PREFIX_BREAKTHECAPSULES, // BREAK THE CAPSULES:
UCRP_PREFIX_SEALEDSTAR, // SEALED STAR: UCRP_PREFIX_SEALEDSTAR, // SEALED STAR:
UCRP_PREFIX_ISMAP, // name of [map]:
UCRP_ISMAP, // gamemap == [map] UCRP_ISMAP, // gamemap == [map]
UCRP_ISCHARACTER, // character == [skin] UCRP_ISCHARACTER, // character == [skin]
UCRP_FINISHCOOL, // Finish in good standing UCRP_FINISHCOOL, // Finish in good standing