diff options
| author | 2025-10-11 01:35:54 +0100 | |
|---|---|---|
| committer | 2025-10-11 01:36:16 +0100 | |
| commit | b447f5879d0c4c49d72f167ed2cf0f1e44a52123 (patch) | |
| tree | 7b20bb65b7acc2826591af01d531baf8281ae79b /src | |
| parent | e3716a68c1b4f1b189065dda1a1e998715c8ede9 (diff) | |
| download | sst-b447f5879d0c4c49d72f167ed2cf0f1e44a52123.tar.gz sst-b447f5879d0c4c49d72f167ed2cf0f1e44a52123.zip | |
Handle negated gamedata tag matches properly
The NE thing wasn't really correct, because it would match hypothetical
cases where OE and some other tag bit are both set. Now we simply use
!OE instead. The _GAMES_WITH inversion case is correct, because it
doesn't necessarily exclude OE from being included too.
Diffstat (limited to 'src')
| -rw-r--r-- | src/build/mkgamedata.c | 12 | ||||
| -rw-r--r-- | src/fixes.c | 2 | ||||
| -rw-r--r-- | src/gametype.h | 6 |
3 files changed, 9 insertions, 11 deletions
diff --git a/src/build/mkgamedata.c b/src/build/mkgamedata.c index d3b9c9c..de70c0b 100644 --- a/src/build/mkgamedata.c +++ b/src/build/mkgamedata.c @@ -182,8 +182,10 @@ F( "#line %d \"%" fS "\"", srclines[i], srcnames[srcfiles[i]]) // don't attempt to optimise for nested conditionals because that's // way more complicated and also basically defeats the purpose. if (indents[j] != 1) continue; - if_cold (fprintf(out, "%s \\\n\t _gametype_tag_%s", pipe, - sbase + tags[j]) < 0) { + bool neg = sbase[tags[j]] == '!'; + const char *tilde = (const char *)"~" + !neg; // cast away warning + if_cold (fprintf(out, "%s \\\n\t %s_gametype_tag_%s", pipe, tilde, + sbase + tags[j] + neg) < 0) { diewrite(); } pipe = " |"; @@ -247,14 +249,16 @@ _i("}") continue; } F( "#line %d \"%" fS "\"", srclines[i], srcnames[srcfiles[i]]) + bool neg = sbase[tags[i]] == '!'; + const char *excl = (const char *)"!" + !neg; // cast away warning if (indents[i] > indents[i - 1]) { -Fi(" if (GAMETYPE_MATCHES(%s)) {", sbase + tags[i]) +Fi(" if (%sGAMETYPE_MATCHES(%s)) {", excl, sbase + tags[i] + neg); ++indent; } else { _i("}") F( "#line %d \"%" fS "\"", srclines[i], srcnames[srcfiles[i]]) -Fi("else if (GAMETYPE_MATCHES(%s)) {", sbase + tags[i]) +Fi("else if (%sGAMETYPE_MATCHES(%s)) {", excl, sbase + tags[i] + neg); } if (exprs[i]) { F( "#line %d \"%" fS "\"", srclines[i], srcnames[srcfiles[i]]) diff --git a/src/fixes.c b/src/fixes.c index d4b5330..733616b 100644 --- a/src/fixes.c +++ b/src/fixes.c @@ -91,8 +91,8 @@ static void generalfixes() { // fps_max policy varies a bit between speedgames and their communities! // in theory we might wanna remove CON_NOTCONN on Portal 1 in a future // release, but for now people haven't fully talked themselves into it. - struct con_var *v = con_findvar("fps_max"); if (GAMETYPE_MATCHES(L4Dx)) { + struct con_var *v = con_findvar("fps_max"); // for L4D games, generally changing anything above normal limits is // disallowed, but externally capping FPS will always be possible so we // might as well allow lowering it ingame for convenience. diff --git a/src/gametype.h b/src/gametype.h index 6f6a712..5b9336b 100644 --- a/src/gametype.h +++ b/src/gametype.h @@ -95,12 +95,6 @@ GAMETYPE_BASETAGS(_GAMETYPE_DISCARD, _GAMETYPE_ZERO) (_gametype_tag_OrangeBox | _gametype_tag_2013) #define _gametype_tag_Portal (_gametype_tag_Portal1 | _gametype_tag_Portal2) -/* Match for stuff that's specifically NOT OE. */ -// TODO(compat): maybe we should add a specific !Tag syntax to mkgamedata, -// which would make this redundant. as of now this is just a low-effort way to -// keep some cvar things undefined under OE to avoid confusion -#define _gametype_tag_NE (~_gametype_tag_OE) - #define GAMETYPE_MATCHES(x) !!(_gametype_tag & (_gametype_tag_##x)) #endif |
