From da7729a00b32ecfa952d99b353686ae0d2f0ec7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Wed, 17 Apr 2024 23:46:58 +0200 Subject: [PATCH] add zebra --- enmacompat/src/area.rs | 21 +++++++++++------- enmacompat/src/dist_cell.rs | 44 +++++++++++++++++++++++++++++++++++++ enmacompat/src/lane.rs | 26 ++++++++-------------- enmacompat/src/lib.rs | 2 ++ enmacompat/src/meta.rs | 5 +++-- enmacompat/src/speed.rs | 24 +++++++------------- enmacompat/src/zebra.rs | 22 +++++++++++++++++++ 7 files changed, 101 insertions(+), 43 deletions(-) create mode 100644 enmacompat/src/dist_cell.rs create mode 100644 enmacompat/src/zebra.rs diff --git a/enmacompat/src/area.rs b/enmacompat/src/area.rs index 5390f1a..c0d531f 100644 --- a/enmacompat/src/area.rs +++ b/enmacompat/src/area.rs @@ -1,8 +1,10 @@ use crate::{ - lane::{read_lane, EnmaLane}, + dist_cell::read_dist_cells, + lane::EnmaLaneCell, section::{read_bank_cell, EnmaBankCell, EnmaSection}, - speed::{read_speed_cells, EnmaSpeedCell}, + speed::EnmaSpeedCell, windows_pe::WindowsPEFile, + zebra::EnmaZebraCell, }; use binrw::{BinRead, NullString}; use serde::Serialize; @@ -62,8 +64,11 @@ pub fn read_area(file: &WindowsPEFile, address: u64) -> Result>()?, bank_left: read_bank_cell(file, area.bank_left_addr, area.section_count)?, bank_right: read_bank_cell(file, area.bank_right_addr, area.section_count)?, - speed: read_speed_cells(file, area.speed_addr, area.max_dist)?, - lane: read_lane(file, area.lane_addr, area.max_dist)?, + zebra_left: read_dist_cells(file, area.zebra_left_addr, area.max_dist, false)?, + zebra_right: read_dist_cells(file, area.zebra_left_addr, area.max_dist, false)?, + gaps: read_dist_cells(file, area.gaps_addr, area.max_dist, false)?, + speed: read_dist_cells(file, area.speed_addr, area.max_dist, true)?, + lane: read_dist_cells(file, area.lane_addr, area.max_dist, true)?, }) } @@ -79,13 +84,13 @@ pub struct EnmaArea { pub sections: Vec, pub bank_left: Vec, pub bank_right: Vec, - // TODO: Zebra Left - // TODO: Zebra Right - // TODO: Gaps + pub zebra_left: Vec, + pub zebra_right: Vec, + pub gaps: Vec, // TODO: Non Guard Left // TODO: Non Guard Right pub speed: Vec, - pub lane: Vec, + pub lane: Vec, } #[derive(BinRead, Debug)] diff --git a/enmacompat/src/dist_cell.rs b/enmacompat/src/dist_cell.rs new file mode 100644 index 0000000..02df6e2 --- /dev/null +++ b/enmacompat/src/dist_cell.rs @@ -0,0 +1,44 @@ +use binrw::BinRead; + +use crate::windows_pe::WindowsPEFile; + +pub trait EnmaDistCell { + fn dist(&self) -> f32; + fn size() -> u64; +} + +impl EnmaDistCell for f32 { + fn dist(&self) -> f32 { + *self + } + + fn size() -> u64 { + 4 + } +} + +pub fn read_dist_cells<'a, T>( + file: &WindowsPEFile, + mut address: u64, + max_dist: f32, + include_last: bool, +) -> Result, std::io::Error> +where + T: BinRead + EnmaDistCell, + T::Args<'a>: Default, +{ + let mut result = vec![]; + loop { + let cell = file.read_addr::(address)?; + if cell.dist() >= max_dist { + if include_last { + result.push(cell); + } + break; + } + result.push(cell); + address += T::size(); + } + + Ok(result) +} diff --git a/enmacompat/src/lane.rs b/enmacompat/src/lane.rs index 59f2a60..4ab935a 100644 --- a/enmacompat/src/lane.rs +++ b/enmacompat/src/lane.rs @@ -1,9 +1,10 @@ -use crate::windows_pe::WindowsPEFile; use binrw::BinRead; use serde::Serialize; +use crate::dist_cell::EnmaDistCell; + #[derive(Debug, BinRead, Serialize)] -pub struct EnmaLane { +pub struct EnmaLaneCell { pub dist: f32, pub unk2: i32, pub unk3: i32, @@ -12,21 +13,12 @@ pub struct EnmaLane { pub right: [f32; 2], } -pub fn read_lane( - file: &WindowsPEFile, - mut address: u64, - max_dist: f32, -) -> Result, std::io::Error> { - let mut result = vec![]; - loop { - let lane = file.read_addr::(address)?; - let dist = lane.dist; - result.push(lane); - if dist >= max_dist { - break; - } - address += 0x20; +impl EnmaDistCell for EnmaLaneCell { + fn dist(&self) -> f32 { + self.dist } - Ok(result) + fn size() -> u64 { + 0x20 + } } diff --git a/enmacompat/src/lib.rs b/enmacompat/src/lib.rs index 75eb152..a625e86 100644 --- a/enmacompat/src/lib.rs +++ b/enmacompat/src/lib.rs @@ -1,7 +1,9 @@ pub mod area; +pub mod dist_cell; pub mod lane; pub mod meta; pub mod section; pub mod speed; mod util; pub mod windows_pe; +pub mod zebra; diff --git a/enmacompat/src/meta.rs b/enmacompat/src/meta.rs index d937d1f..5407dd6 100644 --- a/enmacompat/src/meta.rs +++ b/enmacompat/src/meta.rs @@ -35,8 +35,9 @@ impl EnmaMeta { } println!( - "\x1b[32m\x1b[1mArea Array\x1b[0m: \x1b[4m{:#x} ({} items)\x1b[0m", - area_array_addr, area_array_count + "\x1b[32m\x1b[1mArea Array\x1b[0m: \x1b[4m{:#x} ({} Areas)\x1b[0m", + area_array_addr, + area_array_count - 1 ); Ok(Self { diff --git a/enmacompat/src/speed.rs b/enmacompat/src/speed.rs index aea22c9..6f7c4cb 100644 --- a/enmacompat/src/speed.rs +++ b/enmacompat/src/speed.rs @@ -1,7 +1,8 @@ -use crate::windows_pe::WindowsPEFile; use binrw::BinRead; use serde::Serialize; +use crate::dist_cell::EnmaDistCell; + #[derive(Debug, BinRead, Serialize)] pub struct EnmaSpeedCell { pub dist: f32, @@ -14,21 +15,12 @@ pub struct EnmaSpeedCell { pub pow_22: f32, } -pub fn read_speed_cells( - file: &WindowsPEFile, - mut address: u64, - max_dist: f32, -) -> Result, std::io::Error> { - let mut result = vec![]; - loop { - let speed = file.read_addr::(address)?; - let dist = speed.dist; - result.push(speed); - if dist >= max_dist { - break; - } - address += 0x20; +impl EnmaDistCell for EnmaSpeedCell { + fn dist(&self) -> f32 { + self.dist } - Ok(result) + fn size() -> u64 { + 0x20 + } } diff --git a/enmacompat/src/zebra.rs b/enmacompat/src/zebra.rs new file mode 100644 index 0000000..7ffe1fa --- /dev/null +++ b/enmacompat/src/zebra.rs @@ -0,0 +1,22 @@ +use binrw::BinRead; +use serde::Serialize; + +use crate::dist_cell::EnmaDistCell; + +#[derive(Debug, BinRead, Serialize)] +pub struct EnmaZebraCell { + pub dist: f32, + pub unk1: f32, + pub unk2: f32, + pub unk3: i32, +} + +impl EnmaDistCell for EnmaZebraCell { + fn dist(&self) -> f32 { + self.dist + } + + fn size() -> u64 { + 0x10 + } +}