This commit is contained in:
Quaternions 2024-02-01 19:44:17 -08:00
parent d13bff00bf
commit 5a8a1af278
5 changed files with 79 additions and 11 deletions

@ -1,3 +1,4 @@
use crate::model;
use crate::integer::{Time,Planar64,Planar64Vec3};
//you have this effect while in contact
@ -77,7 +78,7 @@ pub struct Wormhole{
//destination does not need to be another wormhole
//this defines a one way portal to a destination model transform
//two of these can create a two way wormhole
pub destination_model_id:u32,
pub destination_model:model::ModelId,
//(position,angles)*=origin.transform.inverse()*destination.transform
}
//attributes listed in order of handling
@ -132,6 +133,12 @@ impl IntersectingAttributes{
}
}
pub struct CollisionAttributesId(u32);
impl CollisionAttributesId{
pub fn new(id:u32)->Self{
Self(id)
}
}
#[derive(Clone,Hash,Eq,PartialEq)]
pub enum CollisionAttributes{
Decoration,//visual only
Contact{//track whether you are contacting the object

@ -33,8 +33,16 @@ pub enum StageElementBehaviour{
#[derive(Clone,Copy,Hash,Eq,PartialEq)]
pub struct CheckpointId(usize);
#[derive(Clone,Hash,Eq,PartialEq)]
#[derive(Clone,Hash,Eq,PartialEq,Ord,PartialOrd)]
pub struct StageId(u32);
impl StageId{
pub const fn id(id:u32)->Self{
Self(id)
}
pub const fn get(self)->u32{
self.0
}
}
pub struct Stage{
spawn:ModelId,
//open world support lol
@ -43,6 +51,16 @@ pub struct Stage{
ordered_checkpoints:HashMap<CheckpointId,ModelId>,
unordered_checkpoints:HashSet<ModelId>,
}
impl Stage{
pub fn new(spawn:ModelId)->Self{
Self{
spawn,
ordered_checkpoints_count:0,
ordered_checkpoints:HashMap::new(),
unordered_checkpoints:HashSet::new(),
}
}
}
#[derive(Default)]
pub struct StageUpdate{
//other behaviour models of this stage can have
@ -62,13 +80,16 @@ pub enum Zone{
Finish,
Anticheat,
}
#[derive(Clone,Hash,Eq,PartialEq)]
#[derive(Clone,Hash,Eq,PartialEq,Ord,PartialOrd)]
pub struct ModeId(u32);
impl ModeId{
pub const MAIN:Self=Self(0);
pub const BONUS:Self=Self(1);
pub const fn mode(mode_id:u32)->Self{
Self(mode_id)
pub const fn id(id:u32)->Self{
Self(id)
}
pub const fn get(&self)->u32{
self.0
}
}
pub struct Mode{
@ -81,6 +102,22 @@ pub struct Mode{
jump_limit:HashMap<ModelId,u32>,
}
impl Mode{
pub fn new(style:gameplay_style::StyleModifiers,start:ModelId)->Self{
Self{
style,
start,
zones:HashMap::new(),
stages:Vec::new(),
elements:HashMap::new(),
jump_limit:HashMap::new(),
}
}
pub fn push_stage(&mut self,stage:Stage){
self.stages.push(stage)
}
pub fn get_stage_mut(&mut self,stage:StageId)->Option<&mut Stage>{
self.stages.get_mut(stage.0 as usize)
}
pub fn get_spawn_model_id(&self,stage:StageId)->Option<ModelId>{
self.stages.get(stage.0 as usize).map(|s|s.spawn)
}
@ -165,6 +202,9 @@ impl Modes{
modes,
}
}
pub fn push_mode(&mut self,mode:Mode){
self.modes.push(mode)
}
pub fn get_mode(&self,mode:ModeId)->Option<&Mode>{
self.modes.get(mode.0 as usize)
}

@ -70,7 +70,7 @@ impl StyleModifiers{
}
}
fn roblox_bhop()->Self{
pub fn roblox_bhop()->Self{
Self{
controls_used:!0,
controls_mask:!0,//&!(Self::CONTROL_MOVEUP|Self::CONTROL_MOVEDOWN),

@ -1,11 +1,11 @@
use std::collections::HashMap;
use crate::model;
use crate::gameplay_modes;
use crate::gameplay_attributes;
//this is the current map data loaded in memory
pub struct Map{
modes:gameplay_modes::Modes,
models:model::Models,
pub modes:gameplay_modes::Modes,
pub models:model::Models,
pub attributes:Vec<gameplay_attributes::CollisionAttributes>,
//RenderPattern
textures:HashMap<u32,Vec<u8>>,
pub textures:Vec<Vec<u8>>,
}

@ -34,6 +34,11 @@ pub struct IndexedPhysicsGroup{
//This is a superset of PhysicsModel and GraphicsModel
#[derive(Clone,Copy,Hash,Eq,PartialEq)]
pub struct IndexedModelId(u32);
impl IndexedModelId{
pub const fn new(id:u32)->Self{
Self(id)
}
}
pub struct IndexedModel{
pub unique_pos:Vec<Planar64Vec3>,//Unit32Vec3
pub unique_normal:Vec<Planar64Vec3>,//Unit32Vec3
@ -50,6 +55,11 @@ pub struct IndexedModel{
#[derive(Clone,Copy,Hash,Eq,PartialEq)]
pub struct ModelId(u32);
impl ModelId{
pub const fn id(id:u32)->Self{
Self(id)
}
}
pub struct Model{
pub model:IndexedModelId,
pub attributes:gameplay_attributes::CollisionAttributesId,
@ -61,6 +71,17 @@ pub struct Models{
indexed_models:HashMap<IndexedModelId,IndexedModel>,
models:HashMap<ModelId,Model>,
}
impl Models{
pub fn new(
indexed_models:HashMap<IndexedModelId,IndexedModel>,
models:HashMap<ModelId,Model>,
)->Self{
Self{
indexed_models,
models,
}
}
}
impl Updatable<Models> for Models{
fn update(&mut self,update:Models){
self.indexed_models.extend(update.indexed_models);