From b41967f90db7e6643b3b215dbae95070c60026d6 Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 17 Jul 2023 21:59:38 +0200 Subject: feat: Launch via Steam on non-Windows systems if possible (#422) --- src-tauri/src/main.rs | 57 +----------------------------- src-tauri/src/northstar/mod.rs | 78 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 5d71713a..a584eea9 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -128,7 +128,7 @@ fn main() { install_northstar_caller, update_northstar, northstar::launch_northstar, - launch_northstar_steam, + northstar::launch_northstar_steam, github::release_notes::check_is_flightcore_outdated, repair_and_verify::get_log_list, repair_and_verify::verify_game_files, @@ -461,8 +461,6 @@ mod platform_specific; #[cfg(target_os = "linux")] use platform_specific::linux; -use crate::constants::TITANFALL2_STEAM_ID; - #[derive(Serialize, Deserialize, Debug, Clone)] pub enum InstallType { STEAM, @@ -527,56 +525,3 @@ pub fn check_is_valid_game_path(game_install_path: &str) -> Result<(), String> { fn get_host_os() -> String { env::consts::OS.to_string() } - -/// Prepare Northstar and Launch through Steam using the Browser Protocol -#[tauri::command] -fn launch_northstar_steam( - game_install: GameInstall, - _bypass_checks: Option, -) -> Result { - if !matches!(game_install.install_type, InstallType::STEAM) { - return Err("Titanfall2 was not installed via Steam".to_string()); - } - - match steamlocate::SteamDir::locate() { - Some(mut steamdir) => { - if get_host_os() != "windows" { - let titanfall2_steamid: u32 = TITANFALL2_STEAM_ID.parse().unwrap(); - match steamdir.compat_tool(&titanfall2_steamid) { - Some(compat) => { - if !compat - .name - .clone() - .unwrap() - .to_ascii_lowercase() - .contains("northstarproton") - { - return Err( - "Titanfall2 was not configured to use NorthstarProton".to_string() - ); - } - } - None => { - return Err( - "Titanfall2 was not configured to use a compatibility tool".to_string() - ); - } - } - } - } - None => { - return Err("Couldn't access Titanfall2 directory".to_string()); - } - } - - // Switch to Titanfall2 directory to set everything up - if std::env::set_current_dir(game_install.game_path).is_err() { - // We failed to get to Titanfall2 directory - return Err("Couldn't access Titanfall2 directory".to_string()); - } - - match open::that(format!("steam://run/{}//--northstar/", TITANFALL2_STEAM_ID)) { - Ok(()) => Ok("Started game".to_string()), - Err(_err) => Err("Failed to launch Titanfall 2 via Steam".to_string()), - } -} diff --git a/src-tauri/src/northstar/mod.rs b/src-tauri/src/northstar/mod.rs index 47510dbd..bf55603b 100644 --- a/src-tauri/src/northstar/mod.rs +++ b/src-tauri/src/northstar/mod.rs @@ -3,7 +3,10 @@ pub mod install; use crate::util::check_ea_app_or_origin_running; -use crate::{constants::CORE_MODS, get_host_os, GameInstall, InstallType}; +use crate::{ + constants::{CORE_MODS, TITANFALL2_STEAM_ID}, + get_host_os, GameInstall, InstallType, +}; use anyhow::anyhow; /// Check version number of a mod @@ -65,16 +68,16 @@ pub fn launch_northstar( let host_os = get_host_os(); // Explicitly fail early certain (currently) unsupported install setups - if host_os != "windows" - || !(matches!(game_install.install_type, InstallType::STEAM) - || matches!(game_install.install_type, InstallType::ORIGIN) - || matches!(game_install.install_type, InstallType::UNKNOWN)) - { - return Err(format!( - "Not yet implemented for \"{}\" with Titanfall2 installed via \"{:?}\"", - get_host_os(), - game_install.install_type - )); + if host_os != "windows" { + if !matches!(game_install.install_type, InstallType::STEAM) { + return Err(format!( + "Not yet implemented for \"{}\" with Titanfall2 installed via \"{:?}\"", + get_host_os(), + game_install.install_type + )); + } + + return launch_northstar_steam(game_install, bypass_checks); } let bypass_checks = bypass_checks.unwrap_or(false); @@ -122,3 +125,56 @@ pub fn launch_northstar( get_host_os() )) } + +/// Prepare Northstar and Launch through Steam using the Browser Protocol +#[tauri::command] +pub fn launch_northstar_steam( + game_install: GameInstall, + _bypass_checks: Option, +) -> Result { + if !matches!(game_install.install_type, InstallType::STEAM) { + return Err("Titanfall2 was not installed via Steam".to_string()); + } + + match steamlocate::SteamDir::locate() { + Some(mut steamdir) => { + if get_host_os() != "windows" { + let titanfall2_steamid: u32 = TITANFALL2_STEAM_ID.parse().unwrap(); + match steamdir.compat_tool(&titanfall2_steamid) { + Some(compat) => { + if !compat + .name + .clone() + .unwrap() + .to_ascii_lowercase() + .contains("northstarproton") + { + return Err( + "Titanfall2 was not configured to use NorthstarProton".to_string() + ); + } + } + None => { + return Err( + "Titanfall2 was not configured to use a compatibility tool".to_string() + ); + } + } + } + } + None => { + return Err("Couldn't access Titanfall2 directory".to_string()); + } + } + + // Switch to Titanfall2 directory to set everything up + if std::env::set_current_dir(game_install.game_path).is_err() { + // We failed to get to Titanfall2 directory + return Err("Couldn't access Titanfall2 directory".to_string()); + } + + match open::that(format!("steam://run/{}//--northstar/", TITANFALL2_STEAM_ID)) { + Ok(()) => Ok("Started game".to_string()), + Err(_err) => Err("Failed to launch Titanfall 2 via Steam".to_string()), + } +} -- cgit v1.2.3