Sorry for posting previously thread with wrong informations. Now everything seems to be working.
There are two methods to apply mod:
- for people with DLC installed
- for people without DLC installed
People without DLC must install additionally exefs patch, so with each new game update they must also update exefs patch to get config working.
Graphics settings are stored in binary file, so script is necessary to convert it up back to bin file.
Tutorial
Requirements:
Instructions:
Remember that messing up with settings can bring unexpected results, in worst case crashing game or even damaging save.
Thanks to @PhiZero and @OldManKain for testing.
I didn't test it personally.
Whatever presets you will figure out, you can upload in this topic.
There are two methods to apply mod:
- for people with DLC installed
- for people without DLC installed
People without DLC must install additionally exefs patch, so with each new game update they must also update exefs patch to get config working.
Graphics settings are stored in binary file, so script is necessary to convert it up back to bin file.
Structure
Header:
So new config file has 373 entries in comparison to 224 entries in XCDE. Quite a buff.
But issue is that we don't have names of those settings.
Entry table:
and at the end values.
main doesn't calculate those name hashes in runtime, it has hashes stored already in main, so we don't have access to original names of configs. So 148 entries are unknown (found by brute force only one new name - "ifmg")
Took config names from XCDE config file to fill names for what we can, for unknown names I am using hash as name (starting with 0x)
ao_av_Shwstr for whatever reason is repeated. Since JSON doesn't accept repeated keys and I wanted this to output the same file as original, I have decided to store one name as string, second as hash 0xDD677246.
If someone can write some sophisticated dictionary brute force attack on hashes and run it to fill out names, it would be appreciated.
Header:
Python:
MAGIC "INIB"
int32 10000 #unknown purpose
uint32 0x10 #offset of entry table
uint32 0x175 #entry count
So new config file has 373 entries in comparison to 224 entries in XCDE. Quite a buff.
But issue is that we don't have names of those settings.
Entry table:
Python:
int32 hash #murmur3 hash of config name
int32 type #0 - bool, 1 - float, 2 - (float, float, float), 3 - (float, float, float, float)
uint32 offset #direct offset of value
and at the end values.
main doesn't calculate those name hashes in runtime, it has hashes stored already in main, so we don't have access to original names of configs. So 148 entries are unknown (found by brute force only one new name - "ifmg")
Took config names from XCDE config file to fill names for what we can, for unknown names I am using hash as name (starting with 0x)
ao_av_Shwstr for whatever reason is repeated. Since JSON doesn't accept repeated keys and I wanted this to output the same file as original, I have decided to store one name as string, second as hash 0xDD677246.
If someone can write some sophisticated dictionary brute force attack on hashes and run it to fill out names, it would be appreciated.
C++:
{
"tonemap": true,
"ssao": false,
"bloom": false,
"godray": true,
"AntiAliasing": true,
"ColReduction": true,
"dof": false,
"lensFlare": false,
"aoskip": false,
"lut": true,
"toneHistogramLow": 0.8,
"toneHistogramHigh": 0.9,
"tonemax": 1.0,
"tonemin": 0.15,
"tonescale": 7.0,
"toneUpSpeed": 0.1,
"toneDownSpeed": 0.5,
"toneBlmmax": 1000.0,
"toneBlmmin": 0.001,
"toneBlmmul": 100.0,
"godray_inival": 0.95,
"godray_decay": 0.99,
"godray_scale": 1.235,
"blm_border_sub": 1.0,
"blm_border_mul": 0.105,
"blm_border_sub2": 0.0,
"blm_border_mul2": 0.0,
"blm_border_max": 3.5,
"blm_str1": 1.0,
"blm_str2": 1.0,
"blm_str3": 1.0,
"blm_gauss1": 0.9,
"blm_gauss2": 0.8,
"blm_gauss3": 0.8,
"blm_weight1": 0.63,
"blm_weight2": 0.1,
"blm_weight3": 0.14,
"blm_weight4": 0.53,
"blm_weight5": 0.58,
"blm_deviation1": 0.2,
"blm_deviation2": 0.5,
"blm_deviation3": 1.0,
"blm_deviation4": 1.0,
"blm_deviation5": 1.0,
"blm_saturation1": 0.0,
"blm_saturation2": 0.0,
"blm_saturation3": 0.0,
"blm_saturation4": 0.0,
"blm_saturation5": 0.35,
"blm_emissive_str": 9.0,
"blm_tone_scale": 0.05,
"blm_emissive_max": 20.0,
"blm_emissive_min": 0.0,
"bloom2": true,
"0x5D63DA76": 1.0,
"0xFC6A6BB8": 1.1,
"0x3857A64C": 0.7,
"0x2B755BF": 0.1, // related settings starts here
"0x35CD4D20": 0.11,
"0x506684C7": 0.25,
"0xD357E3AE": 0.36, // related settings ends here
"lens_max": 1.0,
"lens_rot": 0.0,
"lens_sub": 1.5,
"lens_mul": 3.5,
"lens_weight": 0.1,
"lens_decay": 1.0,
"lens_str": 1.5,
"lens_paMax": 4.0,
"lens_UVDecay": 0.29,
"AA_Sharpness": 8.0,
"AA_Range": 0.5,
"AA_Threshold": 0.17,
"AA_ThresholdMin": 0.05,
"red_sclX": 1.0,
"red_sclY": 1.0,
"red_hdsclX": 0.75,
"red_hdsclY": 0.75,
"red_Auto": true,
"red_AtMaxX": 1.0,
"red_AtMaxY": 1.0,
"red_AtMinX": 0.7,
"red_AtMinY": 0.7,
"red_AtRate": 99.0,
"ao_Lengs": 0.1, //Ignored (not read at all)
"ao_LengsRatio": 1.98, //Ignored (not read at all)
"ao_range": 5.7, //Ignored (not read at all)
"ao_rangeRatio": 1.0, //Ignored (not read at all)
"ao_sub": 0.02, //Ignored (not read at all)
"ao_subRatio": 0.15, //Ignored (not read at all)
"ao_Mul": 2.0, //Ignored (not read at all)
"ao_blurRange": 0.72, //Ignored (not read at all)
"ao_blurScale": 0.75, //Ignored (not read at all)
"ao_av_Shwstr": 0.5,
"blur": false,
"blurStr": 0.2,
"blurAlpha": 40.0,
"blurSub": 0.025,
"blurBlurRange": 0.32,
"shadowStr": 1.0,
"shadowHalf": true,
"shadowColor": [
1.0,
1.0,
1.0
],
"simShwStr": 1.6,
"simShwIn": 0.7,
"simShwMin": 0.15,
"sRGBMode": true,
"gamma": 6.0,
"ao_av_CenterWeight": 1.09,
"ao_av_MaxDistance": 0.15,
"ao_av_MaxRadius": 0.2,
"ao_av_FadeOutStart": 70000.0,
"ao_av_FadeOutDistance": 10000.0,
"ao_av_BlurFallOff": 0.05,
"ao_av_BlurScale": 1.6,
"0xDD677246": 0.5, //ao_av_Shwstr
"cam_near": 0.1,
"cam_far": 80000.0,
"avmp01": [
0.5,
0.5,
0.5
],
"avmp02": [
0.5,
0.5,
0.5
],
"avmp03": [
0.5,
0.5,
0.5
],
"avmp04": [
0.5,
0.5,
0.5
],
"avmp05": [
0.5,
0.5,
0.5
],
"avmp06": [
0.5,
0.5,
0.5
],
"avmp07": [
0.5,
0.5,
0.5
],
"avmp08": [
0.5,
0.5,
0.5
],
"avmp09": [
0.5,
0.5,
0.5
],
"avmp10": [
0.5,
0.5,
0.5
],
"avmp11": [
0.5,
0.5,
0.5
],
"avmp12": [
0.5,
0.5,
0.5
],
"avmp13": [
0.5,
0.5,
0.5
],
"avmp14": [
0.5,
0.5,
0.5
],
"avmp15": [
0.5,
0.5,
0.5
],
"avmp16": [
0.5,
0.5,
0.5
],
"cloud_h_min": 1000.0,
"cloud_h_max": 1100.0,
"cloud_color": [
1.0,
1.0,
1.0
],
"toonDirType": 0.0,
"toonDirBackBright": 1.0,
"toonDirElevation": 0.1,
"toonDirPntSptRatio": 0.5,
"toonDirLightScaleVal": 0.75,
"toonDirInOutMin": 0.6,
"toonIBLScaleVal": 0.28,
"toonShadowAlpha": 0.15,
"toonCharShadowAlpha": 0.02,
"toonCharShadowMin": 0.46,
"0xF333710C": 8.0,
"0xFFD3EE80": 15.0,
"0x8D2766E2": 30.0,
"0xF6FF1D20": 0.5, // related settings start here
"0x1A1693FE": 6.0,
"0x189ADEE9": 9.5, //related settings end
"0x301232E3": 0.1,
"0xA7951F52": true, //Ignored (not read at all)
"0x6099124E": 0.0, //Ignored (not read at all)
"0xC94C3D6C": 0.0,
"0x9B196145": 2.3,
"0x5789A4A": true,
"0xB12E641E": 40.0,
"0xC4662501": 0.0,
"0x5F104B4": 0.4,
"0x336AFD5E": 1.5,
"0xD6CEDAEF": [
0.0,
0.0,
0.0
],
"0x712CE7F5": 8.0, //related settings start here
"0x72A9D801": 15.0,
"0x9144CB69": 30.0, //related settings end here
"0x7DECFD2B": 0.5, //related settings start here
"0x35BB3EB": 6.0,
"0xF7FE9B66": 9.5, //related settings end here
"0x427B5122": 0.1,
"rim_color": [ //Ignored (not read at all)
1.0,
1.0,
1.0
],
"rim_intensity": 3.0, //Ignored (not read at all)
"iblDirectLightIntensity": 1.0,
"iblSkyIntensity": 1.5,
"iblBlendBetweenFrame": 30.0,
"0xCC9776A3": 2.2,
"skyToneDirLightIntensity": 0.2,
"skyToneAmbientIntensity": 0.32,
"tssao": true,
"tssaoRadius": 1.0,
"tssaoIntensityMul": 1.0,
"tssaoIntensityPow": 0.16,
"tssaoOutputAO": 0.35,
"tssaoPostBlurSharpness": 0.55,
"tssaoLuminanceCorrection": 0.3,
"tssaoSelectiveFiltering": true, //Ignored (not read at all)
"tssaoWeakenRatio": 0.8,
"ssr": true,
"ssrIntensity": 1.0,
"ssrShinessFade": 0.8, //Ignored (not read at all)
"ssrGroundness": 0.73,
"ssrFadeSec": 5.0,
"shadowCloud": true,
"shadowCloudStr": 0.8,
"shadowCloudSize": 300.0,
"shadowCloudScrollDir": 150.0,
"shadowCloudScrollSpeed": 6.0,
"shadowRaytraceDistance": 0.15,
"shadowRaytracePitch": 0.0,
"tmaa": true,
"tmaaSharpness_0": 0.4,
"tmaaSharpness_1": 0.6,
"tmaaSharpness_2": 0.6,
"tmaaSharpness_3": 0.72,
"tmaaSharpness_4": 0.8,
"tmaaSharpness_5": 0.9,
"tmaaSharpness_Hnd_0": 1.2,
"tmaaSharpness_Hnd_1": 1.1,
"tmaaSharpness_Hnd_2": 1.1,
"tmaaSharpness_Hnd_3": 1.12,
"tmaaSharpness_Hnd_4": 1.2,
"tmaaSharpness_Hnd_5": 1.3,
"tmaaBlendDefault": 0.05,
"tmaaBlendPBR": 0.0,
"tmaaBlendMPF": 0.3,
"tmaaBlendToon": 0.05,
"tmaaNewUpScale": true,
"tmaaSharpnessType": 2.0,
"tmaaSharpnessAwareIntensity": 0.2,
"shwCharParm": 17.92,
"shwHalfLamParm": 1.0,
"wetMaxShiness": 0.5,
"wetDarkness": 0.48,
"wetShinessScale": 0.6,
"wetToInsideFrame": 10.0,
"wetToOutsideFrame": 20.0,
"TransReduction": true,
"trans_red_sclX": 0.5,
"trans_red_sclY": 0.5,
"blur2": true,
"blur2Str": 10.0,
"blur2Sub": 0.25,
"blur2ObjScale": 0.65,
"blur2CameraScale": 0.8,
"blur2BlurRange": 0.7,
"blur2PixelRange": 20.0,
"blur2HLV": true,
"gpucount": 64.0,
"leafSpecColMinShiness": 0.1,
"leafSpecColMaxShiness": 0.4,
"leafSpecColRatio": 0.85,
"furBlur": true,
"furBlurStr": 0.3,
"furBlurPixelRange": 20.0,
"0x9e2bdf35": true, //AliasingAttoonDefault(?)
"0xCBF60DCC": 0.45,
"0xE7B8E359": 20.0,
"0x3E8B2DFF": 0.172,
"0xFAB5D0F": 0.396,
"0x15D13C05": 0.403,
"0x1F3EB72A": 0.3,
"0xFE2A5D4C": 0.545,
"0xEEF1A09B": 0.291,
"0xCB34ED6F": 0.478,
"0xE3A59F1C": 0.701,
"0x94F0215F": 0.612,
"lightShaft": true,
"lightShaftTonemapScale": 1.0,
"lightShaftTonemapLuminance": 6.5,
"reduceDirLightRim": 3.0,
"monochromeToonId": 128.0,
"monochromeFogScale": 0.5,
"0x6EF1CDA4": true,
"0xBDDCEAFD": 2.0,
"0x11FECE04": true,
"0xB1F493C2": 0.5,
"0xF5EB7B25": 3.0,
"0x44D18825": 0.0,
"0x2FCECF30": 0.4,
"lightRimColor": [
0.88,
0.91,
1.0,
0.0
],
"0xFB0982CB": 0.4,
"0x2496CDB5": 0.8,
"0x829607F": 0.3,
"0xFCA5701C": 0.6,
"0x9DB8A56E": [
0.81,
0.86,
1.0,
0.0
],
"0x55FB8D0A": 0.4,
"0xC7CE9119": 0.8,
"0xA72DEF7C": 0.3,
"0xC7A407A3": 0.6,
"0xBA390E46": false,
"0x5F14B998": 0.0,
"0x57CEA10C": 0.0,
"0x649AAB9D": true,
"0xDBBE01E6": false,
"0xD770A81C": 1.0,
"0xD63B15D7": 1.0,
"0x8644220F": 0.0,
"0xB0D850D5": 0.0,
"0x6B9AE74E": 2.0,
"0x4E9A09B4": 1.0,
"0xF4096DDB": [
0.0,
0.0,
0.0,
1.0
],
"0xA19E7F6A": 0.0,
"0xC4B90990": 0.0,
"0xB8F7EDAE": false,
"0x784D9270": [
0.5,
0.5,
1.0
],
"0xDF6D3430": 10.0,
"0xB3EB5046": 0.3,
"0x6FA1D395": 5.0,
"0xFD3F07AF": 0.2,
"0x6272E208": 0.5,
"0x29B2FD3A": 1.0,
"0x22858515": 1.0,
"0xF4524CBA": true,
"0x61D26460": 9.0,
"0x4236F1E7": 10.0,
"0xC191A703": 0.1,
"0x83BC7501": 0.8,
"0x26C9A218": true,
"0x6533AC49": 0.5,
"0x8946B815": 0.3,
"0x76E6D31": 1.0,
"0x5AFB4305": [
1.0,
0.3,
0.0
],
"0x396603C6": 2.0,
"0xC6AEF946": 1.5,
"0xF873E01": 0.7,
"0xCEE2545E": 400.0,
"0x122F2051": 200.0,
"0x32DA3BA1": 0.5,
"0xE35FE997": 1.0,
"0xF2509119": 0.8,
"0xB6C16A92": 0.2,
"0x7AC5C042": [
0.06,
0.0,
0.15
],
"0xDB44E95F": 1.0,
"0x394D8ADD": 1.0,
"0xCC286031": 0.0,
"0xD0044ECA": 0.0,
"0x46FDEFE": 400.0,
"0xF2F951A0": 400.0,
"0xAE7AAA37": [
1.0,
0.24,
0.0
],
"0x90795FB8": 0.5,
"0xE95E879C": 0.0, //"frAWE"(?)
"0xA671F91F": 25.0,
"ifmg": 75.0,
"0x3C5AB47C": 75.0,
"0x1C71EDDC": 0.0,
"0x9A1225D0": 0.0,
"0x60392758": 75.0,
"0xCF37604F": 75.0,
"0x95236DF0": 0.0,
"0x692E4637": 1.0,
"0x7B297FB2": [
1.0,
0.52,
0.08
],
"0x27733291": 1.2,
"0xDDFD9943": 0.0,
"0x3DB94B93": 0.0,
"0x8AB3E426": 80.0,
"0x1811244E": 80.0,
"0x2871F67": 300.0,
"0x1EAA9061": 400.0,
"0x8A1103DB": 1.0,
"0x7BF25AFD": 3.5,
"0xFBD4A02": 0.3, //Ignored (not read at all)
"0xEBCB4443": 300.0, //Ignored (not read at all)
"0x30EC7F91": 1.0,
"0x7F693558": -1.0,
"0x4E548": 0.65,
"0x38041560": 0.4,
"0xCDFD665A": 50.0,
"0xFD3B3C9A": 0.0,
"0x68F91A18": 0.0,
"0x2988AA37": [
1.0,
0.54,
0.0
],
"0x948D0A42": 3.0,
"0xF4DBB5E9": 0.0,
"0xF51E544F": 0.0,
"0x4860955B": 200.0,
"0x736ED30F": 400.0,
"0xF58EB9B5": 1.0,
"0x5CB90504": 1.0,
"0x81154B3B": 3.0,
"0xB8C8D60E": true,
"0x2328A055": 1.0,
"0x66A4EB5F": 3.0,
"0xD211F9B0": 2.5,
"0x27D2D389": 3.5
}
Tutorial
Requirements:
- Python 3.10.0+
- python library pymmh3 (you can install it with command "pip3 install pymmh3" in cmd/bash if you checked "Add to PATH"/"Add Python to environment variables" when installing Python)
Instructions:
- Download "GraphicsSettings.zip" and unpack it
- Edit "lib_nx.json" with whatever text editor you like. You can use IDE with JSON support (f.e. Visual Studio Code) to check if you didn't broke something in file. Don't change keys (strings before ":") if you don't know what you are doing!
- Run "libnxToBin.py"
-
Compatible titleID and versions:
- 010074F013262000 - 1.0.0, 1.1.0
Mod is using patch file that was based on Next Method from XC2 thread to get config working outside of ard.
- Put "atmosphere" folder on root of your sdcard (folder structure for Yuzu: Link)
- Run game
-
This works with any version of game.
Tested on:
- DLC Wave 1 (010074F013263001)
- Go to atmosphere\contents\010074f013262000\romfs\stream\dumpbin in your GraphicsSettings folder, copy lib_nx.bin to Switch sdcard folder (create folders if they don't exist):
- for DLC Wave 1 users:
atmosphere/contents/010074F013263001/romfs/monolib/shader
- for DLC Wave 1 users:
- Run game
- Go to atmosphere\contents\010074f013262000\romfs\stream\dumpbin in your GraphicsSettings folder, copy lib_nx.bin to Switch sdcard folder (create folders if they don't exist):
Remember that messing up with settings can bring unexpected results, in worst case crashing game or even damaging save.
Thanks to @PhiZero and @OldManKain for testing.
I didn't test it personally.
Whatever presets you will figure out, you can upload in this topic.