1
Fork 0
mirror of https://github.com/redstrate/Physis.git synced 2025-04-20 11:47:46 +00:00
physis/examples/extractor.rs

52 lines
1.6 KiB
Rust
Raw Normal View History

2024-04-29 19:09:58 -04:00
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
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.
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;
};
println!(
"Successfully extracted {} to {}!",
file_path, destination_path
);
}