Skip to content

Commit 6844067

Browse files
committed
support longer Art.dat headers for modded games
1 parent c9599cd commit 6844067

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/command/pack.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,17 @@ fn pack_dat(art_key: &String, input: &PathBuf, output: &PathBuf) -> anyhow::Resu
9292
let header = haxeformat::to_string(&assets)?;
9393
let mut header = header.into_bytes();
9494
let mut out = Vec::new();
95-
out.extend_from_slice((header.len() as u16).to_le_bytes().as_ref());
95+
let header_len = header.len() as i32;
96+
if header_len > i16::MAX as i32 {
97+
println!("!!! Header length {header_len} exceeds 2^15-1. This assets file will only work with a modded game !!!");
98+
let len_one = (header_len & 0xFFFF) as u16;
99+
// set sign bit to 1 as a marker for the modded readInt16 to read 4 bytes instead of 2
100+
let len_two = ((header_len >> 16) as u16) | 0x8000;
101+
out.extend_from_slice(len_two.to_le_bytes().as_ref());
102+
out.extend_from_slice(len_one.to_le_bytes().as_ref());
103+
} else {
104+
out.extend_from_slice((header.len() as u16).to_le_bytes().as_ref());
105+
}
96106
out.append(&mut header);
97107
out.append(&mut asset_bytes);
98108

0 commit comments

Comments
 (0)