Skip to content

Instantly share code, notes, and snippets.

@Snailedlt
Last active June 25, 2022 12:55
Show Gist options
  • Save Snailedlt/ab5939c19563800eb513dd70fd7ae54f to your computer and use it in GitHub Desktop.
Save Snailedlt/ab5939c19563800eb513dd70fd7ae54f to your computer and use it in GitHub Desktop.
Information about the Nucleus Coop Project. Includes CHANGELOG.md, CONTRIBUTORS.md, HANDLER_DOCUMENTATION.md and KNOWN_ISSUES.md

Changelog

v2.1.1 - May 24, 2022

  1. Added Steamless command line version support: "Game.UseSteamless = true;", "Game.SteamlessArgs = "";", "Game.SteamlessTiming = 2500;".
  2. Fixed nicknames not working when using "Game.GoldbergExperimentalSteamClient = true;".
  3. Fixed Player Steam IDs setting to 0 when using "Game.PlayerSteamIDs = [];".
  4. Added game descriptions, they get downloaded to gui\descriptions.
  5. Added new line Context.EditRegKeyNoBackup, will not create a backup of the registry when editing.
  6. Fixed an unknown bug breaking the Nucleus window shape in some cases (maximizing without using the app maximizing button).
  7. Fixed changing the default text editor in Settings.ini not working.
  8. Added blur to background images, the blur can be disabled by setting Blur = 0 in Settings.ini.
  9. Other minor UI improvements and changes.

v2.1 - May 5, 2022

  1. Added Context.HandlersFolder (path to the root of Nucleus Co-op handlers folder: NucleusCo-op\handlers).
  2. Fixed app crash when a handler throws an error (sometimes on app close).
  3. Fixed random crashes while clicking on the game list.
  4. All monitors in use should be correctly scaled to 100% when a game starts now.
  5. Added UI option to enable/disable the auto setting of the desktop scale to 100% (enabled by default).
  6. All UI elements (pictures) can be customized now (see the default theme folder).
  7. Splashscreen fixes, you can skip it now by clicking on it if it shows for too long.
  8. Added UI options in settings to disable/enable the splashscreen and click sound in the settings tab and moved the "mouse click" setting to the setting.ini instead of theme.ini.
  9. Other UI related details.
  10. Some UI code optimizations.
  11. New and improved Nucleus Co-op themes.
  12. Added theme switch option in settings.
  13. Links can be clicked in handler notes now.
  14. Added option to use custom text in Context.RunAdditionalFiles prompt(s) + a boolean to show or not the file path. See readme.txt.
  15. New Documents path registry key backup/restoration handling, should fully fix Nucleus changing the location of the Documents folder sometimes after a crash.
  16. Added custom virtual devices icons.
  17. First attempt to fix Turkish "ı" bug, requires to be tested in real conditions.
  18. Fixed account_name.txt being edited while UseGoldberg is not used.
  19. Added new input device detection in setup screen, keyboards and mice icons will only show in the UI if a key is pressed or a mouse moved now.
  20. Added an option in theme.ini to round the Nucleus Co-op window corners (enabled by default).
  21. Added multiple Nucleus Co-op instances check (can be disabled in settings.ini).
  22. Added the possibility to choose the app font in theme.ini (size can be adjusted).
  23. Fixed a crash that occurred when custom icon pictures were deleted.
  24. Added new "icons" folder inside the Nucleus Co-op "gui" folder, custom icon paths are now saved in the "icons.ini" inside that folder instead of being saved in settings.ini.
  25. Fixed crash that occurred when an user had a custom Documents folder in the root of his drive and clicked game options in the UI.
  26. Fixed "Game.SymlinkFiles = [""];" and updated so that it can work under "Game.Play = function() {" using "Context.ProceedSymlink();".
  27. Help gif updated.
  28. Fixed Nucleus Co-op reporting the incorrect line number when a handler has an error, can still show the number with an offset of +1 if the line number returned is a float.
  29. Fixed a Nucleus Co-op silent crash that happened when controllers got disconnected and reconnected multiple times.
  30. Added Game.SetTopMostAtEnd = true; Sets the game windows to top most at the very end.
  31. Added .ini option to hide the Nucleus Co-op offline icon.
  32. Added handler notes magnifier option.
  33. Added new supported inputs UI icons, display what input devices a handler supports.
  34. Added Player Steam IDs fields to the Nucleus Nicknames settings tab (now named Players), you can change the instances Player Steam IDs when a handler uses goldberg or SSE via the UI now.
  35. Added new Nicknames/Player Steam IDs switcher, you can quickly switch the order of the nicknames and Player Steam IDs you set up.
  36. Fixed minor UI glitch.
  37. Last hooks prompt will show now when only using Game.PromptBetweenInstances=true; with Game.SetTopMostAtEnd = true;
  38. Added option in Settings.ini to change the default text editor.
  39. Selection not working and scaling issues fixed for Nucleus UI options that use images.

v2.0 - February 25, 2022

  1. New overhauled and customizable user interface with support for themes, game covers and screenshots.
  2. Fixed ui scaling issues at more than 100% desktop scale (and all other issues/bugs related to it).
  3. Fixed multi-monitor vertical setup drawing to not overlap input device list.
  4. Quality of life improvements such as but not limited to: new discord invite link, Nucleus Co-op github release link and much more.
  5. Added Nermintingas Galaxy emulator support.
  6. SplitCalculator(Josivan88) integration.
  7. Renamed scripts to handlers.
  8. Added new handler callbacks.
  9. New player nickname assignation.
  10. New player and input order processing.
  11. New optional splitscreen division(visualy similar to a native splitscreen game).

v1.1.3 - September 28, 2021

  1. Fixed only 4 Xinput controllers showing
  2. Fixed controller index being inconsistent with the Nucleus UI
  3. Fixed duplicate controller icons (and similar bugs)
  4. Fixed Ctrl+T working unreliably when Proto Input was injected
  5. Removed xinput1_4 dependency to fix crashing on Windows 7
  6. Added more script callbacks

v1.1.2 - September 1, 2021

  1. Fixed fake cursor not showing in some games

v1.1.1 - August 30, 2021

  1. Added script updater
  2. Fixed the Proto Input controller hooks
  3. Fixed incorrect controller icons being displayed
  4. Fixed the fake cursor not hiding when it should in some games

v1.1.0 - August 18, 2021

  1. Integrated Proto Input (github.com/ilyaki/protoinput) hooks
  2. Greatly improved keyboard/mouse input
  3. Complete rewrite of all hooks, plus new injection method support
  4. Fixed most bugs relating to keyboard/mouse input, including CursorVisibilityHook crashing
  5. New in-game GUI to change hooks and input settings while the game is running
  6. Improved fake focus, including a message filter system for all windows messages
  7. Smarter scripting so you can use a combination of keyboards/mice and controllers smoothly
  8. Custom mouse cursor support
  9. Added support for more than 4 Xinput controllers with OpenXinput
  10. Added DirectInput controller redirection
  11. Rewrite of the input locking system - no more laggy cursor, and Windows UI elements won't randomly open
  12. A bunch of misc changes and bug fixes

v1.0.2 R5 FINAL - January 2, 2020

  1. Fixed bug that would cause the incorrect document path to be used for subsequent players when using Nucleus environment and start up hooks
  2. Document path in registry will now only be changed if it needs to (only if playing a game that uses Documents for game files)
  3. Some fixes for device layout screen
  4. Updated Goldberg emulator to latest git build

