From ce276e5ba00c30ddde9645a1243528a751375512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Wed, 17 Apr 2024 23:23:07 +0200 Subject: [PATCH] add lane data --- enmacompat/src/area.rs | 19 +++++++++++++++---- enmacompat/src/lane.rs | 32 ++++++++++++++++++++++++++++++++ enmacompat/src/lib.rs | 2 ++ enmacompat/src/speed.rs | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 enmacompat/src/lane.rs create mode 100644 enmacompat/src/speed.rs diff --git a/enmacompat/src/area.rs b/enmacompat/src/area.rs index bfb3d71..5390f1a 100644 --- a/enmacompat/src/area.rs +++ b/enmacompat/src/area.rs @@ -1,5 +1,7 @@ use crate::{ + lane::{read_lane, EnmaLane}, section::{read_bank_cell, EnmaBankCell, EnmaSection}, + speed::{read_speed_cells, EnmaSpeedCell}, windows_pe::WindowsPEFile, }; use binrw::{BinRead, NullString}; @@ -54,12 +56,14 @@ pub fn read_area(file: &WindowsPEFile, address: u64) -> Result(area.name_addr)?.to_string(), stage_id: area.stage_id, related_area_addr: area.related_area_addr, - unknown: area.unk2, + max_dist: area.max_dist, sections: (0..area.section_count) .map(|i| file.read_addr::(area.sections_addr + i as u64 * 0x28)) .collect::>()?, 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)?, }) } @@ -71,10 +75,17 @@ pub struct EnmaArea { pub name: String, pub stage_id: u64, pub related_area_addr: [u64; 4], - pub unknown: [f32; 4], + pub max_dist: f32, pub sections: Vec, pub bank_left: Vec, pub bank_right: Vec, + // TODO: Zebra Left + // TODO: Zebra Right + // TODO: Gaps + // TODO: Non Guard Left + // TODO: Non Guard Right + pub speed: Vec, + pub lane: Vec, } #[derive(BinRead, Debug)] @@ -86,8 +97,8 @@ pub struct EnmaAreaRaw { pub related_area_addr: [u64; 4], - pub unk2: [f32; 4], - + #[br(pad_before = 8, pad_after = 4)] + pub max_dist: f32, pub sections_addr: u64, pub section_count: i32, diff --git a/enmacompat/src/lane.rs b/enmacompat/src/lane.rs new file mode 100644 index 0000000..59f2a60 --- /dev/null +++ b/enmacompat/src/lane.rs @@ -0,0 +1,32 @@ +use crate::windows_pe::WindowsPEFile; +use binrw::BinRead; +use serde::Serialize; + +#[derive(Debug, BinRead, Serialize)] +pub struct EnmaLane { + pub dist: f32, + pub unk2: i32, + pub unk3: i32, + pub unk4: f32, + pub left: [f32; 2], + 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; + } + + Ok(result) +} diff --git a/enmacompat/src/lib.rs b/enmacompat/src/lib.rs index 77a4063..75eb152 100644 --- a/enmacompat/src/lib.rs +++ b/enmacompat/src/lib.rs @@ -1,5 +1,7 @@ pub mod area; +pub mod lane; pub mod meta; pub mod section; +pub mod speed; mod util; pub mod windows_pe; diff --git a/enmacompat/src/speed.rs b/enmacompat/src/speed.rs new file mode 100644 index 0000000..aea22c9 --- /dev/null +++ b/enmacompat/src/speed.rs @@ -0,0 +1,34 @@ +use crate::windows_pe::WindowsPEFile; +use binrw::BinRead; +use serde::Serialize; + +#[derive(Debug, BinRead, Serialize)] +pub struct EnmaSpeedCell { + pub dist: f32, + pub z: f32, + pub norm: f32, + pub handle_10: f32, + pub pow_10: f32, + pub ps_600: f32, + pub handle_22: f32, + 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; + } + + Ok(result) +}