The Witcher 2: Assassins of Kings Enhanced Edition

The Witcher 2: Assassins of Kings Enhanced Edition

Not enough ratings
Skip Intro & Launcher Without Mod Download
By Cray
Skip the intro sequences without external mod/downloads. Everything's contained in this guide (you need python to run it, once, though).

For skipping intros, everything is bundled into a single python script. Linux users can just run it, as Python is included in every common Linux distribution.
It should work for windows too, but I haven't tested since I don't use windows.

Credits:

For the skipping intro videos, credit goes to Gametism for his mod at nexusmods:
https://www.nexusmods.com/witcher2/mods/1045

For skipping the launcher, credit goes to carlinho in this thread:
https://steamproxy.net/app/20920/discussions/0/864946409144490392/

Yukimaru for pointing out you can just replace the exe in the launch option on windows.

All I've done here is bundle everything in a convenient script so it fits on a steam guide and you don't need a nexusmods account or download, and referenced the answer by carlinho so you (and myself, later) can find it all in one place. Some users may of course find it easier to just use the nexusmods download.
   
Award
Favorite
Favorited
Unfavorite
Skipping the intros
The script (contained in next section) replaces and takes backups of the intro videos. You can undo the changes later, and it does some basic checks to ensure you don't lose the originals by overwriting the backups.

If you're thinking "Why not just delete the intro video files?" - I thought the same, but it doesn't work, you'll still have to wait and click past them.

note to windows users: stuff like '~' and '/' is Linux specific, so on windows the '~' needs replacing with your full home folder path, and '/' must be replaced with '\'
and use " quotes around the path if it contains spaces


  • Copy the script in the next section and paste it into a file named witcher2_intro_remover.py and store it somewhere like your home folder.

  • Locate the 'movies' folder in your Witcher 2 installation, it should be something like:

    'steamapps/common/the witcher 2/CookedPC/movies'

  • Open a command terminal in this folder ('movies' folder must be your current working directory) and run it thusly:

  • ~/witcher2_intro_remover.py rename
    to skip intros

  • ~/witcher2_intro_remover.py restore
    to restore files and re-enable intros
The script
#!/usr/bin/env python3 import os import sys import bz2 import hashlib import binascii ''' skip intro sequences in Witcher 2 by replacing the video files with empty ones. This is the same method as used by Gametism here: https://www.nexusmods.com/witcher2/mods/1045 The end result is the same, the only difference is this script wraps everything in a single file by bundling the videos as a compressed hex string which is unpacked and written to files. Use at your own risk, author takes no responsibility for any inconvenience or damage. How to use: 1) save this script in your home folder as witcher2_intro_remover.py 2) open a command terminal in the appropriate folder, it should be in: 'steamapps/common/the witcher 2/CookedPC/movies' 3) run the script like so: To remove intros: python3 ~/witcher2_intro_remover.py rename To restore intros: python3 ~/witcher2_intro_remover.py restore ''' FILES_TO_REPLACE = [ 'bumpers_CZ.usm', 'bumpers_EU.usm', 'bumpers_GOG.usm', 'bumpers_HU.usm', 'bumpers_NA.usm', 'bumpers_PL.usm', 'bumpers_RU.usm', 'cdpr.usm', 'intro.usm', 'middleware.usm', 'nvidia.usm', 'redengine.usm' ] BZ2_COMPRESSED_HEX = '425a683931415926535945083a4d0009b47fffffffffffffffddd7fffffff2bfeffff850c8040053409ae24000608002604448d003b61e6cf7bc3c740cf2034d0d0032034d34d3469a347ffaaa8031191a626134c4680000320d0611a34d34340d01a04a210d46427909934419001a1a340000340031000d001a64d1a313206868d3040cd490a034434620640681a6468680626800d000d03f54001a01900d068c868008948f48c1068d190d304d189898869a34c4c04c8c04d1a310c132062019030264d302609129a89a86468193d400190fd51fa90c4f534680001a03401a64191a0000f51a0001a64cccab09b8821489874ae04e1cd7926178198df732f4848b43839ef4e45c32e6c26dbb8e403e2fefcba73f5e299a1525592942a1d3bc2b689c620e95360549b8dcfb6925315e68ec68ae4d557b7fb27796e00000000000000000000000000000000000000000010b22aaa4f7352840d3bd1bd6acb86ba2626661b773f88ac1f784f4224a81ab868164b400a66845db007fb8567356263a4a91a02acbd58f160f68c0797ebf624235ec29bac378308a8d378f310bc9e5f77af457b3e354b8957a9285cb0c4b919324107ba27d79cd1ae50ce54029a85ca8861a816ea25c28093496dc4e71c9eab3e9b6a245c34dabe9357a39909c9104158e8f145b88a14ee437952444068a1c29e04288494e56d5c8900c03870806263f73851e2b87259d3bdb7990f55bee27fc7c862072f33a8302169c3e7e8e9891634791d5260bf59cd3613538b10a04204f800000000000000005145144e13a12196ccbe42450b6a848d3fda79532445b4131f262e732931b180c1b18c630d88984156065fa65835815afa987e8100255152040094c6cd305fe040094a018c6ce2e9410025c2246dc13bf6aae66007dd80cb5ef31ee505966cc648baca9d3c295b7f032447e00e2d70a16ed1cd3d18e9a7622e574326119a82de3a294644a78e352714457a0744cba32dd02002243814add864b692e88200224d6c98293ab2c9310a571d7edf3a5f9e2695be9a36a413b2311ff4040044a36d159ad91e0010000084d0c94d2226bc40033b0913c72e1183163f740d518ccecfa5bb97b54ea0cd154d0d81bb4a96f6c935aaa246f48c5e22bae4baf6667eabb3f8ec1b104378ad7622986a941b9a93c73cf6a38853f116c6418e690d0e766b96910b71583833ca0b456581a4749c4a92bd15cc2f9e1212129412c105009226afc0aa9199c13d318697b313acc29d619679c4c31a54886829355604cca4f21237c51ccc27b345f8a822105034262d1f2e455494af3db0b5cd1df36d5a8b4cb22182a151620696ac954ac14df1acb3dfc2217c5128a977aba3691b020bdd2c21b7c8220b76080088c4908428b70400964248421412490842c9424736de4cae321de02004a0b309f20dd02004a2476f1aba1223b9340995cd3689bfd4faffe2ee48a70a1208a10749a' REPLACEMENT_VIDFILE_SHA256_SUM = 'b6e6522ee9fdc8dd5704efbfe53ea86812e80dc598b6f64f0f8b50a9134f2008' ORIGINALS_SHA256SUMS = { 'bumpers_CZ.usm' : 'f9a6d1f1ae9b30baa820c4a42f97f4f15049cbc0082c7e3435ae13cfb0858e92', 'bumpers_EU.usm' : 'de7b6cfe8bf9d5399c4b8ef2505f42d3ac9bc68eb38eb534d8fb77492029bf67', 'bumpers_GOG.usm' : '725276f06a0b28419996165c9ee8c435fe9410ee2deeae39e969845b04e8c491', 'bumpers_HU.usm' : 'e8e7df5e5276d2c955601acae66e568cf6142d10f2714dcf8fb03f9bcc506b28', 'bumpers_NA.usm' : '5e5592217c08afd6b1a5a8dfb440c740a50fd10318322222811d5528ed3be0ee', 'bumpers_PL.usm' : 'd0143efc132cda35ba10c0e255d4df960cadf121f14ac9999affd3ce55f339f5', 'bumpers_RU.usm' : 'b52944cdb97466b1c5b315a46bf336e97ab6860e7cc9c405e4d98429ede50d17', 'cdpr.usm' : '962e40f8e1fcc7fb4042342945f38c19988c6a38256ead9a899774e3541bbddb', 'intro.usm' : '720df7181cf2a9719078dbeab716e0158072df669d8850f0e34d0f2f79d587f6', 'middleware.usm' : '8b0953b323843cfd5dac065930ea19625c513df1598499c76ca6791cb47d9934', 'nvidia.usm' : '1ab6cb391507d86f1d3120e26f3239308143893ccc0290b8383e093d7d0e1087', 'redengine.usm' : '3a0cc8b95d478a74081a08fa5c0e6cd53b22d9be7a9e1ee1542d15647d8e838a', } def unpack_video_file_data(): raw_bz2_data = binascii.unhexlify(BZ2_COMPRESSED_HEX) raw_vidfile_data = bz2.decompress(raw_bz2_data) return raw_vidfile_data def sha256sum(filename): with open(filename, 'rb') as f: return hashlib.sha256(f.read()).hexdigest() def restore_originals(): missing_files = [] critical_error = False print("--\nrestoring original intro videos\n--") try: for filename in FILES_TO_REPLACE: if sha256sum(filename) == ORIGINALS_SHA256SUMS[filename]: print(f"file '{filename}' is already the original, skipping") continue try: os.rename(f'{filename}.original', filename) print(f"moved '{filename}.original' back to {filename}") except FileNotFoundError: missing_files.append(filename) print(f"original file '{filename}.original' not found, unable to restore", file=sys.stderr) except: critical_error = True raise finally: if missing_files: print("ERROR: Some files were missing and could not be restored:") for filename in missing_files: checksum = ORIGINALS_SHA256SUMS[filename] print(f" missing file: {filename}.original -- sha256sum: {checksum}", file=sys.stderr) print("If you've manually renamed the files, look for files with matching checksums using the sha256sum system command", file=sys.stderr) sys.exit(1) if critical_error: print("\n\nERROR: Something went wrong during restore.", file=sys.stderr) print("You will have to restore originals manually or reinstall.", file=sys.stderr) sys.exit(1) def rename_introvid_files(): print("***\nreplacing intro video files\n***") raw_vidfile_data = unpack_video_file_data() for filename in FILES_TO_REPLACE: if sha256sum(filename) == REPLACEMENT_VIDFILE_SHA256_SUM: print(f"'{filename}' was already replaced, skipping") continue newname = f'{filename}.original' print(f"renaming '{filename}' to '{newname}'") os.rename(filename, newname) print(f" writing new '{filename}'") with open(filename, 'wb') as f: f.write(raw_vidfile_data) def print_help(): print("usage: open a terminal in the 'steamapps/common/the witcher 2/CookedPC/movies' folder and run like so:\n") print(f" remove intro videos: {sys.argv[0]} rename") print(f" undo/restore intros: {sys.argv[0]} restore") def main(): if len(sys.argv) < 2: print_help() sys.exit() if sys.argv[1].lower() == 'restore': restore_originals() print("\nOriginal intros restored.") elif sys.argv[1].lower() == 'rename': rename_introvid_files() print("\nIntros disabled.") else: print("no valid command specified") print_help() if __name__ == '__main__': main()
Skipping the launcher
For windows users, it may be enough to either:

