diff options
| author | 2025-10-11 01:35:54 +0100 | |
|---|---|---|
| committer | 2025-10-11 01:36:16 +0100 | |
| commit | b447f5879d0c4c49d72f167ed2cf0f1e44a52123 (patch) | |
| tree | 7b20bb65b7acc2826591af01d531baf8281ae79b | |
| 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.
| -rw-r--r-- | gamedata/engine.txt | 15 | ||||
| -rw-r--r-- | src/build/mkgamedata.c | 12 | ||||
| -rw-r--r-- | src/fixes.c | 2 | ||||
| -rw-r--r-- | src/gametype.h | 6 |
4 files changed, 16 insertions, 19 deletions
diff --git a/gamedata/engine.txt b/gamedata/engine.txt index 6646565..67cf47e 100644 --- a/gamedata/engine.txt +++ b/gamedata/engine.txt @@ -2,23 +2,22 @@ # XXX: const and non-const entries might be flipped here on Windows, not 100% # sure. kind of just choosing not to care thusfar, as it still works the same! vtidx_AllocateDLLIdentifier - NE 5 + !OE 5 Portal2 8 -vtidx_RegisterConCommand +vtidx_RegisterConCommand 6 OE 5 # named RegisterConCommandBase here, but same thing - NE 6 - Portal2 9 + Portal2 9 vtidx_UnregisterConCommands - NE 8 + !OE 8 Portal2 11 vtidx_FindVar 12 OE 7 Portal2 15 vtidx_FindCommand - NE 14 + !OE 14 Portal2 17 vtidx_CallGlobalChangeCallbacks - NE 20 + !OE 20 L4Dx 18 Portal2 21 vtidx_CallGlobalChangeCallbacks_OE # different function signature, no float arg @@ -154,7 +153,7 @@ vtidx_VGuiConnect 3 + NVDTOR L4Dbased 4 + NVDTOR # ActivateGameUI added L4DS 5 + NVDTOR # some other crap added, god knows vtidx_VGuiIsInitialized # this is also just called IsInitialized() - NE 6 + NVDTOR + !OE 6 + NVDTOR L4Dbased 7 + NVDTOR L4DS 8 + NVDTOR 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 |
