Skip to content
Beta: this is a preview of the new SplitScreen.Me. Data may be reset before launch.

Labyrinthine · handler “Labyrinthine”

Version 3

Release notes

add gamepads support (steam input) ||| switch fakefocus > proto ||| using old GB fork dll

Released
Size
1.4 MB
Downloads
739
Check
Verified
SHA-256
865a25a0ae53743447120a737b5cc969ae6952376d58cacf0c1ee1c36409884a
Download v3 (.nc)All versions

Files 2

PathSize
handler.js17 KB
Labyrinthine/steam_api64.dll3.5 MB

handler.js

Plain text
Hub.Handler.Version = 3; // Released at https://hub.splitscreen.me/ on Wed Apr 30 2025 02:01:24 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "C28GmHa3d2tRBNCRS";
Hub.Maintainer.Name = "Vlxst";
Hub.Maintainer.Id = "wZTsDsXZnJhD4fwfz";

Game.ExecutableContext = ["Labyrinthine_Data"];
Game.DirSymlinkExclusions = ["Labyrinthine_Data\\Plugins\\x86_64", "Labyrinthine_Data"];
Game.FileSymlinkExclusions = ["steam_api64.dll", "steam_appid.txt", "settings.cfg", "keybinds.cfg"];
Game.FileSymlinkCopyInstead = ["globalgamemanagers", "UnityCrashHandler64.exe", "UnityPlayer.dll"];

Game.BackupFiles = ["Labyrinthine_Data\\settings.cfg", "Labyrinthine_Data\\keybinds.cfg"];

Game.SteamID = "1302240";
Game.GUID = "Labyrinthine";
Game.GameName = "Labyrinthine";
Game.HandlerInterval = 100;
Game.UseGoldberg = true;
Game.GoldbergExperimental = true;
Game.SymlinkExe = false;
Game.SymlinkGame = true;
Game.SymlinkFolders = true;
Game.SupportsKeyboard = false;
Game.KeepSymLinkOnExit = false;
Game.GoldbergNoLocalSave = false;
Game.ExecutableName = "Labyrinthine.exe";
Game.MaxPlayersOneMonitor = 8;
Game.MaxPlayers = 8;
Game.Hook.ForceFocus = false;
Game.Hook.ForceFocusWindowName = "Labyrinthine";
Game.HasDynamicWindowTitle = true;
Game.HideTaskbar = true;
Game.ResetWindows = true;
Game.RefreshWindowAfterStart = true;
Game.SetForegroundWindowElsewhere = true;
Game.SetWindowHook = true;
Game.Hook.DInputEnabled = false;
Game.Hook.XInputEnabled = false;
Game.Hook.XInputReroute = false;
Game.Hook.CustomDllEnabled = false;
Game.UserProfileSavePath = "AppData\\LocalLow\\Valko Game Studios";
Game.UserProfileSavePathNoCopy = true;

Game.Description =
  "If have Keyboard players:\n" +
  "Block the inputs when all instances are open and resized, by pressing the END key." +
  "\n" +
  "If the fps is bad, unlock the inputs with the END key and with Ctrl+H to unfocus the instances." +
  "\n" +
  "You can change everything, it just doesn't change the resolution of the game.";

Game.PauseBetweenContextAndLaunch = 7;
Game.PauseBetweenProcessGrab = 10;
Game.PauseBetweenStarts = 20;

//USS deprecated options:

Game.HookSetCursorPos = false;
Game.HookGetCursorPos = false;
Game.HookGetKeyState = false;
Game.HookGetAsyncKeyState = false;
Game.HookGetKeyboardState = false;
Game.HookFilterRawInput = false;
Game.HookFilterMouseMessages = false;
Game.HookUseLegacyInput = false;
Game.HookDontUpdateLegacyInMouseMsg = false;
Game.HookMouseVisibility = false;
Game.InjectHookXinput = false;

Game.SendNormalMouseInput = false;
Game.SendNormalKeyboardInput = false;
Game.SendScrollWheel = false;
Game.ForwardRawKeyboardInput = false;
Game.ForwardRawMouseInput = false;
Game.HookReRegisterRawInput = false;
Game.HookReRegisterRawInputMouse = false;
Game.HookReRegisterRawInputKeyboard = false;
Game.DrawFakeMouseCursor = false;

//ProtoInput:

Game.SupportsMultipleKeyboardsAndMice = true;

Game.ProtoInput.InjectStartup = false;
Game.ProtoInput.InjectRuntime_RemoteLoadMethod = false;
Game.ProtoInput.InjectRuntime_EasyHookMethod = true;
Game.ProtoInput.InjectRuntime_EasyHookStealthMethod = false;

Game.LockInputAtStart = false;
Game.LockInputSuspendsExplorer = true;
Game.ProtoInput.FreezeExternalInputWhenInputNotLocked = false;
Game.LockInputToggleKey = 0x23;

Game.ProtoInput.RenameHandlesHook = false;
Game.ProtoInput.RenameHandles = [];
Game.ProtoInput.RenameNamedPipes = [];

