diff --git a/format.txt b/format.txt index aba0c00..21d4207 100644 --- a/format.txt +++ b/format.txt @@ -33,8 +33,8 @@ next zar = + 0x1A + unk5 uint8_t unk1[0x48] uint32_t N - num strings FString[N] + uint32_t ? N times - uint32_t ? uint32_t M - num strings FString[M] diff --git a/src/fot/world.rs b/src/fot/world.rs index 5804e72..c363173 100644 --- a/src/fot/world.rs +++ b/src/fot/world.rs @@ -24,15 +24,39 @@ impl World { const WORLD_HDR_LEN: usize = 0x13; pub fn test(&self) -> Result<()> { - let mut a = FString::decode(&self.data, 0xA2, 0)?; - dbg!(&a); + let sgd_start: usize = 0x4E; + let mut cur = sgd_start; + cur += Tag::decode(&self.data, sgd_start, 0)?.get_enc_size(); + cur += 0x48; + + let mut rdr = Cursor::new(&self.data.mem[..]); + rdr.set_position(cur as u64); + let N = rdr.read_u32::()?; + + let mut names: Vec = Vec::new(); + cur += 4; + for _ in 0..N { + let name = FString::decode(&self.data, cur, 0)?; + cur += name.get_enc_size(); + names.push(name); + } + //dbg!(names); - a.encoding = FStringEncoding::ANSI; - let b = a.encode()?; - dbg!(&b); - - let c = FString::decode(&b, 0, 0)?; - dbg!(&c); + let unk1 = rdr.read_u32::()?; + cur += 4; + for _ in 0..N { + rdr.set_position(cur as u64); + let M = rdr.read_u32::()?; + cur += 4; + dbg!(M, cur); + let mut strings: Vec = Vec::new(); + for _ in 0..M { + let str = FString::decode(&self.data, cur, 0)?; + cur += str.get_enc_size(); + strings.push(str); + } + dbg!(strings); + } Ok(()) }