Skip to content

TNC CVar Validation

LopeKinz edited this page Oct 2, 2026 · 2 revisions

Cvar Catalog Wolfenstein II: Scrapped vs Engine Output

Note

Historical comparison. The 304 Cvars below are what listCvars shows at the restricted retail console level: only the exposed ones. The engine registers 3,256 Cvars in total (Research-Report-Cvartable). Measured against that full registry, 1822 of the 2231 scraped names are real Cvars, 409 are not, and 1433 real Cvars were missed. The "10 %" hit rate below is relative to the 304 exposed ones only. The full catalogue with descriptions and defaults is TNC-CVar-Catalog.

Generated by tools/merge_cvars_tnc.py. Compared against docs/cvars_tnc.json (scraped from EXE strings via tools/mine_cvars_tnc.py) and docs/cvars_tnc_real.json (output of the running engine).

What the Engine Says

listCvars without a search string reports 304 Cvars in total.

Combined from the available dumps: 304 unique names, of which 296 have descriptions from listCvars - help and 304 with observed values.

The values are observed values for this single session, not default values. The engine does not output default values via listCvars. Therefore, the catalog lists value together with value_source and no default field; a standard value would be an assertion anyway.

How Good Was the Scraping

Names

Count Percentage
Scraped names in cvars_tnc.json 2231 100 %
of which real, registered Cvars 222 10.0 %
of which no Cvars, only EXE strings 2009 90.0 %

Name hit rate: 10.0 %.

The number 2231 in the header of the old file is not a Cvar count, but the number of found strings that look like Cvar names.

Read conversely: of the 304 real Cvars, 222 are also in the scraped catalog; 82 are missing there.

Descriptions

Count Percentage
Guesses overall 1374 100 %
at a name that doesn't exist at all 1224 89.1 %
verifiable against the engine 149 10.8 %
of which word-for-word matching the engine 124 83.2 %
of which partial match (truncated or extended) 0 0.0 %
of which simply wrong 25 16.8 %

Description hit rate: 83.2 % of verifiable cases, word-for-word 83.2 %. Based on all guessed descriptions, including those at names that are not Cvars: 9.0 % demonstrably useful.

Examples of Deviations

anim_fxDeclName — wrong

  • Scraped: idAnimatedEntity::InitAimTargeting INVALID Tag on %s Tagname: %s
  • Engine: fxDecl to use when testing in the model editor

com_assertNoDialog — wrong

  • Scraped: whether to pop up the break, continue, ignore dialog or just break when an assert is hit
  • Engine: bypass the popup assert dialog

com_capturePath — wrong

  • Scraped: format for capture screenshots, 0 = JPG, 1 = TGA
  • Engine: optional outpath for screenshots, this path is appended to screeenshots/

com_drawThreadSpeeds — wrong

  • Scraped: sets com_drawThreadSpeeds to 2 if a frame takes longer than this time in milliseconds
  • Engine: 1 = dynamic draw, 2 = static draw, 3 = dynamic draw until stall

r_allowAsyncCompute — wrong

  • Scraped: If true then enforce encoded async compute blacklist, cvar is here to allow IHV to test
  • Engine: Enables async computing. No effect until game is restarted

r_decalFadeCulling — wrong

  • Scraped: Threshold value for the dot product between decal normal and player view direction. Range is [-1,1].
  • Engine: 1. Starts culling decals based on area of visibility on screen after the distance specified on r_decalDistanceFadeStart. Culling starts once decal has r_decalPixelThresholdFadeStart on screen and ends when it reaches r_decalPixelThresholdFadeEnd pixels. 2 - Also cull decals that face normals facing away from player.

r_decalFilteringQuality — wrong

  • Scraped: Displays just the decal id wanted.
  • Engine: 0 - Low (trilinear). 1 - Medium (aniso 2x). 2 - High (aniso 4x). 3 - Ultra (aniso 8x). 4 - Nightmare (aniso 16x)

r_imageAtlasDecalWidth — wrong

  • Scraped: Hight of decal image atlas (in k, must be pot)
  • Engine: Width of decal image atlas (in k, must be pot)

r_imageAtlasForceDropMip — wrong

  • Scraped: print image atlas stats
  • Engine: force dropmip for image atlas resources > 128px

r_initialModeWidth — falsch

  • geschuerft: Default Vertical Resolution on first start ever - Only gets used if r_mode = -2
  • Engine: Default Horizontal Resolution on first start ever - Only gets used if r_mode = -2

r_lightScatteringQuality — falsch

  • geschuerft: Light scattering volume width: 3: screenres / 8 x 128 depth (high) 2: screenres / 16 x 128 depth (high UDH) 1: screenres / 8 x 64 (medium), 0: screenres / 16 x 64 (low). >=1440p uses 0 by default
  • Engine: Light scattering volume width: 3: screenres 8 x 128 depth (high) 2: screenres / 16 x 128 depth (high UDH) 1: screenres / 8 x 64 (medium), 0: screenres / 16 x 64 (low). >=1440p uses 0 by default

r_shadingRateAntiFlickerMotionNorm — falsch

  • geschuerft: Use NVIDIA Variable Shading Rate (VSR)
  • Engine: Normalization in pixels

