EntityList decoding and encoding fully implemented, working and tested
This commit is contained in:
parent
35ce0e9076
commit
43c3bd11f6
3 changed files with 17 additions and 21 deletions
|
|
@ -60,7 +60,10 @@ impl DecoderCtx<&mut EntityList, &EntityList> for Entity {
|
||||||
EntityEncoding::World => {
|
EntityEncoding::World => {
|
||||||
wd.write_u32(self.flags)?;
|
wd.write_u32(self.flags)?;
|
||||||
wd.write_u16(self.type_idx as u16)?;
|
wd.write_u16(self.type_idx as u16)?;
|
||||||
wd.write(self.esh.as_ref().unwrap())?;
|
match self.esh.as_ref() {
|
||||||
|
Some(esh) => wd.write(esh)?,
|
||||||
|
None => ()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(wd.into_raw(0, 0))
|
Ok(wd.into_raw(0, 0))
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ impl DecoderCtx<EntityEncoding,EntityEncoding> for EntityList {
|
||||||
wd.write(type_name)?;
|
wd.write(type_name)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
wd.write_u16(self.entities.len() as u16)?;
|
wd.write_u16((self.entities.len() + 1) as u16)?;
|
||||||
wd.write_u32(self.unk1)?;
|
wd.write_u32(self.unk1)?;
|
||||||
for ent in self.entities.iter() {
|
for ent in self.entities.iter() {
|
||||||
wd.write_opt(ent, &self)?;
|
wd.write_opt(ent, &self)?;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use super::decoder::Decoder;
|
use super::decoder::{Decoder, DecoderCtx};
|
||||||
use super::fstring::FString;
|
use super::fstring::FString;
|
||||||
use super::entitylist::{EntityList, EntityEncoding};
|
use super::entitylist::{EntityList, EntityEncoding};
|
||||||
use super::raw::Raw;
|
use super::raw::Raw;
|
||||||
|
|
@ -13,6 +13,8 @@ use deflate::deflate_bytes_zlib;
|
||||||
use inflate::inflate_bytes_zlib;
|
use inflate::inflate_bytes_zlib;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
pub struct World {
|
pub struct World {
|
||||||
pub tag: Tag,
|
pub tag: Tag,
|
||||||
pub uncompressed_size: u32,
|
pub uncompressed_size: u32,
|
||||||
|
|
@ -31,25 +33,16 @@ impl World {
|
||||||
const WORLD_HDR_LEN: usize = 0x13;
|
const WORLD_HDR_LEN: usize = 0x13;
|
||||||
|
|
||||||
pub fn test(&self) -> Result<()> {
|
pub fn test(&self) -> Result<()> {
|
||||||
for i in 0..self.ents.entities.len() {
|
let entfile_start: usize = 0x1038;
|
||||||
let ent = &self.ents.entities[i];
|
let raw1 = Raw {
|
||||||
let idx = i+1;
|
offset: 0,
|
||||||
|
size: self.ents.get_enc_size(),
|
||||||
let type_name = match ent.type_idx {
|
mem: self.data.mem[entfile_start..entfile_start+self.ents.get_enc_size()].to_vec()
|
||||||
0xFFFF => "<NO ESH>",
|
|
||||||
_ => self.ents.get_type_name(ent.type_idx).str.as_str()
|
|
||||||
};
|
};
|
||||||
println!("idx {} type {}", idx, type_name);
|
raw1.dump(Path::new("entfile1.bin"))?;
|
||||||
|
|
||||||
match ent.esh.as_ref() {
|
let raw2 = self.ents.encode(EntityEncoding::World)?;
|
||||||
Some(esh) => {
|
raw2.dump(Path::new("entfile2.bin"))?;
|
||||||
for (name, value) in esh.props.iter() {
|
|
||||||
println!("\t{} {}", &name, &value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue