diff --git a/src/dat.rs b/src/dat.rs index 130b42a..c74ed66 100755 --- a/src/dat.rs +++ b/src/dat.rs @@ -1,7 +1,6 @@ use std::io::{Cursor, Read, Seek, SeekFrom}; use binrw::BinRead; use binrw::binrw; -use crate::compression::no_header_decompress; use crate::gamedata::MemoryBuffer; use crate::model::ModelHeader; use std::io::Write; diff --git a/src/exd.rs b/src/exd.rs index 4bd1bd8..ae15b98 100644 --- a/src/exd.rs +++ b/src/exd.rs @@ -1,5 +1,4 @@ -use std::collections::HashMap; -use std::io::{BufRead, BufReader, Cursor, Seek, SeekFrom}; +use std::io::{Cursor, Seek, SeekFrom}; use crate::gamedata::MemoryBuffer; use binrw::{binread, Endian, ReadOptions}; use crate::common::Language; diff --git a/src/exh.rs b/src/exh.rs index d2cbafc..66deac4 100644 --- a/src/exh.rs +++ b/src/exh.rs @@ -1,5 +1,4 @@ -use std::collections::HashMap; -use std::io::{BufRead, BufReader, Cursor}; +use std::io::Cursor; use crate::gamedata::MemoryBuffer; use binrw::binread; use crate::common::Language; diff --git a/src/gamedata.rs b/src/gamedata.rs index 6b042cd..7600a0b 100755 --- a/src/gamedata.rs +++ b/src/gamedata.rs @@ -1,4 +1,3 @@ -use std::ffi::OsStr; use std::fs; use std::fs::DirEntry; use std::path::PathBuf; @@ -21,7 +20,7 @@ pub struct GameData { } fn is_valid(path: &str) -> bool { - let mut d = PathBuf::from(path); + let d = PathBuf::from(path); if fs::metadata(d.as_path()).is_err() { println!("Failed game directory."); diff --git a/src/installer.rs b/src/installer.rs index 667f10d..9655cba 100644 --- a/src/installer.rs +++ b/src/installer.rs @@ -30,7 +30,9 @@ const BOOT_COMPONENT_FILES: [&str; 18] = [ const GAME_COMPONENT_FILES: [&str; 1] = ["ffxivgame.ver"]; #[repr(C)] -struct Unshield; +struct Unshield { + _private: [u8; 0] +} #[link(name = "unshield")] extern "C" { @@ -46,9 +48,8 @@ extern "C" { /// Installs the game from the provided retail installer. pub unsafe fn install_game(installer_path : &str, game_directory : &str) { - let installer_file = std::fs::read(installer_path).unwrap(); + let installer_file = fs::read(installer_path).unwrap(); - let mut file_size = installer_file.len(); let mut last_position = 0; let mut last_filename = ""; for filename in FILES_TO_EXTRACT { @@ -69,13 +70,10 @@ pub unsafe fn install_game(installer_path : &str, game_directory : &str) { } else { new_file.write(&installer_file[last_position + 33..position - 42]); } - - last_position = position; } last_position = position; last_filename = filename; - file_size -= (position + 4) - last_position; } let mut new_file = File::create(last_filename).unwrap(); @@ -85,32 +83,30 @@ pub unsafe fn install_game(installer_path : &str, game_directory : &str) { fs::create_dir_all(format!("{game_directory}/boot")); fs::create_dir_all(format!("{game_directory}/game")); - unsafe { - // set unshield to shut up - unshield_set_log_level(0); + // set unshield to shut up + unshield_set_log_level(0); - let unshield = unshield_open(b"data1.cab".as_ptr() as *const c_char); - let file_count = unshield_file_count(unshield); + let unshield = unshield_open(b"data1.cab".as_ptr() as *const c_char); + let file_count = unshield_file_count(unshield); - for i in 0..file_count { - let filename = CStr::from_ptr(unshield_file_name(unshield, i)).to_string_lossy(); + for i in 0..file_count { + let filename = CStr::from_ptr(unshield_file_name(unshield, i)).to_string_lossy(); - for boot_name in BOOT_COMPONENT_FILES { - if boot_name == filename { - let save_filename = format!("{game_directory}/boot/{boot_name}"); - unshield_file_save(unshield, i, CString::new(save_filename).unwrap().as_ptr()); - } - } - - for game_name in GAME_COMPONENT_FILES { - if game_name == filename { - let save_filename = format!("{game_directory}/game/{game_name}"); - unshield_file_save(unshield, i, CString::new(save_filename).unwrap().as_ptr()); - } + for boot_name in BOOT_COMPONENT_FILES { + if boot_name == filename { + let save_filename = format!("{game_directory}/boot/{boot_name}"); + unshield_file_save(unshield, i, CString::new(save_filename).unwrap().as_ptr()); } } - unshield_close(unshield); + for game_name in GAME_COMPONENT_FILES { + if game_name == filename { + let save_filename = format!("{game_directory}/game/{game_name}"); + unshield_file_save(unshield, i, CString::new(save_filename).unwrap().as_ptr()); + } + } } + + unshield_close(unshield); } diff --git a/src/lib.rs b/src/lib.rs index 9cfbb70..d883bfc 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,5 @@ extern crate core; -use std::fs; -use std::path::PathBuf; -use crate::bootdata::BootData; -use crate::gamedata::GameData; - pub mod gamedata; /// Reading game data repositories, such as "ffxiv" and "ex1", and so on. diff --git a/src/patch.rs b/src/patch.rs index 02ed32e..a79453a 100755 --- a/src/patch.rs +++ b/src/patch.rs @@ -1,10 +1,9 @@ use std::fs; use std::fs::{File, OpenOptions}; -use std::io::{Cursor, Seek, SeekFrom, Write}; +use std::io::{Seek, SeekFrom, Write}; use binrw::BinRead; use binrw::binread; -use crate::{BootData, GameData}; -use crate::sqpack::{read_data_block, read_data_block_patch}; +use crate::sqpack::read_data_block_patch; use core::cmp::min; use crate::patch::TargetHeaderKind::Version; @@ -304,7 +303,7 @@ fn get_expansion_folder(sub_id : u16) -> String { match expansion_id { 0 => "ffxiv".to_string(), - (x) => format!("ex{}", x) + x => format!("ex{}", x) } } @@ -338,7 +337,7 @@ pub fn process_patch(data_dir : &str, path : &str) { SqpkOperation::AddData(add) => { let filename = get_dat_filename(data_dir, add.main_id, add.sub_id, add.file_id); - let (left, right) = filename.rsplit_once('/').unwrap(); + let (left, _) = filename.rsplit_once('/').unwrap(); fs::create_dir_all(left); let mut new_file = OpenOptions::new() @@ -365,7 +364,7 @@ pub fn process_patch(data_dir : &str, path : &str) { SqpkOperation::ExpandData(expand) => { let filename = get_dat_filename(data_dir, expand.main_id, expand.sub_id, expand.file_id); - let (left, right) = filename.rsplit_once('/').unwrap(); + let (left, _) = filename.rsplit_once('/').unwrap(); fs::create_dir_all(left); let mut new_file = OpenOptions::new() @@ -376,7 +375,7 @@ pub fn process_patch(data_dir : &str, path : &str) { write_empty_file_block_at(&mut new_file, expand.block_offset, expand.block_number); } SqpkOperation::HeaderUpdate(header) => { - let mut file_path : String; + let file_path : String; match header.file_kind { TargetFileKind::Dat => { @@ -387,7 +386,7 @@ pub fn process_patch(data_dir : &str, path : &str) { } } - let (left, right) = file_path.rsplit_once('/').unwrap(); + let (left, _) = file_path.rsplit_once('/').unwrap(); fs::create_dir_all(left); let mut new_file = OpenOptions::new() @@ -406,7 +405,7 @@ pub fn process_patch(data_dir : &str, path : &str) { SqpkFileOperation::AddFile => { let new_path = data_dir.to_owned() + "/" + &fop.path; - let (left, right) = new_path.rsplit_once('/').unwrap(); + let (left, _) = new_path.rsplit_once('/').unwrap(); fs::create_dir_all(left); @@ -439,9 +438,6 @@ pub fn process_patch(data_dir : &str, path : &str) { SqpkFileOperation::RemoveAll => { println!("STUB: SqpkFileOperation::RemoveAll"); } - _ => { - panic!("Unhandled operation!"); - } } } _ => {} diff --git a/src/sqpack.rs b/src/sqpack.rs index 1f12a3b..38ba1bb 100755 --- a/src/sqpack.rs +++ b/src/sqpack.rs @@ -65,7 +65,7 @@ pub fn read_data_block_patch(mut buf : T) -> Option> { Some(decompressed_data) } CompressionMode::Uncompressed { file_size } => { - let new_file_size : usize = ((file_size as usize + 143) & 0xFFFFFF80); + let new_file_size : usize = (file_size as usize + 143) & 0xFFFFFF80; let mut local_data: Vec = vec![0; file_size as usize]; buf.read_exact(&mut local_data).ok()?;