1.7.1
- implemented jadeite patch for hi3rd
This commit is contained in:
parent
40708d6b10
commit
6662d6516d
3 changed files with 29 additions and 64 deletions
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "anime-launcher-sdk"
|
||||
version = "1.7.0"
|
||||
version = "1.7.1"
|
||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
||||
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 = []
|
||||
|
|
|
@ -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<String>,
|
||||
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),
|
||||
path: match value.get("path").and_then(|path| path.as_str()).map(PathBuf::from) {
|
||||
Some(path) => path,
|
||||
None => default.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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<F: Fn(StateUpdating)> {
|
|||
pub wine_prefix: PathBuf,
|
||||
pub game_path: PathBuf,
|
||||
|
||||
pub patch_servers: Vec<String>,
|
||||
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,
|
||||
|
||||
|
|
Loading…
Reference in a new issue