示例#1
0
 private void FreeListener()
 {
     if (_diListener != null)
     {
         _diListener.OnStateChange -= new DirectInputListener.diStateChange(diListener_OnStateChange);
         _diListener = null;
     }
 }
示例#2
0
        /// <summary>
        /// Creates DirectInput thread.
        /// </summary>
        /// <param name="joystickGuid">Joysticks GUID.</param>
        /// <param name="playerNumber">Player number.</param>
        /// <param name="directInputListener">Direct Input listener class.</param>
        /// <param name="joystickMapping"></param>
        /// <param name="xinputMapping"></param>
        /// <param name="useXinput">If we use xinput instead.</param>
        /// <returns>Thread id.</returns>
        private Thread CreateDirectInputThread(Guid joystickGuid, int playerNumber, DirectInputListener directInputListener, XInputListener xinputListener, JoystickMapping joystickMapping, XInputMapping xinputMapping, bool useXinput)
        {
            Thread inputThread;

            if (!useXinput)
            {
                if (joystickGuid == Guid.Empty)
                {
                    return(null);
                }
                inputThread = new Thread(() => directInputListener.Listen(joystickGuid, playerNumber,
                                                                          _settingsData.UseSto0ZDrivingHack, joystickMapping));
                inputThread.Start();
            }
            else
            {
                inputThread = new Thread(() => xinputListener.Listen(playerNumber, _settingsData.UseSto0ZDrivingHack, xinputMapping));
                inputThread.Start();
            }
            return(inputThread);
        }
