From b43efe1abd36ccfe07669401b9cf23ceb1853477 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Tue, 29 Aug 2023 21:39:07 +0300 Subject: [PATCH] successful attempt to decode sgd. Realized, that I need to implement some stream reading --- format.txt | 2 +- src/fot/world.rs | 40 ++++++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 9 deletions(-) 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(()) }