diff --git a/Cargo.toml b/Cargo.toml index c5ede60..ea43c88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "anime-launcher-sdk" -version = "1.7.0" +version = "1.7.1" authors = ["Nikita Podvirnyy "] license = "GPL-3.0" readme = "README.md" @@ -9,7 +9,7 @@ edition = "2021" [dependencies.anime-game-core] git = "https://github.com/an-anime-team/anime-game-core" -tag = "1.12.0" +tag = "1.12.1" features = ["all"] # path = "../anime-game-core" # ! for dev purposes only @@ -37,7 +37,10 @@ pgr = ["anime-game-core/pgr"] genshin-patch = ["anime-game-core/patch-dawn"] star-rail-patch = ["anime-game-core/patch-jadeite"] -honkai-patch = ["anime-game-core/patch-jadeite"] +honkai-patch = [ + "anime-game-core/patch-jadeite", + "anime-game-core/patch-mfplat" +] # Common features states = [] diff --git a/src/games/honkai/config/schema/patch.rs b/src/games/honkai/config/schema/patch.rs index 96e05cb..0759b00 100644 --- a/src/games/honkai/config/schema/patch.rs +++ b/src/games/honkai/config/schema/patch.rs @@ -8,9 +8,7 @@ use crate::honkai::consts::launcher_dir; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Patch { pub path: PathBuf, - pub servers: Vec, - pub apply_mfplat: bool, - pub root: bool + pub apply_mfplat: bool } impl Default for Patch { @@ -21,18 +19,10 @@ impl Default for Patch { Self { path: launcher_dir.join("patch"), - servers: vec![ - String::from("https://codeberg.org/an-anime-team/dusk"), - String::from("https://notabug.org/mkrsym1/dusk") - ], - // Seems to not be needed with wine 8+ // which is recommended by default, so will work // for most of users - apply_mfplat: false, - - // Disable root requirement for patching if we're running launcher in flatpak - root: !PathBuf::from("/.flatpak-info").exists() + apply_mfplat: false } } } @@ -42,40 +32,14 @@ impl From<&JsonValue> for Patch { let default = Self::default(); Self { - path: match value.get("path") { - Some(value) => match value.as_str() { - Some(value) => PathBuf::from(value), - None => default.path - }, + path: match value.get("path").and_then(|path| path.as_str()).map(PathBuf::from) { + Some(path) => path, None => default.path }, - servers: match value.get("servers") { - Some(value) => match value.as_array() { - Some(values) => { - let mut servers = Vec::new(); - - for value in values { - if let Some(server) = value.as_str() { - servers.push(server.to_string()); - } - } - - servers - }, - None => default.servers - }, - None => default.servers - }, - apply_mfplat: match value.get("apply_mfplat") { Some(value) => value.as_bool().unwrap_or(default.apply_mfplat), None => default.apply_mfplat - }, - - root: match value.get("root") { - Some(value) => value.as_bool().unwrap_or(default.root), - None => default.root } } } diff --git a/src/games/honkai/states.rs b/src/games/honkai/states.rs index 3fec2a0..1bdea5d 100644 --- a/src/games/honkai/states.rs +++ b/src/games/honkai/states.rs @@ -10,7 +10,13 @@ pub enum LauncherState { Launch, MfplatPatchAvailable, - MainPatchAvailable(MainPatch), + + PatchNotVerified, + PatchBroken, + PatchUnsafe, + + PatchNotInstalled, + PatchUpdateAvailable, #[cfg(feature = "components")] WineNotInstalled, @@ -35,7 +41,6 @@ pub struct LauncherStateParams { pub wine_prefix: PathBuf, pub game_path: PathBuf, - pub patch_servers: Vec, pub patch_folder: PathBuf, pub apply_mfplat: bool, @@ -59,35 +64,29 @@ impl LauncherState { let diff = game.try_get_diff()?; match diff { - VersionDiff::Latest(_) => { + VersionDiff::Latest(version) => { // Check game patch status (params.status_updater)(StateUpdating::Patch); // Check if mfplat patch is needed - if params.apply_mfplat && !MfplatPatch::is_applied(¶ms.wine_prefix)? { + if params.apply_mfplat && !mfplat::is_applied(¶ms.wine_prefix)? { return Ok(Self::MfplatPatchAvailable); } - let patch = Patch::new(¶ms.patch_folder); - - // Sync local patch folder with remote if needed - // TODO: maybe I shouldn't do it here? - if patch.is_sync(¶ms.patch_servers)?.is_none() { - for server in ¶ms.patch_servers { - if patch.sync(server).is_ok() { - break; - } - } + if !jadeite::is_installed(¶ms.patch_folder) { + return Ok(Self::PatchNotInstalled); } - // Check main patch status - let player_patch = patch.main_patch()?; - - if !player_patch.is_applied(¶ms.game_path)? { - return Ok(Self::MainPatchAvailable(player_patch)); + if jadeite::get_latest()?.version > jadeite::get_version(params.patch_folder)? { + return Ok(Self::PatchUpdateAvailable); } - Ok(Self::Launch) + match jadeite::get_metadata()?.hsr.global.get_status(version) { + JadeitePatchStatusVariant::Verified => Ok(Self::Launch), + JadeitePatchStatusVariant::Unverified => Ok(Self::PatchNotVerified), + JadeitePatchStatusVariant::Broken => Ok(Self::PatchBroken), + JadeitePatchStatusVariant::Unsafe => Ok(Self::PatchUnsafe) + } } VersionDiff::Diff { .. } => Ok(Self::GameUpdateAvailable(diff)), @@ -115,7 +114,6 @@ impl LauncherState { wine_prefix: config.get_wine_prefix_path(), game_path: config.game.path, - patch_servers: config.patch.servers, patch_folder: config.patch.path, apply_mfplat: config.patch.apply_mfplat,