mirror of
https://github.com/redstrate/Physis.git
synced 2025-04-24 21:37:46 +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",
|
"paste",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"sha1_smol",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -603,6 +604,12 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sha1_smol"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.99"
|
version = "1.0.99"
|
||||||
|
|
|
@ -44,3 +44,6 @@ hard-xml = "1.13.0"
|
||||||
# needed for textools skel parsing
|
# needed for textools skel parsing
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
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::ffi::CString;
|
||||||
|
use std::fs::read;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use binrw::binread;
|
use binrw::binrw;
|
||||||
use crate::gamedata::MemoryBuffer;
|
use crate::gamedata::MemoryBuffer;
|
||||||
use binrw::BinRead;
|
use binrw::BinRead;
|
||||||
|
|
||||||
#[binread]
|
#[binrw]
|
||||||
#[br(magic = b"FileInfo")]
|
#[brw(magic = b"FileInfo")]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct FileInfo {
|
pub struct FileInfo {
|
||||||
#[br(pad_before = 20)]
|
#[brw(pad_before = 16)]
|
||||||
|
#[br(ignore)]
|
||||||
|
#[bw(calc = 1024)]
|
||||||
|
unknown : i32,
|
||||||
|
|
||||||
#[br(temp)]
|
#[br(temp)]
|
||||||
|
#[bw(calc = (entries.len() * 96) as i32)]
|
||||||
entries_size : i32,
|
entries_size : i32,
|
||||||
|
|
||||||
#[br(pad_before = 992)]
|
#[brw(pad_before = 992)]
|
||||||
#[br(count = entries_size / 96)]
|
#[br(count = entries_size / 96)]
|
||||||
entries : Vec<FIINEntry>
|
entries : Vec<FIINEntry>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binread]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct FIINEntry {
|
pub struct FIINEntry {
|
||||||
file_size : i32,
|
file_size : i32,
|
||||||
|
|
||||||
#[br(pad_before = 4)]
|
#[brw(pad_before = 4)]
|
||||||
#[br(count = 64)]
|
#[br(count = 64)]
|
||||||
#[br(map = | x: Vec < u8 > | String::from_utf8(x).unwrap())]
|
#[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,
|
file_name: String,
|
||||||
|
|
||||||
#[br(count = 24)]
|
#[br(count = 24)]
|
||||||
|
#[bw(pad_size_to = 24)]
|
||||||
sha1 : Vec<u8>
|
sha1 : Vec<u8>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,4 +45,22 @@ impl FileInfo {
|
||||||
let mut cursor = Cursor::new(buffer);
|
let mut cursor = Cursor::new(buffer);
|
||||||
Some(FileInfo::read(&mut cursor).ok()?)
|
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