use itertools::Itertools;
use std::io::{stdin, Write};
use std::path::PathBuf;
use std::str::FromStr;
use std::{env, io};
use std::time::Instant;
use rpkg_rs::misc::hash_path_list::PathList;
use rpkg_rs::misc::resource_id::ResourceID;
use rpkg_rs::resource::partition_manager::{PartitionManager, PartitionManagerPar, PartitionState};
use rpkg_rs::resource::pdefs::{GamePaths, PackageDefinitionSource};
use rpkg_rs::resource::resource_info::ResourceInfo;
use rpkg_rs::resource::resource_partition::PatchId;
use rpkg_rs::resource::runtime_resource_id::RuntimeResourceID;
use rpkg_rs::WoaVersion;
fn main() {
let start = Instant::now();
let mut path_list = PathList::new();
let _ = path_list.parse_into("/media/dafitius/980 PRO/HitmanProjects/Tools/rpkgtools2.33/hash_list.txt").unwrap();
let retail_path = PathBuf::from("/media/dafitius/980 PRO/SteamLibrary/steamapps/common/HITMAN 3/Retail/");
let game_version = WoaVersion::HM3;
let game_paths = GamePaths::from_retail_directory(retail_path.clone()).unwrap_or_else(|e| {
eprintln!("failed to discover game paths: {}", e);
std::process::exit(0);
});
let package_definition_source =
PackageDefinitionSource::from_file(game_paths.package_definition_path, game_version)
.unwrap_or_else(|e| {
eprintln!("failed to parse package definition: {}", e);
std::process::exit(0);
});
let mut partition_infos = package_definition_source.read().unwrap_or_else(|e| {
eprintln!("failed to read package definition: {}", e);
std::process::exit(0);
});
for partition in partition_infos.iter_mut() {
partition.set_max_patch_level(9);
}
let mut package_manager =
PartitionManager::new(game_paths.runtime_path, &package_definition_source).unwrap_or_else(
|e| {
eprintln!("failed to init package manager: {}", e);
std::process::exit(0);
},
);
let mut last_index = 0;
let mut progress = 0.0;
let progress_callback = |current, state: &PartitionState| {
if current != last_index {
last_index = current;
}
if !state.installing && !state.mounted {
println!("[Failed to mount this partition. Is it installed?]");
}
let install_progress = (state.install_progress * 10.0).ceil() / 10.0;
let chars_to_add = (install_progress * 10.0 - progress * 10.0) as usize * 2;
let chars_to_add = std::cmp::min(chars_to_add, 20);
io::stdout().flush().unwrap();
progress = install_progress;
if progress == 1.0 {
progress = 0.0;
if state.mounted {
println!(" done :)");
} else {
println!(" failed :(");
}
}
};
package_manager
.mount_partitions_par(progress_callback)
.unwrap_or_else(|e| {
eprintln!("failed to mount partitions: {}", e);
std::process::exit(0);
});
for partition in package_manager.partitions.iter_mut() {
println!("{}", partition.partition_info().id)
}
println!("{}", start.elapsed().as_secs_f32());
}