public override void Play() { if (Game.GameId.StartsWith("CONSOLE")) { throw new Exception("We can't start console only games, the technology is not there yet."); } var prg = Programs.GetUWPApps().FirstOrDefault(a => a.AppId == Game.GameId); if (prg == null) { throw new Exception("Cannot start UWP game, installation not found."); } ProcessStarter.StartProcess(prg.Path, prg.Arguments); stopWatch = Stopwatch.StartNew(); procMon = new ProcessMonitor(); procMon.TreeDestroyed += Monitor_TreeDestroyed; procMon.TreeStarted += ProcMon_TreeStarted; // TODO switch to WatchUwpApp once we are building as 64bit app //procMon.WatchUwpApp(uwpMatch.Groups[1].Value, false); if (Directory.Exists(prg.WorkDir) && ProcessMonitor.IsWatchableByProcessNames(prg.WorkDir)) { procMon.WatchDirectoryProcesses(prg.WorkDir, false, true); } else { OnStopped(this, new GameControllerEventArgs(this, 0)); } }
public override void Play() { if (Game.PlayAction == null) { throw new Exception("Cannot start game without play action."); } var playAction = Game.PlayAction.ExpandVariables(Game); Dispose(); OnStarting(this, new GameControllerEventArgs(this, 0)); var proc = GameActionActivator.ActivateAction(playAction); if (playAction.Type != GameActionType.URL && playAction.Type != GameActionType.CMD) { stopWatch = Stopwatch.StartNew(); procMon = new ProcessMonitor(); procMon.TreeDestroyed += Monitor_TreeDestroyed; // Handle Windows store apps var uwpMatch = Regex.Match(playAction.Arguments ?? string.Empty, @"shell:AppsFolder\\(.+)!.+"); if (playAction.Path == "explorer.exe" && uwpMatch.Success) { var scanDirectory = Game.InstallDirectory; procMon.TreeStarted += ProcMon_TreeStarted; if (!Game.GameId.IsNullOrEmpty()) { var prg = Programs.GetUWPApps().FirstOrDefault(a => a.AppId == Game.GameId); if (prg != null) { scanDirectory = prg.WorkDir; } } // TODO switch to WatchUwpApp once we are building as 64bit app //procMon.WatchUwpApp(uwpMatch.Groups[1].Value, false); if (Directory.Exists(scanDirectory) && ProcessMonitor.IsWatchableByProcessNames(scanDirectory)) { procMon.WatchDirectoryProcesses(scanDirectory, false, true); } else { OnStopped(this, new GameControllerEventArgs(this, 0)); } } else { if (proc != null) { OnStarted(this, new GameControllerEventArgs(this, 0)); procMon.WatchProcessTree(proc); } else { OnStopped(this, new GameControllerEventArgs(this, 0)); } } } else { if (!string.IsNullOrEmpty(Game.InstallDirectory) && Directory.Exists(Game.InstallDirectory)) { OnStarted(this, new GameControllerEventArgs(this, 0)); stopWatch = Stopwatch.StartNew(); procMon = new ProcessMonitor(); procMon.TreeDestroyed += Monitor_TreeDestroyed; procMon.WatchDirectoryProcesses(Game.InstallDirectory, false); } else { OnStopped(this, new GameControllerEventArgs(this, 0)); } } }
public void Start(GameAction playAction, bool asyncExec = false) { if (playAction == null) { throw new ArgumentNullException("Cannot start game without play action."); } if (playAction.Type == GameActionType.Emulator) { throw new Exception("Cannot start emulator using this configuration."); } SourceGameAction = playAction; var gameClone = Game.GetClone(); var action = playAction.GetClone(); if (gameClone.Roms.HasItems()) { var romPath = gameClone.Roms[0].Path; SelectedRomPath = romPath; var newPath = CheckPath(romPath, "ROM", FileSystemItem.File); if (newPath != romPath) { gameClone.Roms = new ObservableCollection <GameRom> { new GameRom("LookupAlternativeFilePath", newPath) }; } } action = action.ExpandVariables(gameClone); action.Path = CheckPath(action.Path, nameof(action.Path), FileSystemItem.File); action.WorkingDir = CheckPath(action.WorkingDir, nameof(action.WorkingDir), FileSystemItem.Directory); if (playAction.Type == GameActionType.Script) { if (action.Script.IsNullOrWhiteSpace()) { throw new ArgumentNullException("Game script is not defined."); } RunStartScript( $"{Game.Name} play script", action.Script, gameClone.ExpandVariables(gameClone.InstallDirectory, true), new Dictionary <string, object>(), asyncExec); } else { Process proc; if (action.Type == GameActionType.File) { proc = ProcessStarter.StartProcess(action.Path, action.Arguments, action.WorkingDir); } else if (action.Type == GameActionType.URL) { proc = ProcessStarter.StartUrl(action.Path); } else { throw new NotSupportedException(); } procMon = new ProcessMonitor(); procMon.TreeStarted += ProcMon_TreeStarted; procMon.TreeDestroyed += Monitor_TreeDestroyed; if (action.TrackingMode == TrackingMode.Default) { if (action.Type != GameActionType.URL) { stopWatch = Stopwatch.StartNew(); // Handle Windows store apps var uwpMatch = Regex.Match(action.Arguments ?? string.Empty, @"shell:AppsFolder\\(.+)!.+"); if (action.Path == "explorer.exe" && uwpMatch.Success) { var scanDirectory = gameClone.InstallDirectory; if (!gameClone.GameId.IsNullOrEmpty()) { var prg = Programs.GetUWPApps().FirstOrDefault(a => a.AppId == gameClone.GameId); if (prg != null) { scanDirectory = prg.WorkDir; } } // TODO switch to WatchUwpApp once we are building as 64bit app //procMon.WatchUwpApp(uwpMatch.Groups[1].Value, false); if (Directory.Exists(scanDirectory) && ProcessMonitor.IsWatchableByProcessNames(scanDirectory)) { procMon.WatchDirectoryProcesses(scanDirectory, false, true); } else { InvokeOnStopped(new GameStoppedEventArgs()); } } else { if (proc != null) { InvokeOnStarted(new GameStartedEventArgs()); procMon.WatchProcessTree(proc); } else { InvokeOnStopped(new GameStoppedEventArgs()); } } } else { if (!string.IsNullOrEmpty(gameClone.InstallDirectory) && Directory.Exists(gameClone.InstallDirectory)) { InvokeOnStarted(new GameStartedEventArgs()); stopWatch = Stopwatch.StartNew(); procMon.WatchDirectoryProcesses(gameClone.InstallDirectory, false); } else { InvokeOnStopped(new GameStoppedEventArgs()); } } } else if (action.TrackingMode == TrackingMode.Process) { if (proc != null) { InvokeOnStarted(new GameStartedEventArgs()); stopWatch = Stopwatch.StartNew(); procMon.WatchProcessTree(proc); } else { InvokeOnStopped(new GameStoppedEventArgs()); } } else if (action.TrackingMode == TrackingMode.Directory) { var watchDir = action.TrackingPath.IsNullOrEmpty() ? gameClone.InstallDirectory : action.TrackingPath; if (!watchDir.IsNullOrEmpty() && Directory.Exists(watchDir)) { stopWatch = Stopwatch.StartNew(); procMon.WatchDirectoryProcesses(watchDir, false); } else { InvokeOnStopped(new GameStoppedEventArgs()); } } else { throw new NotSupportedException(); } } }