Game.ProtoInput.RegisterRawInputHook = true;
Game.ProtoInput.GetRawInputDataHook = false;
Game.ProtoInput.MessageFilterHook = true;
Game.ProtoInput.GetCursorPosHook = false;
Game.ProtoInput.SetCursorPosHook = false;
Game.ProtoInput.GetKeyStateHook = false;
Game.ProtoInput.GetAsyncKeyStateHook = false;
Game.ProtoInput.GetKeyboardStateHook = false;
Game.ProtoInput.CursorVisibilityHook = false;
Game.ProtoInput.ClipCursorHook = true;
Game.ProtoInput.FocusHooks = false;
Game.ProtoInput.DrawFakeCursor = false;
Game.ProtoInput.ClipCursorHookCreatesFakeClip = true;
Game.ProtoInput.EnableToggleFakeCursorVisibilityShortcut = false;
Game.ProtoInput.DontShowCursorWhenImageUpdated = true;

Game.ProtoInput.RawInputFilter = false;
Game.ProtoInput.MouseMoveFilter = false;
Game.ProtoInput.MouseActivateFilter = true;
Game.ProtoInput.WindowActivateFilter = false;
Game.ProtoInput.WindowActvateAppFilter = false;
Game.ProtoInput.MouseWheelFilter = false;
Game.ProtoInput.MouseButtonFilter = false;
Game.ProtoInput.KeyboardButtonFilter = true;

Game.ProtoInput.SendMouseWheelMessages = true;
Game.ProtoInput.SendMouseButtonMessages = true;
Game.ProtoInput.SendMouseMovementMessages = true;
Game.ProtoInput.SendKeyboardButtonMessages = true;

Game.ProtoInput.EnableFocusMessageLoop = false;
//Game.ProtoInput.FocusLoopIntervalMilliseconds = 5;
//Game.ProtoInput.FocusLoop_WM_ACTIVATE = true;
//Game.ProtoInput.FocusLoop_WM_ACTIVATEAPP = true;
//Game.ProtoInput.FocusLoop_WM_NCACTIVATE = true;
//Game.ProtoInput.FocusLoop_WM_SETFOCUS = true;
//Game.ProtoInput.FocusLoop_WM_MOUSEACTIVATE = true;
Game.ProtoInput.BlockedMessages = [0x0008, 0x02a3, 0x02a1]; // Blocks WM_KILLFOCUS, WM_MOUSEHOVER and WM_MOUSELEAVE

//// for work gamepads
Game.ProtoInput.XinputHook = true;
Game.ProtoInput.UseOpenXinput = true;
Game.ProtoInput.UseDinputRedirection = false;
Game.ProtoInput.DinputDeviceHook = false;
Game.ProtoInput.DinputHookAlsoHooksGetDeviceState = false;
Game.ProtoInput.MultipleProtoControllers = true;

