jmrenamer: Add "unclear" mode
This will allow transparent switching between clear names and .DAT names.
This commit is contained in:
parent
94823a21e3
commit
7e97ccaf48
|
@ -4,4 +4,5 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
clap = { version = "4.3.8", features = ["derive"] }
|
||||||
jmmt = { path = "../jmmt" }
|
jmmt = { path = "../jmmt" }
|
||||||
|
|
|
@ -6,16 +6,27 @@ use jmmt::hash::filename::*;
|
||||||
use jmmt::read::package_toc::read_package_toc;
|
use jmmt::read::package_toc::read_package_toc;
|
||||||
use std::{fs, path::Path};
|
use std::{fs, path::Path};
|
||||||
|
|
||||||
// TODO: A mode that will re-name everything back? This wouldn't be too hard to implement
|
use clap::{Subcommand, Parser};
|
||||||
|
|
||||||
fn main() {
|
|
||||||
// A relatively simple idiot-check. Later on utilities might have a shared library
|
#[derive(Parser)]
|
||||||
// of code which validates game root stuff and can open it up/etc.
|
#[command(author, version, about, long_about = None)]
|
||||||
if !Path::new("DATA").is_dir() {
|
#[command(propagate_version = true)]
|
||||||
println!("This program should be run in the root of an extracted copy.");
|
struct Cli {
|
||||||
return ();
|
#[command(subcommand)]
|
||||||
|
command: Commands,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Subcommand)]
|
||||||
|
enum Commands {
|
||||||
|
/// Rename the files in the DATA directory to the original filenames.
|
||||||
|
Clear,
|
||||||
|
|
||||||
|
/// Rename the files to the .DAT filenames that the game expects.
|
||||||
|
Unclear,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_clear() {
|
||||||
let package_toc_filename = format!("DATA/{}", dat_filename("package.toc"));
|
let package_toc_filename = format!("DATA/{}", dat_filename("package.toc"));
|
||||||
|
|
||||||
match read_package_toc(Path::new(package_toc_filename.as_str()).to_path_buf()) {
|
match read_package_toc(Path::new(package_toc_filename.as_str()).to_path_buf()) {
|
||||||
|
@ -42,7 +53,7 @@ fn main() {
|
||||||
return ();
|
return ();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
println!("moved {} -> {}", src_path.display(), dest_path.display());
|
println!("Clearnamed {} -> {}", src_path.display(), dest_path.display());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,3 +75,77 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn do_unclear() {
|
||||||
|
let package_toc_filename = String::from("DATA/package.toc");
|
||||||
|
|
||||||
|
match read_package_toc(Path::new(package_toc_filename.as_str()).to_path_buf()) {
|
||||||
|
Ok(toc) => {
|
||||||
|
for toc_entry in toc {
|
||||||
|
|
||||||
|
let dat_clearname = format!(
|
||||||
|
"DATA/{}",
|
||||||
|
toc_entry
|
||||||
|
.file_name()
|
||||||
|
.expect("How did invalid ASCII get here?")
|
||||||
|
);
|
||||||
|
let src_path = Path::new(dat_clearname.as_str());
|
||||||
|
|
||||||
|
|
||||||
|
let dat_dest = format!(
|
||||||
|
"DATA/{}",
|
||||||
|
dat_filename_from_hash(toc_entry.file_name_hash())
|
||||||
|
);
|
||||||
|
|
||||||
|
let dest_path = Path::new(dat_dest.as_str());
|
||||||
|
|
||||||
|
if src_path.exists() {
|
||||||
|
match fs::rename(src_path, dest_path) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(error) => {
|
||||||
|
println!("Error renaming {}: {}", src_path.display(), error);
|
||||||
|
return ();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
println!("Uncleared {} -> {}", src_path.display(), dest_path.display());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let package_toc_dat_filename = format!("DATA/{}", dat_filename("package.toc"));
|
||||||
|
match fs::rename(
|
||||||
|
Path::new("DATA/package.toc"),
|
||||||
|
Path::new(package_toc_dat_filename.as_str()),
|
||||||
|
) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(error) => {
|
||||||
|
println!("Error renaming TOC file: {}", error);
|
||||||
|
return ();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(error) => {
|
||||||
|
println!("Error reading package.toc file: {}", error);
|
||||||
|
return ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// A relatively simple idiot-check. Later on utilities might have a shared library
|
||||||
|
// of code which validates game root stuff and can open it up/etc.
|
||||||
|
if !Path::new("DATA").is_dir() {
|
||||||
|
println!("This program should be run in the root of an extracted copy.");
|
||||||
|
return ();
|
||||||
|
}
|
||||||
|
|
||||||
|
let cli = Cli::parse();
|
||||||
|
|
||||||
|
|
||||||
|
match &cli.command {
|
||||||
|
Commands::Clear =>
|
||||||
|
do_clear(),
|
||||||
|
Commands::Unclear =>
|
||||||
|
do_unclear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue