From 3255b687e5143a64c3477ba65490047621499553 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 7 Aug 2024 18:11:24 -0700 Subject: [PATCH] refactor JumpCalculation --- src/newtypes/gameplay_attributes.rs | 17 +++ src/newtypes/gameplay_style.rs | 188 ++++++++++++++-------------- 2 files changed, 112 insertions(+), 93 deletions(-) diff --git a/src/newtypes/gameplay_attributes.rs b/src/newtypes/gameplay_attributes.rs index 0dd3501..192aee8 100644 --- a/src/newtypes/gameplay_attributes.rs +++ b/src/newtypes/gameplay_attributes.rs @@ -125,6 +125,11 @@ pub enum Booster{ Velocity(Planar64Vec3), #[brw(magic=1u8)] Energy{direction:Planar64Vec3,energy:Planar64}, + #[brw(magic=2u8)] + AirTime(Time), + #[brw(magic=3u8)] + Height(Planar64), + } impl Into for Booster{ fn into(self)->strafesnet_common::gameplay_attributes::Booster{ @@ -138,6 +143,14 @@ impl Into for Booster{ direction:strafesnet_common::integer::Planar64Vec3::raw_array(direction), energy:strafesnet_common::integer::Planar64::raw(energy) }, + Booster::AirTime(time)=> + strafesnet_common::gameplay_attributes::Booster::AirTime( + strafesnet_common::integer::Time::raw(time) + ), + Booster::Height(height)=> + strafesnet_common::gameplay_attributes::Booster::Height( + strafesnet_common::integer::Planar64::raw(height) + ), } } } @@ -151,6 +164,10 @@ impl From for Booster{ direction:direction.get().to_array(), energy:energy.get(), }, + strafesnet_common::gameplay_attributes::Booster::AirTime(time)=> + Booster::AirTime(time.get()), + strafesnet_common::gameplay_attributes::Booster::Height(height)=> + Booster::Height(height.get()), } } } diff --git a/src/newtypes/gameplay_style.rs b/src/newtypes/gameplay_style.rs index bb7cecb..64d98b9 100644 --- a/src/newtypes/gameplay_style.rs +++ b/src/newtypes/gameplay_style.rs @@ -105,52 +105,52 @@ impl From for StyleModifiers{ #[binrw::binrw] #[brw(little,repr=u8)] pub enum JumpCalculation{ - Capped, - Energy, - Linear, + Max, + BoostThenJump, + JumpThenBoost, } impl Into for JumpCalculation{ fn into(self)->strafesnet_common::gameplay_style::JumpCalculation{ match self{ - JumpCalculation::Capped=>strafesnet_common::gameplay_style::JumpCalculation::Capped, - JumpCalculation::Energy=>strafesnet_common::gameplay_style::JumpCalculation::Energy, - JumpCalculation::Linear=>strafesnet_common::gameplay_style::JumpCalculation::Linear, + JumpCalculation::Max=>strafesnet_common::gameplay_style::JumpCalculation::Max, + JumpCalculation::BoostThenJump=>strafesnet_common::gameplay_style::JumpCalculation::BoostThenJump, + JumpCalculation::JumpThenBoost=>strafesnet_common::gameplay_style::JumpCalculation::JumpThenBoost, } } } impl From for JumpCalculation{ fn from(value:strafesnet_common::gameplay_style::JumpCalculation)->Self{ match value{ - strafesnet_common::gameplay_style::JumpCalculation::Capped=>JumpCalculation::Capped, - strafesnet_common::gameplay_style::JumpCalculation::Energy=>JumpCalculation::Energy, - strafesnet_common::gameplay_style::JumpCalculation::Linear=>JumpCalculation::Linear, + strafesnet_common::gameplay_style::JumpCalculation::Max=>JumpCalculation::Max, + strafesnet_common::gameplay_style::JumpCalculation::BoostThenJump=>JumpCalculation::BoostThenJump, + strafesnet_common::gameplay_style::JumpCalculation::JumpThenBoost=>JumpCalculation::JumpThenBoost, } } } pub enum JumpImpulse{ - FromTime(Time), - FromHeight(Planar64), - FromDeltaV(Planar64), - FromEnergy(Planar64), + Time(Time), + Height(Planar64), + Linear(Planar64), + Energy(Planar64), } impl Into for JumpImpulse{ fn into(self)->strafesnet_common::gameplay_style::JumpImpulse{ match self{ - JumpImpulse::FromTime(time)=>strafesnet_common::gameplay_style::JumpImpulse::FromTime(strafesnet_common::integer::Time::raw(time)), - JumpImpulse::FromHeight(height)=>strafesnet_common::gameplay_style::JumpImpulse::FromHeight(strafesnet_common::integer::Planar64::raw(height)), - JumpImpulse::FromDeltaV(deltav)=>strafesnet_common::gameplay_style::JumpImpulse::FromDeltaV(strafesnet_common::integer::Planar64::raw(deltav)), - JumpImpulse::FromEnergy(energy)=>strafesnet_common::gameplay_style::JumpImpulse::FromEnergy(strafesnet_common::integer::Planar64::raw(energy)), + JumpImpulse::Time(time)=>strafesnet_common::gameplay_style::JumpImpulse::Time(strafesnet_common::integer::Time::raw(time)), + JumpImpulse::Height(height)=>strafesnet_common::gameplay_style::JumpImpulse::Height(strafesnet_common::integer::Planar64::raw(height)), + JumpImpulse::Linear(deltav)=>strafesnet_common::gameplay_style::JumpImpulse::Linear(strafesnet_common::integer::Planar64::raw(deltav)), + JumpImpulse::Energy(energy)=>strafesnet_common::gameplay_style::JumpImpulse::Energy(strafesnet_common::integer::Planar64::raw(energy)), } } } impl From for JumpImpulse{ fn from(value:strafesnet_common::gameplay_style::JumpImpulse)->Self{ match value{ - strafesnet_common::gameplay_style::JumpImpulse::FromTime(time)=>JumpImpulse::FromTime(time.get()), - strafesnet_common::gameplay_style::JumpImpulse::FromHeight(height)=>JumpImpulse::FromHeight(height.get()), - strafesnet_common::gameplay_style::JumpImpulse::FromDeltaV(deltav)=>JumpImpulse::FromDeltaV(deltav.get()), - strafesnet_common::gameplay_style::JumpImpulse::FromEnergy(energy)=>JumpImpulse::FromEnergy(energy.get()), + strafesnet_common::gameplay_style::JumpImpulse::Time(time)=>JumpImpulse::Time(time.get()), + strafesnet_common::gameplay_style::JumpImpulse::Height(height)=>JumpImpulse::Height(height.get()), + strafesnet_common::gameplay_style::JumpImpulse::Linear(deltav)=>JumpImpulse::Linear(deltav.get()), + strafesnet_common::gameplay_style::JumpImpulse::Energy(energy)=>JumpImpulse::Energy(energy.get()), } } } @@ -165,19 +165,19 @@ pub struct ControlsActivation{ impl TryInto for ControlsActivation{ type Error=ControlsError; fn try_into(self)->Result{ - Ok(strafesnet_common::gameplay_style::ControlsActivation::new( - strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_mask).ok_or(ControlsError::UnknownBits)?, - strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_intersects).ok_or(ControlsError::UnknownBits)?, - strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_contains).ok_or(ControlsError::UnknownBits)?, - )) + Ok(strafesnet_common::gameplay_style::ControlsActivation{ + controls_mask:strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_mask).ok_or(ControlsError::UnknownBits)?, + controls_intersects:strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_intersects).ok_or(ControlsError::UnknownBits)?, + controls_contains:strafesnet_common::controls_bitflag::Controls::from_bits(self.controls_contains).ok_or(ControlsError::UnknownBits)?, + }) } } impl From for ControlsActivation{ fn from(value:strafesnet_common::gameplay_style::ControlsActivation)->Self{ Self{ - controls_mask:value.controls_mask().bits(), - controls_intersects:value.controls_intersects().bits(), - controls_contains:value.controls_contains().bits(), + controls_mask:value.controls_mask.bits(), + controls_intersects:value.controls_intersects.bits(), + controls_contains:value.controls_contains.bits(), } } } @@ -209,24 +209,23 @@ impl std::error::Error for StrafeSettingsError{} impl TryInto for StrafeSettings{ type Error=StrafeSettingsError; fn try_into(self)->Result{ - Ok(strafesnet_common::gameplay_style::StrafeSettings::new( - self.enable.try_into().map_err(StrafeSettingsError::Controls)?, - strafesnet_common::integer::Planar64::raw(self.mv), - self.air_accel_limit.map(strafesnet_common::integer::Planar64::raw), - self.tick_rate.try_into().map_err(StrafeSettingsError::Ratio)?, - )) + Ok(strafesnet_common::gameplay_style::StrafeSettings{ + enable:self.enable.try_into().map_err(StrafeSettingsError::Controls)?, + mv:strafesnet_common::integer::Planar64::raw(self.mv), + air_accel_limit:self.air_accel_limit.map(strafesnet_common::integer::Planar64::raw), + tick_rate:self.tick_rate.try_into().map_err(StrafeSettingsError::Ratio)?, + }) } } impl From for StrafeSettings{ fn from(value:strafesnet_common::gameplay_style::StrafeSettings)->Self{ - let (enable,mv,air_accel_limit,tick_rate)=value.into_inner(); - let header=flag(air_accel_limit.is_some(),StrafeSettings::AIR_ACCEL_LIMIT); + let header=flag(value.air_accel_limit.is_some(),StrafeSettings::AIR_ACCEL_LIMIT); Self{ header, - enable:enable.into(), - mv:mv.get(), - air_accel_limit:air_accel_limit.map(|a|a.get()), - tick_rate:tick_rate.into(), + enable:value.enable.into(), + mv:value.mv.get(), + air_accel_limit:value.air_accel_limit.map(|a|a.get()), + tick_rate:value.tick_rate.into(), } } } @@ -238,15 +237,15 @@ pub struct PropulsionSettings{ } impl Into for PropulsionSettings{ fn into(self)->strafesnet_common::gameplay_style::PropulsionSettings{ - strafesnet_common::gameplay_style::PropulsionSettings::new( - strafesnet_common::integer::Planar64::raw(self.magnitude) - ) + strafesnet_common::gameplay_style::PropulsionSettings{ + magnitude:strafesnet_common::integer::Planar64::raw(self.magnitude) + } } } impl From for PropulsionSettings{ fn from(value:strafesnet_common::gameplay_style::PropulsionSettings)->Self{ Self{ - magnitude:value.magnitude().get(), + magnitude:value.magnitude.get(), } } } @@ -258,25 +257,29 @@ pub struct JumpSettings{ impulse:i64, } impl JumpSettings{ - const IMPULSE:u8=0b0011; - const CALCULATION:u8=0b1100; + const IMPULSE:u8=0b00011; + const CALCULATION:u8=0b01100; + const LIMIT_MINIMUM:u8=0b10000; const fn impulse(&self)->Option{ match self.header&Self::IMPULSE{ - 0=>Some(strafesnet_common::gameplay_style::JumpImpulse::FromTime(strafesnet_common::integer::Time::raw(self.impulse))), - 1=>Some(strafesnet_common::gameplay_style::JumpImpulse::FromHeight(strafesnet_common::integer::Planar64::raw(self.impulse))), - 2=>Some(strafesnet_common::gameplay_style::JumpImpulse::FromDeltaV(strafesnet_common::integer::Planar64::raw(self.impulse))), - 3=>Some(strafesnet_common::gameplay_style::JumpImpulse::FromEnergy(strafesnet_common::integer::Planar64::raw(self.impulse))), + 0=>Some(strafesnet_common::gameplay_style::JumpImpulse::Time(strafesnet_common::integer::Time::raw(self.impulse))), + 1=>Some(strafesnet_common::gameplay_style::JumpImpulse::Height(strafesnet_common::integer::Planar64::raw(self.impulse))), + 2=>Some(strafesnet_common::gameplay_style::JumpImpulse::Linear(strafesnet_common::integer::Planar64::raw(self.impulse))), + 3=>Some(strafesnet_common::gameplay_style::JumpImpulse::Energy(strafesnet_common::integer::Planar64::raw(self.impulse))), _=>None, } } const fn calculation(&self)->Option{ match (self.header&Self::CALCULATION)>>2{ - 0=>Some(strafesnet_common::gameplay_style::JumpCalculation::Capped), - 1=>Some(strafesnet_common::gameplay_style::JumpCalculation::Energy), - 2=>Some(strafesnet_common::gameplay_style::JumpCalculation::Linear), + 0=>Some(strafesnet_common::gameplay_style::JumpCalculation::Max), + 1=>Some(strafesnet_common::gameplay_style::JumpCalculation::JumpThenBoost), + 2=>Some(strafesnet_common::gameplay_style::JumpCalculation::BoostThenJump), _=>None, } } + const fn limit_minimum(&self)->bool{ + self.header&Self::LIMIT_MINIMUM!=0 + } } #[derive(Debug)] pub enum JumpSettingsError{ @@ -286,29 +289,30 @@ pub enum JumpSettingsError{ impl TryInto for JumpSettings{ type Error=JumpSettingsError; fn try_into(self)->Result{ - Ok(strafesnet_common::gameplay_style::JumpSettings::new( - self.impulse().ok_or(JumpSettingsError::InvalidImpulseDiscriminant)?, - self.calculation().ok_or(JumpSettingsError::InvalidCalculationDiscriminant)?, - )) + Ok(strafesnet_common::gameplay_style::JumpSettings{ + impulse:self.impulse().ok_or(JumpSettingsError::InvalidImpulseDiscriminant)?, + calculation:self.calculation().ok_or(JumpSettingsError::InvalidCalculationDiscriminant)?, + limit_minimum:self.limit_minimum(), + }) } } impl From for JumpSettings{ fn from(value:strafesnet_common::gameplay_style::JumpSettings)->Self{ - let (impulse_enum,calculation)=value.into_inner(); - let (impulse,impulse_header)=match impulse_enum{ - strafesnet_common::gameplay_style::JumpImpulse::FromTime(impulse)=>(impulse.get(),0), - strafesnet_common::gameplay_style::JumpImpulse::FromHeight(impulse)=>(impulse.get(),1), - strafesnet_common::gameplay_style::JumpImpulse::FromDeltaV(impulse)=>(impulse.get(),2), - strafesnet_common::gameplay_style::JumpImpulse::FromEnergy(impulse)=>(impulse.get(),3), + let (impulse,impulse_header)=match value.impulse{ + strafesnet_common::gameplay_style::JumpImpulse::Time(impulse)=>(impulse.get(),0), + strafesnet_common::gameplay_style::JumpImpulse::Height(impulse)=>(impulse.get(),1), + strafesnet_common::gameplay_style::JumpImpulse::Linear(impulse)=>(impulse.get(),2), + strafesnet_common::gameplay_style::JumpImpulse::Energy(impulse)=>(impulse.get(),3), }; - let calculation_header=match calculation{ - strafesnet_common::gameplay_style::JumpCalculation::Capped=>0, - strafesnet_common::gameplay_style::JumpCalculation::Energy=>1, - strafesnet_common::gameplay_style::JumpCalculation::Linear=>2, + let calculation_header=match value.calculation{ + strafesnet_common::gameplay_style::JumpCalculation::Max=>0, + strafesnet_common::gameplay_style::JumpCalculation::JumpThenBoost=>1, + strafesnet_common::gameplay_style::JumpCalculation::BoostThenJump=>2, }; let header= impulse_header - |(calculation_header<<2); + |(calculation_header<<2) + |((value.limit_minimum as u8)<<4); Self{ header, impulse, @@ -324,17 +328,17 @@ pub struct AccelerateSettings{ } impl Into for AccelerateSettings{ fn into(self)->strafesnet_common::gameplay_style::AccelerateSettings{ - strafesnet_common::gameplay_style::AccelerateSettings::new( - strafesnet_common::integer::Planar64::raw(self.accel), - strafesnet_common::integer::Planar64::raw(self.topspeed), - ) + strafesnet_common::gameplay_style::AccelerateSettings{ + accel:strafesnet_common::integer::Planar64::raw(self.accel), + topspeed:strafesnet_common::integer::Planar64::raw(self.topspeed), + } } } impl From for AccelerateSettings{ fn from(value:strafesnet_common::gameplay_style::AccelerateSettings)->Self{ Self{ - accel:value.accel().get(), - topspeed:value.topspeed().get(), + accel:value.accel.get(), + topspeed:value.topspeed.get(), } } } @@ -349,22 +353,21 @@ pub struct WalkSettings{ } impl Into for WalkSettings{ fn into(self)->strafesnet_common::gameplay_style::WalkSettings{ - strafesnet_common::gameplay_style::WalkSettings::new( - self.accelerate.into(), - strafesnet_common::integer::Planar64::raw(self.static_friction), - strafesnet_common::integer::Planar64::raw(self.kinetic_friction), - strafesnet_common::integer::Planar64::raw(self.surf_dot), - ) + strafesnet_common::gameplay_style::WalkSettings{ + accelerate:self.accelerate.into(), + static_friction:strafesnet_common::integer::Planar64::raw(self.static_friction), + kinetic_friction:strafesnet_common::integer::Planar64::raw(self.kinetic_friction), + surf_dot:strafesnet_common::integer::Planar64::raw(self.surf_dot), + } } } impl From for WalkSettings{ fn from(value:strafesnet_common::gameplay_style::WalkSettings)->Self{ - let (accelerate,static_friction,kinetic_friction,surf_dot)=value.into_inner(); Self{ - accelerate:accelerate.into(), - static_friction:static_friction.get(), - kinetic_friction:kinetic_friction.get(), - surf_dot:surf_dot.get(), + accelerate:value.accelerate.into(), + static_friction:value.static_friction.get(), + kinetic_friction:value.kinetic_friction.get(), + surf_dot:value.surf_dot.get(), } } } @@ -377,18 +380,17 @@ pub struct LadderSettings{ } impl Into for LadderSettings{ fn into(self)->strafesnet_common::gameplay_style::LadderSettings{ - strafesnet_common::gameplay_style::LadderSettings::new( - self.accelerate.into(), - strafesnet_common::integer::Planar64::raw(self.dot), - ) + strafesnet_common::gameplay_style::LadderSettings{ + accelerate:self.accelerate.into(), + dot:strafesnet_common::integer::Planar64::raw(self.dot), + } } } impl From for LadderSettings{ fn from(value:strafesnet_common::gameplay_style::LadderSettings)->Self{ - let (accelerate,dot)=value.into_inner(); Self{ - accelerate:accelerate.into(), - dot:dot.get(), + accelerate:value.accelerate.into(), + dot:value.dot.get(), } } }