Historical comparison. The 304 Cvars below are what
listCvarsshows 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 1already 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.