strafe-project/lib/common/src/run.rs

109 lines
2.7 KiB
Rust
Raw Normal View History

2024-07-31 20:16:16 +00:00
use crate::timer::{TimerFixed,Realtime,Paused,Unpaused};
2025-01-08 06:36:21 +00:00
use crate::physics::{TimeInner as PhysicsTimeInner,Time as PhysicsTime};
#[derive(Clone,Copy,Hash,Eq,PartialEq,PartialOrd,Debug)]
pub enum TimeInner{}
pub type Time=crate::integer::Time<TimeInner>;
2024-07-31 20:16:16 +00:00
2024-08-20 23:11:34 +00:00
#[derive(Clone,Copy,Debug)]
2024-07-31 20:16:16 +00:00
pub enum FlagReason{
Anticheat,
StyleChange,
Clock,
Pause,
Flying,
Gravity,
Timescale,
TimeTravel,
Teleport,
}
impl ToString for FlagReason{
fn to_string(&self)->String{
match self{
FlagReason::Anticheat=>"Passed through anticheat zone.",
FlagReason::StyleChange=>"Changed style.",
FlagReason::Clock=>"Incorrect clock. (This can be caused by internet hiccups)",
FlagReason::Pause=>"Pausing is not allowed in this style.",
FlagReason::Flying=>"Flying is not allowed in this style.",
FlagReason::Gravity=>"Gravity modification is not allowed in this style.",
FlagReason::Timescale=>"Timescale is not allowed in this style.",
FlagReason::TimeTravel=>"Time travel is not allowed in this style.",
FlagReason::Teleport=>"Illegal teleport.",
}.to_owned()
}
}
#[derive(Debug)]
pub enum Error{
NotStarted,
AlreadyStarted,
AlreadyFinished,
}
impl std::fmt::Display for Error{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for Error{}
2024-08-20 23:11:34 +00:00
#[derive(Clone,Copy,Debug)]
2024-07-31 20:16:16 +00:00
enum RunState{
Created,
2025-01-08 06:36:21 +00:00
Started{timer:TimerFixed<Realtime<PhysicsTimeInner,TimeInner>,Unpaused>},
Finished{timer:TimerFixed<Realtime<PhysicsTimeInner,TimeInner>,Paused>},
2024-07-31 20:16:16 +00:00
}
2024-08-20 23:11:34 +00:00
#[derive(Clone,Copy,Debug)]
2024-07-31 20:16:16 +00:00
pub struct Run{
state:RunState,
flagged:Option<FlagReason>,
}
impl Run{
pub fn new()->Self{
Self{
state:RunState::Created,
flagged:None,
}
}
2025-01-08 06:36:21 +00:00
pub fn time(&self,time:PhysicsTime)->Time{
2024-07-31 20:16:16 +00:00
match &self.state{
RunState::Created=>Time::ZERO,
RunState::Started{timer}=>timer.time(time),
RunState::Finished{timer}=>timer.time(time),
}
}
2025-01-08 06:36:21 +00:00
pub fn start(&mut self,time:PhysicsTime)->Result<(),Error>{
2024-07-31 20:16:16 +00:00
match &self.state{
RunState::Created=>{
self.state=RunState::Started{
timer:TimerFixed::new(time,Time::ZERO),
};
Ok(())
},
RunState::Started{..}=>Err(Error::AlreadyStarted),
RunState::Finished{..}=>Err(Error::AlreadyFinished),
}
}
2025-01-08 06:36:21 +00:00
pub fn finish(&mut self,time:PhysicsTime)->Result<(),Error>{
2024-07-31 20:16:16 +00:00
//this uses Copy
match &self.state{
RunState::Created=>Err(Error::NotStarted),
RunState::Started{timer}=>{
self.state=RunState::Finished{
timer:timer.into_paused(time),
};
Ok(())
},
RunState::Finished{..}=>Err(Error::AlreadyFinished),
}
}
pub fn flag(&mut self,flag_reason:FlagReason){
//don't replace the first reason the run was flagged
if self.flagged.is_none(){
self.flagged=Some(flag_reason);
}
}
}