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]
|
[package]
|
||||||
name = "anime-launcher-sdk"
|
name = "anime-launcher-sdk"
|
||||||
version = "1.7.0"
|
version = "1.7.1"
|
||||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -9,7 +9,7 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies.anime-game-core]
|
[dependencies.anime-game-core]
|
||||||
git = "https://github.com/an-anime-team/anime-game-core"
|
git = "https://github.com/an-anime-team/anime-game-core"
|
||||||
tag = "1.12.0"
|
tag = "1.12.1"
|
||||||
features = ["all"]
|
features = ["all"]
|
||||||
|
|
||||||
# path = "../anime-game-core" # ! for dev purposes only
|
# path = "../anime-game-core" # ! for dev purposes only
|
||||||
|
@ -37,7 +37,10 @@ pgr = ["anime-game-core/pgr"]
|
||||||
|
|
||||||
genshin-patch = ["anime-game-core/patch-dawn"]
|
genshin-patch = ["anime-game-core/patch-dawn"]
|
||||||
star-rail-patch = ["anime-game-core/patch-jadeite"]
|
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
|
# Common features
|
||||||
states = []
|
states = []
|
||||||
|
|
|
@ -8,9 +8,7 @@ use crate::honkai::consts::launcher_dir;
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct Patch {
|
pub struct Patch {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
pub servers: Vec<String>,
|
pub apply_mfplat: bool
|
||||||
pub apply_mfplat: bool,
|
|
||||||
pub root: bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Patch {
|
impl Default for Patch {
|
||||||
|
@ -21,18 +19,10 @@ impl Default for Patch {
|
||||||
Self {
|
Self {
|
||||||
path: launcher_dir.join("patch"),
|
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+
|
// Seems to not be needed with wine 8+
|
||||||
// which is recommended by default, so will work
|
// which is recommended by default, so will work
|
||||||
// for most of users
|
// for most of users
|
||||||
apply_mfplat: false,
|
apply_mfplat: false
|
||||||
|
|
||||||
// Disable root requirement for patching if we're running launcher in flatpak
|
|
||||||
root: !PathBuf::from("/.flatpak-info").exists()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,40 +32,14 @@ impl From<&JsonValue> for Patch {
|
||||||
let default = Self::default();
|
let default = Self::default();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
path: match value.get("path") {
|
path: match value.get("path").and_then(|path| path.as_str()).map(PathBuf::from) {
|
||||||
Some(value) => match value.as_str() {
|
Some(path) => path,
|
||||||
Some(value) => PathBuf::from(value),
|
|
||||||
None => default.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") {
|
apply_mfplat: match value.get("apply_mfplat") {
|
||||||
Some(value) => value.as_bool().unwrap_or(default.apply_mfplat),
|
Some(value) => value.as_bool().unwrap_or(default.apply_mfplat),
|
||||||
None => 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,
|
Launch,
|
||||||
|
|
||||||
MfplatPatchAvailable,
|
MfplatPatchAvailable,
|
||||||
MainPatchAvailable(MainPatch),
|
|
||||||
|
PatchNotVerified,
|
||||||
|
PatchBroken,
|
||||||
|
PatchUnsafe,
|
||||||
|
|
||||||
|
PatchNotInstalled,
|
||||||
|
PatchUpdateAvailable,
|
||||||
|
|
||||||
#[cfg(feature = "components")]
|
#[cfg(feature = "components")]
|
||||||
WineNotInstalled,
|
WineNotInstalled,
|
||||||
|
@ -35,7 +41,6 @@ pub struct LauncherStateParams<F: Fn(StateUpdating)> {
|
||||||
pub wine_prefix: PathBuf,
|
pub wine_prefix: PathBuf,
|
||||||
pub game_path: PathBuf,
|
pub game_path: PathBuf,
|
||||||
|
|
||||||
pub patch_servers: Vec<String>,
|
|
||||||
pub patch_folder: PathBuf,
|
pub patch_folder: PathBuf,
|
||||||
pub apply_mfplat: bool,
|
pub apply_mfplat: bool,
|
||||||
|
|
||||||
|
@ -59,35 +64,29 @@ impl LauncherState {
|
||||||
let diff = game.try_get_diff()?;
|
let diff = game.try_get_diff()?;
|
||||||
|
|
||||||
match diff {
|
match diff {
|
||||||
VersionDiff::Latest(_) => {
|
VersionDiff::Latest(version) => {
|
||||||
// Check game patch status
|
// Check game patch status
|
||||||
(params.status_updater)(StateUpdating::Patch);
|
(params.status_updater)(StateUpdating::Patch);
|
||||||
|
|
||||||
// Check if mfplat patch is needed
|
// 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);
|
return Ok(Self::MfplatPatchAvailable);
|
||||||
}
|
}
|
||||||
|
|
||||||
let patch = Patch::new(¶ms.patch_folder);
|
if !jadeite::is_installed(¶ms.patch_folder) {
|
||||||
|
return Ok(Self::PatchNotInstalled);
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check main patch status
|
if jadeite::get_latest()?.version > jadeite::get_version(params.patch_folder)? {
|
||||||
let player_patch = patch.main_patch()?;
|
return Ok(Self::PatchUpdateAvailable);
|
||||||
|
|
||||||
if !player_patch.is_applied(¶ms.game_path)? {
|
|
||||||
return Ok(Self::MainPatchAvailable(player_patch));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)),
|
VersionDiff::Diff { .. } => Ok(Self::GameUpdateAvailable(diff)),
|
||||||
|
@ -115,7 +114,6 @@ impl LauncherState {
|
||||||
wine_prefix: config.get_wine_prefix_path(),
|
wine_prefix: config.get_wine_prefix_path(),
|
||||||
game_path: config.game.path,
|
game_path: config.game.path,
|
||||||
|
|
||||||
patch_servers: config.patch.servers,
|
|
||||||
patch_folder: config.patch.path,
|
patch_folder: config.patch.path,
|
||||||
apply_mfplat: config.patch.apply_mfplat,
|
apply_mfplat: config.patch.apply_mfplat,
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue