Merge pull request 'Linedef Loading' (#15) from linedef-loader into master

Reviewed-on: https://git.batesirvintech.net/wesley/doom-oxidized/pulls/15
This commit is contained in:
Wesley Irvin
2023-04-29 09:45:58 -04:00
3 changed files with 138 additions and 3 deletions

View File

@@ -1,3 +1,4 @@
mod linedef;
mod vertex; mod vertex;
use std::{ use std::{
@@ -5,6 +6,8 @@ use std::{
io::{Read, Seek, SeekFrom}, io::{Read, Seek, SeekFrom},
}; };
use self::linedef::Linedef;
use super::wadfile::WADFile; use super::wadfile::WADFile;
use vertex::Vertex; use vertex::Vertex;
@@ -19,12 +22,12 @@ enum Lumps {
SECTORS, SECTORS,
REJECT, REJECT,
BLOCKMAP, BLOCKMAP,
BEHAVIOR,
} }
pub struct DoomLevel { pub struct DoomLevel {
pub name: String, pub name: String,
pub vertexes: Vec<Vertex>, pub vertexes: Vec<Vertex>,
pub linedefs: Vec<Linedef>,
} }
impl DoomLevel { impl DoomLevel {
@@ -36,6 +39,11 @@ impl DoomLevel {
wad_file.get_lump_offset(lvl_index + Lumps::VERTEXES as u32), wad_file.get_lump_offset(lvl_index + Lumps::VERTEXES as u32),
wad_file.get_lump_size(lvl_index + Lumps::VERTEXES as u32), wad_file.get_lump_size(lvl_index + Lumps::VERTEXES as u32),
), ),
linedefs: load_linedefs(
wad_file,
wad_file.get_lump_offset(lvl_index + Lumps::LINEDEFS as u32),
wad_file.get_lump_size(lvl_index + Lumps::LINEDEFS as u32),
),
} }
} }
} }
@@ -63,3 +71,42 @@ fn load_vertexes(wad_file: &WADFile, offset: u32, size: u32) -> Vec<Vertex> {
vertex_list vertex_list
} }
fn load_linedefs(wad_file: &WADFile, offset: u32, size: u32) -> Vec<Linedef> {
let num_linedef: u32 = size / 14u32;
let mut linedef_list: Vec<Linedef> = Vec::with_capacity(num_linedef as usize);
let mut linedef_data = File::open(&wad_file.wad_path).unwrap();
linedef_data.seek(SeekFrom::Start(offset as u64)).unwrap();
for _ in 0..num_linedef {
let mut start_vertex = [0; 2];
let mut end_vertex = [0; 2];
let mut flags = [0; 2];
let mut special_type = [0; 2];
let mut sector_tag = [0; 2];
let mut front_sidedef = [0; 2];
let mut back_sidedef = [0; 2];
linedef_data.read(&mut start_vertex).unwrap();
linedef_data.read(&mut end_vertex).unwrap();
linedef_data.read(&mut flags).unwrap();
linedef_data.read(&mut special_type).unwrap();
linedef_data.read(&mut sector_tag).unwrap();
linedef_data.read(&mut front_sidedef).unwrap();
linedef_data.read(&mut back_sidedef).unwrap();
linedef_list.push(Linedef {
start_vertex: i16::from_le_bytes(start_vertex),
end_vertex: i16::from_le_bytes(end_vertex),
flags: i16::from_le_bytes(flags),
special_type: i16::from_le_bytes(special_type),
sector_tag: i16::from_le_bytes(sector_tag),
front_sidedef: i16::from_le_bytes(front_sidedef),
back_sidedef: i16::from_le_bytes(back_sidedef),
});
}
linedef_list
}

47
src/doomlevel/linedef.rs Normal file
View File

@@ -0,0 +1,47 @@
pub struct Linedef {
pub start_vertex: i16,
pub end_vertex: i16,
pub flags: i16,
pub special_type: i16,
pub sector_tag: i16,
pub front_sidedef: i16,
pub back_sidedef: i16,
}
impl Linedef {
pub fn blocks_players(&self) -> bool {
self.flags & (1 << 0) != 0
}
pub fn blocks_monsters(&self) -> bool {
self.flags & (1 << 1) != 0
}
pub fn is_two_sided(&self) -> bool {
self.flags & (1 << 2) != 0
}
pub fn is_upper_unpegged(&self) -> bool {
self.flags & (1 << 3) != 0
}
pub fn is_lower_unpegged(&self) -> bool {
self.flags & (1 << 4) != 0
}
pub fn is_secret(&self) -> bool {
self.flags & (1 << 5) != 0
}
pub fn blocks_sound(&self) -> bool {
self.flags & (1 << 6) != 0
}
pub fn never_automap(&self) -> bool {
self.flags & (1 << 7) != 0
}
pub fn always_automap(&self) -> bool {
self.flags & (1 << 8) != 0
}
}

View File

@@ -35,12 +35,53 @@ Header:
); );
} }
println!("\nFirst 20 Vertex Entries for E1M1:"); println!("\nFirst 15 Vertex Entries for {}:", level.name);
for i in 0..20 { for i in 0..15 {
println!( println!(
"\t{} - ({}, {})", "\t{} - ({}, {})",
i, level.vertexes[i].x, level.vertexes[i].y i, level.vertexes[i].x, level.vertexes[i].y
); );
} }
let test_linedef = 247;
println!("\nLinedef Entry {} for {}:", test_linedef, level.name);
println!(
"Start Vertex: {}
End Vertex: {}
Flags: {}
Special Type: {}
Sector Tag: {}
Front Sidedef: {}
Back Sidedef: {}
Flags:
\tBlocks Players: {}
\tBlocks Monsters: {}
\tTwo Sided: {}
\tUpper Texture Unpegged: {}
\tLower Texture Unpegged: {}
\tSecret: {}
\tBlocks Sound: {}
\tNever Shows on Automap: {}
\tAlways Shows on Automap {}",
level.linedefs[test_linedef].start_vertex,
level.linedefs[test_linedef].end_vertex,
level.linedefs[test_linedef].flags,
level.linedefs[test_linedef].special_type,
level.linedefs[test_linedef].sector_tag,
level.linedefs[test_linedef].front_sidedef,
level.linedefs[test_linedef].back_sidedef,
level.linedefs[test_linedef].blocks_players(),
level.linedefs[test_linedef].blocks_monsters(),
level.linedefs[test_linedef].is_two_sided(),
level.linedefs[test_linedef].is_upper_unpegged(),
level.linedefs[test_linedef].is_lower_unpegged(),
level.linedefs[test_linedef].is_secret(),
level.linedefs[test_linedef].blocks_sound(),
level.linedefs[test_linedef].never_automap(),
level.linedefs[test_linedef].always_automap()
);
} }