From fdb68ce0ff0719faeacd1890b60a469e8bbd215b Mon Sep 17 00:00:00 2001 From: Wesley Irvin Date: Mon, 31 Mar 2025 20:20:52 -0400 Subject: [PATCH] Sidedef Reader Added the ability to read sidedef lumps from the wadfile. --- src/lumps/lump.rs | 1 + src/lumps/mod.rs | 5 +++-- src/lumps/sidedef.rs | 19 ++++++++++++++++ src/tests/wad.rs | 46 ++++++++++++++++++++++++++++++++++++++ src/types/mod.rs | 2 ++ src/types/sidedef.rs | 9 ++++++++ src/wad/wadfile.rs | 1 + src/wad/wadfile/readers.rs | 34 ++++++++++++++++++++++++++-- 8 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 src/lumps/sidedef.rs create mode 100644 src/types/sidedef.rs diff --git a/src/lumps/lump.rs b/src/lumps/lump.rs index 35c047c..7a29688 100644 --- a/src/lumps/lump.rs +++ b/src/lumps/lump.rs @@ -11,4 +11,5 @@ pub enum LumpType { Unknown, Vertex, Linedef, + Sidedef, } diff --git a/src/lumps/mod.rs b/src/lumps/mod.rs index 86f4fba..67476bf 100644 --- a/src/lumps/mod.rs +++ b/src/lumps/mod.rs @@ -1,8 +1,9 @@ mod linedef; mod lump; +mod sidedef; mod vertex; pub use linedef::LinedefLump; -pub use lump::Lump; -pub use lump::LumpType; +pub use lump::{Lump, LumpType}; +pub use sidedef::SidedefLump; pub use vertex::VertexLump; diff --git a/src/lumps/sidedef.rs b/src/lumps/sidedef.rs new file mode 100644 index 0000000..5038053 --- /dev/null +++ b/src/lumps/sidedef.rs @@ -0,0 +1,19 @@ +use crate::types::Sidedef; + +pub struct SidedefLump { + pub sidedefs: Vec, +} + +impl SidedefLump { + pub fn get_num_sidedefs(&self) -> usize { + self.sidedefs.len() + } + + pub fn get_all_sidedefs(&self) -> Vec { + self.sidedefs.to_vec() + } + + pub fn get_sidedef(&self, pos: usize) -> Sidedef { + self.sidedefs[pos].to_owned() + } +} diff --git a/src/tests/wad.rs b/src/tests/wad.rs index 8b7606e..4bd11f4 100644 --- a/src/tests/wad.rs +++ b/src/tests/wad.rs @@ -147,3 +147,49 @@ pub fn get_num_linedefs() { assert_eq!(linedef_lump.get_num_linedefs(), 475); } + +#[test] +pub fn read_first_sidedef() { + use crate::types::Sidedef; + + let wad_file = get_wad(); + + let sidedef_lump = wad_file.get_sidedef_lump(&wad_file.directory[9]); + + let correct_sidedef = Sidedef { + x_offset: 0, + y_offset: 0, + upper_texture: String::from("-"), + lower_texture: String::from("-"), + middle_texture: String::from("DOOR3"), + sector: 40, + }; + + assert_eq!(sidedef_lump.get_sidedef(0), correct_sidedef); +} + +#[test] +pub fn get_num_sidedef_lumps() { + use crate::lumps::{Lump, LumpType}; + + let mut sidedef_lumps: Vec = Vec::new(); + + let wad_file = get_wad(); + + for entry in 0..wad_file.num_lumps as usize { + if let LumpType::Sidedef = wad_file.directory[entry].lump_type { + sidedef_lumps.push(wad_file.directory[entry].to_owned()); + } + } + + assert_eq!(sidedef_lumps.len(), 9); +} + +#[test] +pub fn get_num_sidedefs() { + let wad_file = get_wad(); + + let sidedef_lump = wad_file.get_sidedef_lump(&wad_file.directory[9]); + + assert_eq!(sidedef_lump.get_num_sidedefs(), 648); +} diff --git a/src/types/mod.rs b/src/types/mod.rs index fb02331..60ee0e6 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,5 +1,7 @@ mod linedef; +mod sidedef; mod vertex; pub use linedef::Linedef; +pub use sidedef::Sidedef; pub use vertex::Vertex; diff --git a/src/types/sidedef.rs b/src/types/sidedef.rs new file mode 100644 index 0000000..46a05bd --- /dev/null +++ b/src/types/sidedef.rs @@ -0,0 +1,9 @@ +#[derive(Clone, Debug, PartialEq)] +pub struct Sidedef { + pub x_offset: i16, + pub y_offset: i16, + pub upper_texture: String, + pub lower_texture: String, + pub middle_texture: String, + pub sector: i16, +} diff --git a/src/wad/wadfile.rs b/src/wad/wadfile.rs index c5a65f8..1bdc249 100644 --- a/src/wad/wadfile.rs +++ b/src/wad/wadfile.rs @@ -44,6 +44,7 @@ impl WADFile { let lump_type = match name.as_str() { "VERTEXES" => LumpType::Vertex, "LINEDEFS" => LumpType::Linedef, + "SIDEDEFS" => LumpType::Sidedef, _ => LumpType::Unknown, }; lump_dir.push(Lump { diff --git a/src/wad/wadfile/readers.rs b/src/wad/wadfile/readers.rs index 62ecf92..b152241 100644 --- a/src/wad/wadfile/readers.rs +++ b/src/wad/wadfile/readers.rs @@ -1,5 +1,6 @@ -use crate::lumps::{LinedefLump, Lump, VertexLump}; -use crate::types::{Linedef, Vertex}; +use crate::lumps::{LinedefLump, Lump, SidedefLump, VertexLump}; +use crate::types::{Linedef, Sidedef, Vertex}; +use crate::utils::read_ascii; use crate::wad::WADFile; use crate::wad::wadfile::read_i16_le; @@ -55,4 +56,33 @@ impl WADFile { LinedefLump { linedefs } } + + pub fn get_sidedef_lump(&self, lump: &Lump) -> SidedefLump { + let lump_offset = lump.offset as usize; + let lump_size = lump.size as usize; + let lump_data = &self.data[lump_offset..lump_offset + lump_size]; + let lump_entires = lump_size / 30; + let mut sidedefs: Vec = Vec::with_capacity(lump_entires); + + for entry in 0..lump_entires { + let startpos = entry * 30; + let x_offset = read_i16_le(&lump_data[startpos..startpos + 2]); + let y_offset = read_i16_le(&lump_data[startpos + 2..startpos + 4]); + let upper_texture = read_ascii(&lump_data[startpos + 4..startpos + 12]); + let lower_texture = read_ascii(&lump_data[startpos + 12..startpos + 20]); + let middle_texture = read_ascii(&lump_data[startpos + 20..startpos + 28]); + let sector = read_i16_le(&lump_data[startpos + 28..startpos + 30]); + + sidedefs.push(Sidedef { + x_offset, + y_offset, + upper_texture, + lower_texture, + middle_texture, + sector, + }); + } + + SidedefLump { sidedefs } + } } -- 2.49.1