diff --git a/src/durandal/fixed.rs b/src/durandal/fixed.rs index 8f29a8f..ea69373 100644 --- a/src/durandal/fixed.rs +++ b/src/durandal/fixed.rs @@ -8,7 +8,7 @@ macro_rules! define_fixed_type { ( $Type:ident : $IT:ident, $UT:ident, $LT:ident, $FracBits:expr ) => { - #[derive(Serialize)] + #[derive(Clone, PartialEq, Serialize)] pub struct $Type($IT); impl $Type @@ -27,7 +27,7 @@ macro_rules! define_fixed_type { self.0 = bits as $IT } - pub fn from_bits(bits: $UT) -> Self + pub const fn from_bits(bits: $UT) -> Self { $Type(bits as $IT) } diff --git a/src/main.rs b/src/main.rs index d3f76fb..d1ae5a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,10 +41,7 @@ fn dump_chunk(opt: &Options, cid: Ident, cnk: &[u8], eid: u16) -> ResultS<()> { if opt.wad_all { make_chunk(opt, cid, cnk, eid)?; - return Ok(()); - } - - if opt.wad_chunks.contains(&cid) { + } else if opt.wad_chunks.contains(&cid) { match &cid { b"PICT" => { let im = pict::load_pict(cnk)?; @@ -59,9 +56,7 @@ fn dump_chunk(opt: &Options, cid: Ident, cnk: &[u8], eid: u16) -> ResultS<()> b"term" => make_yaml(opt, &rd_array(cnk, trm::read_term)?)?, _ => (), } - } - - if opt.wad_unknown { + } else if opt.wad_unknown { make_chunk(opt, cid, cnk, eid)?; } diff --git a/src/marathon/map.rs b/src/marathon/map.rs index b82c83b..d6f5b54 100644 --- a/src/marathon/map.rs +++ b/src/marathon/map.rs @@ -154,11 +154,11 @@ pub fn read_poly(b: &[u8]) -> ResultS<(Polygon, usize)> media_l, sound, snd_amb, snd_rnd}, 128)) } -#[derive(Serialize)] +#[derive(Clone, PartialEq, Serialize)] pub struct Point { - x: Unit, - y: Unit, + pub x: Unit, + pub y: Unit, } #[derive(Debug, Serialize)] @@ -219,16 +219,16 @@ pub struct Polygon snd_rnd: ObjID, } -#[derive(Debug, Serialize)] +#[derive(Debug, PartialEq, Serialize)] pub struct Minf { - env_code: u16, - physi_id: u16, - music_id: u16, - msn_flag: MsnFlags, - env_flag: EnvFlags, - ent_flag: EntFlags, - levelnam: String, + pub env_code: u16, + pub physi_id: u16, + pub music_id: u16, + pub msn_flag: MsnFlags, + pub env_flag: EnvFlags, + pub ent_flag: EntFlags, + pub levelnam: String, } bitflags! { diff --git a/tests/epnt.in b/tests/epnt.in new file mode 100644 index 0000000..b74b19b Binary files /dev/null and b/tests/epnt.in differ diff --git a/tests/epnt.out b/tests/epnt.out new file mode 100644 index 0000000..7dabd23 --- /dev/null +++ b/tests/epnt.out @@ -0,0 +1,56 @@ +[ + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(4096)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(4096)}, + map::Point{x: Unit::from_bits(7168), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(7168), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(7168)}, + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(7168)}, + map::Point{x: Unit::from_bits(4096), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(4096), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(4608), y: Unit::from_bits(3072)}, + map::Point{x: Unit::from_bits(3072), y: Unit::from_bits(4608)}, + map::Point{x: Unit::from_bits(6656), y: Unit::from_bits(3072)}, + map::Point{x: Unit::from_bits(8192), y: Unit::from_bits(4608)}, + map::Point{x: Unit::from_bits(8192), y: Unit::from_bits(6656)}, + map::Point{x: Unit::from_bits(6656), y: Unit::from_bits(8192)}, + map::Point{x: Unit::from_bits(4608), y: Unit::from_bits(8192)}, + map::Point{x: Unit::from_bits(3072), y: Unit::from_bits(6656)}, + map::Point{x: Unit::from_bits(1536), y: Unit::from_bits(13312)}, + map::Point{x: Unit::from_bits(9728), y: Unit::from_bits(13312)}, + map::Point{x: Unit::from_bits(1536), y: Unit::from_bits(63488)}, + map::Point{x: Unit::from_bits(9728), y: Unit::from_bits(63488)}, + map::Point{x: Unit::from_bits(13312), y: Unit::from_bits(1536)}, + map::Point{x: Unit::from_bits(13312), y: Unit::from_bits(9728)}, + map::Point{x: Unit::from_bits(63488), y: Unit::from_bits(1536)}, + map::Point{x: Unit::from_bits(63488), y: Unit::from_bits(9728)}, + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(13312)}, + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(14336)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(13312)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(14336)}, + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(63488)}, + map::Point{x: Unit::from_bits(5120), y: Unit::from_bits(62464)}, + map::Point{x: Unit::from_bits(4096), y: Unit::from_bits(62464)}, + map::Point{x: Unit::from_bits(4096), y: Unit::from_bits(61440)}, + map::Point{x: Unit::from_bits(7168), y: Unit::from_bits(61440)}, + map::Point{x: Unit::from_bits(7168), y: Unit::from_bits(62464)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(62464)}, + map::Point{x: Unit::from_bits(6144), y: Unit::from_bits(63488)}, + map::Point{x: Unit::from_bits(13312), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(14336), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(14336), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(13312), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(63488), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(5120)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(4096)}, + map::Point{x: Unit::from_bits(61440), y: Unit::from_bits(4096)}, + map::Point{x: Unit::from_bits(61440), y: Unit::from_bits(7168)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(7168)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(63488), y: Unit::from_bits(6144)}, + map::Point{x: Unit::from_bits(61440), y: Unit::from_bits(7680)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(7680)}, + map::Point{x: Unit::from_bits(62464), y: Unit::from_bits(13312)}, + map::Point{x: Unit::from_bits(61440), y: Unit::from_bits(8704)}, + map::Point{x: Unit::from_bits(57344), y: Unit::from_bits(8704)}, + map::Point{x: Unit::from_bits(57344), y: Unit::from_bits(13312)} +] diff --git a/tests/epnt.rs b/tests/epnt.rs new file mode 100644 index 0000000..f37b1b4 --- /dev/null +++ b/tests/epnt.rs @@ -0,0 +1,12 @@ +use maraiah::{durandal::{bin, fixed::*}, marathon::map}; + +#[test] +fn read_epnt_must_process_this() +{ + assert_eq!(bin::rd_array(INPUT, map::read_epnt).unwrap(), OUTPUT.to_vec()); +} + +const INPUT: &'static [u8] = include_bytes!("epnt.in"); +const OUTPUT: [map::Point; 54] = include!("epnt.out"); + +// EOF diff --git a/tests/minf.in b/tests/minf.in new file mode 100644 index 0000000..e66ab63 Binary files /dev/null and b/tests/minf.in differ diff --git a/tests/minf.rs b/tests/minf.rs new file mode 100644 index 0000000..99e7968 --- /dev/null +++ b/tests/minf.rs @@ -0,0 +1,19 @@ +use maraiah::marathon::map; + +#[test] +fn read_minf_must_process_map0() +{ + assert_eq!(map::read_minf(INPUT).unwrap(), map::Minf{ + env_code: 0, + physi_id: 1, + music_id: 1, + msn_flag: map::MsnFlags::Repair, + env_flag: map::EnvFlags::empty(), + ent_flag: map::EntFlags::Solo | map::EntFlags::CoOp, + levelnam: "Waterloo Waterpark".to_string() + }); +} + +const INPUT: &'static [u8] = include_bytes!("minf.in"); + +// EOF