2024-04-29 19:09:58 -04:00
|
|
|
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
2024-05-18 09:42:07 -04:00
|
|
|
use physis::common::Platform;
|
|
|
|
use physis::gamedata::GameData;
|
2024-04-29 19:09:58 -04:00
|
|
|
use std::env;
|
|
|
|
use std::fs::File;
|
|
|
|
use std::io::Write;
|
|
|
|
|
|
|
|
/// A simple program that allows a user to extract raw files from the game
|
|
|
|
fn main() {
|
|
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
if args.len() != 4 {
|
|
|
|
println!("Usage: extractor [game dir] [filepath_to_extract] [destination]");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Collect our arguments
|
|
|
|
let game_dir = &args[1];
|
|
|
|
let file_path = &args[2];
|
|
|
|
let destination_path = &args[3];
|
|
|
|
|
|
|
|
/// Create a GameData struct, this manages the repositories. It allows us to easily extract files.
|
|
|
|
let Some(mut game_data) = GameData::from_existing(Platform::Win32, game_dir) else {
|
|
|
|
println!("Invalid game directory ({})!", game_dir);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Extract said file:
|
|
|
|
let Some(game_file) = game_data.extract(file_path) else {
|
|
|
|
println!("File {} not found!", file_path);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Create the file to write into.
|
|
|
|
let Ok(mut file) = File::create(destination_path) else {
|
|
|
|
println!("Failed to open file {} for writing.", destination_path);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Since GameData::extract returns a byte buffer, it's trivial to write that to a file on disk.
|
2025-03-11 16:25:59 -04:00
|
|
|
if file.write_all(&game_file).is_err() {
|
2024-04-29 19:09:58 -04:00
|
|
|
println!("Failed to write to file {}.", destination_path);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
2024-05-18 09:42:07 -04:00
|
|
|
println!(
|
|
|
|
"Successfully extracted {} to {}!",
|
|
|
|
file_path, destination_path
|
|
|
|
);
|
|
|
|
}
|