a) rename Launcher.exe to something else and then symlinking 'bin/witcher2.exe' to Launcher.exe
b) put "installfolder\bin\witcher2.exe" in launch options.

On Linux/Proton/Wine, this doesn't seem to work very well, so instead you should do some launch options magic. It could work on the Linux native version, but running it in Proton usually gives better performance.

  • Right click game in library and go to Properties->Launch options
  • enter: eval $( echo "%command%" | sed "s/\/Launcher.exe'.*/\/bin\/witcher2.exe'/" )
  • Done.

Any environment variables like 'DXVK_FRAME_RATE=144' should appear before this,
and any '--specialoption' you might pass to the game should come after.


Credit goes to carlinho in this thread:
https://steamproxy.net/app/20920/discussions/0/864946409144490392/

Originally posted by charlinho:
If using Linux, just add this as the initialization options:
eval $( echo "%command%" | sed "s/\/Launcher.exe'.*/\/bin\/witcher2.exe'/" )

In other words, anything that will replace 'Launcher.exe' with '/bin/witcher2.exe' in the launch command will work for this.
Final note
That's all there is to it. Made this to save others some time, and to give myself a backup if I need to do this again.

It's a 1st world problem, but still, it would be nice if game devs & publishers would give built-in options for automatically skipping these things, and only show logos etc. while actually loading the game in the background.

If 1 million players have to spend 4 seconds per launch, and they launch the game 25 times, that's 3 years of human time wasted on intros nobody gives a jack's ass about.

Respect people's time, it's valuable.


Glad if it saved some of yours.
4 Comments
Yukimaru 17 Nov @ 9:38am 
Without %command% it would still launch the launcher instead of the actual game
Cray  [author] 16 Nov @ 7:52pm 
Yukimaru:

1) that would launch witcher2.exe + "full original launch command", there should be no %command% at the end.
2) As mentioned, the solution is for Linux, where replacing the exe parameter like that still opens the launcher.
3) The replacement command is simple, short always works, and avoids having to lookup the folder, just a quick copypaste.

Afaik. you're right simply replacing it in launch options works on windows though, thanks, I'll edit that in.

Ig. some people use symlinks on windows because it's easier when they're already in the folder, and it doesn't throw a long pathname in the launch options.
Yukimaru 15 Nov @ 12:39pm 
I have no idea why everyone is saying using symlink or renaming, a better way (at least tested on windows) is that type "path to the bin/witcher2.exe" %command%, and that's it.
Ratconned 10 Nov @ 11:56pm 
I was thinking of playing this with the project mersey mod