r_shadingRateDebug — falsch

  • geschuerft: Visualize shading rate in colors: blue - 1x2/2x1; green - 2x2; yellow - 2x4/4x2; red - 4x4; white dot = transposed
  • Engine: Visualize shading rate in colors: blue - 1x2 2x1; green - 2x2; yellow - 2x4/4x2; red - 4x4; white dot = transposed

r_shadingRateMotionSensitivityToLuma — falsch

  • geschuerft: 1/x factor to increase luma sensitivity under slow motion and avoid shimmering
  • Engine: Reduce motion influence in areas with divergent colors

r_shadingRateQualityOverride — falsch

  • geschuerft: Minimum allowed shading rate (0 - 4x4; 1 - 4x2; 2 - 2x2; 3 - 2x1; 4 - 1x1)
  • Engine: 0 - 4x4; 1 - 4x2; 2 - 2x2; 3 - 2x1; 4 - 1x1; 5 - adaptive

r_shadowAtlasTileSize — falsch

  • geschuerft: variance shadow maps
  • Engine: Shadow map atlas tile size

s_loudness_profile — falsch

  • geschuerft: Profile version exceeded support threshold, will be reset by profile manager.
  • Engine: Loudness profile

vt_maxLockedPagesPercent — falsch

  • geschuerft: maximum number of transcoded pages per frame
  • Engine: Amount of physical page pool to lock in percent; -1 = use default, [0..50] = use that percentage

vt_packPageFiles — falsch

  • geschuerft: Lock from coarsest LOD down to this LOD level in the vmtr physical page pool; [0..10] = lock from coarsest(11) down to this mip LOD
  • Engine: Use the virtual texture file name without any suffixes

vt_pageImageSizeUnique — falsch

  • geschuerft: Report the number of explicit pages each frame.
  • Engine: Dimensions of the physical page images. vt_restart after changing this.

Welche Dumps vorliegen

File Invocation Parsed Entries Engine Reports
d01.txt listCvars - help g_ 11 11
d01_0.txt listCvars - help a 225 225
d02.txt listCvars - help pm_ 2 2
d02_0.txt listCvars - help b 65 65
d03.txt listCvars - help ai_ 0 0
d03_0.txt listCvars - help c 145 145
d04.txt listCvars - help com_ 35 35
d04_0.txt listCvars - help d 172 172
d05.txt listCvars - help sys_ 14 14
d05_0.txt listCvars - help e 262 262
d06.txt listCvars - help vt_ 28 28
d06_0.txt listCvars - help f 86 86
d07.txt listCvars - help in_ 11 11
d07_0.txt listCvars - help g 145 145
d08.txt listCvars - help menu_ 0 0
d08_0.txt listCvars - help h 120 120
d09.txt listCvars - help si_ 0 0
d09_0.txt listCvars - help i 206 206
d10.txt listCvars - help anim_ 1 1
d10_0.txt listCvars - help j 29 29
d11.txt listCvars - help rs_ 4 4
d11_0.txt listCvars - help k 33 33
d12.txt listCvars - help af_ 0 0
d12_0.txt listCvars - help l 184 184
d13.txt listCvars - help decl_ 0 0
d13_0.txt listCvars - help m 167 167
d14.txt listCvars - help fx_ 0 0
d15.txt listCvars - help bot_ 0 0
d16.txt listCvars - help aic_ 0 0
d17.txt listCvars - help dp_ 0 0
d18.txt listCvars - help gp_ 0 0
d19.txt listCvars - help vk_ 0 0
d20.txt listCvars - help image_ 4 4
d21.txt listCvars - help net_ 9 9
gdump.txt listCvars - help g 145 145
wolfdump.txt listCvars 304 304

The number of parsed entries and the number reported by the engine must match everywhere; tools/verify_cvars_tnc.py checks exactly this and crashes on any incorrectly handled continuation line.

What is still missing

1 One Cvar is known by name but did not appear in any help output yet. A search text matches as a substring: a name without a single letter from a to m slips through all previous dumps. Run these calls in-game, then run merge_cvars_tnc.py again:

listCvars - help r_
conDump d_r.txt
r_SSR

7 Cvars appear in the help output with an empty description column. The engine itself has no help text for them; another dump does not bring them along, beschreibung remains null:

com_skipInputRouting
com_skipSignInManager
fs_debug
r_disableSteamOverlay
r_particleFadeQualityMultiplier
r_particleFadeQualityMultiplierDurango
sys_lang

Search texts that have never been run

Letters: n, o, p, q, r, s, t, u, v, w, x, y, z.

The search text matches as a substring at any position; a single letter covers a great deal, so a to m are covered. As long as the sum of names matches the number from listCvars, the catalog is complete and n to z would only be a final check. They are worth it if the numbers diverge.

The real gap

The capture was made in a single session. Cvars registered later cannot appear in it at all. Therefore run listCvars again, namely

  • in the loaded level instead of in the menu,
  • with com_enableDeveloperMode 1 already at startup,
  • in a multiplayer session.

If the reported total number then deviates from 304, exactly the difference is missing in Cvars, and help dumps are needed for their prefixes.

Clone this wiki locally