v1.0.1 R5 FINAL - December 30, 2020

  1. Fixed app not opening for some users
  2. Fixed bug with expanding single keyboard vertically
  3. Added NucluesUserRoot to context (get userprofile paths for a player's respective nucleusplayer Windows account)
  4. Other minor bug fixes/tweaks

v1.0 R5 FINAL - December 24, 2020

  1. Audio routing per instance; specify each game to run through different audio sources
  2. Added support for Nemirtingas Epic Emulator
  3. Added support for games that use Documents for game files (and support for users with custom document folders)
  4. Nucleus user accounts on windows can now retain save data between sessions (including Halo MCC, your game saves will remain intact)
  5. Nucleus on close will now remove files it created when using original game folders (keeping your original game folder untouched)
  6. Registry edits done by Nucleus now only persist the game session (Nucleus backs up and restores, as to note touch your original game settings)
  7. Added alot of new scripting features that greatly increases game compatibility list
  8. New function, custom prompts. Scripts can prompt users for input that can be used in scripts for logic
  9. New xinput hooks (alot more effective way of hooking and handling xinput messages) (Thanks to @Ilyaki)
  10. Fixes for custom layouts and stretching KMB inputs on layouts
  11. Fixes for status window, performs alot better (but still every once and awhile may not work)
  12. Updated alpha 10 custom xinput dlls to enable mouse and keyboard input for instances
  13. XinputPlus assign gamepad based on player's gamepad index NOT player's index
  14. Added support for wizark952's dinput8 blocker
  15. Added some support for Goldberg's steam client loader
  16. Added options to set window styles at very end, ignore window border check, and option to enable windows at end
  17. Added function Game.IgnoreThirdPartyPrompt; when launching via third party, ignore the prompt to press ok when game is launched
  18. Changes to LaunchAsDifferentUsers - added option to keep user accounts and ability to transfer user account data (if not keeping)
  19. Made some back-end changes to Nucleus environment
  20. Revamped settings window, tabs are now used to seperate different sub-settings
  21. Changes to Context values, functions and bug fixes
  22. Updated Goldberg emulator to latest git build
  23. Added prelimary and experimental function to write to process memory; Game.WriteToProcessMemory
  24. LOTS of miscellaneous changes/bug-fixes

v0.9.9.9 r4 - April 12, 2020

  1. Improved script downloader. Handlers are cached and viewable up to a specified # of results at a time (via "pages"). User can also pre-sort and use drop-down as an alternative way to sort when searching
  2. Replaced LaunchAsDifferentUsers with a new and improved method, which will now also utilize current user's Nucleus environment. The previous method has been retained as LaunchAsDifferentUsersAlt
  3. Added an optional status window to appear when launching and closing Nucleus, to show what Nucleus is doing
  4. Added an alternative method of changing IP per instance. Alt method will create temporary loopback adapters for each player (however, it will not change any metric)
  5. Added the ability to extract existing script handlers (.nc files)
  6. Added a new option in game scripts to call Game.Play after the game instance has launched
  7. Added a new option in game scripts to not copy files from UserProfilePath when using Nucleus environment
  8. Added a new option in game scripts to ignore checking if launcher exe exists in game folder
  9. Added a new Context function, ReadRegKey. Will return a string value for a specified key
  10. Added new Context function, RunAdditionalFiles. User can specify files that need to be run before launcher/game
  11. Added functions to Context so you can now get a list of all found files and their paths that match a given pattern. Can also change a creation date and modified date of a file
  12. Added an option for DirSymlinkCopyInstead to copy all subfolders and files in addition
  13. Added new values for Player, SID, Adapter and UserProfile (for use with some of the new functions in this update)
  14. Improved editing and deleting of registry keys, in addition keys in HKEY_USERS are now accessible
  15. Changed prompts from message boxes to Forms (more control, shold now be on top most of the time)
  16. Migrated from SlimDX to SharpDX for reading controllers
  17. Updated rename mutexes to work with "Type:|" prefixes introduced in a recent update
  18. Updated external libraries to latest versions (Jint, DotNetZip, Newtonsoft Json)
  19. Potential fix for bug that was eating CPU resources when using Direct Input/Xinput Reroute
  20. Fixed XInputPlus bug that would only recognize dinput dll if it was all lowercase
  21. Fixed bugs when using DrawFakeMouseCursor, added option DrawFakeMouseForControllers [thanks to @Ilyaki]
  22. Fixed some bugs in script downloader
  23. Fixed backed up registry table not being restored
  24. Fixed DirSymlinkCopyInstead not copying folder itself
  25. Fixed ChangeExe not working when KeepSymLinkOnExit is being used
  26. Fixed Nucleus post hook dlls being injected too early when using ProcessChangesAtEnd
  27. Number of other bug fixes
  28. Minor tweaks/changes

v0.9.9.9 r3 - March 26, 2020

  1. Fixes and improvements to Game.LaunchAsDifferentUsers
  2. Fixed error message on the controller layout screen when using dinput / xinput reroute
  3. Fixed context aspect ratio decimals

v0.9.9.9 r2 - March 25, 2020

  1. Can now view all public scripts in Script Downloader and sort columns by ascending/descending order
  2. Added an option in game scripts to launch each game instance as a different user (Nucleus will create temporary accounts "nucluesplayerx" and then delete them at the very end) [thanks to @napserious for his base code]
  3. Added an option in game scripts to run Game.ExecutableName in addition to Game.LauncherExe (if used)
  4. Added an option in game scripts to specify an amount of time to wait after lauching game but before grabbing the game's process
  5. Added an option in game scripts to specify if starting arguments should be inside the executable path when using Game.CMDLaunch
  6. Added an option in game scripts/utility to use a EAC bypass dll
  7. Added an option in game scripts to kill mutexes at the end, when using Game.ProcessChangsAtEnd
  8. Added an option in game scripts to add gamepad cursors [thanks to @Ilyaki]
  9. Added additional logic to SetWindowHook and SetWindowHook hooks, now they should work better
  10. New context options available to get monitor or a specific player window's height/width/aspectratio
  11. Game.CreateSingleDeviceFile will now also hook CreateFileA for ANSI calls
  12. Whenever registry keys are being edited or deleted by a script, Nucleus will now backup the current registry keys and restore them upon exit
  13. When hard copying game files, you can now specify exclusions
  14. When hard copying game files, Nucleus will wait for each instance to hard copy before continuing
  15. Updated Goldberg emulator to latest git build (sha 5c41ba020c4ffc46d0adbeb3b82c9ae623d14ef2)
  16. Fixed not all lines using right encoding when specified, when modifying lines to files (replacelines, removelines, etc)
  17. Fixed Script Downloader not working for Window 7 users
  18. Fix for raw input filter / reregister raw input not working [thanks to @Ilyaki]
  19. Fixed some objects weren't being properly disposed

v0.9.9.9 f1 - March 15, 2020

  1. Added an option in game scripts to create only one file for HID devices per instance (the assigned HID device). This is a workaround for Unity games that use default input
  2. Added an option in game scripts to enable the minimize, and restore of game window at the end (now off by default, only few games are known to need it atm)
  3. Device handle zero support [thanks to @Ilyaki]
  4. Added a delay during start up hooks for better performance (would cause issues on lower end PCs), and fixed hang when it failed its 5 attempts
  5. Fix ResetWindows not resizing or repositioning if DontResize or DontReposition is on
  6. Only copy from AppData folder to Nucleus Environment if Nucleus Environment is being used
  7. Re-enabled debug log header
  8. Minor tweaks/bug fixes

v0.9.9.9 - March 7, 2020

  1. Nucleus now supports multiple Mice and Keyboards [thanks to @Ilyaki]
  2. Added the ability to search for scripts (handlers) and download them directly from the UI [thanks to @r-mach]
  3. You can now edit scripts while Nucleus is open and changes will take effect (no need to restart Nucleus each time anymore)
  4. Added a new option in game scripts to do resizing, repositioning and post-launch hooking of ALL instances at the very end (after all have been opened)
  5. Note: This method will not work for every option to-date
  6. Added an option in game scripts to re-register raw input in game process, a replacement for forwarding raw input [thanks to @Ilyaki]
  7. Added a new utility, Flawless Widescreen. Can be setup by calling it in game script
  8. Added an option in game scripts to change your IP per instance (NOTE: Highly experimental), a drop-down has been added to settings to select which network to change IP for
  9. Added logic to delete certain files that Nucleus adds to original game folder (when not linking or copying). For example, some that get deleted: Nucleus custom dlls, x360ce, xinput plus, custom utils
  10. Added an option in game scripts to kill mutexes in launchers
  11. Added an option in game scripts to kill mutexes in the last instance (normally last is ignored)
  12. Added an option in game scripts to rename, move or delete files in instance folders
  13. Added an option in game scripts to prompt the user after launching each instance, but before the grab process is grabbed
  14. Added an option in game scripts to delete file(s) from user profile config or save path, a prompt asking you to confirm will typically show, but this can be turned off in script too
  15. Added an option in game scripts to rename the steam api for Goldberg experimental (default will now not rename, you must set it to do so)
  16. Added an option in game scripts to kill additional processes upon exiting Nucleus or stopping a session
  17. Added an option in game scripts to ignore PreventWindowDeactivation if player is using keyboard
  18. Added an option in game scripts to copy (not symlink) all files within a given folder
  19. Added options in game scripts to disable Nucleus resizing, repositioning or making windows top most
  20. Added an option in game scripts to specify custom window styles (extended window styles as well)
  21. Increased max nickname length to 9 characters
  22. Exposed IsKeyboardPlayer to Context (will be True or False), can now be called in Game.Play
  23. Launchers will now also be killed upon exiting Nucleus or stopping a session (if any remain open throughout session), in addition to game windows
  24. Added logic to KeepAspectRatio & KeepMonitorAspectRatio if new width is to be determined (previously only new height)
  25. Added logic so that mutexes of different kinds can be killed. In Game.KillMutex(Launcher), simply begin the string with "Type:Mutant|" following by the name of the mutex to kill. Can replace mutant with any mutex type
  26. Added logic to check if borders are removed at very end (some games bring them back), and if they aren't, remove them again
  27. Added Steam language in UI settings, and language gets updated automatically for SSE now as well
  28. Updated logic when launching games with start up hooks. Will check if process for that instance is already running, as well as try to grab the correct process if it is detected to be wrong
  29. Updated logic for Goldberg to set the settings folder in Nucleus Environment if environment and no local save are enabled
  30. Updated Goldberg emulator to latest git build (sha a0b66407bf2b8da686a708802cbc412f9cd386ca)
  31. Updated Context.LocalIP to better identify user's local IP when there are multiple IPs
  32. Updated method to capture current environment's user profile if different than their username [thanks to @Ilyaki]
  33. Fixed bug with x360ce placing files in wrong directory
  34. Fixed some duplicate operations happening if game was not linked or copied
  35. Fixed instanced folders trying to be deleted if game was not linked or copied
  36. Fixed a bug with PreventWindowDeactivation causing input to not work for some users
  37. Fixed some bugs with HexEditFileAddress and HexEditExeAddress
  38. Fixed architecture displayed in UI script details

v0.9.9.1 - February 5, 2020

  1. Updated logic for LauncherExe. The file name in this field will now be launched via Nucleus but ExecutableName will be used to resize, reposition and hook. Launchers will no longer be looked for when grabbing process to manipulate. LauncherExe will be used for hex editing exes and change exes.
  2. LauncherExe can now also accept a full path to the launcher exe. This is if the launcher is outside of the game folder; NOTE: This file/folder contents will NOT be symlinked/copied, only the game root folder of ExecutableName. This means that hex edits and changing exe using a full path in LauncherExe WILL overwrite the original file!
  3. Added an option in game scripts to specify which instances get starting hooks, post-launch hooks and fake focus messages sent to (including a specific option for keyboard player)
  4. Added an option in game scripts to provide a relative config and save path from user profile for games (for use with Nucleus environment)
  5. Added an option in context menu/game options in UI to open or delete relative config and save paths (for system user profile and Nucleus)
  6. Added logic if the game is running in Nucleus environment and a user profile config and/or save path have been provided, files and folders will be copied over from the system user profile path (+ added an option to force it)
  7. Added an option in game scripts to manually enter steam IDs to be used
  8. Added an option in game scripts for games to try and keep monitor aspect ratio when being resized
  9. Added an option in game scripts to replace bytes in the exe or file at a specific offset
  10. Added new field in Context that can be used to grab the local IP address of the computer
  11. Added new fields in Context for Nucleus environment paths and relative game config/save paths
  12. If using Nucleus environment and goldberg, set the goldberg settings folder to the Nucleus appdata path
  13. Updated Goldberg emulator to latest git build (sha b4205535fbee455bee925ab3aa90780e00eead27)
  14. Hopefully, final fixes for aspect ratios being preserved via KeepAspectRatio and the new KeepMonitorAspectRatio options
  15. Fixed some issues with x360ce
  16. Fixed a bug that would cause infinite waiting if process data had already been assigned by the time it got checked
  17. Fixes for CMDBatchBefore/After (CMDOptions no longer required and will only use if there is a line for that instance, CMDBatchAfter now working)
  18. Fixed a bug that caused Nucleus to crash when using x360ce
  19. Fixed SmartSteamEmu not grabbing game process to resize, reposition and hook. SSE launches can now also use process picker
  20. Fixed bug preventing nickname from reverting back to default after removing a nickname
  21. Fixed bug that would sometimes cause an error and weird nicknames in UI, when disconnecting, reconnecting controllers
  22. Made some changes/improvements to context/game options menu and logging
  23. Game.HookInitDelay and Game.HookFocusInstances have been removed

v0.9.9 - January 22, 2020

  1. Added an option in game scripts to use Goldberg Lobby Connect (automatic)
  2. Thanks to Ilyaki, added an option in game scripts to use a custom environment (located at C:\Users<your username>\NucleusCoop)
  3. Added an option in game scripts to specify if the game is launched outside of Nucleus (Nucleus will then not launch it, but continue to do everything else, hook, resize, repos etc)
  4. Added a last fail-safe if process is still not found; a new window will open asking user to manually select the process
  5. Added an option in game scripts to manually pick the process to be manipulated for things such as resizing, repositioning and used for post-launch hooks
  6. Added an option in game scripts to run other commands in command prompt before or after game launches when using CMDLaunch (or UseForceBindIP), also set some environment variables that can be used in commands
  7. Added DInput support for XInputPlus
  8. Added an option in game scripts to have Goldberg not create a local_save.txt file (use default save location)
  9. Added an option to specify a different x360ce dll name be used, if needed
  10. Added the ability to copy entire folders (and all its contents) in CopyCustomUtils
  11. Added an option in context menu/game options in UI to delete content folder
  12. Added an option in game scripts to completely ignore linking or copying a folder and all its contents
  13. Updated Goldberg emulator to latest git build (sha 3f44827326eff6d9cc385c27f0bded89ee7642ea)
  14. Replaced a function (GetDpiForWindow - used for GUI) that required Windows 10, with an alternative method, so older versions of Windows are now better supported
  15. Made auto goldberg case insensitive when replacing steam api dlls
  16. Fixed bug that would stop script notes from appearing in UI after stopping a session
  17. Fixed bug when KeepSymLinkOnExit = true and # of players increase when there are more than 4 players
  18. Fixed LauncherExe being required in script if process was not found, or if script uses CMDLaunch or UseForceBindIP
  19. Fixed "Process is not running" crashes when using start up hooks
  20. Fixed KeepAspectRatio not resizing correctly, windows will now be horizontally centered as well (to player bounds)
  21. Fixed crash when SymlinkGame is false

v0.9.8.2 - December 8, 2019

  1. Hook code has been cleaned up and some lingering issues with Easyhook in the past have been resolved *Thanks to @Ilyaki
  2. Completely reworked Autosearch. Fixed bug requiring admin rights, custom paths are now allowed, user can choose which found games to add, and so much more
  3. Instance folder will no longer be symlinked if SymlinkFolders is true
  4. Integrated and added an option in game scripts to use DirectX 9, Direct 3D wrapper (d3d9.dll) to try and run DirectX 9 games in windowed mode
  5. Added an option in game scripts to force steam stub DRM patcher to either use x64 or x86 architecture dll
  6. Added an option in game scripts to force symlink every time
  7. Added an option in game scripts to set processor affinity per instance
  8. Changed logic of setting processor affinity
  9. Nicknames assigned in Nucleus are no longer exclusive to Goldberg
  10. The keyboard player can now be assigned a nickname in Settings
  11. Fixed large files sometimes breaking the symlink process
  12. Fixed files not being symlinked with different amount of players under the new rule: files will only be copied or symlinked once, if needed
  13. Fixed Nicknames not always being updated if changed
  14. Fixed the black window from Hide Desktop not closing when stopping a game session (must press stop or stop session hotkey)
  15. Added an option in game scripts to set processor affinity per instance
  16. Changed logic of setting processor affinity

v0.9.8.1 - November 4, 2019

  1. Reverted folder and file exclusion logic to the way it was done pre-0.9.8 (but still kept improvements made to them)
  2. DirSymlinkExclusion will force hardcopy of the folder (if it is to be symlinked), FileSymlinkExclusion will completely ignore the file (no link/copy), FileSymlinkCopyInstead will continue to just create hardcopy of file instead of symlinking it
  3. Fixed xinput plus controller mappings when keyboard player was any player except last
  4. Prompt between instances can now be delayed if PauseBetweenStarts has a value

v0.9.8 - November 1, 2019

  1. Nucleus no longer starts with administrative privileges and will prompt if it is needed, games will not be launched elevated now either
  2. Improved and changed logic on how files are copied/symlinked, much faster now and done all it once at the beginning !WARNING!: DirSymlinkExclusions did not work properly in original Nucleus Alpha 8 and now does. All files and subfolders of a DirSymlinkExclusion will be ignored no matter what the file is. Check your scripts!
  3. Files that get added to the instance folders (goldberg, xinput plus, etc) will no longer be copied over to the original game path and files (as long as SymlinkFolders is false)
  4. If SymlinkFolders is true, files WILL be copied over to the original file path
  5. Files will only be copied or symlinked once, if needed; i.e. if Instance0 path exists with at least one file & KeepSymLinkOnExit is true, Nucleus will skip copying/linking
  6. Added an option in game scripts to prevent window deactivation
  7. Added an option in game scripts to hardlink files instead of symlink
  8. Added an option in game scripts to symlink folders (needed for some games)
  9. Added option in game scripts to use the experimental Goldberg branch
  10. Added an option in game scripts to ignore creating a steam_appid file (needed for some games)
  11. Added an option in game scripts to use Steam Stub DRM Patcher
  12. Added an option in game scripts to set the foreground window to something other than the games, needed for some games to balance out FPS
  13. Added an option in game scripts to create a steam_appid.txt file in the same folder as the game executable (needed for some games)
  14. Added game option to open the original executable directory
  15. Added number of players each game has in the UI game list, under the title
  16. Added option to right click on layout selection to go through the different layouts in reverse
  17. Added/tweaked some additional logging info
  18. Added more information to be displayed when selecting the Details option in UI
  19. Updated Goldberg emulator to latest git build (sha 2986b01d0cf34cd900f772cf4294ad387c104cf4)
  20. XInput plus and X360ce will now leave controller slots blank if player is using a keyboard (no controller input should work on keyboard instance)
  21. Scripts will now open in Notepad++ by default if installed, when using the Open Script option in UI
  22. Fixed Script Author notes in UI so that long notes will not overlap when placing controllers
  23. Fixed NeedsSteamEmulation option and added SSE support for x64 games
  24. Fixed IdInWindowTitle and ForceWindowTitle bug that would prevent them from working
  25. Fixed bug preventing mutexes being killed if there were two or more
  26. Fixed process with ID of 0 being killed
  27. Removed DotNetZip nuget package as it is no longer being used (replaced zip extractions with direct file operations)
  28. If a game script has an issue and game doesn't appear, when you fix the issue and launch Nucleus again, you no longer need to re-add the game (game will simply reappear)
  29. If a file is unable to be deleted after 10 tries during clean-up, do not throw an exception, just carry-on (details are logged)
  30. PromptBetweenInstances will now show the last prompt (to install hooks) if there are hooks to install OR if FakeFocus is set to true
  31. Renamed the Data folder to now be "content" (needed as some games mistake the Nucleus Data folder in the path as game files)
  32. Renamed the games folder to now be "scripts"

v0.9.7.2 - October 15, 2019

  1. Fixed crash that would happen if ForceFocusWindowName was left blank

v0.9.7.1 - October 14, 2019

  1. When placing controllers, you can now resize any player's screen to be full vertically or horizontally on any layout (custom layouts too!)
  2. Added a new option in game scripts to reset the previous window's size, position and borders as each new instance opens up
  3. Added an option in game scripts to provide a description, that will appear in the UI when the user selects the script's game
  4. Added an option to manually specify what language Goldberg should use
  5. Experimental: UI will now scale based on monitor DPI and Font size
  6. Improved closing procedures; better chance of finding and killing any lingering game processes
  7. Only one copy of Nucleus Coop can be open now
  8. Fixed typo preventing start up hooks from working on x64 when using the delay method
  9. Fixed Nucleus not launching when there is an error with a game script; will now prompt the user about the error and not show the game in the game list
  10. Fixed a bug when stopping a session would sometimes trigger an error message
  11. Fixed a bug where third party files were being placed in wrong directory when working folder was set to something in game script
  12. Fixed not all the files in the instance folders not being deleted sometimes
  13. If Nucleus crashes, the error message is now logged in the debug log in addition to the error file generated in the Data folder, plus taskbar will now show if it was hidden
  14. Changed the "Unknown Game" error message to be clearer on what the issue is
  15. Instead of denying the user to add a game if the game's executable is already in the game list, it will now prompt the user if they would like to add the game anyway or not
  16. Removed pointless horizontal scroll bar on game list
  17. Other Minor UI changes

v0.9.7.0 - October 7, 2019

  1. Goldberg Emu is now built-in to Nucleus, 3 new options in game scripts that will fully automate the process
  2. Added a customizable custom layout slot when placing controllers/devices. Create your own layout in Settings!
  3. Fixed issue of mutexes with certain special characters not being killed or renamed properly
  4. Removed SmartSteamEmu embedded in Nucleus.Gaming.dll, greatly reducing the dll's file size. SmartSteamEmu is now accessed and available externally through the "utils" folder (also updated SSE to the latest version, 1.4.3)
  5. Added an option in game scripts to copy custom files if needed
  6. Added two options in game scripts to be able to do text value replacements in binary files
  7. Added two additional options in game scripts to be able to do text value replacements in a file you specify
  8. Added new util, ForceBindIP and an option in game scripts to set it up automatically
  9. Added new util, XInputPlus and an option in game scripts to set it up automatically
  10. Added new util, Devreorder and an option in game scripts to set it up automatically
  11. Added an option in game scripts to block raw input devices in game
  12. Updated cmd launch to now work with every instance (previously only worked on second instance)
  13. User can now right click on game list to access different options for that game
  14. Added an option in the UI to open the game script in notepad
  15. Added an option in the UI to open the game data folder
  16. Added an option in the UI to change the game icon
  17. Added an option to enable a debug log to be created
  18. Game.ExecutableName is no longer case sensitive when trying to add a game in the UI
  19. Fixed an empty error log text file from being created in instance folder whenever a hook was used
  20. Fixed x64 focus hooks and setwindow hook
  21. Added a SetWindowStart hook that can be applied as each game opens up, instead of later on with SetWindowHook
  22. Made game windows not be the top most when using Game.PromptBetweenInstances, until after the last prompt (keeps prompt on top and easier to switch-to)
  23. Improved x360ce so that the xinput dll file gets copied along with the executable so x360ce doesn't prompt to create one
  24. Exposed the raw gamepad guid of each player's controller in game scripts (changed the name of the x360ce formatted one for clarity)

v0.9.6.1a - September 22, 2019

  1. Fixed 6 and 8 player layouts
  2. Reverted mutex searching back to exact matches by default as this broke some games, but left the option to do partial searches if needed (some games do require this)

v0.9.6.0a - September 20, 2019

  1. Added an option in game scripts to rename mutexes instead of killing them
  2. Tweaked method of finding mutexes to be more inclusive. You can now provide a partial name of mutex to kill (you must still provide full name for renaming)
  3. Upgraded custom xinput dll to Alpha 10s' and added x64 custom dll support (alpha 10 custom dlls are now the default, but you can revert back to alpha 8 with a line in game script for compatability)
  4. Added 6 and 8 player support
  5. Added an option to delete games from directly within the NucleusCoop UI
  6. Added the ability to assign "nicknames" to controllers in settings, used to identify specific controllers
  7. Added the option to allow you to use those newly created nicknames in-game, instead of default "Player1", "Player2" etc (this is for games using Goldberg only)
  8. Added the ability to see which controller is which by simply holding down a button on a controller. The corresponding controller icon will light up
  9. Added an option in game scripts to keep the game's aspect ratio when resizing
  10. Added an option in game scripts to manually set width, height, as well as position of each game window
  11. Added an option in game scripts to launch and set up x360ce before launching games (make sure you aren't using custom dlls)
  12. Added an option in game scripts to have the user decide when to open the next instance, instead of each being opened automatically
  13. Added an option in game scripts to hide desktop background
  14. Added an option in game scripts to hide taskbar when launching games
  15. Added an option in game scripts to hide the mouse cursor
  16. Added an option in game scripts to add the process ID to the end of game windows (helpful for creating unique/different window titles)
  17. Added an option in game scripts to use different exe names for each instance
  18. Added an option in game scripts to Hardcopy game files instead of Symlinking
  19. Added an option in game scripts to resize and reposition the previous window after a new window opens (some games need this)
  20. Fixed a bug preventing x64 focus and setwindow hooks from working
  21. Fixed a bug preventing Nucleus from opening when multiple scripts use the same Game.ExecutableName value
  22. WIP: rudimentary support for DInput alongside XInput (more recognized in Nucleus, can be assigned to a screen like any instance - should work in game). *Most dinput devices will still need to be set up manually.
  23. WIP: rudimentary Keyboard support

v0.9.5.3a - August 30, 2019

  1. Fixed a bug that stopped Game.FakeFocus from working

v0.9.5.2a - August 30, 2019

  1. Fixed Halo not working correctly with more than 2 instances

v0.9.5.1a - August 29, 2019

  1. Added an option in game scripts to prevent games from resizing on their own
  2. Added an option in game scripts to copy files from the game directory to the instanced folder
  3. Added a parameter to the registry manipulation methods, you can now specify a base key to work from (local machine or current user)
  4. Created a custom solution in order for Halo Custom Edition to work in Nucleus
  5. Tweaked EditRegKey so it now takes an object data type as the data and a custom RegType to specify the registry type (DWord, QWord, Binary, etc), opens alot more possibilities
  6. Reworked launching games using command prompt, much better results now. CMDOptions can now be specified per game instance (first instance is ignored for now)
  7. Fixed an issue with focus hooks that would sometimes crash the game
  8. Fixed launching games that don't require mutexes be killed but still have initial hooks
  9. Fixed some other minor bugs

v0.9.5 - August 21, 2019

  1. Added an option in game scripts to hook into game functions to trick the game into thinking it has focus
  2. Added an option in game scripts to hook into game functions that try and prevent multiple instances from running
  3. Added @gymmer's "FocusFaker' method to further trick the game into thinking it has focus
  4. Added an option in game scripts to set the window priority of each game instance. Can be set to either "AboveNormal", "High" or "RealTime"
  5. Added an option in game scripts to assign which processor games run on. Can be either an ideal processor (safer, no gaurantee) or a fixed one despite availability
  6. Added the ability to edit registry keys. Required for some games
  7. Added an option in game scripts to work-around ForceFocusWindowName having to match 1:1 with game window title for resizing, positioning and focus. Needed for some games that change their window title (does not effect game launchers)
  8. Added an option to force the title of game windows to be whatever is specific in Game.Hook.ForceFocusWindowName
  9. Added an option to specify individual files to Symlink
  10. Added an option in game scripts to launch a game using cmd with specified options
  11. There is a new Settings window (see cog icon to right corner of Nucleus)
  12. You can now customize the Nucleus hotkeys to be whatever you'd like
  13. Fixed a bug that Nucleus did not work properly when game windows were closed manually
  14. Updated method to toggle game windows being top most. It is now more efficient and doesn't rely on game script
  15. Minor improvement in performance
  16. Cleaned up some code

v0.9.4.1a - August 7, 2019

  1. Fixed bug that broke the generic file manipulation methods

v0.9.4a - August 6, 2019

  1. Added two new methods for game scripts: RemoveLineInTextFile and FindLineNumberInTextFile
  2. All four of the generic file manipulation methods (Find, Remove, Replace, ReplacePartial) now include an overload method to specify the kind of encoding to use
  3. Added a new variable to be used in Remove & Find Line methods: Nucleus.SearchType. You can specify either "Contains", "Full" or "StartsWith" to get more accurate results. Now with the four file manipulation methods, you should now be able to edit ANY game text file for ANY game
  4. Fixed bug in original Nucleus that didn't allow 1 player to be able to start/play a game
  5. Fixed "one time use" bug in original Nucleus; Nucleus can now be used multiple times in one session by simply pressing the STOP Button in the app OR pressing the newly created hotkey for it: Ctrl+S
  6. Added a toggle to make the game windows not the top most windows. Useful if you want to use other programs in the background. Hotkey is Ctrl+A. Pressing it will either disable or enable the windows being top most, depending on its current state. This requires Game.GameName in Nucleus game scripts to work.

v0.9a - August 1, 2019

  1. Initial release

Main contributors

  • Original Nucleus Co-op Project: Lucas Assis (lucasassislar)
  • Nucleus Co-op Alpha 8 Mod : ZeroFox
  • Proto Input, USS, multiple keyboards/mice & hooks: Ilyaki
  • Official Nucleus Co-op 2.0 and Up: Mikou27
  • Website & handler API: r-mach
  • Handlers development and general testing: Talos91, PoundlandBacon, Pizzo, dr.oldboi and many more.

Additional credits to all original developers of the third party utilities Nucleus Co-op uses:

Special thanks to the SplitScreenDreams discord community, this wouldn't have been possible without all your contributions.

HANDLER API DOCUMENTATION

Note: If you want to create your own handler see the MasterHandler.js inside Nucleus handlers folder and this info.

Game Info

Game.ExecutableName = "Game.exe"; //The name of the game executable with the extension. This will be used by Nucleus to add games, to run the game and as process to follow for positioning and resizing.
Game.ExecutableToLaunch = "Game.exe"; //If the game is to launch a different executable, other than what Game.ExecutableName is.
Game.LauncherExe = "Launcher.exe"; //If the game needs to go through a launcher before opening Nucleus will use this exe to start the game and it will still use the Game.ExecutableName process for positioning and resizing.
Game.GUID = "Game Name"; //The name of the folder that will be created inside the Nucleus content folder (just use letters not symbols). In this folder Nucleus will store the symlinked or copied game files for each instance of the game.
Game.GameName = "Game Name"; //Title of the game that will be shown in Nucleus.
Game.LauncherTitle = "Launcher Window Title"; //The name of the launcher's window title. Some games need to go through a launcher to open. This is needed or else the application will lose the game's window.
Game.MaxPlayersOneMonitor = 4; //This is just info. It will not limit the players number.
Game.MaxPlayers = 16; //This is just the max players info that shows under the handler name in Nucleus UI. Usually we write the max number of players the game supports. (PC, should support 16 max connected input devices).

Mutex

Game.KillMutexType = "Mutant"; //Specify the type of mutex/handle to kill, for example "Mutant", "Event" or "Semaphore" | default: "Mutant".
Game.KillMutexDelay = 10; //# of seconds to wait before killing the mutex | Only works with killing not renaming | default: 0.
Game.RenameNotKillMutex = true; //Instead of killing the mutex or handle, rename it on startup to something else | Requires Game.KillMutex to contain the EXACT name of the handles for this to work (no partial).
Game.PartialMutexSearch = false; //When killing handles, should a partial search be done with the handle name? | Renaming handles requires an exact match | default: false.
Game.KillLastInstanceMutex = false; //Kill the handles, specified in Game.KillMutex, in the last instance (normally last is ignored).
Game.KillMutexAtEnd = false; //When using ProcessChangesAtEnd, should handles also be killed at the end?.
Game.KillMutexProcess = ["Mutexes","To","Close"]; //When using Game.MutexProcessExe, here you can specify the handles that need to be killed.
Game.PartialMutexSearchProcess = false; //When using Game.MutexProcessExe, here you can specify if you want to do a partial search for handles.
Game.KillMutexTypeProcess = "Mutant"; //When using Game.MutexProcessExe, here you can specify the type of handles to kill.
Game.MutexProcessExe = "Process.exe"; //Specify another executable to kill handles for.
Game.PauseBeforeMutexKilling = 1000; //Wait for X number of seconds before proceeding with mutex killing.
Game.KillMutexDelayProcess = 1000; //When using Game.MutexProcessExe, wait for X number of seconds before beginning its mutex killing.

File System

Game.SymlinkGame = true; //If we should symbolic link the game's files to a temporary directory (Nucleus instances folders in its content folder). If not will launch straight from the installation directory.
Game.SymlinkExe = false; //If SymlinkGame is enabled, if we should copy or symlink the game executable.
Game.SymlinkFolders = false; //Folders by default are hardcopied, with this enabled, folders will be symlinked instead | warning files placed in symlink folders will appear in the original game files too.
Game.KeepSymLinkOnExit = true; //Enable or disable symlink files from being deleted when Nucleus is closed | default: false.
Game.SymlinkFiles = ["game.exe","settings.cfg"]; //Symlink individual files from the game directory to the instanced folder.
Game.CopyFiles = ["game.exe","settings.cfg"]; //Copy files from the game directory to the instanced folder.
Game.HardcopyGame = true; //Instead of Symlinking, create hard copies of the games files (copy/paste) | Be careful of storage, takes a LONG time to start a game when copying.
Game.HardlinkGame = false; //Hardlink files instead of Symlink (or hard copy) | Directories will still be symlinked but files will be hardlinked.
Game.ForceSymlink = false; //Force game to be symlinked each time it is ran.
Game.DirSymlinkExclusions = ["folder1", "folder2"]; //Array with the name of the folders you don't want Nucleus Co-op to symlink, only the folders placed here get hardcopied not the files.
Game.FileSymlinkExclusions = ["file1.txt", "file2.txt"]; //Array with the name of the files you don't want Nucleus Co-op to symlink, useful if you want to replace files or add external files.
Game.FileSymlinkCopyInstead = ["file1.txt", "file2.txt"]; //Array with the name of the files you want Nucleus Co-op to make full copies of, in some cases games need certain files to be full copies or they won't run.
Game.DirSymlinkCopyInstead = [ "folder1", "folder2" ]; //Copy (not symlink) all files within a given folder | Folder name is relative from root game folder.
Game.DirSymlinkCopyInsteadIncludeSubFolders = false; //When specifying folder(s) to copy all its contents instead of linking, should subfolders and files be included as well?
Game.SymlinkFoldersTo = ["folderToMove|whereToMoveIt"]; //Symlink folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.HardlinkFoldersTo = ["folderToMove|whereToMoveIt"];//Hardlink folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.ChangeExe = true; //Will rename the game's executable to "<exe name> - Player X", x being the instance/player #.
Game.CopyCustomUtils = [ "d3d9.dll" ]; //Copy the a file or folder you specify between the quotes to each instance folder, if the file/folder is located in Nucleus folder\utils\User. This function also accepts two additional parameters, a relative path from the game root folder if the file needs to be placed somewhere else within instance folder and one parameter to indicate which instances to copy the file to if it only needs to be in some. Use of parameters is separated by a | character. So it would look something like this [ "filename.ini|\\bin|1,2" ]. This example would copy filename.ini from Nucleus\utils\User to Instance0\bin and Instance1\bin. If you don't specify which instances, it will do them all by default. If you don't specify a path then root instance folder is used. If you want instances but root folder you would just do [ "filename.ini||1,2" ] | If copying multiple files, use comma seperated strings
Game.HexEditAllExes = [ "before|afters" ]; //Will do a text value replacement in a file for every instance, accepts two parameters, one on what to look for, and what it should be replaced with (seperated with a "|") | Works with multiple values | Works in conjunction with HexEditExe (this will trigger first).
Game.HexEditExe = [ "before|afters" ]; //Will do a text value replacement in a file for a specific instance, accepts two parameters, one on what to look for, and what it should be replaced with (seperated with a "|") | Works with multiple values, each comma seperated string is the order of the instances | Works in conjunction with HexEditAllExe (this will trigger second).
Game.HexEditFile = [ "filePath|before|afters" ]; //Works same as HexEditExe function but with a file you specify as an extra parameter (first one) | filePath is relative path from the game root folder.
Game.HexEditAllFiles = [ "filePath|before|afters" ]; //Works same as HexEditAllExes function but with a file you specify as an extra parameter (first one) | filePath is relative path from the game root folder.
Game.DirExclusions = ["dir1"]; //Folders (+ all its contents) listed here will not be linked or copied over to Nucleus game content folder, the instance folders.
Game.CreateSteamAppIdByExe = false; //Create a steam_appid.txt file where the game executable is.
Game.LauncherExeIgnoreFileCheck = false; //Do not check if Launcher Exe exists in game folder | you will need to provide a relative filepath from game root folder.
Game.CopyEnvFoldersToNucleusAccounts = ["Documents", "AppData"]; //Copy subfolders of current user profile to Nucleus user accounts.
Game.CopyFoldersTo = ["folderToMove|whereToMoveIt"]; //Copy folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.HexEditExeAddress = [ "1|address|bytes" ]; //Use this to replace bytes in a file at a specified address, can be for specific instances with optional 3rd argument | 1st arg: instance # (optional), 2nd arg: hex address offset, 3rd arg: new bytes.
Game.HexEditFileAddress = [ "1|relativePath|address|bytes" ]; //Same as HexEditExeAddress but for a file other than exe | Need to provide relative path (from game root folder) + filename as 1st or 2nd arg if not specifying an instance.
Game.IgnoreDeleteFilesPrompt = false; //Do not display the warning message about a file being deleted .
Game.RenameAndOrMoveFiles = [ "1|before.dat|after.dat" ];//Specify files to either rename or move | can accept relative path from root | optional first parameter to specify a specific instance to apply to, omit to do them all.
Game.DeleteFiles = [ "1|delete.dis" ]; //Specify files to be deleted from instanced folder | can accept relative path from root | optional first parameter to specify a specific instance to apply to, omit to do them all.
Game.RunLauncherAndExe = false; //When using Game.LauncherExe, should ExecutableName also be launched?
Game.ForceLauncherExeIgnoreFileCheck = false; //Forces LauncherExeIgnoreFileCheck when game isn't symlinked.

Nucleus Co-op Environment

Game.UseNucleusEnvironment = false; //Use custom environment variables for games that use them, replaces some common paths (e.g. AppData) with C:\Users\<your username>\NucleusCoop.
Game.UserProfileConfigPath = "AppData\\Local\\Game\\Config"; //Relative path from user profile (e.g. C:\Users\ZeroFox) to game's config path | Used to provide some extra functionality (open/delete/copy over to Nucleus Environment).
Game.UserProfileSavePath = "AppData\\Local\\Game\\Saves"; //Relative path from user profile (e.g. C:\Users\ZeroFox) to game's save path | Used to provide some extra functionality (open/delete/copy over to Nucleus Environment).
Game.ForceUserProfileConfigCopy = false; //Force the games config files in UserProfileConfigPath to copy over from system user profile to Nucleus environment.
Game.ForceUserProfileSaveCopy = false; //Force the games save files in UserProfileSavePath to copy over from system user profile to Nucleus environment.
Game.DeleteFilesInConfigPath = [ "file.del", "me.too" ];//Specify files to delete in Nucleus environment config path (UserProfileConfigPath).
Game.DeleteFilesInSavePath = [ "file.del", "me.too" ]; //Specify files to delete in Nucleus environment save path (UserProfileSavePath).
Game.UserProfileConfigPathNoCopy = false; //Do not copy files from original UserProfileConfigPath if using Nucleus Environment.
Game.UserProfileSavePathNoCopy = false; //Do not copy files from original UserProfileSavePath if using Nucleus Environment.
Game.UseCurrentUserEnvironment = false; //Force the game to use the current user's environment (useful for some games that may require different Window user accounts).
Game.DocumentsConfigPath = "Path\\Here"; //Similar to UserProfileConfigPath, use this when the game uses Documents to store game files.
Game.DocumentsSavePath = "Path\\Here"; //Similar to UserProfileSavePath, use this when the game uses Documents to store game files.
Game.ForceDocumentsConfigCopy = false; //When using DocumentsConfigPath, forces a file copy from original location to Nucleus Documents.
Game.ForceDocumentsSaveCopy = false; //When using DocumentsSavePath, forces a file copy from original location to Nucleus Documents.
Game.DocumentsConfigPathNoCopy = false; //When using DocumentsConfigPath, do not let Nucleus copy from original location to Nucleus Documents.
Game.DocumentsSavePathNoCopy = false; //When using DocumentsSavePath, do not let Nucleus copy from original location to Nucleus Documents.
Game.ForceEnvironmentUse = true; //Forces use of custom environment variable when Game.ThirdPartyLaunch = true;

Focus

Game.FakeFocus = true; //Enable or disable the sending of focus messages to each game window at a regular interval | default: false.
Game.HookFocus = true; //Enable or disable hooks to trick the game into thinking it has focus | default: false.
Game.HookInit = true; //Enable or disable hooks of functions some games may try and use to prevent multiple instances from running | default: false.
Game.PreventWindowDeactivation = false; //Blocks the processing of all the windows messages that get sent when the window loses focus.
Game.HasDynamicWindowTitle = false; //Work-around for ForceFocusWindowName having to match 1:1 with game window title for resizing, positioning and focus | default: false.
Game.ForceWindowTitle = false; //Forces the game window title to be whatever is specified in Game.Hook.ForceFocusWindowName (triggers once, after all instances have started) | default: false.
Game.IdInWindowTitle = true; //Adds the process ID to the end of the window title.
Game.SetForegroundWindowElsewhere = false; //Set the foreground window to be something other than game windows.
Game.StartHookInstances = "1,2,3,4"; //If you only want specific instances to have starting hooks, specify them in a comma seperated string.
Game.PostHookInstances = "1,2,3,4"; //If you only want specific instances to have post launch hooks, specify them in a comma seperated string.
Game.FakeFocusInstances = "1,2,3,4"; //If you only want specific instances to have fake focus messages sent to, specify them in a comma seperated string.
Game.KeyboardPlayerSkipFakeFocus = false; //Should the keyboard player instance be skipped when fake focus messages are being sent to.
Game.KeyboardPlayerSkipPreventWindowDeactivate = false; //Ignore PreventWindowDeactivation if player is using keyboard.
Game.FakeFocusSendActivate = true; //Should WM_ACTIVATE message be sent to each instance? | default: true.
Game.PreventGameFocus = false; //Makes sure all the game windows are unfocused so nothing received double input from Windows.
Game.FakeFocusInterval = 1000; //The milliseconds between sending fake focus messages. Default at 1000, some rare games need this to be very low.
Game.EnableWindows = false; //Enable each game window at the end (useful if became disabled, or for some games that require this Window function to be called to display properly, after Nucleus setup).
Game.ProcessChangesAtEnd = false; //Do the resizing, repositioning and post-launch hooking of all game instances at the very end | will not work with every option ran normally.
Game.PromptProcessChangesAtEnd = false; //If ProcessChangesAtEnd = true, pause and show a prompt, before making changes to processes.
Game.PromptBetweenInstancesEnd = false; //If ProcessChangesAtEnd = true, show a prompt between each instance being changed.

Window manipulation

Game.SetWindowHook = true; //Prevent games from resizing their windows on their own | Hooks after all instances have been opened (see Game.SetWindowHookStart for an alternative).
Game.SetWindowHookStart = false; //Prevent games from resizing window their windows on their own | Hooks upon game starting up (see Game.SetWindowHook for an alternative).
Game.Hook.FixResolution = false; //Should the custom dll do the resizing? | Only works with Alpha 10 custom dll | default: false.
Game.Hook.FixPosition = false; //Should the custom dll do the repositioning? | Only works with Alpha 10 custom dll | default: false.
Game.Hook.WindowX = 0; //If manual positioning, what is the window's X coordinate | If both X and Y value > 0, window will be positioned manually.
Game.Hook.WindowY = 0; //If manual positioning, what is the window's Y coordinate | If both X and Y value > 0, window will be positioned manually.
Game.Hook.ResWidth = 1280; //If manual resizing, what is the window's width | If both ResWidth and ResHeight value > 0, window will be positioned manually.
Game.Hook.ResHeight = 720; //If manual resizing, what is the window's height | If both ResWidth and ResHeight value > 0, window will be positioned manually.
Game.KeepAspectRatio = false; //Should the game window try and keep it's aspect ratio when being resized? | default: false.
Game.ResetWindows = false; //After each new instance opens, resize, reposition and remove borders of the previous instance.
Game.KeepMonitorAspectRatio = false; //Try and resize game window within player bounds to the aspect ratio of the monitor.
Game.DontResize = false; //Should Nucleus not resize the game windows?.
Game.DontReposition = false; //Should Nucleus not reposition the game windows?.
Game.NotTopMost = false; //Should Nucleus not make the game windows top most (appear above everything else).
Game.WindowStyleValues = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.ExtWindowStyleValues = [ "~0x200", "0x200000" ]; //Override Nucleus' default of removing borders and specify a custom extended window style | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.RefreshWindowAfterStart = false; //Should each game window be minimized and restored once all instances are opened?.
Game.WindowStyleEndChanges = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style during end processing | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.ExtWindowStyleEndChanges = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style during end processing | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.IgnoreWindowBordercheck = false; //Ignore logic at end to check if any game window still has a border.
Game.DontRemoveBorders = false; //Prevents Nucleus from removing game window borders.
Game.SetTopMostAtEnd = true; //Set the game windows to top most at the very end.

Input

Game.SupportsKeyboard = true; //Enable/disable use of one keyboard/mouse player.
Game.XInputPlusDll = ["xinput1_3.dll"]; //Set up XInputPlus | If multiple dlls required, use comma seperated strings.
Game.KeyboardPlayerFirst = true; //If the keyboard player should be processed first.
Game.UseX360ce = true; //Before launching any games, Nucleus Co-op will open x360ce and let the user set up their controllers before continuing | close x360ce to continue | Don't use with custom dlls.
Game.Hook.UseAlpha8CustomDll = false; //Use the xinput custom dll from Alpha 8 instead of Alpha 10 | Will still force alpha 10 custom dll if game is x64.
Game.PlayersPerInstance = 2; //If using XInputPlus or X360ce and there are multiple players playing the same instance, set the # per instance here.
Game.UseDevReorder = true; //Set up Devreorder.
Game.XboxOneControllerFix = false; //When using x360ce, this will set certain hooktype that may work for xbox one controllers if the normal method does not work.
Game.BlockRawInput = false; //Disable raw input devices in game | default: false.
Game.X360ceDll = [ "xinput1_3.dll" ]; //If x360ce dll should be named something OTHER than xinput1_3.dll | requires Game.Usex360ce to be set to true.
Game.CreateSingleDeviceFile = false; //Create only one file for HID devices per instance (the assigned HID device).
Game.Hook.EnableMKBInput = false; //Enable Mouse/Keyboard input for instances when using Alpha 10 custom xinput dll (normally MKB is restricted).
Game.UseDInputBlocker = false; //Setup wizark952's dinput blocker (block dinput for the game).
Game.XInputPlusNoIni = false; //Do not copy XInputPlus' ini when using Game.XInputPlusDll.
Game.XInputPlusOldDll = false; //When using Game.XInputPlusDll, you can specify to use the previous version instead of latest (needed for some games).

Goldberg Emulator

Game.UseGoldberg = false; //Use the built-in Goldberg features in Nucleus | default: false.
Game.GoldbergExperimental = false; //Use the experimental branch of Goldberg | Requires `Game.UseGoldberg = true` | default: false.
Game.GoldbergExperimentalSteamClient = false; //Automatically setup Goldberg's Experimental Steam Client | Requires Game.UseGoldberg and the original steam_api.dll.
Game.GoldbergLobbyConnect = false; //Should Goldberg Lobby Connect be used to connect the instances.
Game.GoldbergNoLocalSave = false; //Do not create a local_save.txt file for Goldberg, saves are to use default game save location.
Game.GoldbergNeedSteamInterface = false; //Some older games require a steam_interfaces.txt file for Goldberg to work | Will first search orig game path and nucleus games path, if not found then tries to create one with the GoldbergNeedSteamInterface command.
Game.GoldbergLanguage = "english"; //Manually specify what language you want Goldberg to use for the game | by default, Goldberg will use the language you chose in Steam.
Game.OrigSteamDllPath = "C:\full path\steam_api.dll"; //If steam_interface.txt is required, provide full path here to the original steam_api(64).dll and Nucleus will create one if it can't find an existing copy.
Game.GoldbergIgnoreSteamAppId = false; //When set to true, Goldberg will not create a steam_appid.txt file.
Game.PlayerSteamIDs = ["76561198134585131","76561198134585132"]; //A list of steam IDs to be used instead of the pre-defined ones Nucleuses uses | IDs will be used in order they are placed, i.e. instance 1 will be first non-empty string in array.
Game.GoldbergExperimentalRename = false; //Set to true to have Goldberg Experimental rename instanced steam_api(64).dll to cracksteam_api(64).dll.
Game.GoldbergWriteSteamIDAndAccount = false; //Force Goldberg to write account_name.txt and user_steam_id.txt | Requires Game.UseGoldberg;

Smart Steam Emulator

Game.NeedsSteamEmulation = false; //If the game needs a fake Steam wrapper (SSE) to run multiple instances (this is not needed if you are using the new use Goldberg emulator line).
Game.SSEAdditionalLines = ["Section|Key=Value"]; //When using Game.NeedsSteamEmulation, here you can provide additional lines to write to the SSE ini file.

Nemirtingas Epic Emulator

Game.UseNemirtingasEpicEmu = false; //Automatically set up Nemirtinga's Epic Emulator in Nucleus
Game.EpicEmuArgs = false; //When using Nemirtinga's Epic Emulator, use pre-defined parameters -AUTH_LOGIN=unused -AUTH_PASSWORD=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -AUTH_TYPE=exchangecode -epicapp=CrabTest -epicenv=Prod -EpicPortal -epicusername=\"" + <Player Nickname here> + "\" -epicuserid=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -epiclocale=en"
Game.AltEpicEmuArgs = false; //Optional. When using Nemirtinga's Epic Emulator, use pre-defined parameters + Set NickName as epic id, only to use with games that do not use epic id to start or connect(Set clever save names if the game use the epic id to name saves ex: Tiny Tina's Assault On Dragon Keep)" -AUTH_LOGIN=unused -AUTH_PASSWORD=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -AUTH_TYPE=exchangecode -epicapp=CrabTest -epicenv=Prod -EpicPortal -epicusername=" + <Player Nickname here> + " -epicuserid="+ <Player Nickname here> + "-epiclocale=" + EpicLang".

/*
 * NemirtingasEpicEmu.json edition from a handler example:
 */

 // If you don't need to edit a line do not add it here, the emu will automatically write it with default parameters. More info here: https://gitlab.com/Nemirtingas/nemirtingas_epic_emu/-/blob/master/README.md
 // Available debug parameters,  should be "off" by default. Only required to debug the nermintingas eos emulator.
 // TRACE: Very verbose, will log DEBUG + All functions enter
 // DEBUG: Very verbose, will log INFO  + Debug infos like function parameters
 // INFO : verbose     , will log WARN  + some informations about code execution and TODOs
 // WARN : not verbose , will log ERR   + some warnings about code execution
 // ERR  : not verbose , will log FATAL + errors about code execution
 // FATAL: not verbose , will log only Fatal errors like unimplemented steam_api versions
 // OFF  : no logs     , saves cpu usage when running the debug versions
 // In case of using custom start arguments => -epicusername == same username as in the.json => -epicuserid == same epicid as in the.json >

    var jsonPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\nepice_settings\\NemirtingasEpicEmu.json";// + "\\NemirtingasEpicEmus.json" for stable older epic emu version.
    var params = [
      '{',
      '  "appid": "InvalidAppid",',
      '  "disable_online_networking": false,',
      '  "enable_lan": true,',
      '  "enable_overlay": true,',
      //'  "epicid": "3808a45790894253344fec21026bbf80",', //better to let the emu automaticaly add this line.
      '  "language":' + '"' + Context.EpicLang + '"' + ',',
      '  "log_level": "off",',
      //'  "productuserid": "ab65359ffde1b5cc41e81afee8e32c33",', //better to let the emu automaticaly add this line.
      '  "savepath": "appdata",',
      '  "signaling_servers": [],',
      '  "unlock_dlcs": true,',
      '  "username": ' + '"' + Context.Nickname + '"', //must always be added if you edit the json and must be the last line else the emulator will reset all parameters(there is no coma at the end of this line in the json).
      '}'
    ] ;
    Context.WriteTextFile(jsonPath,params);

Nemirtingas Galaxy GoG Emulator

Game.UseNemirtingasGalaxyEmu = false; //Automatically set up Nemirtinga's Galaxy Emulator in Nucleus.

NemirtingasGalxyEmu.json edition from a handler example:

    var idg = Context.PlayerID + 6;

    var jsonPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\ngalaxye_settings\\NemirtingasGalaxyEmu.json";
    var params = [
      '{',
      '  "api_version": "1.139.2.0",',
      '  "enable_overlay": false,',
      '  "galaxyid": 14549624462898294'+idg+',',
      '  "language": ' + '"' + Context.GogLang + '",',
      '  "productid": 2143654691,',
      '  "username": ' + '"' + Context.Nickname + '"', //must always be added if you edit the json and must be the last line else the emulator will reset all parameters (there is no coma at the end of this line in the json).
      '}'
     ];
    Context.WriteTextFile(jsonPath,params);

Additional Tools

Game.UseSteamless = true; //Use atom0s' Steamless app to remove Steam Stub DRM from a protected executable.
Game.SteamlessArgs = "--quiet --keepbind"; //Use this when using Game.UseSteamless = true; always, the command line version of Steamless allows for different launch arguments to be used.
Game.SteamlessTiming = 2500; //The time in milliseconds to give Steamless to patch the game .exe. 2500 is the default value and will be applied even if the timing line has not been added in a handler.
Game.UseSteamStubDRMPatcher = false; //Use UberPsyX's Steam Stub DRM Patcher to remove Steam Stub DRM from a protected executable.
Game.SteamStubDRMPatcherArch = "64"; //Force Steam Stub DRM Patcher to use either the x64 or x86 dll | Values: "64" or "86".
Game.UseEACBypass = false; //Replace any EasyAntiCheat_(x86)(x64).dll with a bypass dll.
Game.FlawlessWidescreen = "FWGameName"; //Use Flawless Widescreen application | value must be the name of the game plugin folder in PluginCache\FWS_Plugins\Modules.
Game.FlawlessWidescreenOverrideDisplay = false; //(undocumented)
Game.FlawlessWidescreenPluginPath //(undocumented)

Network

Game.UseForceBindIP = false; //Set up game instances with ForceBindIP; each instance having their own IP.
Game.ChangeIPPerInstance = false; //Highly experimental feature, will change your existing network to a static IP for each instance | option in settings to choose your network.
Game.ChangeIPPerInstanceAlt; //An alternative method to changing IP per instance | this method will create loopback adapters for each player and assign them a static ip on the same subnet mask as your main network interface.

Extra

Game.PauseBetweenProcessGrab = 30; //How many seconds to wait after launching game (or launcher) but before grabbing game process.
Game.PauseBetweenContextAndLaunch = 0; //Number of seconds to wait after running additional files but before continuing with player setup.
Game.ThirdPartyLaunch = false; //Use if the game is launched outside of Nucleus | NOTE: You will not be able to use start up hooks or CMDLaunch with this option.
Game.IgnoreThirdPartyPrompt = false; //Ignore the prompt that appears when using Game.ThirdPartyLaunch;
Game.ForceProcessPick = false; //Manually select the process that will be used for process manipulation, such as resizing, repositioning and used for post-launch hooks.
Game.PromptBetweenInstances = true; //Prompt the user with a messagebox to let the user decide when to open the next instance | default: false, PauseBetweenStarts STILL required.
Game.PromptAfterFirstInstance = false; //Show a prompt that user must click on ok to continue, after the first instance is setup.
Game.GamePlayAfterLaunch; //Call the Game.Play function after the call has launched.
Game.GamePlayBeforeGameSetup = false; //Execute Game.Play function (context) before the majority of the game is setup.
Game.LaunchAsDifferentUsers = false; //Launch each instance from a different user account | must run Nucleus as admin | will temporary create user accounts "nucleusplayerx" and delete them when closing Nucleus.
Game.LaunchAsDifferentUsersAlt = false; //An alternative method to launch each instance from a different user account | must run Nucleus as admin | will temporary create user accounts "nucleusplayerx" and delete them when closing Nucleus.
Game.TransferNucleusUserAccountProfiles = false; //Will backup and restore Nucleus user account user profile's on windows between sessions (when user accounts are not kept).
Game.ForceProcessSearch = false; //Force Nucleus to search for the game process.
Game.RequiresAdmin = false; //Game requires Nucleus to be run as administrator (this option will check and advise if detected not running Nucleus as admin).
Game.WriteToProcessMemory //(undocumented)
Game.ProcessorPriorityClass = "Normal"; //Sets the overall priority category for the associated process. Can be "AboveNormal", "High" or "RealTime" | default: "Normal".
Game.UseProcessor = "1,2,3,4"; //Sets the processors on which the game's threads can run on (provide the # of the cores in a comma-seperated list in quotations) | default: system delegation.
Game.UseProcessorsPerInstance = [ "1,2","3,4" ]; //Sets the processors on which an instances game's threads can run on (provide the # of the cores in a comma-seperated list in quotations) | default: system delegation.
Game.IdealProcessor = 2; //Sets the preferred processor for the game's threads, used when the system schedules threads, to determine which processor to run the thread on | default: system delegation.
Game.HideCursor = true; //Hide the mouse cursor in game instances.
Game.HideDesktop = false; //Hide the desktop background with a solid black background.
Game.HideTaskbar = true; //Most games hide the taskbar when placed on-top but for games that don't you can use this.
Game.Description = "Hello World"; //Display a message to the end-user, that will appear when user selects the game of a handler| useful if there is anything the end-user needs to know before-hand | Only first two or three sentences will appear in UI, but full message can be viewed if user right clicks on the game in the list.
Game.KillProcessesOnClose = [ "kill", "me" ]; //List of additional processes that need to be killed (other than executable and launcher).
Game.DeleteOnClose = ["DeleteThis.exe"]; //Delete a file upon ending game session | Relative paths from root of game folder.
Game.UseDirectX9Wrapper = false; //Use a Direct X wrapper to try and force DirectX 9 games to run windowed.
Game.CMDLaunch = false; //Launch a game using command prompt.
Game.CMDOptions = ["ops1","ops2"]; //Specify command line options if game is launched using command prompt | requires CMDLaunch to be true, each element is for a different instance.
Game.CMDBatchBefore = [ "0|ops1", "1|ops2" ]; //When using CMDLaunch (or UseForceBindIP), specify command lines to run BEFORE the game launches in same cmd session, syntax is instance and | symbol as a delimiter and the line you want that instance to run. If you want same line to run all instances, leave out the # and | (only write the line in quotes).
Game.CMDBatchAfter = [ "0|ops1", "1|ops2" ]; //When using CMDLaunch (or UseForceBindIP), specify command lines to run AFTER the game launches in same cmd session, syntax is instance and | symbol as a delimiter and the line you want that instance to run. If you want same line to run all instances, leave out the # and | (only write the line in quotes).
Game.PauseCMDBatchBefore = 10; //Wait for X number of seconds before proceeding with CMDBatchBefore.
Game.PauseCMDBatchAfter = 10; //Wait for X number of seconds before proceeding with CMDBatchAfter.
Game.CMDBatchClose ["cmd1", "cmd2"]; //Run command lines upon exiting Nucleus.
Game.CMDStartArgsInside = false; //When using CMDLaunch, should the game's starting arguments be inside the same quotations as the game path?
Game.ForceGameArch = "x86" (or "x64"); //Force Nucleus to treat the game as 32 or 64-bit architecture.
Game.SplitDivCompatibility = false; //Explicitly disable splitscreen divisons if the game is known to be imcompatible with it.(Does not require to be true for compatible game)Default = true.

/*
 * Custom prompts - Prompt user for input, which can be then used in handlers logic
 */

Game.CustomUserGeneralPrompts = ["Enter ROM name", "Enter filename"]; //This prompts user one time and applies to ALL players, unless a value text file already exists and saving is on.
Game.SaveCustomUserGeneralValues = false;
Game.SaveAndEditCustomUserGeneralValues = false;

Game.CustomUserPlayerPrompts = ["Enter network Adapter name", "Enter character name"]; //This will prompt each player, unless a value text file already exists for that player and saving for players is on.
Game.SaveCustomUserPlayerValues = false;
Game.SaveAndEditCustomUserPlayerValues = false;

Game.CustomUserInstancePrompts = ["Enter network Adapter name"]; //This will prompt each instance, unless a value text file already exists for that instance and save is on. In case it is not player specific but different values are needed for instances.
Game.SaveCustomUserInstanceValues = false;
Game.SaveAndEditCustomUserInstanceValues = false;
//Access the user input values via Context.CustomUser(General/Player/Instance)Values[index]

/*
 * 2. Support for multiple mice and keyboards (These options are deprecated, see the new Proto Input guide: https://www.splitscreen.me/docs/proto)
 */

Game.SupportsMultipleKeyboardsAndMice = true;
Game.SendNormalMouseInput = true;
Game.SendNormalKeyboardInput = true;
Game.ForwardRawKeyboardInput = false;
Game.ForwardRawMouseInput = false;
Game.SendScrollWheel = false;
Game.DrawFakeMouseCursor = true;
Game.DrawFakeMouseForControllers = false;
Game.HookFilterRawInput = false;
Game.HookFilterMouseMessages = false;
Game.HookGetCursorPos = true;
Game.HookSetCursorPos = true;
Game.HookUseLegacyInput = false;
Game.HookDontUpdateLegacyInMouseMsg = false;
Game.HookGetKeyState = false;
Game.HookGetAsyncKeyState = true;
Game.HookGetKeyboardState = false;
Game.HookMouseVisibility = false;
Game.LockInputAtStart = true;
Game.LockInputToggleKey = 0x23; //See https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
Game.HookReRegisterRawInput = false; //Re-register raw input from directly within game process | Recommended to disable forwarding input while using this
Game.HookReRegisterRawInputMouse = true;
Game.HookReRegisterRawInputKeyboard = true;
Game.UpdateFakeMouseWithInternalInput = false;

/*
 * 3. New methods to be used in game handlers -
 */

Path variables

Context.RootInstallFolder; //Path to the source game root folder.
Context.NucleusFolder //Path to the Nucleus Co-op root folder (Nucleus-Coop\).
Context.ScriptFolder //Path to the Nucleus Co-op handlers root folder (Nucleus-Coop\handlers).
Game.Folder //Path to the game handler folder (Nucleus-Coop\handlers\handler_folder).
Context.GetFolder(Nucleus.Folder.InstancedGameFolder) //Path to the Nucleus Co-op current instance root folder (Nucleus-Coop\content\GUID\Instance#).
Context.EnvironmentPlayer //Path to current players Nucleus environment.
Context.EnvironmentRoot //Path to Nucleus environment root folder.
Context.UserProfileConfigPath //Relative path from user profile to game's config path | requires Game.UserProfileConfigPath be set.
Context.UserProfileSavePath //Relative path from user profile to game's save path | requires Game.UserProfileSavePath be set.
Context.DocumentsPlayer //Path to current players Nucleus documents environment.
Context.DocumentsRoot //Path to Nucleus documents environment root folder.
Context.DocumentsConfigPath //Relative path from user profile to game's config path | requires Game.DocumentsConfigPath be set.
Context.DocumentsSavePath //Relative path from user profile to game's save path | requires Game.DocumentsSavePath be set.
Context.NucleusUserRoot //Path to current players Nucleus environment Windows User root folder.
Context.HandlersFolder //return "NucleusCo-op\handlers" path.

Context.ChangeXmlNodeInnerTextValue(string path, string nodeName, string newValue) //Edit an XML element (previously only nodes and attributes).
Context.ReplaceLinesInTextFile(string path, string[] lineNumAndnewValues) //Replace an entire line; for string array use the format: "lineNum|newValue", the | is required.
Context.ReplacePartialLinesInTextFile(string path, string[] lineNumRegPtrnAndNewValues) //Partially replace a line; for string array use the format: "lineNum|Regex pattern|newValue", the | is required.
Context.RemoveLineInTextFile(string path, int lineNum) //Removes a given line number completely.
Context.RemoveLineInTextFile(string path, string txtInLine, SearchType type) //Removes a given line number completely.
Context.FindLineNumberInTextFile(string path, string searchValue, SearchType type) //Returns a line number (int), utilizes a newly created enum SearchType.
/*
 * Each of the above methods, also have an overload method so you can specify a kind of encoding to use (enter string of encoding as last parameter, e.g. "utf-8", "utf-16" "us-ascii").
 * - SearchTypes include: "Contains", "Full" and "StartsWith", use like so: Nucleus SearchType.StartsWith.
 */ 

Context.CreateRegKey(string baseKey, string sKey, string subKey) //Create a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER".
Context.DeleteRegKey(string baseKey, string sKey, string subKey) //Delete a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER".
Context.EditRegKey(string baseKey, string sKey, string name, object data, RegType type) //Edit a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER". EditRegKey uses a custom registry data type to use, by using Nucleus.RegType.DWord for example. The last word can be of the same name of RegistryValueKind enum.
Context.EditRegKeyNoBackup //Edit a registry key for current user without Nucleus creating a backup of the registry or before it creates one. Must be placed before any "Context.EditRegKey" line in handler for it to work.
Context.Nickname //Use this in a game handler to get the player's nickname
Context.EpicLang //Can be use to edit NemirtingasEpicEmu.json //Can be use in start argument to setup user Epic language parameter //ex: Context.StartArguments = ' -AlwaysFocus -nosplash -nomoviestartup -nomouse' + Context.EpicLang; (if Epic Language is set to "en" return => "-epiclocale=en", Should not be necessary in most cases)
Context.GamepadGuid //Get the raw gamepad guid
Context.GogLang //Can be use to edit NemirtingasGalaxyEmu.json from handlers
Context.GamepadId //Useful to make sure that controllers are correctly assigned to the player they are meant to be assigned.
Context.x360ceGamepadGuid //Get the x360ce formatted gamepad guid.
Context.LocalIP //Local IP address of the computer.
Context.KillProcessesMatchingProcessName(string name) //Kill processes matching a given process name during preperation.
Context.KillProcessesMatchingWindowName(string name) //Kill processes matching a given window name during preperation.
Context.IsKeyboardPlayer //True if current player is using keyboard, useful for logic that is needed for keyboard only player.
Context.OrigHeight //Player monitor's height.
Context.OrigWidth //Player monitor's width.
Context.OrigAspectRatio //Player monitor's aspect ratio (e.g. 16:9).
Context.OrigAspectRatioDecimal //Player monitor's aspect ratio in decimal (e.g. 1.777777).
Context.AspectRatio //Player's aspect ratio (e.g. 16:9).
Context.AspectRatioDecimal //Player's aspect ratio in decimal (e.g. 1777777).
Context.FindFiles(string rootFolder, string fileName) //Return a string array of filenames (and their paths) found that match a pattern you specify.
Context.CreatedDate(string file, int year, int month, int day) //Change the creation date of a file.
Context.ModifiedDate(string file, int year, int month, int day) //Change the last modified date of a file.
Context.RunAdditionalFiles(string[] filePaths, bool changeWorkingDir, string customText, int secondsToPauseInbetween, bool showFilePath, bool runAsAdmin, bool promptBetween,bool confirm) //Specify additional files to run before launching game. By default will run each additional file once but can specify to run during specific player's instances by prefixing the filepath with #|. Replace # with player number. Can also specify to run files for each player by prefixing filepath with "all|". "bool confirm" will only run the file after clicking "Ok" in the prompt.
Context.ReadRegKey(string baseKey, string sKey, string subKey) //Return the value of a provided key as a string.
Context.HandlerGUID
Context.StartArguments = ""; //Adds whatever you put into the field as starting parameters for the game's executable in context. For example, in most cases '-windowed' will force windowed mode. Parameters can be chained.

Context.NumberOfPlayers

Context.CopyScriptFolder
Context.HexEdit
Context.PatchFileFindAll
Context.MoveFolder

Context.CopyScriptFolder(string DestinationPath)
Context.RandomInt(int min, int max)
Context.RandomString(int size, bool lowerCase = false)

Context.ConvertToInt()
Context.ConvertToString()
Context.ConvertToBytes()
Context.GCD(int a, int b)
Context.Arch
Context.PosX
Context.PosY
Context.MonitorWidth
Context.MonitorHeight
Context.Log()
Context.ProcessID
Context.HasKeyboardPlayer

Other useful lines

System.IO.File.Delete("FileToDelete"); //Delete the specified file.
System.IO.File.Copy("SourceFile", "DestinationFile", true); //Copy the specified "SourceFile" to the "DestinationFile" path. You can uses a different name on the DestinationFile to rename the file. The true in the end specify to overwrite, if found, the existing file with the same name.
System.IO.File.Move("SourceFile", "DestinationFile", true); //Move the specified "SourceFile" to the "DestinationFile" path. You can uses a different name on the DestinationFile to rename the file. The true in the end specify to overwrite, if found, the existing file with the same name.
var OneFolderUP = System.IO.Path.Combine(Path goes here, ".."); // The variable OneFolderUP will return a folder UP of the specified path. Example: var OneFolderUP = System.IO.Path.Combine(Game.Folder, "..");
var TwoFolderUP = System.IO.Path.Combine(Path goes here, "..", ".."); // The variable TwoFolderUP will return a folder UP of the specified path. Example: var OneFolderUP = System.IO.Path.Combine(Game.Folder, "..", "..");
var OneFolderUP = System.IO.Directory.GetParent("SourceDirectory"); // The variable OneFolderUP will return a folder UP of the specified path ("SourceDirectory").

/*
 * 4. CMD Launch Environment Variables (used with CMDBatchBefore and CMDBatchAfter)
 */
%NUCLEUS_EXE% //Exe filename (e.g. Halo.exe).
%NUCLEUS_INST_EXE_FOLDER% //Path the instance exe resides in (e.g. C:\Nucleus\content\Halo\Instance0\Binaries).
%NUCLEUS_INST_FOLDER% //Path of the instance folder (e.g. C:\Nucleus\content\Halo\Instance0\).
%NUCLEUS_FOLDER% //Path where Nucleus Coop is being ran from (e.g. C:\Nucleus).
%NUCLEUS_ORIG_EXE_FOLDER% //Path the original exe resides in (e.g. C:\Program Files\Halo\Binaries).
%NUCLEUS_ORIG_FOLDER% //Path of the "root" original folder (e.g. C:\Proggram Files\Halo).

/*
 * 5. New Player variables
 */
Player.Nickname
Player.HIDDeviceID
Player.RawHID
Player.SID
Player.Adapter
Player.UserProfile

Known Issues

  1. Force feedback does not work with Nucleus custom dlls.
  2. PreventWindowDeactivation will prevent mouse and keyboard input on instances using this hook (and may have other adverse effects).
  3. Status Window may cause Nucleus to crash every now and then.

Nucleus Co-op - version 2.1.1

Nucleus Co-op is a free and open source tool for Windows that allows split-screen play on many games that do not initially support it, the app purpose is to make it as easy as possible for the average user to play games locally using only one PC and one game copy.

https://github.com/SplitScreen-Me/splitscreenme-nucleus

This is a new and improved official version of the Nucleus Co-op application and is part of the SplitScreen.Me github organization, it includes the following:

New and improved options in game handlers

Note: If you want to create your own handler see the MasterHandler.js inside Nucleus handlers folder and this info.

Game Info

Game.ExecutableName = "Game.exe"; //The name of the game executable with the extension. This will be used by Nucleus to add games, to run the game and as process to follow for positioning and resizing.
Game.ExecutableToLaunch = "Game.exe"; //If the game is to launch a different executable, other than what Game.ExecutableName is.
Game.LauncherExe = "Launcher.exe"; //If the game needs to go through a launcher before opening Nucleus will use this exe to start the game and it will still use the Game.ExecutableName process for positioning and resizing.
Game.GUID = "Game Name"; //The name of the folder that will be created inside the Nucleus content folder (just use letters not symbols). In this folder Nucleus will store the symlinked or copied game files for each instance of the game.
Game.GameName = "Game Name"; //Title of the game that will be shown in Nucleus.
Game.LauncherTitle = "Launcher Window Title"; //The name of the launcher's window title. Some games need to go through a launcher to open. This is needed or else the application will lose the game's window.
Game.MaxPlayersOneMonitor = 4; //This is just info. It will not limit the players number.
Game.MaxPlayers = 16; //This is just the max players info that shows under the handler name in Nucleus UI. Usually we write the max number of players the game supports. (PC, should support 16 max connected input devices).

Mutex

Game.KillMutexType = "Mutant"; //Specify the type of mutex/handle to kill, for example "Mutant", "Event" or "Semaphore" | default: "Mutant".
Game.KillMutexDelay = 10; //# of seconds to wait before killing the mutex | Only works with killing not renaming | default: 0.
Game.RenameNotKillMutex = true; //Instead of killing the mutex or handle, rename it on startup to something else | Requires Game.KillMutex to contain the EXACT name of the handles for this to work (no partial).
Game.PartialMutexSearch = false; //When killing handles, should a partial search be done with the handle name? | Renaming handles requires an exact match | default: false.
Game.KillLastInstanceMutex = false; //Kill the handles, specified in Game.KillMutex, in the last instance (normally last is ignored).
Game.KillMutexAtEnd = false; //When using ProcessChangesAtEnd, should handles also be killed at the end?.
Game.KillMutexProcess = ["Mutexes","To","Close"]; //When using Game.MutexProcessExe, here you can specify the handles that need to be killed.
Game.PartialMutexSearchProcess = false; //When using Game.MutexProcessExe, here you can specify if you want to do a partial search for handles.
Game.KillMutexTypeProcess = "Mutant"; //When using Game.MutexProcessExe, here you can specify the type of handles to kill.
Game.MutexProcessExe = "Process.exe"; //Specify another executable to kill handles for.
Game.PauseBeforeMutexKilling = 1000; //Wait for X number of seconds before proceeding with mutex killing.
Game.KillMutexDelayProcess = 1000; //When using Game.MutexProcessExe, wait for X number of seconds before beginning its mutex killing.

File System

Game.SymlinkGame = true; //If we should symbolic link the game's files to a temporary directory (Nucleus instances folders in its content folder). If not will launch straight from the installation directory.
Game.SymlinkExe = false; //If SymlinkGame is enabled, if we should copy or symlink the game executable.
Game.SymlinkFolders = false; //Folders by default are hardcopied, with this enabled, folders will be symlinked instead | warning files placed in symlink folders will appear in the original game files too.
Game.KeepSymLinkOnExit = true; //Enable or disable symlink files from being deleted when Nucleus is closed | default: false.
Game.SymlinkFiles = ["game.exe","settings.cfg"]; //Symlink individual files from the game directory to the instanced folder.
Game.CopyFiles = ["game.exe","settings.cfg"]; //Copy files from the game directory to the instanced folder.
Game.HardcopyGame = true; //Instead of Symlinking, create hard copies of the games files (copy/paste) | Be careful of storage, takes a LONG time to start a game when copying.
Game.HardlinkGame = false; //Hardlink files instead of Symlink (or hard copy) | Directories will still be symlinked but files will be hardlinked.
Game.ForceSymlink = false; //Force game to be symlinked each time it is ran.
Game.DirSymlinkExclusions = ["folder1", "folder2"]; //Array with the name of the folders you don't want Nucleus Co-op to symlink, only the folders placed here get hardcopied not the files.
Game.FileSymlinkExclusions = ["file1.txt", "file2.txt"]; //Array with the name of the files you don't want Nucleus Co-op to symlink, useful if you want to replace files or add external files.
Game.FileSymlinkCopyInstead = ["file1.txt", "file2.txt"]; //Array with the name of the files you want Nucleus Co-op to make full copies of, in some cases games need certain files to be full copies or they won't run.
Game.DirSymlinkCopyInstead = [ "folder1", "folder2" ]; //Copy (not symlink) all files within a given folder | Folder name is relative from root game folder.
Game.DirSymlinkCopyInsteadIncludeSubFolders = false; //When specifying folder(s) to copy all its contents instead of linking, should subfolders and files be included as well?
Game.SymlinkFoldersTo = ["folderToMove|whereToMoveIt"]; //Symlink folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.HardlinkFoldersTo = ["folderToMove|whereToMoveIt"];//Hardlink folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.ChangeExe = true; //Will rename the game's executable to "<exe name> - Player X", x being the instance/player #.
Game.CopyCustomUtils = [ "d3d9.dll" ]; //Copy the a file or folder you specify between the quotes to each instance folder, if the file/folder is located in Nucleus folder\utils\User. This function also accepts two additional parameters, a relative path from the game root folder if the file needs to be placed somewhere else within instance folder and one parameter to indicate which instances to copy the file to if it only needs to be in some. Use of parameters is separated by a | character. So it would look something like this [ "filename.ini|\\bin|1,2" ]. This example would copy filename.ini from Nucleus\utils\User to Instance0\bin and Instance1\bin. If you don't specify which instances, it will do them all by default. If you don't specify a path then root instance folder is used. If you want instances but root folder you would just do [ "filename.ini||1,2" ] | If copying multiple files, use comma seperated strings
Game.HexEditAllExes = [ "before|afters" ]; //Will do a text value replacement in a file for every instance, accepts two parameters, one on what to look for, and what it should be replaced with (seperated with a "|") | Works with multiple values | Works in conjunction with HexEditExe (this will trigger first).
Game.HexEditExe = [ "before|afters" ]; //Will do a text value replacement in a file for a specific instance, accepts two parameters, one on what to look for, and what it should be replaced with (seperated with a "|") | Works with multiple values, each comma seperated string is the order of the instances | Works in conjunction with HexEditAllExe (this will trigger second).
Game.HexEditFile = [ "filePath|before|afters" ]; //Works same as HexEditExe function but with a file you specify as an extra parameter (first one) | filePath is relative path from the game root folder.
Game.HexEditAllFiles = [ "filePath|before|afters" ]; //Works same as HexEditAllExes function but with a file you specify as an extra parameter (first one) | filePath is relative path from the game root folder.
Game.DirExclusions = ["dir1"]; //Folders (+ all its contents) listed here will not be linked or copied over to Nucleus game content folder, the instance folders.
Game.CreateSteamAppIdByExe = false; //Create a steam_appid.txt file where the game executable is.
Game.LauncherExeIgnoreFileCheck = false; //Do not check if Launcher Exe exists in game folder | you will need to provide a relative filepath from game root folder.
Game.CopyEnvFoldersToNucleusAccounts = ["Documents", "AppData"]; //Copy subfolders of current user profile to Nucleus user accounts.
Game.CopyFoldersTo = ["folderToMove|whereToMoveIt"]; //Copy folders in game root folder to another spot in game folder | Relative paths from root of game folder.
Game.HexEditExeAddress = [ "1|address|bytes" ]; //Use this to replace bytes in a file at a specified address, can be for specific instances with optional 3rd argument | 1st arg: instance # (optional), 2nd arg: hex address offset, 3rd arg: new bytes.
Game.HexEditFileAddress = [ "1|relativePath|address|bytes" ]; //Same as HexEditExeAddress but for a file other than exe | Need to provide relative path (from game root folder) + filename as 1st or 2nd arg if not specifying an instance.
Game.IgnoreDeleteFilesPrompt = false; //Do not display the warning message about a file being deleted .
Game.RenameAndOrMoveFiles = [ "1|before.dat|after.dat" ];//Specify files to either rename or move | can accept relative path from root | optional first parameter to specify a specific instance to apply to, omit to do them all.
Game.DeleteFiles = [ "1|delete.dis" ]; //Specify files to be deleted from instanced folder | can accept relative path from root | optional first parameter to specify a specific instance to apply to, omit to do them all.
Game.RunLauncherAndExe = false; //When using Game.LauncherExe, should ExecutableName also be launched?
Game.ForceLauncherExeIgnoreFileCheck = false; //Forces LauncherExeIgnoreFileCheck when game isn't symlinked.

Nucleus Co-op Environment

Game.UseNucleusEnvironment = false; //Use custom environment variables for games that use them, replaces some common paths (e.g. AppData) with C:\Users\<your username>\NucleusCoop.
Game.UserProfileConfigPath = "AppData\\Local\\Game\\Config"; //Relative path from user profile (e.g. C:\Users\ZeroFox) to game's config path | Used to provide some extra functionality (open/delete/copy over to Nucleus Environment).
Game.UserProfileSavePath = "AppData\\Local\\Game\\Saves"; //Relative path from user profile (e.g. C:\Users\ZeroFox) to game's save path | Used to provide some extra functionality (open/delete/copy over to Nucleus Environment).
Game.ForceUserProfileConfigCopy = false; //Force the games config files in UserProfileConfigPath to copy over from system user profile to Nucleus environment.
Game.ForceUserProfileSaveCopy = false; //Force the games save files in UserProfileSavePath to copy over from system user profile to Nucleus environment.
Game.DeleteFilesInConfigPath = [ "file.del", "me.too" ];//Specify files to delete in Nucleus environment config path (UserProfileConfigPath).
Game.DeleteFilesInSavePath = [ "file.del", "me.too" ]; //Specify files to delete in Nucleus environment save path (UserProfileSavePath).
Game.UserProfileConfigPathNoCopy = false; //Do not copy files from original UserProfileConfigPath if using Nucleus Environment.
Game.UserProfileSavePathNoCopy = false; //Do not copy files from original UserProfileSavePath if using Nucleus Environment.
Game.UseCurrentUserEnvironment = false; //Force the game to use the current user's environment (useful for some games that may require different Window user accounts).
Game.DocumentsConfigPath = "Path\\Here"; //Similar to UserProfileConfigPath, use this when the game uses Documents to store game files.
Game.DocumentsSavePath = "Path\\Here"; //Similar to UserProfileSavePath, use this when the game uses Documents to store game files.
Game.ForceDocumentsConfigCopy = false; //When using DocumentsConfigPath, forces a file copy from original location to Nucleus Documents.
Game.ForceDocumentsSaveCopy = false; //When using DocumentsSavePath, forces a file copy from original location to Nucleus Documents.
Game.DocumentsConfigPathNoCopy = false; //When using DocumentsConfigPath, do not let Nucleus copy from original location to Nucleus Documents.
Game.DocumentsSavePathNoCopy = false; //When using DocumentsSavePath, do not let Nucleus copy from original location to Nucleus Documents.
Game.ForceEnvironmentUse = true; //Forces use of custom environment variable when Game.ThirdPartyLaunch = true;

Focus

Game.FakeFocus = true; //Enable or disable the sending of focus messages to each game window at a regular interval | default: false.
Game.HookFocus = true; //Enable or disable hooks to trick the game into thinking it has focus | default: false.
Game.HookInit = true; //Enable or disable hooks of functions some games may try and use to prevent multiple instances from running | default: false.
Game.PreventWindowDeactivation = false; //Blocks the processing of all the windows messages that get sent when the window loses focus.
Game.HasDynamicWindowTitle = false; //Work-around for ForceFocusWindowName having to match 1:1 with game window title for resizing, positioning and focus | default: false.
Game.ForceWindowTitle = false; //Forces the game window title to be whatever is specified in Game.Hook.ForceFocusWindowName (triggers once, after all instances have started) | default: false.
Game.IdInWindowTitle = true; //Adds the process ID to the end of the window title.
Game.SetForegroundWindowElsewhere = false; //Set the foreground window to be something other than game windows.
Game.StartHookInstances = "1,2,3,4"; //If you only want specific instances to have starting hooks, specify them in a comma seperated string.
Game.PostHookInstances = "1,2,3,4"; //If you only want specific instances to have post launch hooks, specify them in a comma seperated string.
Game.FakeFocusInstances = "1,2,3,4"; //If you only want specific instances to have fake focus messages sent to, specify them in a comma seperated string.
Game.KeyboardPlayerSkipFakeFocus = false; //Should the keyboard player instance be skipped when fake focus messages are being sent to.
Game.KeyboardPlayerSkipPreventWindowDeactivate = false; //Ignore PreventWindowDeactivation if player is using keyboard.
Game.FakeFocusSendActivate = true; //Should WM_ACTIVATE message be sent to each instance? | default: true.
Game.PreventGameFocus = false; //Makes sure all the game windows are unfocused so nothing received double input from Windows.
Game.FakeFocusInterval = 1000; //The milliseconds between sending fake focus messages. Default at 1000, some rare games need this to be very low.
Game.EnableWindows = false; //Enable each game window at the end (useful if became disabled, or for some games that require this Window function to be called to display properly, after Nucleus setup).
Game.ProcessChangesAtEnd = false; //Do the resizing, repositioning and post-launch hooking of all game instances at the very end | will not work with every option ran normally.
Game.PromptProcessChangesAtEnd = false; //If ProcessChangesAtEnd = true, pause and show a prompt, before making changes to processes.
Game.PromptBetweenInstancesEnd = false; //If ProcessChangesAtEnd = true, show a prompt between each instance being changed.

Window manipulation

Game.SetWindowHook = true; //Prevent games from resizing their windows on their own | Hooks after all instances have been opened (see Game.SetWindowHookStart for an alternative).
Game.SetWindowHookStart = false; //Prevent games from resizing window their windows on their own | Hooks upon game starting up (see Game.SetWindowHook for an alternative).
Game.Hook.FixResolution = false; //Should the custom dll do the resizing? | Only works with Alpha 10 custom dll | default: false.
Game.Hook.FixPosition = false; //Should the custom dll do the repositioning? | Only works with Alpha 10 custom dll | default: false.
Game.Hook.WindowX = 0; //If manual positioning, what is the window's X coordinate | If both X and Y value > 0, window will be positioned manually.
Game.Hook.WindowY = 0; //If manual positioning, what is the window's Y coordinate | If both X and Y value > 0, window will be positioned manually.
Game.Hook.ResWidth = 1280; //If manual resizing, what is the window's width | If both ResWidth and ResHeight value > 0, window will be positioned manually.
Game.Hook.ResHeight = 720; //If manual resizing, what is the window's height | If both ResWidth and ResHeight value > 0, window will be positioned manually.
Game.KeepAspectRatio = false; //Should the game window try and keep it's aspect ratio when being resized? | default: false.
Game.ResetWindows = false; //After each new instance opens, resize, reposition and remove borders of the previous instance.
Game.KeepMonitorAspectRatio = false; //Try and resize game window within player bounds to the aspect ratio of the monitor.
Game.DontResize = false; //Should Nucleus not resize the game windows?.
Game.DontReposition = false; //Should Nucleus not reposition the game windows?.
Game.NotTopMost = false; //Should Nucleus not make the game windows top most (appear above everything else).
Game.WindowStyleValues = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.ExtWindowStyleValues = [ "~0x200", "0x200000" ]; //Override Nucleus' default of removing borders and specify a custom extended window style | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.RefreshWindowAfterStart = false; //Should each game window be minimized and restored once all instances are opened?.
Game.WindowStyleEndChanges = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style during end processing | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.ExtWindowStyleEndChanges = [ "~0xC00000", "0x8000000" ]; //Override Nucleus' default of removing borders and specify a custom window style during end processing | Start string with ~ to remove a style, or don't use it to add one | See https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles for values that can be used.
Game.IgnoreWindowBordercheck = false; //Ignore logic at end to check if any game window still has a border.
Game.DontRemoveBorders = false; //Prevents Nucleus from removing game window borders.
Game.SetTopMostAtEnd = true; //Set the game windows to top most at the very end.

Input

Game.SupportsKeyboard = true; //Enable/disable use of one keyboard/mouse player.
Game.XInputPlusDll = ["xinput1_3.dll"]; //Set up XInputPlus | If multiple dlls required, use comma seperated strings.
Game.KeyboardPlayerFirst = true; //If the keyboard player should be processed first.
Game.UseX360ce = true; //Before launching any games, Nucleus Co-op will open x360ce and let the user set up their controllers before continuing | close x360ce to continue | Don't use with custom dlls.
Game.Hook.UseAlpha8CustomDll = false; //Use the xinput custom dll from Alpha 8 instead of Alpha 10 | Will still force alpha 10 custom dll if game is x64.
Game.PlayersPerInstance = 2; //If using XInputPlus or X360ce and there are multiple players playing the same instance, set the # per instance here.
Game.UseDevReorder = true; //Set up Devreorder.
Game.XboxOneControllerFix = false; //When using x360ce, this will set certain hooktype that may work for xbox one controllers if the normal method does not work.
Game.BlockRawInput = false; //Disable raw input devices in game | default: false.
Game.X360ceDll = [ "xinput1_3.dll" ]; //If x360ce dll should be named something OTHER than xinput1_3.dll | requires Game.Usex360ce to be set to true.
Game.CreateSingleDeviceFile = false; //Create only one file for HID devices per instance (the assigned HID device).
Game.Hook.EnableMKBInput = false; //Enable Mouse/Keyboard input for instances when using Alpha 10 custom xinput dll (normally MKB is restricted).
Game.UseDInputBlocker = false; //Setup wizark952's dinput blocker (block dinput for the game).
Game.XInputPlusNoIni = false; //Do not copy XInputPlus' ini when using Game.XInputPlusDll.
Game.XInputPlusOldDll = false; //When using Game.XInputPlusDll, you can specify to use the previous version instead of latest (needed for some games).

Goldberg Emulator

Game.UseGoldberg = false; //Use the built-in Goldberg features in Nucleus | default: false.
Game.GoldbergExperimental = false; //Use the experimental branch of Goldberg | Requires `Game.UseGoldberg = true` | default: false.
Game.GoldbergExperimentalSteamClient = false; //Automatically setup Goldberg's Experimental Steam Client | Requires Game.UseGoldberg and the original steam_api.dll.
Game.GoldbergLobbyConnect = false; //Should Goldberg Lobby Connect be used to connect the instances.
Game.GoldbergNoLocalSave = false; //Do not create a local_save.txt file for Goldberg, saves are to use default game save location.
Game.GoldbergNeedSteamInterface = false; //Some older games require a steam_interfaces.txt file for Goldberg to work | Will first search orig game path and nucleus games path, if not found then tries to create one with the GoldbergNeedSteamInterface command.
Game.GoldbergLanguage = "english"; //Manually specify what language you want Goldberg to use for the game | by default, Goldberg will use the language you chose in Steam.
Game.OrigSteamDllPath = "C:\full path\steam_api.dll"; //If steam_interface.txt is required, provide full path here to the original steam_api(64).dll and Nucleus will create one if it can't find an existing copy.
Game.GoldbergIgnoreSteamAppId = false; //When set to true, Goldberg will not create a steam_appid.txt file.
Game.PlayerSteamIDs = ["76561198134585131","76561198134585132"]; //A list of steam IDs to be used instead of the pre-defined ones Nucleuses uses | IDs will be used in order they are placed, i.e. instance 1 will be first non-empty string in array.
Game.GoldbergExperimentalRename = false; //Set to true to have Goldberg Experimental rename instanced steam_api(64).dll to cracksteam_api(64).dll.
Game.GoldbergWriteSteamIDAndAccount = false; //Force Goldberg to write account_name.txt and user_steam_id.txt | Requires Game.UseGoldberg;

Smart Steam Emulator

Game.NeedsSteamEmulation = false; //If the game needs a fake Steam wrapper (SSE) to run multiple instances (this is not needed if you are using the new use Goldberg emulator line).
Game.SSEAdditionalLines = ["Section|Key=Value"]; //When using Game.NeedsSteamEmulation, here you can provide additional lines to write to the SSE ini file.

Nemirtingas Epic Emulator

Game.UseNemirtingasEpicEmu = false; //Automatically set up Nemirtinga's Epic Emulator in Nucleus
Game.EpicEmuArgs = false; //When using Nemirtinga's Epic Emulator, use pre-defined parameters -AUTH_LOGIN=unused -AUTH_PASSWORD=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -AUTH_TYPE=exchangecode -epicapp=CrabTest -epicenv=Prod -EpicPortal -epicusername=\"" + <Player Nickname here> + "\" -epicuserid=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -epiclocale=en"
Game.AltEpicEmuArgs = false; //Optional. When using Nemirtinga's Epic Emulator, use pre-defined parameters + Set NickName as epic id, only to use with games that do not use epic id to start or connect(Set clever save names if the game use the epic id to name saves ex: Tiny Tina's Assault On Dragon Keep)" -AUTH_LOGIN=unused -AUTH_PASSWORD=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -AUTH_TYPE=exchangecode -epicapp=CrabTest -epicenv=Prod -EpicPortal -epicusername=" + <Player Nickname here> + " -epicuserid="+ <Player Nickname here> + "-epiclocale=" + EpicLang".

/*
 * NemirtingasEpicEmu.json edition from a handler example:
 */

 // If you don't need to edit a line do not add it here, the emu will automatically write it with default parameters. More info here: https://gitlab.com/Nemirtingas/nemirtingas_epic_emu/-/blob/master/README.md
 // Available debug parameters,  should be "off" by default. Only required to debug the nermintingas eos emulator.
 // TRACE: Very verbose, will log DEBUG + All functions enter
 // DEBUG: Very verbose, will log INFO  + Debug infos like function parameters
 // INFO : verbose     , will log WARN  + some informations about code execution and TODOs
 // WARN : not verbose , will log ERR   + some warnings about code execution
 // ERR  : not verbose , will log FATAL + errors about code execution
 // FATAL: not verbose , will log only Fatal errors like unimplemented steam_api versions
 // OFF  : no logs     , saves cpu usage when running the debug versions
 // In case of using custom start arguments => -epicusername == same username as in the.json => -epicuserid == same epicid as in the.json >

    var jsonPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\nepice_settings\\NemirtingasEpicEmu.json";// + "\\NemirtingasEpicEmus.json" for stable older epic emu version.
    var params = [
      '{',
      '  "appid": "InvalidAppid",',
      '  "disable_online_networking": false,',
      '  "enable_lan": true,',
      '  "enable_overlay": true,',
      //'  "epicid": "3808a45790894253344fec21026bbf80",', //better to let the emu automaticaly add this line.
      '  "language":' + '"' + Context.EpicLang + '"' + ',',
      '  "log_level": "off",',
      //'  "productuserid": "ab65359ffde1b5cc41e81afee8e32c33",', //better to let the emu automaticaly add this line.
      '  "savepath": "appdata",',
      '  "signaling_servers": [],',
      '  "unlock_dlcs": true,',
      '  "username": ' + '"' + Context.Nickname + '"', //must always be added if you edit the json and must be the last line else the emulator will reset all parameters(there is no coma at the end of this line in the json).
      '}'
    ] ;
    Context.WriteTextFile(jsonPath,params);

Nemirtingas Galaxy GoG Emulator

Game.UseNemirtingasGalaxyEmu = false; //Automatically set up Nemirtinga's Galaxy Emulator in Nucleus.

NemirtingasGalxyEmu.json edition from a handler example:

    var idg = Context.PlayerID + 6;

    var jsonPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\ngalaxye_settings\\NemirtingasGalaxyEmu.json";
    var params = [
      '{',
      '  "api_version": "1.139.2.0",',
      '  "enable_overlay": false,',
      '  "galaxyid": 14549624462898294'+idg+',',
      '  "language": ' + '"' + Context.GogLang + '",',
      '  "productid": 2143654691,',
      '  "username": ' + '"' + Context.Nickname + '"', //must always be added if you edit the json and must be the last line else the emulator will reset all parameters (there is no coma at the end of this line in the json).
      '}'
     ];
    Context.WriteTextFile(jsonPath,params);

Additional Tools

Game.UseSteamless = true; //Use atom0s' Steamless app to remove Steam Stub DRM from a protected executable.
Game.SteamlessArgs = "--quiet --keepbind"; //Use this when using Game.UseSteamless = true; always, the command line version of Steamless allows for different launch arguments to be used.
Game.SteamlessTiming = 2500; //The time in milliseconds to give Steamless to patch the game .exe. 2500 is the default value and will be applied even if the timing line has not been added in a handler.
Game.UseSteamStubDRMPatcher = false; //Use UberPsyX's Steam Stub DRM Patcher to remove Steam Stub DRM from a protected executable.
Game.SteamStubDRMPatcherArch = "64"; //Force Steam Stub DRM Patcher to use either the x64 or x86 dll | Values: "64" or "86".
Game.UseEACBypass = false; //Replace any EasyAntiCheat_(x86)(x64).dll with a bypass dll.
Game.FlawlessWidescreen = "FWGameName"; //Use Flawless Widescreen application | value must be the name of the game plugin folder in PluginCache\FWS_Plugins\Modules.
Game.FlawlessWidescreenOverrideDisplay = false; //(undocumented)
Game.FlawlessWidescreenPluginPath //(undocumented)

Network

Game.UseForceBindIP = false; //Set up game instances with ForceBindIP; each instance having their own IP.
Game.ChangeIPPerInstance = false; //Highly experimental feature, will change your existing network to a static IP for each instance | option in settings to choose your network.
Game.ChangeIPPerInstanceAlt; //An alternative method to changing IP per instance | this method will create loopback adapters for each player and assign them a static ip on the same subnet mask as your main network interface.

Extra

Game.PauseBetweenProcessGrab = 30; //How many seconds to wait after launching game (or launcher) but before grabbing game process.
Game.PauseBetweenContextAndLaunch = 0; //Number of seconds to wait after running additional files but before continuing with player setup.
Game.ThirdPartyLaunch = false; //Use if the game is launched outside of Nucleus | NOTE: You will not be able to use start up hooks or CMDLaunch with this option.
Game.IgnoreThirdPartyPrompt = false; //Ignore the prompt that appears when using Game.ThirdPartyLaunch;
Game.ForceProcessPick = false; //Manually select the process that will be used for process manipulation, such as resizing, repositioning and used for post-launch hooks.
Game.PromptBetweenInstances = true; //Prompt the user with a messagebox to let the user decide when to open the next instance | default: false, PauseBetweenStarts STILL required.
Game.PromptAfterFirstInstance = false; //Show a prompt that user must click on ok to continue, after the first instance is setup.
Game.GamePlayAfterLaunch; //Call the Game.Play function after the call has launched.
Game.GamePlayBeforeGameSetup = false; //Execute Game.Play function (context) before the majority of the game is setup.
Game.LaunchAsDifferentUsers = false; //Launch each instance from a different user account | must run Nucleus as admin | will temporary create user accounts "nucleusplayerx" and delete them when closing Nucleus.
Game.LaunchAsDifferentUsersAlt = false; //An alternative method to launch each instance from a different user account | must run Nucleus as admin | will temporary create user accounts "nucleusplayerx" and delete them when closing Nucleus.
Game.TransferNucleusUserAccountProfiles = false; //Will backup and restore Nucleus user account user profile's on windows between sessions (when user accounts are not kept).
Game.ForceProcessSearch = false; //Force Nucleus to search for the game process.
Game.RequiresAdmin = false; //Game requires Nucleus to be run as administrator (this option will check and advise if detected not running Nucleus as admin).
Game.WriteToProcessMemory //(undocumented)
Game.ProcessorPriorityClass = "Normal"; //Sets the overall priority category for the associated process. Can be "AboveNormal", "High" or "RealTime" | default: "Normal".
Game.UseProcessor = "1,2,3,4"; //Sets the processors on which the game's threads can run on (provide the # of the cores in a comma-seperated list in quotations) | default: system delegation.
Game.UseProcessorsPerInstance = [ "1,2","3,4" ]; //Sets the processors on which an instances game's threads can run on (provide the # of the cores in a comma-seperated list in quotations) | default: system delegation.
Game.IdealProcessor = 2; //Sets the preferred processor for the game's threads, used when the system schedules threads, to determine which processor to run the thread on | default: system delegation.
Game.HideCursor = true; //Hide the mouse cursor in game instances.
Game.HideDesktop = false; //Hide the desktop background with a solid black background.
Game.HideTaskbar = true; //Most games hide the taskbar when placed on-top but for games that don't you can use this.
Game.Description = "Hello World"; //Display a message to the end-user, that will appear when user selects the game of a handler| useful if there is anything the end-user needs to know before-hand | Only first two or three sentences will appear in UI, but full message can be viewed if user right clicks on the game in the list.
Game.KillProcessesOnClose = [ "kill", "me" ]; //List of additional processes that need to be killed (other than executable and launcher).
Game.DeleteOnClose = ["DeleteThis.exe"]; //Delete a file upon ending game session | Relative paths from root of game folder.
Game.UseDirectX9Wrapper = false; //Use a Direct X wrapper to try and force DirectX 9 games to run windowed.
Game.CMDLaunch = false; //Launch a game using command prompt.
Game.CMDOptions = ["ops1","ops2"]; //Specify command line options if game is launched using command prompt | requires CMDLaunch to be true, each element is for a different instance.
Game.CMDBatchBefore = [ "0|ops1", "1|ops2" ]; //When using CMDLaunch (or UseForceBindIP), specify command lines to run BEFORE the game launches in same cmd session, syntax is instance and | symbol as a delimiter and the line you want that instance to run. If you want same line to run all instances, leave out the # and | (only write the line in quotes).
Game.CMDBatchAfter = [ "0|ops1", "1|ops2" ]; //When using CMDLaunch (or UseForceBindIP), specify command lines to run AFTER the game launches in same cmd session, syntax is instance and | symbol as a delimiter and the line you want that instance to run. If you want same line to run all instances, leave out the # and | (only write the line in quotes).
Game.PauseCMDBatchBefore = 10; //Wait for X number of seconds before proceeding with CMDBatchBefore.
Game.PauseCMDBatchAfter = 10; //Wait for X number of seconds before proceeding with CMDBatchAfter.
Game.CMDBatchClose ["cmd1", "cmd2"]; //Run command lines upon exiting Nucleus.
Game.CMDStartArgsInside = false; //When using CMDLaunch, should the game's starting arguments be inside the same quotations as the game path?
Game.ForceGameArch = "x86" (or "x64"); //Force Nucleus to treat the game as 32 or 64-bit architecture.
Game.SplitDivCompatibility = false; //Explicitly disable splitscreen divisons if the game is known to be imcompatible with it.(Does not require to be true for compatible game)Default = true.

/*
 * Custom prompts - Prompt user for input, which can be then used in handlers logic
 */

Game.CustomUserGeneralPrompts = ["Enter ROM name", "Enter filename"]; //This prompts user one time and applies to ALL players, unless a value text file already exists and saving is on.
Game.SaveCustomUserGeneralValues = false;
Game.SaveAndEditCustomUserGeneralValues = false;

Game.CustomUserPlayerPrompts = ["Enter network Adapter name", "Enter character name"]; //This will prompt each player, unless a value text file already exists for that player and saving for players is on.
Game.SaveCustomUserPlayerValues = false;
Game.SaveAndEditCustomUserPlayerValues = false;

Game.CustomUserInstancePrompts = ["Enter network Adapter name"]; //This will prompt each instance, unless a value text file already exists for that instance and save is on. In case it is not player specific but different values are needed for instances.
Game.SaveCustomUserInstanceValues = false;
Game.SaveAndEditCustomUserInstanceValues = false;
//Access the user input values via Context.CustomUser(General/Player/Instance)Values[index]

/*
 * 2. Support for multiple mice and keyboards (These options are deprecated, see the new Proto Input guide: https://www.splitscreen.me/docs/proto)
 */

Game.SupportsMultipleKeyboardsAndMice = true;
Game.SendNormalMouseInput = true;
Game.SendNormalKeyboardInput = true;
Game.ForwardRawKeyboardInput = false;
Game.ForwardRawMouseInput = false;
Game.SendScrollWheel = false;
Game.DrawFakeMouseCursor = true;
Game.DrawFakeMouseForControllers = false;
Game.HookFilterRawInput = false;
Game.HookFilterMouseMessages = false;
Game.HookGetCursorPos = true;
Game.HookSetCursorPos = true;
Game.HookUseLegacyInput = false;
Game.HookDontUpdateLegacyInMouseMsg = false;
Game.HookGetKeyState = false;
Game.HookGetAsyncKeyState = true;
Game.HookGetKeyboardState = false;
Game.HookMouseVisibility = false;
Game.LockInputAtStart = true;
Game.LockInputToggleKey = 0x23; //See https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
Game.HookReRegisterRawInput = false; //Re-register raw input from directly within game process | Recommended to disable forwarding input while using this
Game.HookReRegisterRawInputMouse = true;
Game.HookReRegisterRawInputKeyboard = true;
Game.UpdateFakeMouseWithInternalInput = false;

/*
 * 3. New methods to be used in game handlers -
 */

Path variables

Context.RootInstallFolder; //Path to the source game root folder.
Context.NucleusFolder //Path to the Nucleus Co-op root folder (Nucleus-Coop\).
Context.ScriptFolder //Path to the Nucleus Co-op handlers root folder (Nucleus-Coop\handlers).
Game.Folder //Path to the game handler folder (Nucleus-Coop\handlers\handler_folder).
Context.GetFolder(Nucleus.Folder.InstancedGameFolder) //Path to the Nucleus Co-op current instance root folder (Nucleus-Coop\content\GUID\Instance#).
Context.EnvironmentPlayer //Path to current players Nucleus environment.
Context.EnvironmentRoot //Path to Nucleus environment root folder.
Context.UserProfileConfigPath //Relative path from user profile to game's config path | requires Game.UserProfileConfigPath be set.
Context.UserProfileSavePath //Relative path from user profile to game's save path | requires Game.UserProfileSavePath be set.
Context.DocumentsPlayer //Path to current players Nucleus documents environment.
Context.DocumentsRoot //Path to Nucleus documents environment root folder.
Context.DocumentsConfigPath //Relative path from user profile to game's config path | requires Game.DocumentsConfigPath be set.
Context.DocumentsSavePath //Relative path from user profile to game's save path | requires Game.DocumentsSavePath be set.
Context.NucleusUserRoot //Path to current players Nucleus environment Windows User root folder.
Context.HandlersFolder //return "NucleusCo-op\handlers" path.

Context.ChangeXmlNodeInnerTextValue(string path, string nodeName, string newValue) //Edit an XML element (previously only nodes and attributes).
Context.ReplaceLinesInTextFile(string path, string[] lineNumAndnewValues) //Replace an entire line; for string array use the format: "lineNum|newValue", the | is required.
Context.ReplacePartialLinesInTextFile(string path, string[] lineNumRegPtrnAndNewValues) //Partially replace a line; for string array use the format: "lineNum|Regex pattern|newValue", the | is required.
Context.RemoveLineInTextFile(string path, int lineNum) //Removes a given line number completely.
Context.RemoveLineInTextFile(string path, string txtInLine, SearchType type) //Removes a given line number completely.
Context.FindLineNumberInTextFile(string path, string searchValue, SearchType type) //Returns a line number (int), utilizes a newly created enum SearchType.
/*
 * Each of the above methods, also have an overload method so you can specify a kind of encoding to use (enter string of encoding as last parameter, e.g. "utf-8", "utf-16" "us-ascii").
 * - SearchTypes include: "Contains", "Full" and "StartsWith", use like so: Nucleus SearchType.StartsWith.
 */ 

Context.CreateRegKey(string baseKey, string sKey, string subKey) //Create a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER".
Context.DeleteRegKey(string baseKey, string sKey, string subKey) //Delete a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER".
Context.EditRegKey(string baseKey, string sKey, string name, object data, RegType type) //Edit a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER". EditRegKey uses a custom registry data type to use, by using Nucleus.RegType.DWord for example. The last word can be of the same name of RegistryValueKind enum.
Context.EditRegKeyNoBackup //Edit a registry key for current user without Nucleus creating a backup of the registry or before it creates one. Must be placed before any "Context.EditRegKey" line in handler for it to work.
Context.Nickname //Use this in a game handler to get the player's nickname
Context.EpicLang //Can be use to edit NemirtingasEpicEmu.json //Can be use in start argument to setup user Epic language parameter //ex: Context.StartArguments = ' -AlwaysFocus -nosplash -nomoviestartup -nomouse' + Context.EpicLang; (if Epic Language is set to "en" return => "-epiclocale=en", Should not be necessary in most cases)
Context.GamepadGuid //Get the raw gamepad guid
Context.GogLang //Can be use to edit NemirtingasGalaxyEmu.json from handlers
Context.GamepadId //Useful to make sure that controllers are correctly assigned to the player they are meant to be assigned.
Context.x360ceGamepadGuid //Get the x360ce formatted gamepad guid.
Context.LocalIP //Local IP address of the computer.
Context.KillProcessesMatchingProcessName(string name) //Kill processes matching a given process name during preperation.
Context.KillProcessesMatchingWindowName(string name) //Kill processes matching a given window name during preperation.
Context.IsKeyboardPlayer //True if current player is using keyboard, useful for logic that is needed for keyboard only player.
Context.OrigHeight //Player monitor's height.
Context.OrigWidth //Player monitor's width.
Context.OrigAspectRatio //Player monitor's aspect ratio (e.g. 16:9).
Context.OrigAspectRatioDecimal //Player monitor's aspect ratio in decimal (e.g. 1.777777).
Context.AspectRatio //Player's aspect ratio (e.g. 16:9).
Context.AspectRatioDecimal //Player's aspect ratio in decimal (e.g. 1777777).
Context.FindFiles(string rootFolder, string fileName) //Return a string array of filenames (and their paths) found that match a pattern you specify.
Context.CreatedDate(string file, int year, int month, int day) //Change the creation date of a file.
Context.ModifiedDate(string file, int year, int month, int day) //Change the last modified date of a file.
Context.RunAdditionalFiles(string[] filePaths, bool changeWorkingDir, string customText, int secondsToPauseInbetween, bool showFilePath, bool runAsAdmin, bool promptBetween,bool confirm) //Specify additional files to run before launching game. By default will run each additional file once but can specify to run during specific player's instances by prefixing the filepath with #|. Replace # with player number. Can also specify to run files for each player by prefixing filepath with "all|". "bool confirm" will only run the file after clicking "Ok" in the prompt.
Context.ReadRegKey(string baseKey, string sKey, string subKey) //Return the value of a provided key as a string.
Context.HandlerGUID
Context.StartArguments = ""; //Adds whatever you put into the field as starting parameters for the game's executable in context. For example, in most cases '-windowed' will force windowed mode. Parameters can be chained.

Context.NumberOfPlayers

Context.CopyScriptFolder
Context.HexEdit
Context.PatchFileFindAll
Context.MoveFolder

Context.CopyScriptFolder(string DestinationPath)
Context.RandomInt(int min, int max)
Context.RandomString(int size, bool lowerCase = false)

Context.ConvertToInt()
Context.ConvertToString()
Context.ConvertToBytes()
Context.GCD(int a, int b)
Context.Arch
Context.PosX
Context.PosY
Context.MonitorWidth
Context.MonitorHeight
Context.Log()
Context.ProcessID
Context.HasKeyboardPlayer

Other useful lines

System.IO.File.Delete("FileToDelete"); //Delete the specified file.
System.IO.File.Copy("SourceFile", "DestinationFile", true); //Copy the specified "SourceFile" to the "DestinationFile" path. You can uses a different name on the DestinationFile to rename the file. The true in the end specify to overwrite, if found, the existing file with the same name.
System.IO.File.Move("SourceFile", "DestinationFile", true); //Move the specified "SourceFile" to the "DestinationFile" path. You can uses a different name on the DestinationFile to rename the file. The true in the end specify to overwrite, if found, the existing file with the same name.
var OneFolderUP = System.IO.Path.Combine(Path goes here, ".."); // The variable OneFolderUP will return a folder UP of the specified path. Example: var OneFolderUP = System.IO.Path.Combine(Game.Folder, "..");
var TwoFolderUP = System.IO.Path.Combine(Path goes here, "..", ".."); // The variable TwoFolderUP will return a folder UP of the specified path. Example: var OneFolderUP = System.IO.Path.Combine(Game.Folder, "..", "..");
var OneFolderUP = System.IO.Directory.GetParent("SourceDirectory"); // The variable OneFolderUP will return a folder UP of the specified path ("SourceDirectory").

/*
 * 4. CMD Launch Environment Variables (used with CMDBatchBefore and CMDBatchAfter)
 */
%NUCLEUS_EXE% //Exe filename (e.g. Halo.exe).
%NUCLEUS_INST_EXE_FOLDER% //Path the instance exe resides in (e.g. C:\Nucleus\content\Halo\Instance0\Binaries).
%NUCLEUS_INST_FOLDER% //Path of the instance folder (e.g. C:\Nucleus\content\Halo\Instance0\).
%NUCLEUS_FOLDER% //Path where Nucleus Coop is being ran from (e.g. C:\Nucleus).
%NUCLEUS_ORIG_EXE_FOLDER% //Path the original exe resides in (e.g. C:\Program Files\Halo\Binaries).
%NUCLEUS_ORIG_FOLDER% //Path of the "root" original folder (e.g. C:\Proggram Files\Halo).

/*
 * 5. New Player variables
 */
Player.Nickname
Player.HIDDeviceID
Player.RawHID
Player.SID
Player.Adapter
Player.UserProfile

Known Issues

  1. Force feedback does not work with Nucleus custom dlls.
  2. PreventWindowDeactivation will prevent mouse and keyboard input on instances using this hook (and may have other adverse effects).
  3. Status Window may cause Nucleus to crash every now and then.

Changelog

v2.1.1 - May 24, 2022

  1. Added Steamless command line version support: "Game.UseSteamless = true;", "Game.SteamlessArgs = "";", "Game.SteamlessTiming = 2500;".
  2. Fixed nicknames not working when using "Game.GoldbergExperimentalSteamClient = true;".
  3. Fixed Player Steam IDs setting to 0 when using "Game.PlayerSteamIDs = [];".
  4. Added game descriptions, they get downloaded to gui\descriptions.
  5. Added new line Context.EditRegKeyNoBackup, will not create a backup of the registry when editing.
  6. Fixed an unknown bug breaking the Nucleus window shape in some cases (maximizing without using the app maximizing button).
  7. Fixed changing the default text editor in Settings.ini not working.
  8. Added blur to background images, the blur can be disabled by setting Blur = 0 in Settings.ini.
  9. Other minor UI improvements and changes.

v2.1 - May 5, 2022

  1. Added Context.HandlersFolder (path to the root of Nucleus Co-op handlers folder: NucleusCo-op\handlers).
  2. Fixed app crash when a handler throws an error (sometimes on app close).
  3. Fixed random crashes while clicking on the game list.
  4. All monitors in use should be correctly scaled to 100% when a game starts now.
  5. Added UI option to enable/disable the auto setting of the desktop scale to 100% (enabled by default).
  6. All UI elements (pictures) can be customized now (see the default theme folder).
  7. Splashscreen fixes, you can skip it now by clicking on it if it shows for too long.
  8. Added UI options in settings to disable/enable the splashscreen and click sound in the settings tab and moved the "mouse click" setting to the setting.ini instead of theme.ini.
  9. Other UI related details.
  10. Some UI code optimizations.
  11. New and improved Nucleus Co-op themes.
  12. Added theme switch option in settings.
  13. Links can be clicked in handler notes now.
  14. Added option to use custom text in Context.RunAdditionalFiles prompt(s) + a boolean to show or not the file path. See readme.txt.
  15. New Documents path registry key backup/restoration handling, should fully fix Nucleus changing the location of the Documents folder sometimes after a crash.
  16. Added custom virtual devices icons.
  17. First attempt to fix Turkish "ı" bug, requires to be tested in real conditions.
  18. Fixed account_name.txt being edited while UseGoldberg is not used.
  19. Added new input device detection in setup screen, keyboards and mice icons will only show in the UI if a key is pressed or a mouse moved now.
  20. Added an option in theme.ini to round the Nucleus Co-op window corners (enabled by default).
  21. Added multiple Nucleus Co-op instances check (can be disabled in settings.ini).
  22. Added the possibility to choose the app font in theme.ini (size can be adjusted).
  23. Fixed a crash that occurred when custom icon pictures were deleted.
  24. Added new "icons" folder inside the Nucleus Co-op "gui" folder, custom icon paths are now saved in the "icons.ini" inside that folder instead of being saved in settings.ini.
  25. Fixed crash that occurred when an user had a custom Documents folder in the root of his drive and clicked game options in the UI.
  26. Fixed "Game.SymlinkFiles = [""];" and updated so that it can work under "Game.Play = function() {" using "Context.ProceedSymlink();".
  27. Help gif updated.
  28. Fixed Nucleus Co-op reporting the incorrect line number when a handler has an error, can still show the number with an offset of +1 if the line number returned is a float.
  29. Fixed a Nucleus Co-op silent crash that happened when controllers got disconnected and reconnected multiple times.
  30. Added Game.SetTopMostAtEnd = true; Sets the game windows to top most at the very end.
  31. Added .ini option to hide the Nucleus Co-op offline icon.
  32. Added handler notes magnifier option.
  33. Added new supported inputs UI icons, display what input devices a handler supports.
  34. Added Player Steam IDs fields to the Nucleus Nicknames settings tab (now named Players), you can change the instances Player Steam IDs when a handler uses goldberg or SSE via the UI now.
  35. Added new Nicknames/Player Steam IDs switcher, you can quickly switch the order of the nicknames and Player Steam IDs you set up.
  36. Fixed minor UI glitch.
  37. Last hooks prompt will show now when only using Game.PromptBetweenInstances=true; with Game.SetTopMostAtEnd = true;
  38. Added option in Settings.ini to change the default text editor.
  39. Selection not working and scaling issues fixed for Nucleus UI options that use images.

v2.0 - February 25, 2022

  1. New overhauled and customizable user interface with support for themes, game covers and screenshots.
  2. Fixed ui scaling issues at more than 100% desktop scale (and all other issues/bugs related to it).
  3. Fixed multi-monitor vertical setup drawing to not overlap input device list.
  4. Quality of life improvements such as but not limited to: new discord invite link, Nucleus Co-op github release link and much more.
  5. Added Nermintingas Galaxy emulator support.
  6. SplitCalculator(Josivan88) integration.
  7. Renamed scripts to handlers.
  8. Added new handler callbacks.
  9. New player nickname assignation.
  10. New player and input order processing.
  11. New optional splitscreen division(visualy similar to a native splitscreen game).

v1.1.3 - September 28, 2021

  1. Fixed only 4 Xinput controllers showing
  2. Fixed controller index being inconsistent with the Nucleus UI
  3. Fixed duplicate controller icons (and similar bugs)
  4. Fixed Ctrl+T working unreliably when Proto Input was injected
  5. Removed xinput1_4 dependency to fix crashing on Windows 7
  6. Added more script callbacks

v1.1.2 - September 1, 2021

  1. Fixed fake cursor not showing in some games

v1.1.1 - August 30, 2021

  1. Added script updater
  2. Fixed the Proto Input controller hooks
  3. Fixed incorrect controller icons being displayed
  4. Fixed the fake cursor not hiding when it should in some games

v1.1.0 - August 18, 2021

  1. Integrated Proto Input (github.com/ilyaki/protoinput) hooks
  2. Greatly improved keyboard/mouse input
  3. Complete rewrite of all hooks, plus new injection method support
  4. Fixed most bugs relating to keyboard/mouse input, including CursorVisibilityHook crashing
  5. New in-game GUI to change hooks and input settings while the game is running
  6. Improved fake focus, including a message filter system for all windows messages
  7. Smarter scripting so you can use a combination of keyboards/mice and controllers smoothly
  8. Custom mouse cursor support
  9. Added support for more than 4 Xinput controllers with OpenXinput
  10. Added DirectInput controller redirection
  11. Rewrite of the input locking system - no more laggy cursor, and Windows UI elements won't randomly open
  12. A bunch of misc changes and bug fixes

v1.0.2 R5 FINAL - January 2, 2020

  1. Fixed bug that would cause the incorrect document path to be used for subsequent players when using Nucleus environment and start up hooks
  2. Document path in registry will now only be changed if it needs to (only if playing a game that uses Documents for game files)
  3. Some fixes for device layout screen
  4. Updated Goldberg emulator to latest git build

v1.0.1 R5 FINAL - December 30, 2020

  1. Fixed app not opening for some users
  2. Fixed bug with expanding single keyboard vertically
  3. Added NucluesUserRoot to context (get userprofile paths for a player's respective nucleusplayer Windows account)
  4. Other minor bug fixes/tweaks

v1.0 R5 FINAL - December 24, 2020

  1. Audio routing per instance; specify each game to run through different audio sources
  2. Added support for Nemirtingas Epic Emulator
  3. Added support for games that use Documents for game files (and support for users with custom document folders)
  4. Nucleus user accounts on windows can now retain save data between sessions (including Halo MCC, your game saves will remain intact)
  5. Nucleus on close will now remove files it created when using original game folders (keeping your original game folder untouched)
  6. Registry edits done by Nucleus now only persist the game session (Nucleus backs up and restores, as to note touch your original game settings)
  7. Added alot of new scripting features that greatly increases game compatibility list
  8. New function, custom prompts. Scripts can prompt users for input that can be used in scripts for logic
  9. New xinput hooks (alot more effective way of hooking and handling xinput messages) (Thanks to @Ilyaki)
  10. Fixes for custom layouts and stretching KMB inputs on layouts
  11. Fixes for status window, performs alot better (but still every once and awhile may not work)
  12. Updated alpha 10 custom xinput dlls to enable mouse and keyboard input for instances
  13. XinputPlus assign gamepad based on player's gamepad index NOT player's index
  14. Added support for wizark952's dinput8 blocker
  15. Added some support for Goldberg's steam client loader
  16. Added options to set window styles at very end, ignore window border check, and option to enable windows at end
  17. Added function Game.IgnoreThirdPartyPrompt; when launching via third party, ignore the prompt to press ok when game is launched
  18. Changes to LaunchAsDifferentUsers - added option to keep user accounts and ability to transfer user account data (if not keeping)
  19. Made some back-end changes to Nucleus environment
  20. Revamped settings window, tabs are now used to seperate different sub-settings
  21. Changes to Context values, functions and bug fixes
  22. Updated Goldberg emulator to latest git build
  23. Added prelimary and experimental function to write to process memory; Game.WriteToProcessMemory
  24. LOTS of miscellaneous changes/bug-fixes

v0.9.9.9 r4 - April 12, 2020

  1. Improved script downloader. Handlers are cached and viewable up to a specified # of results at a time (via "pages"). User can also pre-sort and use drop-down as an alternative way to sort when searching
  2. Replaced LaunchAsDifferentUsers with a new and improved method, which will now also utilize current user's Nucleus environment. The previous method has been retained as LaunchAsDifferentUsersAlt
  3. Added an optional status window to appear when launching and closing Nucleus, to show what Nucleus is doing
  4. Added an alternative method of changing IP per instance. Alt method will create temporary loopback adapters for each player (however, it will not change any metric)
  5. Added the ability to extract existing script handlers (.nc files)
  6. Added a new option in game scripts to call Game.Play after the game instance has launched
  7. Added a new option in game scripts to not copy files from UserProfilePath when using Nucleus environment
  8. Added a new option in game scripts to ignore checking if launcher exe exists in game folder
  9. Added a new Context function, ReadRegKey. Will return a string value for a specified key
  10. Added new Context function, RunAdditionalFiles. User can specify files that need to be run before launcher/game
  11. Added functions to Context so you can now get a list of all found files and their paths that match a given pattern. Can also change a creation date and modified date of a file
  12. Added an option for DirSymlinkCopyInstead to copy all subfolders and files in addition
  13. Added new values for Player, SID, Adapter and UserProfile (for use with some of the new functions in this update)
  14. Improved editing and deleting of registry keys, in addition keys in HKEY_USERS are now accessible
  15. Changed prompts from message boxes to Forms (more control, shold now be on top most of the time)
  16. Migrated from SlimDX to SharpDX for reading controllers
  17. Updated rename mutexes to work with "Type:|" prefixes introduced in a recent update
  18. Updated external libraries to latest versions (Jint, DotNetZip, Newtonsoft Json)
  19. Potential fix for bug that was eating CPU resources when using Direct Input/Xinput Reroute
  20. Fixed XInputPlus bug that would only recognize dinput dll if it was all lowercase
  21. Fixed bugs when using DrawFakeMouseCursor, added option DrawFakeMouseForControllers [thanks to @Ilyaki]
  22. Fixed some bugs in script downloader
  23. Fixed backed up registry table not being restored
  24. Fixed DirSymlinkCopyInstead not copying folder itself
  25. Fixed ChangeExe not working when KeepSymLinkOnExit is being used
  26. Fixed Nucleus post hook dlls being injected too early when using ProcessChangesAtEnd
  27. Number of other bug fixes
  28. Minor tweaks/changes

v0.9.9.9 r3 - March 26, 2020

  1. Fixes and improvements to Game.LaunchAsDifferentUsers
  2. Fixed error message on the controller layout screen when using dinput / xinput reroute
  3. Fixed context aspect ratio decimals

v0.9.9.9 r2 - March 25, 2020

  1. Can now view all public scripts in Script Downloader and sort columns by ascending/descending order
  2. Added an option in game scripts to launch each game instance as a different user (Nucleus will create temporary accounts "nucluesplayerx" and then delete them at the very end) [thanks to @napserious for his base code]
  3. Added an option in game scripts to run Game.ExecutableName in addition to Game.LauncherExe (if used)
  4. Added an option in game scripts to specify an amount of time to wait after lauching game but before grabbing the game's process
  5. Added an option in game scripts to specify if starting arguments should be inside the executable path when using Game.CMDLaunch
  6. Added an option in game scripts/utility to use a EAC bypass dll
  7. Added an option in game scripts to kill mutexes at the end, when using Game.ProcessChangsAtEnd
  8. Added an option in game scripts to add gamepad cursors [thanks to @Ilyaki]
  9. Added additional logic to SetWindowHook and SetWindowHook hooks, now they should work better
  10. New context options available to get monitor or a specific player window's height/width/aspectratio
  11. Game.CreateSingleDeviceFile will now also hook CreateFileA for ANSI calls
  12. Whenever registry keys are being edited or deleted by a script, Nucleus will now backup the current registry keys and restore them upon exit
  13. When hard copying game files, you can now specify exclusions
  14. When hard copying game files, Nucleus will wait for each instance to hard copy before continuing
  15. Updated Goldberg emulator to latest git build (sha 5c41ba020c4ffc46d0adbeb3b82c9ae623d14ef2)
  16. Fixed not all lines using right encoding when specified, when modifying lines to files (replacelines, removelines, etc)
  17. Fixed Script Downloader not working for Window 7 users
  18. Fix for raw input filter / reregister raw input not working [thanks to @Ilyaki]
  19. Fixed some objects weren't being properly disposed

v0.9.9.9 f1 - March 15, 2020

  1. Added an option in game scripts to create only one file for HID devices per instance (the assigned HID device). This is a workaround for Unity games that use default input
  2. Added an option in game scripts to enable the minimize, and restore of game window at the end (now off by default, only few games are known to need it atm)
  3. Device handle zero support [thanks to @Ilyaki]
  4. Added a delay during start up hooks for better performance (would cause issues on lower end PCs), and fixed hang when it failed its 5 attempts
  5. Fix ResetWindows not resizing or repositioning if DontResize or DontReposition is on
  6. Only copy from AppData folder to Nucleus Environment if Nucleus Environment is being used
  7. Re-enabled debug log header
  8. Minor tweaks/bug fixes

v0.9.9.9 - March 7, 2020

  1. Nucleus now supports multiple Mice and Keyboards [thanks to @Ilyaki]
  2. Added the ability to search for scripts (handlers) and download them directly from the UI [thanks to @r-mach]
  3. You can now edit scripts while Nucleus is open and changes will take effect (no need to restart Nucleus each time anymore)
  4. Added a new option in game scripts to do resizing, repositioning and post-launch hooking of ALL instances at the very end (after all have been opened)
  5. Note: This method will not work for every option to-date
  6. Added an option in game scripts to re-register raw input in game process, a replacement for forwarding raw input [thanks to @Ilyaki]
  7. Added a new utility, Flawless Widescreen. Can be setup by calling it in game script
  8. Added an option in game scripts to change your IP per instance (NOTE: Highly experimental), a drop-down has been added to settings to select which network to change IP for
  9. Added logic to delete certain files that Nucleus adds to original game folder (when not linking or copying). For example, some that get deleted: Nucleus custom dlls, x360ce, xinput plus, custom utils
  10. Added an option in game scripts to kill mutexes in launchers
  11. Added an option in game scripts to kill mutexes in the last instance (normally last is ignored)
  12. Added an option in game scripts to rename, move or delete files in instance folders
  13. Added an option in game scripts to prompt the user after launching each instance, but before the grab process is grabbed
  14. Added an option in game scripts to delete file(s) from user profile config or save path, a prompt asking you to confirm will typically show, but this can be turned off in script too
  15. Added an option in game scripts to rename the steam api for Goldberg experimental (default will now not rename, you must set it to do so)
  16. Added an option in game scripts to kill additional processes upon exiting Nucleus or stopping a session
  17. Added an option in game scripts to ignore PreventWindowDeactivation if player is using keyboard
  18. Added an option in game scripts to copy (not symlink) all files within a given folder
  19. Added options in game scripts to disable Nucleus resizing, repositioning or making windows top most
  20. Added an option in game scripts to specify custom window styles (extended window styles as well)
  21. Increased max nickname length to 9 characters
  22. Exposed IsKeyboardPlayer to Context (will be True or False), can now be called in Game.Play
  23. Launchers will now also be killed upon exiting Nucleus or stopping a session (if any remain open throughout session), in addition to game windows
  24. Added logic to KeepAspectRatio & KeepMonitorAspectRatio if new width is to be determined (previously only new height)
  25. Added logic so that mutexes of different kinds can be killed. In Game.KillMutex(Launcher), simply begin the string with "Type:Mutant|" following by the name of the mutex to kill. Can replace mutant with any mutex type
  26. Added logic to check if borders are removed at very end (some games bring them back), and if they aren't, remove them again
  27. Added Steam language in UI settings, and language gets updated automatically for SSE now as well
  28. Updated logic when launching games with start up hooks. Will check if process for that instance is already running, as well as try to grab the correct process if it is detected to be wrong
  29. Updated logic for Goldberg to set the settings folder in Nucleus Environment if environment and no local save are enabled
  30. Updated Goldberg emulator to latest git build (sha a0b66407bf2b8da686a708802cbc412f9cd386ca)
  31. Updated Context.LocalIP to better identify user's local IP when there are multiple IPs
  32. Updated method to capture current environment's user profile if different than their username [thanks to @Ilyaki]
  33. Fixed bug with x360ce placing files in wrong directory
  34. Fixed some duplicate operations happening if game was not linked or copied
  35. Fixed instanced folders trying to be deleted if game was not linked or copied
  36. Fixed a bug with PreventWindowDeactivation causing input to not work for some users
  37. Fixed some bugs with HexEditFileAddress and HexEditExeAddress
  38. Fixed architecture displayed in UI script details

v0.9.9.1 - February 5, 2020

  1. Updated logic for LauncherExe. The file name in this field will now be launched via Nucleus but ExecutableName will be used to resize, reposition and hook. Launchers will no longer be looked for when grabbing process to manipulate. LauncherExe will be used for hex editing exes and change exes.
  2. LauncherExe can now also accept a full path to the launcher exe. This is if the launcher is outside of the game folder; NOTE: This file/folder contents will NOT be symlinked/copied, only the game root folder of ExecutableName. This means that hex edits and changing exe using a full path in LauncherExe WILL overwrite the original file!
  3. Added an option in game scripts to specify which instances get starting hooks, post-launch hooks and fake focus messages sent to (including a specific option for keyboard player)
  4. Added an option in game scripts to provide a relative config and save path from user profile for games (for use with Nucleus environment)
  5. Added an option in context menu/game options in UI to open or delete relative config and save paths (for system user profile and Nucleus)
  6. Added logic if the game is running in Nucleus environment and a user profile config and/or save path have been provided, files and folders will be copied over from the system user profile path (+ added an option to force it)
  7. Added an option in game scripts to manually enter steam IDs to be used
  8. Added an option in game scripts for games to try and keep monitor aspect ratio when being resized
  9. Added an option in game scripts to replace bytes in the exe or file at a specific offset
  10. Added new field in Context that can be used to grab the local IP address of the computer
  11. Added new fields in Context for Nucleus environment paths and relative game config/save paths
  12. If using Nucleus environment and goldberg, set the goldberg settings folder to the Nucleus appdata path
  13. Updated Goldberg emulator to latest git build (sha b4205535fbee455bee925ab3aa90780e00eead27)
  14. Hopefully, final fixes for aspect ratios being preserved via KeepAspectRatio and the new KeepMonitorAspectRatio options
  15. Fixed some issues with x360ce
  16. Fixed a bug that would cause infinite waiting if process data had already been assigned by the time it got checked
  17. Fixes for CMDBatchBefore/After (CMDOptions no longer required and will only use if there is a line for that instance, CMDBatchAfter now working)
  18. Fixed a bug that caused Nucleus to crash when using x360ce
  19. Fixed SmartSteamEmu not grabbing game process to resize, reposition and hook. SSE launches can now also use process picker
  20. Fixed bug preventing nickname from reverting back to default after removing a nickname
  21. Fixed bug that would sometimes cause an error and weird nicknames in UI, when disconnecting, reconnecting controllers
  22. Made some changes/improvements to context/game options menu and logging
  23. Game.HookInitDelay and Game.HookFocusInstances have been removed

v0.9.9 - January 22, 2020

  1. Added an option in game scripts to use Goldberg Lobby Connect (automatic)
  2. Thanks to Ilyaki, added an option in game scripts to use a custom environment (located at C:\Users<your username>\NucleusCoop)
  3. Added an option in game scripts to specify if the game is launched outside of Nucleus (Nucleus will then not launch it, but continue to do everything else, hook, resize, repos etc)
  4. Added a last fail-safe if process is still not found; a new window will open asking user to manually select the process
  5. Added an option in game scripts to manually pick the process to be manipulated for things such as resizing, repositioning and used for post-launch hooks
  6. Added an option in game scripts to run other commands in command prompt before or after game launches when using CMDLaunch (or UseForceBindIP), also set some environment variables that can be used in commands
  7. Added DInput support for XInputPlus
  8. Added an option in game scripts to have Goldberg not create a local_save.txt file (use default save location)
  9. Added an option to specify a different x360ce dll name be used, if needed
  10. Added the ability to copy entire folders (and all its contents) in CopyCustomUtils
  11. Added an option in context menu/game options in UI to delete content folder
  12. Added an option in game scripts to completely ignore linking or copying a folder and all its contents
  13. Updated Goldberg emulator to latest git build (sha 3f44827326eff6d9cc385c27f0bded89ee7642ea)
  14. Replaced a function (GetDpiForWindow - used for GUI) that required Windows 10, with an alternative method, so older versions of Windows are now better supported
  15. Made auto goldberg case insensitive when replacing steam api dlls
  16. Fixed bug that would stop script notes from appearing in UI after stopping a session
  17. Fixed bug when KeepSymLinkOnExit = true and # of players increase when there are more than 4 players
  18. Fixed LauncherExe being required in script if process was not found, or if script uses CMDLaunch or UseForceBindIP
  19. Fixed "Process is not running" crashes when using start up hooks
  20. Fixed KeepAspectRatio not resizing correctly, windows will now be horizontally centered as well (to player bounds)
  21. Fixed crash when SymlinkGame is false

v0.9.8.2 - December 8, 2019

  1. Hook code has been cleaned up and some lingering issues with Easyhook in the past have been resolved *Thanks to @Ilyaki
  2. Completely reworked Autosearch. Fixed bug requiring admin rights, custom paths are now allowed, user can choose which found games to add, and so much more
  3. Instance folder will no longer be symlinked if SymlinkFolders is true
  4. Integrated and added an option in game scripts to use DirectX 9, Direct 3D wrapper (d3d9.dll) to try and run DirectX 9 games in windowed mode
  5. Added an option in game scripts to force steam stub DRM patcher to either use x64 or x86 architecture dll
  6. Added an option in game scripts to force symlink every time
  7. Added an option in game scripts to set processor affinity per instance
  8. Changed logic of setting processor affinity
  9. Nicknames assigned in Nucleus are no longer exclusive to Goldberg
  10. The keyboard player can now be assigned a nickname in Settings
  11. Fixed large files sometimes breaking the symlink process
  12. Fixed files not being symlinked with different amount of players under the new rule: files will only be copied or symlinked once, if needed
  13. Fixed Nicknames not always being updated if changed
  14. Fixed the black window from Hide Desktop not closing when stopping a game session (must press stop or stop session hotkey)
  15. Added an option in game scripts to set processor affinity per instance
  16. Changed logic of setting processor affinity

v0.9.8.1 - November 4, 2019

  1. Reverted folder and file exclusion logic to the way it was done pre-0.9.8 (but still kept improvements made to them)
  2. DirSymlinkExclusion will force hardcopy of the folder (if it is to be symlinked), FileSymlinkExclusion will completely ignore the file (no link/copy), FileSymlinkCopyInstead will continue to just create hardcopy of file instead of symlinking it
  3. Fixed xinput plus controller mappings when keyboard player was any player except last
  4. Prompt between instances can now be delayed if PauseBetweenStarts has a value

v0.9.8 - November 1, 2019

  1. Nucleus no longer starts with administrative privileges and will prompt if it is needed, games will not be launched elevated now either
  2. Improved and changed logic on how files are copied/symlinked, much faster now and done all it once at the beginning !WARNING!: DirSymlinkExclusions did not work properly in original Nucleus Alpha 8 and now does. All files and subfolders of a DirSymlinkExclusion will be ignored no matter what the file is. Check your scripts!
  3. Files that get added to the instance folders (goldberg, xinput plus, etc) will no longer be copied over to the original game path and files (as long as SymlinkFolders is false)
  4. If SymlinkFolders is true, files WILL be copied over to the original file path
  5. Files will only be copied or symlinked once, if needed; i.e. if Instance0 path exists with at least one file & KeepSymLinkOnExit is true, Nucleus will skip copying/linking
  6. Added an option in game scripts to prevent window deactivation
  7. Added an option in game scripts to hardlink files instead of symlink
  8. Added an option in game scripts to symlink folders (needed for some games)
  9. Added option in game scripts to use the experimental Goldberg branch
  10. Added an option in game scripts to ignore creating a steam_appid file (needed for some games)
  11. Added an option in game scripts to use Steam Stub DRM Patcher
  12. Added an option in game scripts to set the foreground window to something other than the games, needed for some games to balance out FPS
  13. Added an option in game scripts to create a steam_appid.txt file in the same folder as the game executable (needed for some games)
  14. Added game option to open the original executable directory
  15. Added number of players each game has in the UI game list, under the title
  16. Added option to right click on layout selection to go through the different layouts in reverse
  17. Added/tweaked some additional logging info
  18. Added more information to be displayed when selecting the Details option in UI
  19. Updated Goldberg emulator to latest git build (sha 2986b01d0cf34cd900f772cf4294ad387c104cf4)
  20. XInput plus and X360ce will now leave controller slots blank if player is using a keyboard (no controller input should work on keyboard instance)
  21. Scripts will now open in Notepad++ by default if installed, when using the Open Script option in UI
  22. Fixed Script Author notes in UI so that long notes will not overlap when placing controllers
  23. Fixed NeedsSteamEmulation option and added SSE support for x64 games
  24. Fixed IdInWindowTitle and ForceWindowTitle bug that would prevent them from working
  25. Fixed bug preventing mutexes being killed if there were two or more
  26. Fixed process with ID of 0 being killed
  27. Removed DotNetZip nuget package as it is no longer being used (replaced zip extractions with direct file operations)
  28. If a game script has an issue and game doesn't appear, when you fix the issue and launch Nucleus again, you no longer need to re-add the game (game will simply reappear)
  29. If a file is unable to be deleted after 10 tries during clean-up, do not throw an exception, just carry-on (details are logged)
  30. PromptBetweenInstances will now show the last prompt (to install hooks) if there are hooks to install OR if FakeFocus is set to true
  31. Renamed the Data folder to now be "content" (needed as some games mistake the Nucleus Data folder in the path as game files)
  32. Renamed the games folder to now be "scripts"

v0.9.7.2 - October 15, 2019

  1. Fixed crash that would happen if ForceFocusWindowName was left blank

v0.9.7.1 - October 14, 2019

  1. When placing controllers, you can now resize any player's screen to be full vertically or horizontally on any layout (custom layouts too!)
  2. Added a new option in game scripts to reset the previous window's size, position and borders as each new instance opens up
  3. Added an option in game scripts to provide a description, that will appear in the UI when the user selects the script's game
  4. Added an option to manually specify what language Goldberg should use
  5. Experimental: UI will now scale based on monitor DPI and Font size
  6. Improved closing procedures; better chance of finding and killing any lingering game processes
  7. Only one copy of Nucleus Coop can be open now
  8. Fixed typo preventing start up hooks from working on x64 when using the delay method
  9. Fixed Nucleus not launching when there is an error with a game script; will now prompt the user about the error and not show the game in the game list
  10. Fixed a bug when stopping a session would sometimes trigger an error message
  11. Fixed a bug where third party files were being placed in wrong directory when working folder was set to something in game script
  12. Fixed not all the files in the instance folders not being deleted sometimes
  13. If Nucleus crashes, the error message is now logged in the debug log in addition to the error file generated in the Data folder, plus taskbar will now show if it was hidden
  14. Changed the "Unknown Game" error message to be clearer on what the issue is
  15. Instead of denying the user to add a game if the game's executable is already in the game list, it will now prompt the user if they would like to add the game anyway or not
  16. Removed pointless horizontal scroll bar on game list
  17. Other Minor UI changes

v0.9.7.0 - October 7, 2019

  1. Goldberg Emu is now built-in to Nucleus, 3 new options in game scripts that will fully automate the process
  2. Added a customizable custom layout slot when placing controllers/devices. Create your own layout in Settings!
  3. Fixed issue of mutexes with certain special characters not being killed or renamed properly
  4. Removed SmartSteamEmu embedded in Nucleus.Gaming.dll, greatly reducing the dll's file size. SmartSteamEmu is now accessed and available externally through the "utils" folder (also updated SSE to the latest version, 1.4.3)
  5. Added an option in game scripts to copy custom files if needed
  6. Added two options in game scripts to be able to do text value replacements in binary files
  7. Added two additional options in game scripts to be able to do text value replacements in a file you specify
  8. Added new util, ForceBindIP and an option in game scripts to set it up automatically
  9. Added new util, XInputPlus and an option in game scripts to set it up automatically
  10. Added new util, Devreorder and an option in game scripts to set it up automatically
  11. Added an option in game scripts to block raw input devices in game
  12. Updated cmd launch to now work with every instance (previously only worked on second instance)
  13. User can now right click on game list to access different options for that game
  14. Added an option in the UI to open the game script in notepad
  15. Added an option in the UI to open the game data folder
  16. Added an option in the UI to change the game icon
  17. Added an option to enable a debug log to be created
  18. Game.ExecutableName is no longer case sensitive when trying to add a game in the UI
  19. Fixed an empty error log text file from being created in instance folder whenever a hook was used
  20. Fixed x64 focus hooks and setwindow hook
  21. Added a SetWindowStart hook that can be applied as each game opens up, instead of later on with SetWindowHook
  22. Made game windows not be the top most when using Game.PromptBetweenInstances, until after the last prompt (keeps prompt on top and easier to switch-to)
  23. Improved x360ce so that the xinput dll file gets copied along with the executable so x360ce doesn't prompt to create one
  24. Exposed the raw gamepad guid of each player's controller in game scripts (changed the name of the x360ce formatted one for clarity)

v0.9.6.1a - September 22, 2019

  1. Fixed 6 and 8 player layouts
  2. Reverted mutex searching back to exact matches by default as this broke some games, but left the option to do partial searches if needed (some games do require this)

v0.9.6.0a - September 20, 2019

  1. Added an option in game scripts to rename mutexes instead of killing them
  2. Tweaked method of finding mutexes to be more inclusive. You can now provide a partial name of mutex to kill (you must still provide full name for renaming)
  3. Upgraded custom xinput dll to Alpha 10s' and added x64 custom dll support (alpha 10 custom dlls are now the default, but you can revert back to alpha 8 with a line in game script for compatability)
  4. Added 6 and 8 player support
  5. Added an option to delete games from directly within the NucleusCoop UI
  6. Added the ability to assign "nicknames" to controllers in settings, used to identify specific controllers
  7. Added the option to allow you to use those newly created nicknames in-game, instead of default "Player1", "Player2" etc (this is for games using Goldberg only)
  8. Added the ability to see which controller is which by simply holding down a button on a controller. The corresponding controller icon will light up
  9. Added an option in game scripts to keep the game's aspect ratio when resizing
  10. Added an option in game scripts to manually set width, height, as well as position of each game window
  11. Added an option in game scripts to launch and set up x360ce before launching games (make sure you aren't using custom dlls)
  12. Added an option in game scripts to have the user decide when to open the next instance, instead of each being opened automatically
  13. Added an option in game scripts to hide desktop background
  14. Added an option in game scripts to hide taskbar when launching games
  15. Added an option in game scripts to hide the mouse cursor
  16. Added an option in game scripts to add the process ID to the end of game windows (helpful for creating unique/different window titles)
  17. Added an option in game scripts to use different exe names for each instance
  18. Added an option in game scripts to Hardcopy game files instead of Symlinking
  19. Added an option in game scripts to resize and reposition the previous window after a new window opens (some games need this)
  20. Fixed a bug preventing x64 focus and setwindow hooks from working
  21. Fixed a bug preventing Nucleus from opening when multiple scripts use the same Game.ExecutableName value
  22. WIP: rudimentary support for DInput alongside XInput (more recognized in Nucleus, can be assigned to a screen like any instance - should work in game). *Most dinput devices will still need to be set up manually.
  23. WIP: rudimentary Keyboard support

v0.9.5.3a - August 30, 2019

  1. Fixed a bug that stopped Game.FakeFocus from working

v0.9.5.2a - August 30, 2019

  1. Fixed Halo not working correctly with more than 2 instances

v0.9.5.1a - August 29, 2019

  1. Added an option in game scripts to prevent games from resizing on their own
  2. Added an option in game scripts to copy files from the game directory to the instanced folder
  3. Added a parameter to the registry manipulation methods, you can now specify a base key to work from (local machine or current user)
  4. Created a custom solution in order for Halo Custom Edition to work in Nucleus
  5. Tweaked EditRegKey so it now takes an object data type as the data and a custom RegType to specify the registry type (DWord, QWord, Binary, etc), opens alot more possibilities
  6. Reworked launching games using command prompt, much better results now. CMDOptions can now be specified per game instance (first instance is ignored for now)
  7. Fixed an issue with focus hooks that would sometimes crash the game
  8. Fixed launching games that don't require mutexes be killed but still have initial hooks
  9. Fixed some other minor bugs

v0.9.5 - August 21, 2019

  1. Added an option in game scripts to hook into game functions to trick the game into thinking it has focus
  2. Added an option in game scripts to hook into game functions that try and prevent multiple instances from running
  3. Added @gymmer's "FocusFaker' method to further trick the game into thinking it has focus
  4. Added an option in game scripts to set the window priority of each game instance. Can be set to either "AboveNormal", "High" or "RealTime"
  5. Added an option in game scripts to assign which processor games run on. Can be either an ideal processor (safer, no gaurantee) or a fixed one despite availability
  6. Added the ability to edit registry keys. Required for some games
  7. Added an option in game scripts to work-around ForceFocusWindowName having to match 1:1 with game window title for resizing, positioning and focus. Needed for some games that change their window title (does not effect game launchers)
  8. Added an option to force the title of game windows to be whatever is specific in Game.Hook.ForceFocusWindowName
  9. Added an option to specify individual files to Symlink
  10. Added an option in game scripts to launch a game using cmd with specified options
  11. There is a new Settings window (see cog icon to right corner of Nucleus)
  12. You can now customize the Nucleus hotkeys to be whatever you'd like
  13. Fixed a bug that Nucleus did not work properly when game windows were closed manually
  14. Updated method to toggle game windows being top most. It is now more efficient and doesn't rely on game script
  15. Minor improvement in performance
  16. Cleaned up some code

v0.9.4.1a - August 7, 2019

  1. Fixed bug that broke the generic file manipulation methods

v0.9.4a - August 6, 2019

  1. Added two new methods for game scripts: RemoveLineInTextFile and FindLineNumberInTextFile
  2. All four of the generic file manipulation methods (Find, Remove, Replace, ReplacePartial) now include an overload method to specify the kind of encoding to use
  3. Added a new variable to be used in Remove & Find Line methods: Nucleus.SearchType. You can specify either "Contains", "Full" or "StartsWith" to get more accurate results. Now with the four file manipulation methods, you should now be able to edit ANY game text file for ANY game
  4. Fixed bug in original Nucleus that didn't allow 1 player to be able to start/play a game
  5. Fixed "one time use" bug in original Nucleus; Nucleus can now be used multiple times in one session by simply pressing the STOP Button in the app OR pressing the newly created hotkey for it: Ctrl+S
  6. Added a toggle to make the game windows not the top most windows. Useful if you want to use other programs in the background. Hotkey is Ctrl+A. Pressing it will either disable or enable the windows being top most, depending on its current state. This requires Game.GameName in Nucleus game scripts to work.

v0.9a - August 1, 2019

  1. Initial release

Credits

  • Official Nucleus Co-op 2.0 and Up: Mikou27/nene27.
  • Original Nucleus Co-op Project: Lucas Assis (lucasassislar).
  • Nucleus Co-op Alpha 8 Mod : ZeroFox.
  • Proto Input, USS, multiple keyboards/mice & hooks: Ilyaki.
  • Website & handler API: r-mach. Handlers development and general testing: Talos91, PoundlandBacon, Pizzo, dr.oldboi and many - more.
  • Nucleus Co-op 2.0+ UI assets creation: dr.oldboi, Mikou27, PoundlandBacon.

Additional credits to all the original developers of the third party utilities Nucleus Co-op uses

  • Mr_Goldberg (Goldberg Emulator)
  • syahmixp (SmartSteamEmu)
  • atom0s (Steamless)
  • EJocys (x360ce)
  • 0dd14 Lab (Xinput Plus)
  • r1ch (ForceBindIP)
  • HaYDeN (Flawless Widescreen)
  • briankendall (devreorder)
  • VerGreeneyes (DirectXWrapper)
  • wizark952 (dinput8 blocker)
  • Nemirtingas (Epic\Galaxy Emulator & OpenXinput)
  • Josivan88 (SplitCalculator).

Special thanks to the SplitScreenDreams discord community, this wouldn't have been possible without all your contributions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment