# totk.ini: settings for totk.exe. Copy this file to totk.ini next to totk.exe and remove the '#' of a line to change it. # Each line shows the default; on a Steam Deck the device profile ([display]) changes a few of them. A TOTK_* # environment variable of the same name (TOTK_FPS_LIMIT for fps_limit) overrides the file. Keys are case-insensitive; # '#' and ';' start a comment; [sections] only group lines. [frame rate] # Frame rate limit: 30, 40, 45, 60, 90, 120, 144, any whole rate from 30 to 240, or display (the refresh rate of the # window's monitor, at most 240). A higher rate gives 240: above it the game's physics runs out of memory. Above 60 # is experimental and needs realtime = 1. Changes while the game runs take effect at once. # With mailbox or fifo presentation (vk_present, the default) a frame reaches the screen at a vertical blank, so a limit # that does not divide the monitor's refresh rate keeps each frame on screen for a different number of refreshes. On a # 320 Hz monitor 80, 64, 40 and 32 divide it and 90 does not: 90 fps alternates 3 and 4 refreshes per frame, which reads # as judder while the frame counter still shows 90. Likewise on 240 Hz 60, 48 and 40 divide it and on 144 Hz 72, 48 and # 36 do, while 60 does not. vk_present = immediate shows a frame as soon as it is presented, without this quantisation, # at the cost of tearing. A monitor running with variable refresh (FreeSync, G-Sync) follows the frames instead, so # there any limit inside its range is even. # fps_limit = 60 # Older key, read only while fps_limit is unset: fps60 = 0 means a limit of 30. # fps60 = 1 # Real-time frame step: game speed follows the clock instead of the frame count. # realtime = 1 # Cloth simulation on the real-time clock. Needs realtime = 1. # cloth_realtime = 1 # Fix for physics that bounce at high frame rates. # highfps_fix = 1 [performance] # The keys of this section and of [diagnostics] are for testing and troubleshooting, and take effect at the next start. # The Advanced tab of the settings menu (F1) shows all of them except zstd_native and zstd_check. # Scheduling. # A thread waiting for a virtual core interrupts the owner when it runs game code: 1 = on, 2 = priority inheritance # without the interrupt, 0 = off (the old scheduling). # async_preempt = 1 # Replay NVN submissions on their own thread, at most one frame behind the game (1 = on). Adds up to a frame of latency. # replay_async = 0 # EXPERIMENTAL, THE GAME CRASHES WITH 1. 1 lifts the virtual core gate: guest threads run without the console's limit # of one thread per core, and the game keeps per-core data without locks. With 1, 1.2.1 and 1.4.3 crash or hang, # usually at start (#212). Keep 0 to play. # free_cores = 0 # Windows timer resolution of 1 ms for steadier frame pacing (0 = the Windows default). # timer_1ms = 1 # Shaders and pipelines. # Draws whose pipeline is still building: default waits on a reserved worker; draw is the previous scheduling. # pipe_wait = default # Which draws are dropped instead of waiting for their pipeline: strict (only draws into per-frame passes), any (also # draws into passes whose target the previous frame rendered) or fullscreen (those and full-screen draws). # pipe_skip = fullscreen # Build shader stage libraries in the background ahead of time, and the threads for it (1 to 16; default: a quarter of # the CPU threads). # lib_prebuild = 1 # lib_prebuild_threads = 4 # Build known pipelines ahead of time. # pipe_prebuild = 1 # Threads that translate known shaders at start (1 to 64; default: half the CPU threads, at most 16). # prewarm_xlate = 8 # Vulkan graphics pipeline library, 0 or 1. Default: on, except on AMD's driver for RDNA 1 and 2 (RX 5000 and 6000). # gpl = 1 # Textures and memory. # ASTC texture decoding: native (the GPU's own ASTC support), gpu (a compute shader), cpu, or auto (native when the GPU # has it, gpu otherwise). # astc = auto # Game memory shared with the GPU: auto (mirror on a discrete GPU, import on an integrated one), import (host memory # imported into Vulkan), mirror (pools used as buffers get a copy in video memory) or verify (mirror plus a check of # every copy; slow). On a discrete GPU import can be far slower than mirror, not slightly slower: the GPU reads the # game's pools over PCIe. A 5070 Ti Laptop went from 6 ms to 135-230 ms of GPU time per frame with import (5 fps on the # title screen, bound: gpu, every line of the perf window waiting on a fence). The log names the mode in use: "mem: # mode import" or "mem: mode mirror". # memory = auto # A new texture created over a live texture's memory starts with that content instead of empty. # tex_alias = 1 # Host zstd decoder in place of the game's (0 = the game's), and a check that decodes every call both ways and logs # the differences (1 = on; slow). # zstd_native = 1 # zstd_check = 0 # Render fixes. # Wait for the game to finish rewriting level-of-detail data before the GPU reads it: stops objects flashing in the # wrong place and a flat far field for a frame. # lod_guard = 1 # Fill the driver-reserved constant bank c0 (storage sizes, dispatch size, point size, base instance) instead of zeros. # fix_c0 = 1 # New GPU memory pools start zero-filled, as Switch memory does. # fix_zero = 1 # Optimisations, 0 turns each off: skip bindings that did not change, remember shader lookups, reuse the previous # draw's pipeline when its state repeats, remember texture descriptors between draws, update descriptors in bulk, # skip push constants that did not change. # bind_skip = 1 # shader_memo = 1 # pipe_memo = 1 # tex_memo = 1 # desc_template = 1 # push_skip = 1 # Submit GPU work in parts every N draws between passes so the GPU starts earlier (0 to 1000; 0 = off), each part at # least split_us microseconds long (0 to 20000). # split_draws = 64 # split_us = 1000 # Vulkan. # Vulkan validation layer: checks every call and slows the game down a lot. Needs the layer installed (Vulkan SDK). # vk_validation = 0 # A thread of its own makes the Vulkan calls of each frame, 0 or 1. Default: on, except on AMD GPUs. # vk_recorder = 1 # Dynamic vertex input, 0 or 1. Default: on, except on Intel's older integrated GPU drivers (Vulkan 1.3.215 and older). # vk_dyn_vertex = 1 # Dynamic alpha to coverage, 0 or 1. Default: on, except on AMD's driver for RDNA 2 and older (RX 400 to RX 6000), # which applies alpha to coverage while the dynamic state says off and draws the characters black. # vk_dyn_a2c = 1 # Pin the shader subgroup size to 32 when the GPU allows it. # vk_subgroup_pin = 1 [display] # Device profile: auto (the Steam Deck when this is one), desktop or deck. On a Steam Deck the keys this file does not # set default to fullscreen = 1, window_size = 1280x800, output_res = 1280x800, render_scale = game, vk_present = fifo # and fps_limit = 40 (starting points, not measured yet). Read at start. # device_profile = auto # Presentation mode: mailbox (default when the driver offers it, vsync otherwise), fifo (vsync) or immediate. # vk_present = mailbox # Window client area in screen pixels (640x360 to 7680x4320), and borderless fullscreen. Windows display scaling does # not apply: at 150% scale, 1920x1080 covers the area 1280x720 covers at 100%. F11 switches fullscreen and saves it # here. Changes while the game runs take effect at once. # window_size = 1920x1080 # fullscreen = 0 # 1, the default: the game keeps running while you are in another window; the keyboard stays quiet until the window is # in front again. 0: it pauses when its window loses focus, as it does on the Switch when Home is pressed; a load # interrupted that way can stop for good. Read at each focus change. # assume_focus = 1 # Performance overlay in the top right corner: off, fps, or full (frame rate, mean and longest frame time). F10 # cycles the modes in game, as do both stick clicks (L3 + R3) on a controller. # perf_overlay = off # Which GPU to use: its index in the log, or part of its name. Default: the first discrete GPU with Vulkan 1.3. # gpu_index = 0 # gpu_name = NVIDIA # Game resolution: the size the game draws its picture and interface in (1280x720 to 7680x4320). Above 1920x1080 the # game's texture heap and memory pool grow with it. Another shape than 16:9, such as 3440x1440 on a 21:9 monitor or # the Steam Deck's 1280x800 (16:10), gives the camera's view that shape and lays the HUD out for it. The installer # prepares the UI layout for ten sizes: 2560x1080, 3440x1440, 3840x1600, 5120x2160 (21:9), 3840x1080, 5120x1440 (32:9), # 1280x800, 1680x1050, 1920x1200 and 2560x1600 (16:10). Any other size # gets the camera's view but a 16:9 HUD, stretched over the picture, unless you build its layout with # tools/make_romfs_patches.py --aspect WxH. Read at start. # output_res = 1920x1080 # 3D render scale: the scene's size relative to the game resolution, game (5/6, the game's own 1600x900 at 1080p) or # a percentage (25 to 400, at most 4096 pixels a side); above 100 supersamples the scene (anti-aliasing). Read at start. # render_scale = game # Scaling to the window when it is larger than the game resolution: fsr (AMD FSR 1) or bilinear, and FSR's sharpening # from 0 (off) to 100. Changes while the game runs take effect at once. # upscaler = fsr # sharpness = 80 # Picture shape when the window's shape differs from the game resolution's (a 16:9 picture in a 21:9 fullscreen # window): fit, the default, keeps the shape, with black bars at the sides or above and below, so a 16:9 game in a wider # window is no longer stretched as it used to be; stretch fills the window. Changes while the game runs take effect at # once. # aspect = fit # Field of view, in percent of the game's own: 70 to 140, 100 (the default) leaves the camera as it is. Higher shows # more of the world around Link. Game version 1.4.3 only. Changes while the game runs take effect at once. # fov = 100 # Anisotropic filtering of surface textures: game (the level the game asks for, as on the Switch) or 2, 4, 8, 16. Keeps # ground, roads and walls seen at a shallow angle sharp into the distance. Only filtered, mipmapped textures that tile # are raised; shadow maps, data maps and screen-sized buffers keep the game's setting. Read at start. # aniso = game # Colour adjustment of the picture, HUD included, before it is scaled to the window: brightness (-30 to 30, added in %), # contrast and saturation (70 to 150 and 50 to 200 %), gamma (0.8 to 1.2, below 1 brightens dark tones). At 0, 100, # 100 and 1 nothing runs. color_preset is the menu's profile (default, vivid, clarity, custom), which sets the four. # Changes while the game runs take effect at once. # color_preset = default # color_brightness = 0 # color_contrast = 100 # color_saturation = 100 # color_gamma = 1 # Sun shadow map size: game (the game's own, which changes with the view and drops to about 400 near the ground, so # leaf shadows look blocky and jump) or a fixed 256, 512, 768, 1024, 1536 or 2048. Above 960 the texture heap grows with # it. 256 is coarser than the game's own and is for integrated GPUs short of memory bandwidth. Read at start. # shadow_res = game # Shadow map resolution: the game's sun cascades are 960x960 (and its static shadow maps 1440 and 720) whatever the game # resolution; 2 to 4 draws them that many times larger on each side, for sharper shadows. 1 = the game's. The game's # shadow edge filter is narrowed by the same factor (translator patch 0011), so close shadow edges don't look doubled. # Read at start. # shadow_scale = 1 # Sun shadow cascade range in percent of the game's (its cascades end at 20, 40, 80 and 160 m), 50 to 400: higher moves # the steps where shadows turn softer further away, and spreads the shadow map over more ground. Read at start. # shadow_range = 100 # Screen-space contact shadows, strength in percent (0 = off): after the game lights its scene, each pixel traces a # short way toward the sun through the depth buffer and darkens where something close blocks it, adding the small # shadows at feet, under stones and in grass that the shadow maps miss. Read at start. # contact_shadows = 0 # Soft sun shadows (PCSS), percent of the default penumbra width (0 to 200; 0 = the game's own four-tap filter): sharp # where an object meets the ground and softer the further its shadow falls. Done in the translated shaders (translator # patch 0010), so the shader cache is rebuilt once after an update. Read at start. # pcss = 0 # NVIDIA DLSS / DLAA for the 3D scene, on NVIDIA RTX GPUs with nvngx_dlss.dll (from NVIDIA's DLSS SDK) next to # totk.exe; elsewhere the setting does nothing. The HUD is drawn after it and is not touched. Read at start. # dlaa = 0 # What DLSS works from: dlaa (the 3D scene at full size), quality, balanced or performance (the scene at 67, 58 or # 50 % of the output, scaled up by DLSS; these replace render_scale and sharpen texture filtering to match). They apply # only with dlaa = 1 and nvngx_dlss.dll next to totk.exe, on Windows; otherwise the scene follows render_scale. Read at # start. # dlss = dlaa # The game's own FXAA after the post effects; with DLAA on it is not needed. Changes while the game runs take effect at # once. # fxaa = 1 # HDR output: hdr = 1 sends the picture as HDR10 (needs HDR on in Windows, "Use HDR", or a Wayland compositor with # colour management; without it the picture stays SDR). The game's tonemap keeps highlights up to hdr_peak_nits (your # display's peak); hdr_game_nits is the picture's white (paper white, 203 is the HDR reference) and hdr_ui_nits the # HUD's and the menu's. hdr is read at start, the nits at once. The colour profile above is for SDR only. # hdr = 0 # hdr_peak_nits = 1000 # hdr_game_nits = 203 # hdr_ui_nits = 203 [language] # Language: a Windows locale such as de-DE, or a Switch code (en-US, ja, zh-Hant, ...). Default: the Windows locale. # locale = en-US # lang = en-US # System mode reported to the game: docked or handheld. # operation_mode = docked # Language of the settings menu and the overlay: en, ru, pt-BR or zh-Hans. Default: the Windows display language, English if # it is none of them. # menu_lang = en [audio] # none mixes without opening an audio device. # audio = default # Audio the output queues before it starts, in ms (0 to 500). # audio_prefill_ms = 20 # Volume in percent (0 to 100), on top of the game's own. Changes while the game runs take effect at once. # volume = 100 [input] # Gamepad motion controls (0 = off) and vibration (0 = off). # motion = 1 # rumble = 1 # Rumble strength in percent (0 to 300; 0 = off) and the exponent on the amplitude (0.2 to 1.5; lower = weak pulses # stronger, 1 = linear). rumble_triggers = 1 also drives the impulse triggers of an Xbox pad. # rumble_strength = 130 # rumble_curve = 0.6 # rumble_triggers = 0 # Which gamepad button is Switch A: nintendo (by position: east A, south B, west Y, north X), xbox (south A, east B, # west X, north Y, as an Xbox pad labels them; cross A on a PlayStation pad) or auto (nintendo for a pad with Nintendo # labels, xbox for the others). The bind_ lines below apply on top. Changes while the game runs take effect at once. # 0.1.9's xbox_prompts is read as nintendo with prompts = xbox. # pad_layout = auto # The buttons the game's prompts show: nintendo (the game's own) or xbox (LB RB LT RT, Menu, View and a d-pad cross, # and A B X Y as labelled on the button pad_layout presses: with nintendo, A shows as B and X as Y). Read at start # (docs/controls.md, "Xbox button prompts"). # prompts = nintendo # Gamepad stick dead zone in percent of full deflection (0 to 50). Raise it for a stick that drifts: inside the circle # the stick reads centred, and the rest of its travel is scaled to start there. # stick_deadzone = 8 # Right-stick camera speed (0.1 to 3): multiplies the game's own camera turn rates, top speed included, at each of the # five camera sensitivities in the game's Options. Keys bound to the right stick follow it; the mouse keeps mouse_sens. # Read at start. # stick_sens = 1 # The dead zone of one stick, in place of stick_deadzone for that stick (0 to 50; unset = stick_deadzone). The Controls # tab shows each stick's deflection now, so a drifting stick's resting value can be read off. # lstick_deadzone = 8 # rstick_deadzone = 8 # Mouse camera sensitivity (0 to 10; 0 = no mouse camera and no cursor capture). # mouse_sens = 1 # The keyboard's sticks are all or nothing, so the game only sees a full tilt from them; while this key is held the # keyboard-driven stick values shrink and the keyboard can walk instead of run. Key names as in the bind_ lines below, # none turns it off. 0.2 to 0.9, the default holds for anything else. Only the keyboard is scaled: the mouse camera and # the gamepad are unchanged. The Controls tab sets both. The default stops just above half because a keyboard sample of # 32767 times 0.5 is one short of the 16384 the game's stick-direction bits need, and below that the keyboard stick # reads as a partial tilt only. # walk_key = lshift # walk_scale = 0.51 # Write the input of this run to a file that replays as a script (docs/controls.md, "Scripted input"). Default: off. # input_record = input.txt # Remap buttons: the Controls tab of the settings menu (F1) writes these lines. One line per Switch button or stick # direction: bind_ or bind__ = comma separated pad: and key: entries, key:default / pad:default for that part's defaults, or none. # A line replaces that button's defaults (pad and keyboard); buttons without a line keep them. Stick directions take keys # only. Invalid entries are logged and skipped. Changes while the game runs take effect at once. # pad names: south east west north l r zl zr start back lstick rstick dpad_left dpad_up dpad_right dpad_down # lpaddle1 rpaddle1 lpaddle2 rpaddle2 (the back buttons of an Xbox Elite, DualSense Edge or Steam Controller) # key names: a-z 0-9 f2-f7 f9 f12 num0-num9 space tab enter backspace lshift rshift lctrl rctrl lalt capslock insert # delete home end pageup pagedown up down left right num_add num_sub num_mul num_div num_decimal minus equals # lbracket rbracket semicolon apostrophe comma period slash backslash grave mouse_l mouse_r mouse_m mouse_x1 mouse_x2 # Defaults (pad_layout = nintendo): A = pad:east, key:E. B = pad:south, key:lshift. X = pad:north, key:space. # Y = pad:west, key:mouse_l. A pad that reports A/B and X/Y swapped (some GuliKit models): set pad_layout = xbox, or # swap them back here (keyboard keys stay): # bind_A = pad:south, key:E # bind_B = pad:east, key:lshift # bind_X = pad:west, key:space # bind_Y = pad:north, key:mouse_l [mods] # Folder with the player's mods, one subfolder per mod (/romfs, /exefs, /cheats). Default: mods next # to totk.exe. # mods_dir = # Load order, top first, names separated by |. The in-game menu (Mods) writes it; a mod not listed goes to the bottom. # mods_order = # Mods switched off, names separated by |. # mods_disabled = # auto: when an enabled mod has cheats that change the game's code and the game was built without them, the game starts # the setup's rebuild at start (a few minutes) and starts again after it. off: the game starts with the code it has. # A rebuild that failed or was cancelled is not started again for the same cheats. Default: auto. # mods_rebuild = auto [files] # Developer overlay: a folder with RomFS files and a manifest.tsv (tools/make_romfs_patches.py format). Players put # their mods into the mods folder instead ([mods]). Default: none. # romfs_mods = # Folder with the Switch shared fonts (BFTTF files, tools/extract_fonts.py output), for Chinese and Korean text. # Default: shared-fonts next to totk.exe. TOTK_SHARED_FONTS overrides it. # shared_fonts = [cheats] # One line per cheat of the mods' cheat files, mods\\cheats\.txt (docs/cheats.md); the Cheats tab of # the menu writes them. cheat_ = 1 switches a cheat on, the hash being FNV-1a 32 of "/". # Default: every cheat off. # cheat_0123abcd = 1 [diagnostics] # Extra lines in the log, comma separated: svc, host, ipc, fs, gfx, perf, sched, audio, present or all. The menu's # Performance log sets perf (frame timings). Default: none. # trace = perf # Flight recorder: keeps the last frames and saves them to a flight folder next to the folder of totk.exe when a frame # takes longer than flight_spike_ms (0 to 60000). # flight = 0 # flight_spike_ms = 100 # GPU pass marks: after a GPU crash (device lost) the log names the render pass or dispatch the GPU had started and the # last one it finished. Unset: on AMD GPUs (VK_AMD_buffer_marker). 1: also on NVIDIA GPUs # (VK_NV_device_diagnostic_checkpoints), which NVIDIA says costs a little. 0: off. # pass_crumbs = 1 # Largest render target (bytes, 0 to 1073741824) that goes back to its game memory when the game waits for a GPU fence. # A game that reads a larger target without invalidating it sees stale bytes at the default. With trace = gfx the log # names each dirty target over the limit that stays on the GPU ("fence write-back skipped-for-size") and each one over # 65536 bytes that went back ("over-default"). Raising it costs a copy per such target and wait. # wb_fence_limit = 65536