mirror of
https://github.com/an-anime-team/an-anime-game-launcher.git
synced 2025-04-05 00:05:09 +03:00
Several changes
- updated core library; now launcher will continue downloading of partially downloaded files - added downloading speed limiter (`config.json` -> `launcher.speed_limit`) - added `Config::try_get_selected_dxvk_info` method; now launcher loads currently applied dxvk version from the wine prefix files
This commit is contained in:
parent
79d63a174e
commit
57c36ae52d
12 changed files with 89 additions and 45 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -31,7 +31,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anime-game-core"
|
name = "anime-game-core"
|
||||||
version = "0.5.2"
|
version = "1.0.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bzip2",
|
"bzip2",
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 2206e00a963a3e1421a9d45d8f71f32a5c9b7acb
|
Subproject commit 12541266d567f3459430ba37e12b0d809d12733d
|
|
@ -1 +1 @@
|
||||||
Subproject commit 59283a76adc8d270ff5f67b630b7dfa905ec34a9
|
Subproject commit 6ad1433587fa487e0d72c545178a61f8961c3b21
|
|
@ -5,8 +5,7 @@ use crate::lib::consts::launcher_dir;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct Dxvk {
|
pub struct Dxvk {
|
||||||
pub builds: String,
|
pub builds: String
|
||||||
pub selected: Option<String>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Dxvk {
|
impl Default for Dxvk {
|
||||||
|
@ -14,8 +13,7 @@ impl Default for Dxvk {
|
||||||
let launcher_dir = launcher_dir().expect("Failed to get launcher dir");
|
let launcher_dir = launcher_dir().expect("Failed to get launcher dir");
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
builds: format!("{launcher_dir}/dxvks"),
|
builds: format!("{launcher_dir}/dxvks")
|
||||||
selected: None
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,20 +26,6 @@ impl From<&JsonValue> for Dxvk {
|
||||||
builds: match value.get("builds") {
|
builds: match value.get("builds") {
|
||||||
Some(value) => value.as_str().unwrap_or(&default.builds).to_string(),
|
Some(value) => value.as_str().unwrap_or(&default.builds).to_string(),
|
||||||
None => default.builds
|
None => default.builds
|
||||||
},
|
|
||||||
|
|
||||||
selected: match value.get("selected") {
|
|
||||||
Some(value) => {
|
|
||||||
if value.is_null() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
match value.as_str() {
|
|
||||||
Some(value) => Some(value.to_string()),
|
|
||||||
None => default.selected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => default.selected
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,7 @@ impl From<CoreGameEdition> for GameEdition {
|
||||||
pub struct Launcher {
|
pub struct Launcher {
|
||||||
pub language: String,
|
pub language: String,
|
||||||
pub temp: Option<String>,
|
pub temp: Option<String>,
|
||||||
|
pub speed_limit: u64,
|
||||||
pub repairer: Repairer,
|
pub repairer: Repairer,
|
||||||
pub edition: GameEdition
|
pub edition: GameEdition
|
||||||
}
|
}
|
||||||
|
@ -72,6 +73,7 @@ impl Default for Launcher {
|
||||||
Self {
|
Self {
|
||||||
language: String::from("en-us"),
|
language: String::from("en-us"),
|
||||||
temp: launcher_dir(),
|
temp: launcher_dir(),
|
||||||
|
speed_limit: 0,
|
||||||
repairer: Repairer::default(),
|
repairer: Repairer::default(),
|
||||||
edition: GameEdition::default()
|
edition: GameEdition::default()
|
||||||
}
|
}
|
||||||
|
@ -102,6 +104,11 @@ impl From<&JsonValue> for Launcher {
|
||||||
None => default.temp
|
None => default.temp
|
||||||
},
|
},
|
||||||
|
|
||||||
|
speed_limit: match value.get("speed_limit") {
|
||||||
|
Some(value) => value.as_u64().unwrap_or(default.speed_limit),
|
||||||
|
None => default.speed_limit
|
||||||
|
},
|
||||||
|
|
||||||
repairer: match value.get("repairer") {
|
repairer: match value.get("repairer") {
|
||||||
Some(value) => Repairer::from(value),
|
Some(value) => Repairer::from(value),
|
||||||
None => default.repairer
|
None => default.repairer
|
||||||
|
|
|
@ -12,6 +12,10 @@ use super::wine::{
|
||||||
Version as WineVersion,
|
Version as WineVersion,
|
||||||
List as WineList
|
List as WineList
|
||||||
};
|
};
|
||||||
|
use super::dxvk::{
|
||||||
|
Version as DxvkVersion,
|
||||||
|
List as DxvkList
|
||||||
|
};
|
||||||
|
|
||||||
pub mod launcher;
|
pub mod launcher;
|
||||||
pub mod game;
|
pub mod game;
|
||||||
|
@ -135,15 +139,10 @@ impl Config {
|
||||||
pub fn try_get_selected_wine_info(&self) -> Option<WineVersion> {
|
pub fn try_get_selected_wine_info(&self) -> Option<WineVersion> {
|
||||||
match &self.game.wine.selected {
|
match &self.game.wine.selected {
|
||||||
Some(selected) => {
|
Some(selected) => {
|
||||||
for group in WineList::get() {
|
WineList::get().iter()
|
||||||
for version in group.versions {
|
.flat_map(|group| group.versions.clone())
|
||||||
if &version.name == selected {
|
.filter(|version| version.name.eq(selected))
|
||||||
return Some(version.clone());
|
.next()
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
None
|
|
||||||
},
|
},
|
||||||
None => None
|
None => None
|
||||||
}
|
}
|
||||||
|
@ -166,6 +165,34 @@ impl Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Try to get DXVK version applied to wine prefix
|
||||||
|
///
|
||||||
|
/// Returns:
|
||||||
|
/// 1) `Ok(Some(..))` if version was found
|
||||||
|
/// 2) `Ok(None)` if version wasn't found, so too old or dxvk is not applied
|
||||||
|
/// 3) `Err(..)` if failed to get applied dxvk version, likely because wrong prefix path specified
|
||||||
|
pub fn try_get_selected_dxvk_info(&self) -> std::io::Result<Option<DxvkVersion>> {
|
||||||
|
let bytes = match std::fs::read(format!("{}/drive_c/windows/system32/dxgi.dll", &self.game.wine.prefix)) {
|
||||||
|
Ok(bytes) => bytes[1600000..1700000].to_vec(),
|
||||||
|
Err(_) => std::fs::read(format!("{}/drive_c/windows/system32/d3d11.dll", &self.game.wine.prefix))?[2400000..2500000].to_vec()
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok({
|
||||||
|
DxvkList::get()
|
||||||
|
.iter()
|
||||||
|
.flat_map(|group| group.versions.clone())
|
||||||
|
.filter(|version| {
|
||||||
|
let version = format!("\0v{}\0", &version.version);
|
||||||
|
let version = version.as_bytes();
|
||||||
|
|
||||||
|
bytes.windows(version.len())
|
||||||
|
.position(|window| window == version)
|
||||||
|
.is_some()
|
||||||
|
})
|
||||||
|
.next()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&JsonValue> for Config {
|
impl From<&JsonValue> for Config {
|
||||||
|
|
|
@ -62,7 +62,7 @@ pub struct Group {
|
||||||
pub versions: Vec<Version>
|
pub versions: Vec<Version>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct Version {
|
pub struct Version {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub version: String,
|
pub version: String,
|
||||||
|
|
|
@ -132,8 +132,8 @@ pub fn run(debug: bool) -> std::io::Result<()> {
|
||||||
command.env("WINEPREFIX", &config.game.wine.prefix);
|
command.env("WINEPREFIX", &config.game.wine.prefix);
|
||||||
|
|
||||||
// Add DXVK_ASYNC=1 for dxvk-async builds automatically
|
// Add DXVK_ASYNC=1 for dxvk-async builds automatically
|
||||||
if let Some(dxvk) = &config.game.dxvk.selected {
|
if let Ok(Some(dxvk)) = &config.try_get_selected_dxvk_info() {
|
||||||
if dxvk.contains("async") {
|
if dxvk.version.contains("async") {
|
||||||
command.env("DXVK_ASYNC", "1");
|
command.env("DXVK_ASYNC", "1");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,6 +263,10 @@ impl App {
|
||||||
installer.temp_folder = temp_folder;
|
installer.temp_folder = temp_folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
installer.downloader
|
||||||
|
.set_downloading_speed(config.launcher.speed_limit)
|
||||||
|
.expect("Failed to set downloading speed limit");
|
||||||
|
|
||||||
// Download wine
|
// Download wine
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
installer.install(&config.game.wine.builds, move |state| {
|
installer.install(&config.game.wine.builds, move |state| {
|
||||||
|
@ -317,6 +321,10 @@ impl App {
|
||||||
if let Some(temp_folder) = config.launcher.temp {
|
if let Some(temp_folder) = config.launcher.temp {
|
||||||
installer.temp_folder = temp_folder;
|
installer.temp_folder = temp_folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
installer.downloader
|
||||||
|
.set_downloading_speed(config.launcher.speed_limit)
|
||||||
|
.expect("Failed to set downloading speed limit");
|
||||||
|
|
||||||
// Download DXVK
|
// Download DXVK
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
|
@ -358,7 +366,7 @@ impl App {
|
||||||
},
|
},
|
||||||
|
|
||||||
ProgressUpdateResult::Finished => {
|
ProgressUpdateResult::Finished => {
|
||||||
let mut config = config::get().unwrap();
|
let config = config::get().unwrap();
|
||||||
|
|
||||||
// Apply DXVK
|
// Apply DXVK
|
||||||
let this = this.clone();
|
let this = this.clone();
|
||||||
|
@ -368,12 +376,7 @@ impl App {
|
||||||
match dxvk_version.apply(&config.game.dxvk.builds, &config.game.wine.prefix) {
|
match dxvk_version.apply(&config.game.dxvk.builds, &config.game.wine.prefix) {
|
||||||
Ok(output) => {
|
Ok(output) => {
|
||||||
println!("Applied DXVK:\n\n{}", String::from_utf8_lossy(&output.stdout));
|
println!("Applied DXVK:\n\n{}", String::from_utf8_lossy(&output.stdout));
|
||||||
|
|
||||||
// Update dxvk config
|
|
||||||
config.game.dxvk.selected = Some(dxvk_version.name.clone());
|
|
||||||
|
|
||||||
config::update_raw(config.clone()).unwrap();
|
|
||||||
|
|
||||||
// Remove .first-run file
|
// Remove .first-run file
|
||||||
let launcher_dir = crate::lib::consts::launcher_dir().unwrap();
|
let launcher_dir = crate::lib::consts::launcher_dir().unwrap();
|
||||||
|
|
||||||
|
|
|
@ -435,6 +435,10 @@ impl App {
|
||||||
installer.temp_folder = temp_folder;
|
installer.temp_folder = temp_folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
installer.downloader
|
||||||
|
.set_downloading_speed(config.launcher.speed_limit)
|
||||||
|
.expect("Failed to set downloading speed limit");
|
||||||
|
|
||||||
let (sender, receiver) = glib::MainContext::channel::<InstallerUpdate>(glib::PRIORITY_DEFAULT);
|
let (sender, receiver) = glib::MainContext::channel::<InstallerUpdate>(glib::PRIORITY_DEFAULT);
|
||||||
let this = this.clone();
|
let this = this.clone();
|
||||||
|
|
||||||
|
|
|
@ -439,16 +439,21 @@ impl App {
|
||||||
Actions::UpdateDxvkComboRow => {
|
Actions::UpdateDxvkComboRow => {
|
||||||
let model = gtk::StringList::new(&[]);
|
let model = gtk::StringList::new(&[]);
|
||||||
|
|
||||||
let list = dxvk::List::list_downloaded(config.game.dxvk.builds)
|
let list = dxvk::List::list_downloaded(&config.game.dxvk.builds)
|
||||||
.expect("Failed to list downloaded DXVK versions");
|
.expect("Failed to list downloaded DXVK versions");
|
||||||
|
|
||||||
let mut raw_list = Vec::new();
|
let mut raw_list = Vec::new();
|
||||||
let mut selected = 0;
|
let mut selected = 0;
|
||||||
|
|
||||||
|
let curr = match config.try_get_selected_dxvk_info() {
|
||||||
|
Ok(Some(curr)) => Some(curr.name),
|
||||||
|
_ => None
|
||||||
|
};
|
||||||
|
|
||||||
for version in list {
|
for version in list {
|
||||||
model.append(&version.name);
|
model.append(&version.name);
|
||||||
|
|
||||||
if let Some(curr) = &config.game.dxvk.selected {
|
if let Some(curr) = &curr {
|
||||||
if &version.name == curr {
|
if &version.name == curr {
|
||||||
selected = raw_list.len() as u32;
|
selected = raw_list.len() as u32;
|
||||||
}
|
}
|
||||||
|
@ -480,9 +485,16 @@ impl App {
|
||||||
|
|
||||||
if let Some(dxvk_versions) = &values.downloaded_dxvk_versions {
|
if let Some(dxvk_versions) = &values.downloaded_dxvk_versions {
|
||||||
let version = dxvk_versions[*i].clone();
|
let version = dxvk_versions[*i].clone();
|
||||||
|
let mut apply = true;
|
||||||
|
|
||||||
if config.game.dxvk.selected != Some(version.name.clone()) {
|
if let Ok(Some(curr)) = config.try_get_selected_dxvk_info() {
|
||||||
config.game.dxvk.selected = Some(version.name.clone());
|
if version == curr {
|
||||||
|
apply = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if apply {
|
||||||
|
this.widgets.dxvk_selected.set_sensitive(false);
|
||||||
|
|
||||||
std::thread::spawn(clone!(@strong config, @strong this => move || {
|
std::thread::spawn(clone!(@strong config, @strong this => move || {
|
||||||
match version.apply(&config.game.dxvk.builds, &config.game.wine.prefix) {
|
match version.apply(&config.game.dxvk.builds, &config.game.wine.prefix) {
|
||||||
|
@ -493,6 +505,8 @@ impl App {
|
||||||
)))).unwrap();
|
)))).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.widgets.dxvk_selected.set_sensitive(true);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,13 +78,18 @@ pub trait DownloadComponent {
|
||||||
});
|
});
|
||||||
|
|
||||||
let (send, recv) = std::sync::mpsc::channel();
|
let (send, recv) = std::sync::mpsc::channel();
|
||||||
|
let config = config::get()?;
|
||||||
|
|
||||||
let mut installer = Installer::new(self.get_download_uri())?;
|
let mut installer = Installer::new(self.get_download_uri())?;
|
||||||
|
|
||||||
if let Some(temp_folder) = config::get()?.launcher.temp {
|
if let Some(temp_folder) = config.launcher.temp {
|
||||||
installer.temp_folder = temp_folder;
|
installer.temp_folder = temp_folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
installer.downloader
|
||||||
|
.set_downloading_speed(config.launcher.speed_limit)
|
||||||
|
.expect("Failed to set downloading speed limit");
|
||||||
|
|
||||||
let installation_path = installation_path.to_string();
|
let installation_path = installation_path.to_string();
|
||||||
|
|
||||||
send.send(installer).unwrap();
|
send.send(installer).unwrap();
|
||||||
|
|
Loading…
Add table
Reference in a new issue