Game.Play = function() {
  var Args = (Context.Args = " -screen-fullscreen 0 -popupwindow " + " -screen-width " + Context.Width + " -screen-height " + Context.Height);
  Context.StartArguments = Args;

  //function to edit path os saves/registry of the instances
  var fillPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\globalgamemanagers";
  var base = Context.Nickname;
  var og_Path = "Labyrinthine";
  //Create newPath by rearranging characters from base
  var newPath = og_Path.substring(0, og_Path.length - 3) + base.charAt(0) + base.charAt(base.length - 1) + base.length;

  //Ensure newPath is at least as long as og_Path
  if (newPath.length < og_Path.length) {
    while (newPath.length < og_Path.length) {
      newPath += base.charAt(base.length - 1);
    }
  } else if (og_Path.length < newPath.length) {
    //Ensure og_Path is at least 3 characters long
    newPath = newPath.substring(0, og_Path.length);
  }
  Context.PatchFile(fillPath, fillPath, og_Path, newPath);
  ////////////////////////////

  ///////////Setup GB

  //GB old Fork
  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_api64.dll");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "steam_api64.dll");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  //glyphs
  var filePath = (Context.filePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\controller\\glyphs");
  System.IO.Directory.CreateDirectory(filePath);

  Context.CopyFolder(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\controller\\glyphs"
  );

  //Dlcs
  var dlc = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\DLC.txt";
  var lines = ["2438400=Labyrinthine Supporter Edition"];
  Context.WriteTextFile(dlc, lines);

  //Stats
  var stats = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\stats.txt";
  var lines = ["Experience=int=0", "Hardcores=int=0", "TicketSpent=int=0", "CosmeticCount=int=0"];
  Context.WriteTextFile(stats, lines);

  //Overlay
  var nolay = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\disable_overlay.txt";
  var lines = [""];
  Context.WriteTextFile(nolay, lines);

  //Gamepad Setup
  var game = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\controller\\game.txt";
  var lines = [
    "OpenMenu=START",
    "ShowTabMenu=BACK",
    "Interact=A",
    "InteractHold=A",
    "Jump=B",
    "Pickup=X",
    "PushToTalk=Y",
    "LeftMouse=DLTRIGGER",
    "RightMouse=DRTRIGGER",
    "Sprint=LSTICK",
    "Move=LJOY=joystick_move",
    "ToggleLight=DRIGHT",
    "ToggleEquipment=DLEFT",
    "Crouch=RSTICK",
    "Camera=RJOY=joystick_move"
  ];
  Context.WriteTextFile(game, lines);

  var Menu = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\Plugins\\x86_64\\steam_settings\\controller\\Menu.txt";
  var lines = [
    "Options=START",
    "Info=BACK",
    "LeftGroup=LBUMPER",
    "RightGroup=RBUMPER",
    "Confirm=A",
    "Back=B",
    "CycleBodyLeft=X",
    "CycleBodyRight=Y",
    "PushToTalk=Y",
    "Navigate=DPAD,LJOY=joystick_move",
    "Scroll=RJOY=joystick_move"
  ];
  Context.WriteTextFile(Menu, lines);

  /////////////////////////////////

  ///////////// Registry edit
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Fullscreen mode_h3630240806", 3, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Height_h2627697771", Context.Height, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Window Height_h1684712807", Context.Height, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Width_h182942802", Context.Width, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Window Width_h2524650974", Context.Width, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Use Native_h1405027254", 0, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "Screenmanager Resolution Use Native Default_h1405981789", 0, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Valko Game Studios\\" + newPath + "", "s_VSync_h867998072", 2, Nucleus.RegType.DWord);

  //Window
  if (!System.IO.File.Exists(Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\settings.cfg")) {
    var cfg = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\settings.cfg";
    var lines = ["screenMode=1", "vsync=1"];
    Context.WriteTextFile(cfg, lines);
  }

  ///// Restore Save backup

  if (System.IO.File.Exists(Context.PlayerGameFilesBackupFolder + "\\Labyrinthine_Data\\settings.cfg")) {
    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\settings.cfg");
    var savePkgOrigin = System.IO.Path.Combine(Context.PlayerGameFilesBackupFolder + "\\Labyrinthine_Data\\settings.cfg");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (System.IO.File.Exists(Context.PlayerGameFilesBackupFolder + "\\Labyrinthine_Data\\keybinds.cfg")) {
    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\keybinds.cfg");
    var savePkgOrigin = System.IO.Path.Combine(Context.PlayerGameFilesBackupFolder + "\\Labyrinthine_Data\\keybinds.cfg");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  //reapplying Vsync/window
  var txtPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\settings.cfg";
  var dict = [Context.FindLineNumberInTextFile(txtPath, "screenMode=", Nucleus.SearchType.StartsWith) + "|screenMode=1"];
  Context.ReplaceLinesInTextFile(txtPath, dict);

  var txtPath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Labyrinthine_Data\\settings.cfg";
  var dict = [Context.FindLineNumberInTextFile(txtPath, "vsync=", Nucleus.SearchType.StartsWith) + "|vsync=1"];
  Context.ReplaceLinesInTextFile(txtPath, dict);

  /////////////////////////////////

  //// for xinput work
  var numPlayers = 0;

  for (var i = 0; i < PlayerList.Count; i++) {
    var player = PlayerList[i];

    if (player.IsXInput && player.ScreenIndex !== -1) {
      numPlayers++;
    }
    player.ProtoController1 = Context.GamepadId;
  }

  //Proto Context Setup
  if (Context.IsKeyboardPlayer) {
    Game.ProtoInput.KeyboardButtonFilter = true;
    Game.ProtoInput.DrawFakeCursor = true;
  } else {
    Game.ProtoInput.KeyboardButtonFilter = false;
    Game.ProtoInput.DrawFakeCursor = false;
  }

  Game.ProtoInput.OnInputLocked = function() {
    for (var i = 0; i < PlayerList.Count; i++) {
      var player = PlayerList[i];

      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetCursorPosHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.SetCursorPosHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetAsyncKeyStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyboardStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.CursorVisibilityStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetRawInputDataHookID);
      //ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.RegisterRawInputHookID);
      //ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.MessageFilterHookID);

      //ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.FocusHooksHookID);

      //Avoid the mouse move filter unless absolutely necessary as it can massively affect performance if the game gets primary input from mouse move messages
      //ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseMoveFilterID);

      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.RawInputFilterID);
      //ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseActivateFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateAppFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseWheelFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseButtonFilterID);

      ProtoInput.SetDrawFakeCursor(player.ProtoInputInstanceHandle, true);
    }
  };

  Game.ProtoInput.OnInputUnlocked = function() {
    for (var i = 0; i < PlayerList.Count; i++) {
      var player = PlayerList[i];

      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetCursorPosHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.SetCursorPosHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetAsyncKeyStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyboardStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.CursorVisibilityStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetRawInputDataHookID);
      //ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.RegisterRawInputHookID);
      //ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.MessageFilterHookID);

      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.RawInputFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseMoveFilterID);
      //ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseActivateFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateAppFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseWheelFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseButtonFilterID);

      ProtoInput.StartFocusMessageLoop(player.ProtoInputInstanceHandle, 10000, true, true, false, false, false);

      ProtoInput.SetDrawFakeCursor(player.ProtoInputInstanceHandle, false);
    }
  };
};