mod body; mod push_solve; mod face_crawler; mod model; pub mod physics; // Physics bug fixes can easily desync all bots. // // When replaying a bot, use the exact physics version which it was recorded with. // // When validating a new bot, ignore the version and use the latest version, // and overwrite the version in the file. // // Compatible physics versions should be determined // empirically at development time via leaderboard resimulation. // // Compatible physics versions should result in an identical leaderboard state, // or the only bots which fail are ones exploiting a surgically patched bug. #[derive(Clone,Copy,Hash,Debug,id::Id,Eq,PartialEq,Ord,PartialOrd)] pub struct PhysicsVersion(u32); pub const VERSION:PhysicsVersion=PhysicsVersion(0); const LATEST_COMPATIBLE_VERSION:[u32;1+VERSION.0 as usize]=const{ let compat=[0]; let mut input_version=0; while input_version<compat.len(){ // compatible version must be greater than or equal to the input version assert!(input_version as u32<=compat[input_version]); // compatible version must be a version that exists assert!(compat[input_version]<=VERSION.0); input_version+=1; } compat }; pub enum PhysicsVersionError{ UnknownPhysicsVersion, } pub const fn get_latest_compatible_version(PhysicsVersion(version):PhysicsVersion)->Result<PhysicsVersion,PhysicsVersionError>{ if (version as usize)<LATEST_COMPATIBLE_VERSION.len(){ Ok(PhysicsVersion(LATEST_COMPATIBLE_VERSION[version as usize])) }else{ Err(PhysicsVersionError::UnknownPhysicsVersion) } }