Beatsaber Rust Utilities: A Beatsaber V3 parsing library.
beatsaber beatmap
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Gameplay events, basic events, and difficulty struct.

AlephCubed 200ac09d 26572e45

+92 -31
+14 -29
src/difficulty.rs
··· 1 + pub mod gameplay_event; 1 2 pub mod lightshow; 2 3 pub mod playfield; 3 4 5 + use crate::difficulty::gameplay_event::{BpmEvent, LaneRotationEvent}; 6 + use crate::difficulty::lightshow::basic::{BasicEvent, ColorBoostEvent, SpecialEvent, Waypoints}; 4 7 use crate::difficulty::lightshow::color::ColorEventBox; 5 8 use crate::difficulty::lightshow::rotation::RotationEventBoxGroup; 6 9 use crate::difficulty::playfield::{Arc, Bomb, Chain, Note, Wall}; ··· 12 15 pub struct DifficultyV3_2 { 13 16 pub version: String, 14 17 pub bpm_events: Vec<BpmEvent>, 15 - pub rotation_events: Vec<Value>, 18 + #[serde(rename = "rotationEvents")] 19 + pub lane_rotation_events: Vec<LaneRotationEvent>, 16 20 #[serde(rename = "colorNotes")] 17 21 pub notes: Vec<Note>, 18 22 #[serde(rename = "bombNotes")] ··· 23 27 pub arcs: Vec<Arc>, 24 28 #[serde(rename = "burstSliders")] 25 29 pub chains: Vec<Chain>, 26 - pub waypoints: Vec<Value>, 27 - pub basic_beatmap_events: Vec<Value>, 28 - pub color_boost_beatmap_events: Vec<ColorBoostEvent>, 30 + pub waypoints: Vec<Waypoints>, 31 + #[serde(rename = "basicBeatmapEvents")] 32 + pub basic_events: Vec<BasicEvent>, 33 + #[serde(rename = "colorBoostBeatmapEvents")] 34 + pub color_boost_events: Vec<ColorBoostEvent>, 29 35 #[serde(rename = "lightColorEventBoxGroups")] 30 36 pub color_event_boxes: Vec<ColorEventBox>, 31 37 #[serde(rename = "lightRotationEventBoxGroups")] 32 38 pub rotation_event_boxes: Vec<RotationEventBoxGroup>, 33 39 #[serde(rename = "lightTranslationEventBoxGroups")] 34 - pub translation_event_boxes: Vec<Value>, 35 - pub basic_event_types_with_keywords: BasicEventTypesWithKeywords, 40 + pub translation_event_boxes: Vec<Value>, // Todo 41 + #[doc(alias = "keyword_events")] 42 + #[serde(rename = "basicEventTypesWithKeywords")] 43 + pub special_events: SpecialEvent, 36 44 pub use_normal_events_as_compatible_events: bool, 37 45 } 38 - 39 - #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 40 - #[serde(rename_all = "camelCase")] 41 - pub struct BpmEvent { 42 - #[serde(rename = "b")] 43 - pub beat: f32, 44 - #[serde(rename = "m")] 45 - pub bpm: i32, 46 - } 47 - 48 - #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 49 - #[serde(rename_all = "camelCase")] 50 - pub struct ColorBoostEvent { 51 - #[serde(rename = "b")] 52 - pub beat: f32, 53 - pub o: bool, 54 - } 55 - 56 - #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 57 - #[serde(rename_all = "camelCase")] 58 - pub struct BasicEventTypesWithKeywords { 59 - pub d: Vec<Value>, 60 - }
+20
src/difficulty/gameplay_event.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + 3 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 4 + pub struct LaneRotationEvent { 5 + #[serde(rename = "b")] 6 + pub beat: f32, 7 + #[serde(rename = "e")] 8 + pub execution_time: i32, 9 + #[serde(rename = "r")] 10 + pub degrees: f32, 11 + } 12 + 13 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 14 + #[serde(rename_all = "camelCase")] 15 + pub struct BpmEvent { 16 + #[serde(rename = "b")] 17 + pub beat: f32, 18 + #[serde(rename = "m")] 19 + pub bpm: i32, 20 + }
+2 -1
src/difficulty/lightshow.rs
··· 1 1 use crate::loose_enum; 2 2 use serde::{Deserialize, Serialize}; 3 3 4 + pub mod basic; 4 5 pub mod color; 5 - mod easing; 6 + pub mod easing; 6 7 pub mod rotation; 7 8 8 9 #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
+55
src/difficulty/lightshow/basic.rs
··· 1 + use crate::difficulty::playfield::CutDirection; 2 + use serde::{Deserialize, Serialize}; 3 + 4 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 5 + pub struct BasicEvent { 6 + #[serde(rename = "b")] 7 + pub beat: f32, 8 + #[serde(rename = "et")] 9 + pub event_type: i32, 10 + #[serde(rename = "i")] 11 + pub value: i32, 12 + #[serde(rename = "f")] 13 + pub float: f32, 14 + } 15 + 16 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 17 + pub struct Waypoints { 18 + #[serde(rename = "b")] 19 + pub beat: f32, 20 + #[serde(rename = "x")] 21 + pub col: u8, 22 + #[serde(rename = "y")] 23 + pub row: u8, 24 + #[serde(rename = "d")] 25 + pub direction: CutDirection, 26 + } 27 + 28 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 29 + #[serde(rename_all = "camelCase")] 30 + pub struct ColorBoostEvent { 31 + #[serde(rename = "b")] 32 + pub beat: f32, 33 + #[serde(rename = "o")] 34 + pub boost: bool, 35 + } 36 + 37 + /// An event containing an array of Special Event Keywords. 38 + /// More info [here](https://bsmg.wiki/mapping/map-format/lightshow.html#special-event-keywords). 39 + #[doc(alias = "KeywordEvent")] 40 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct SpecialEvent { 43 + #[serde(rename = "d")] 44 + pub keywords: Vec<Keyword>, 45 + } 46 + 47 + /// Allows basic event lanes to be overridden with environment-specific behaviour, using secret keys. 48 + /// More info [here](https://bsmg.wiki/mapping/map-format/lightshow.html#special-event-keywords). 49 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 50 + pub struct Keyword { 51 + #[serde(rename = "k")] 52 + pub keyword: String, 53 + #[serde(rename = "e")] 54 + pub event_types: Vec<i32>, 55 + }
+1 -1
src/lib.rs
··· 1 1 pub mod difficulty; 2 2 pub mod info; 3 - mod macros; 3 + pub mod macros; 4 4 5 5 pub fn add(left: u64, right: u64) -> u64 { 6 6 left + right