示例#3
0
        static void Main(string[] args)
        {
            if (!LoadSettingsData())
            {
                return;
            }
            var last = (int)Enum.GetValues(typeof(GameProfiles)).Cast <GameProfiles>().Last();

            if (args.Length != 1)
            {
                PrintGameModes(last);
                return;
            }

            int gameSelection;

            if (!int.TryParse(args[0], out gameSelection))
            {
                PrintGameModes(last);
                return;
            }

            if (gameSelection > last)
            {
                PrintGameModes(last);
                return;
            }

            JoystickMapping jmap1 = null;
            JoystickMapping jmap2 = null;

            try
            {
                if (File.Exists("JoystickMapping1.xml"))
                {
                    jmap1 = JoystickHelper.DeSerialize(1);
                }

                if (File.Exists("JoystickMapping2.xml"))
                {
                    jmap2 = JoystickHelper.DeSerialize(2);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Loading joystick mapping failed with error: {ex.InnerException} {ex.Message}");
                return;
            }

            if (jmap1 == null)
            {
                jmap1 = new JoystickMapping();
            }

            if (jmap2 == null)
            {
                jmap2 = new JoystickMapping();
            }

            InputCode.ButtonMode = (GameProfiles)gameSelection;
            var _serialPortHandler  = new SerialPortHandler();
            var directInputListener = new DirectInputListener();
            KeyboardController kc   = new KeyboardController();
            var jvsThread           = new Thread(() => _serialPortHandler.ListenSerial("COM14"));

            jvsThread.Start();
            var processQueueThread = new Thread(_serialPortHandler.ProcessQueue);

            processQueueThread.Start();
            var directInputThreadP1 = CreateDirectInputThread(_settingsData.PlayerOneGuid, 1, directInputListener, jmap1);

            // Wait before launching second thread.
            Thread.Sleep(1000);
            var directInputThreadP2 = CreateDirectInputThread(_settingsData.PlayerTwoGuid, 2, directInputListener, jmap2);

            if (_settingsData.UseKeyboard)
            {
                kc.Subscribe(directInputThreadP1 == null, directInputThreadP2 == null);
            }
            var gameThread = new Thread(() =>
            {
                while (true)
                {
                    // We only resurrect this since I had no crashes ever in the other threads. Feel free to improve!
                    if (directInputThreadP1 != null && !directInputThreadP1.IsAlive)
                    {
                        directInputThreadP1 = CreateDirectInputThread(_settingsData.PlayerOneGuid, 1, directInputListener, jmap1);
                    }

                    if (directInputThreadP2 != null && !directInputThreadP2.IsAlive)
                    {
                        directInputThreadP2 = CreateDirectInputThread(_settingsData.PlayerTwoGuid, 2, directInputListener, jmap2);
                    }
                    Thread.Sleep(5000);
                }
            });

            gameThread.Start();
            while (gameThread.IsAlive)
            {
                Thread.Sleep(1000);
            }
        }
示例#4
0
        /// <summary>
        /// Creates DirectInput thread.
        /// </summary>
        /// <param name="joystickGuid">Joysticks GUID.</param>
        /// <param name="playerNumber">Player number.</param>
        /// <param name="directInputListener">Direct Input listener class.</param>
        /// <param name="joystickMapping">Joystick map.</param>
        /// <returns>Thread id.</returns>
        private static Thread CreateDirectInputThread(Guid joystickGuid, int playerNumber, DirectInputListener directInputListener, JoystickMapping joystickMapping)
        {
            if (joystickGuid == Guid.Empty)
            {
                return(null);
            }
            var dinputThread = new Thread(() => directInputListener.Listen(joystickGuid, playerNumber, _settingsData.UseSto0ZDrivingHack, joystickMapping));

            dinputThread.Start();
            return(dinputThread);
        }
示例#5
0
 private void CreateListener()
 {
     _diListener                = new DirectInputListener();
     _diListener.Delay          = this.Delay;
     _diListener.OnStateChange += new DirectInputListener.diStateChange(diListener_OnStateChange);
 }
 private void FreeListener()
 {
   if (_diListener != null)
   {
     _diListener.OnStateChange -= new DirectInputListener.diStateChange(diListener_OnStateChange);
     _diListener = null;
   }
 }
 private void CreateListener()
 {
   _diListener = new DirectInputListener();
   _diListener.Delay = this.Delay;
   _diListener.OnStateChange += new DirectInputListener.diStateChange(diListener_OnStateChange);
 }
示例#8
0
        private void GameRunning_OnLoaded(object sender, RoutedEventArgs e)
        {
            var rawInput = new RawInputListener();

            if (_settingsData.UseMouse && (InputCode.ButtonMode == GameProfiles.LetsGoIsland || InputCode.ButtonMode == GameProfiles.SegaDreamRaiders || InputCode.ButtonMode == GameProfiles.GoldenGun))
            {
                rawInput.ListenToDevice(InputCode.ButtonMode == GameProfiles.GoldenGun);
            }
            var directInputListener = new DirectInputListener();
            var xinputListener      = new XInputListener();
            KeyboardController kc   = new KeyboardController();
            var jvsThread           = new Thread(() => _serialPortHandler.ListenSerial("COM14"));

            jvsThread.Start();
            var processQueueThread = new Thread(_serialPortHandler.ProcessQueue);

            processQueueThread.Start();
            Thread directInputThreadP1;

            if (_settingsData.UseMouse && (InputCode.ButtonMode == GameProfiles.LetsGoIsland || InputCode.ButtonMode == GameProfiles.SegaDreamRaiders || InputCode.ButtonMode == GameProfiles.GoldenGun))
            {
                directInputThreadP1 = null;
            }
            else
            {
                directInputThreadP1 = CreateDirectInputThread(_settingsData.PlayerOneGuid, 1, directInputListener, xinputListener, _joystickMapping1, _xinputMapping1, _settingsData.XInputMode);
            }

            // Wait before launching second thread.
            Thread.Sleep(1000);
            var directInputThreadP2 = CreateDirectInputThread(_settingsData.PlayerTwoGuid, 2, directInputListener, xinputListener, _joystickMapping2, _xinputMapping2, _settingsData.XInputMode);

            _gameRunning = true;
            if (_settingsData.UseKeyboard && (InputCode.ButtonMode == GameProfiles.MeltyBlood || InputCode.ButtonMode == GameProfiles.VirtuaTennis4))
            {
                kc.Subscribe(directInputThreadP1 == null, directInputThreadP2 == null);
            }
            var gameThread = new Thread(() =>
            {
                ProcessStartInfo info;
                if (_isTest)
                {
                    if (_testMenuIsExe)
                    {
                        info = new ProcessStartInfo("ParrotLoader.exe", $"\"{Path.Combine(Path.GetDirectoryName(_gameLocation), _testMenuExe)}\" {_testMenuString}");
                    }
                    else
                    {
                        info = new ProcessStartInfo("ParrotLoader.exe", $"\"{_gameLocation}\" {_testMenuString}");
                    }
                }
                else
                {
                    info = new ProcessStartInfo("ParrotLoader.exe", $"\"{_gameLocation}\"");
                }
                info.UseShellExecute = false;
                info.WindowStyle     = ProcessWindowStyle.Normal;
                var process          = Process.Start(info);
                while (!process.HasExited)
                {
                    // We only resurrect this since I had no crashes ever in the other threads. Feel free to improve!
                    if (directInputThreadP1 != null && !directInputThreadP1.IsAlive)
                    {
                        directInputThreadP1 = CreateDirectInputThread(_settingsData.PlayerOneGuid, 1, directInputListener, xinputListener, _joystickMapping1, _xinputMapping1, _settingsData.XInputMode);
                    }

                    if (directInputThreadP2 != null && !directInputThreadP2.IsAlive)
                    {
                        directInputThreadP2 = CreateDirectInputThread(_settingsData.PlayerTwoGuid, 2, directInputListener, xinputListener, _joystickMapping2, _xinputMapping2, _settingsData.XInputMode);
                    }
                    Thread.Sleep(5000);
                }
                _serialPortHandler.KillMe  = true;
                directInputListener.KillMe = true;
                xinputListener.KillMe      = true;
                _gameRunning = false;
                Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(this.Close));
                if (_settingsData.UseKeyboard && (InputCode.ButtonMode == GameProfiles.MeltyBlood || InputCode.ButtonMode == GameProfiles.VirtuaTennis4))
                {
                    kc.Unsubscribe();
                }
                if (_settingsData.UseMouse && (InputCode.ButtonMode == GameProfiles.LetsGoIsland || InputCode.ButtonMode == GameProfiles.SegaDreamRaiders || InputCode.ButtonMode == GameProfiles.GoldenGun))
                {
                    rawInput.StopListening();
                }
            });

            gameThread.Start();
        }