diff --git a/src/fot/stream.rs b/src/fot/stream.rs index 09cf6c9..9336fb7 100644 --- a/src/fot/stream.rs +++ b/src/fot/stream.rs @@ -10,11 +10,10 @@ pub struct ReadStream<'a> { } impl<'a> ReadStream<'a> { - pub fn new(raw: &Raw, offset: usize) -> ReadStream { - ReadStream { - raw: raw, - rdr: Cursor::new(&raw.mem[offset..]), - } + pub fn new(raw: &Raw, start: usize) -> ReadStream { + let mut rdr = Cursor::new(&raw.mem[..]); + rdr.set_position(start as u64); + ReadStream { raw: raw, rdr: rdr } } pub fn offset(&self) -> usize { diff --git a/src/fot/world.rs b/src/fot/world.rs index 5fba7b0..71c1395 100644 --- a/src/fot/world.rs +++ b/src/fot/world.rs @@ -1,6 +1,7 @@ use super::decoder::Decoder; use super::fstring::FString; use super::raw::Raw; +use super::stream::ReadStream; use super::tag::Tag; use anyhow::anyhow; use anyhow::Result; @@ -23,37 +24,27 @@ impl World { pub fn test(&self) -> Result<()> { 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 sgd = ReadStream::new(&self.data, sgd_start); + let _ = sgd.read::(0)?; + sgd.skip(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); + let n = sgd.read_u32()?; + dbg!(sgd.offset(), n); + let mut names: Vec = Vec::with_capacity(n as usize); + for _ in 0..n { + names.push(sgd.read::(0)?); } dbg!(names); - 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); + let unk1 = sgd.read_u32()?; + dbg!(unk1); + for _ in 0..n { + let m = sgd.read_u32()?; + let mut replics: Vec = Vec::with_capacity(m as usize); + for _ in 0..m { + replics.push(sgd.read::(0)?); } - dbg!(strings); + dbg!(replics); } Ok(())