mirror of
https://github.com/redstrate/Physis.git
synced 2025-04-24 13:37:44 +00:00
Enable support for writing the file info format
This is the first step in enabling write support for a format! I wanted to see how binwrite works with one of the game's simplest formats.
This commit is contained in:
parent
5b7cf1d6a3
commit
3bd6fbf9c3
3 changed files with 45 additions and 8 deletions
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -443,6 +443,7 @@ dependencies = [
|
|||
"paste",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha1_smol",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -603,6 +604,12 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha1_smol"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.99"
|
||||
|
|
|
@ -44,3 +44,6 @@ hard-xml = "1.13.0"
|
|||
# needed for textools skel parsing
|
||||
serde_json = "1.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
|
||||
# needed for file info (fiin)
|
||||
sha1_smol = "1.0.0"
|
41
src/fiin.rs
41
src/fiin.rs
|
@ -1,33 +1,42 @@
|
|||
use std::ffi::CString;
|
||||
use std::fs::read;
|
||||
use std::io::Cursor;
|
||||
use binrw::binread;
|
||||
use binrw::binrw;
|
||||
use crate::gamedata::MemoryBuffer;
|
||||
use binrw::BinRead;
|
||||
|
||||
#[binread]
|
||||
#[br(magic = b"FileInfo")]
|
||||
#[binrw]
|
||||
#[brw(magic = b"FileInfo")]
|
||||
#[derive(Debug)]
|
||||
pub struct FileInfo {
|
||||
#[br(pad_before = 20)]
|
||||
#[brw(pad_before = 16)]
|
||||
#[br(ignore)]
|
||||
#[bw(calc = 1024)]
|
||||
unknown : i32,
|
||||
|
||||
#[br(temp)]
|
||||
#[bw(calc = (entries.len() * 96) as i32)]
|
||||
entries_size : i32,
|
||||
|
||||
#[br(pad_before = 992)]
|
||||
#[brw(pad_before = 992)]
|
||||
#[br(count = entries_size / 96)]
|
||||
entries : Vec<FIINEntry>
|
||||
}
|
||||
|
||||
#[binread]
|
||||
#[binrw]
|
||||
#[derive(Debug)]
|
||||
pub struct FIINEntry {
|
||||
file_size : i32,
|
||||
|
||||
#[br(pad_before = 4)]
|
||||
#[brw(pad_before = 4)]
|
||||
#[br(count = 64)]
|
||||
#[br(map = | x: Vec < u8 > | String::from_utf8(x).unwrap())]
|
||||
#[bw(map = | x : &String | x.as_bytes().to_vec())]
|
||||
#[bw(pad_size_to = 64)]
|
||||
file_name: String,
|
||||
|
||||
#[br(count = 24)]
|
||||
#[bw(pad_size_to = 24)]
|
||||
sha1 : Vec<u8>
|
||||
}
|
||||
|
||||
|
@ -36,4 +45,22 @@ impl FileInfo {
|
|||
let mut cursor = Cursor::new(buffer);
|
||||
Some(FileInfo::read(&mut cursor).ok()?)
|
||||
}
|
||||
|
||||
pub fn new(file_names : Vec<&str>) -> Option<FileInfo> {
|
||||
let mut entries = vec![];
|
||||
|
||||
for name in file_names {
|
||||
let file = &read(&name).expect("Cannot read file.");
|
||||
|
||||
entries.push(FIINEntry {
|
||||
file_size: file.len() as i32,
|
||||
file_name: name.to_string(),
|
||||
sha1: sha1_smol::Sha1::from(file).digest().bytes().to_vec()
|
||||
});
|
||||
}
|
||||
|
||||
Some(FileInfo {
|
||||
entries
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue