1#![allow(clippy::all, clippy::pedantic)]
8
9use std::{
10 cmp::Ordering,
11 collections::HashMap,
12 fmt::{Display, Formatter, Result as FmtResult},
13};
14
15use crate::{Acronym, GameModSimple, GameMode, SettingSimple};
16
17mod all_structs {
18 #[derive(Clone, Debug, Default, PartialEq)]
20 #[cfg_attr(
21 feature = "rkyv",
22 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
23 )]
24 pub struct EasyOsu {
25 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
27 pub retries: Option<f64>,
28 }
29 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
31 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
32 pub struct NoFailOsu {}
33 #[derive(Clone, Debug, Default, PartialEq)]
35 #[cfg_attr(
36 feature = "rkyv",
37 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
38 )]
39 pub struct HalfTimeOsu {
40 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
42 pub speed_change: Option<f64>,
43 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
45 pub adjust_pitch: Option<bool>,
46 }
47 #[derive(Clone, Debug, Default, PartialEq)]
49 #[cfg_attr(
50 feature = "rkyv",
51 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
52 )]
53 pub struct DaycoreOsu {
54 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
56 pub speed_change: Option<f64>,
57 }
58 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
60 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
61 pub struct HardRockOsu {}
62 #[derive(Clone, Debug, Default, PartialEq)]
64 #[cfg_attr(
65 feature = "rkyv",
66 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
67 )]
68 pub struct SuddenDeathOsu {
69 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
71 pub fail_on_slider_tail: Option<bool>,
72 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
74 pub restart: Option<bool>,
75 }
76 #[derive(Clone, Debug, Default, PartialEq)]
78 #[cfg_attr(
79 feature = "rkyv",
80 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
81 )]
82 pub struct PerfectOsu {
83 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
85 pub restart: Option<bool>,
86 }
87 #[derive(Clone, Debug, Default, PartialEq)]
89 #[cfg_attr(
90 feature = "rkyv",
91 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
92 )]
93 pub struct DoubleTimeOsu {
94 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
96 pub speed_change: Option<f64>,
97 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
99 pub adjust_pitch: Option<bool>,
100 }
101 #[derive(Clone, Debug, Default, PartialEq)]
103 #[cfg_attr(
104 feature = "rkyv",
105 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
106 )]
107 pub struct NightcoreOsu {
108 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
110 pub speed_change: Option<f64>,
111 }
112 #[derive(Clone, Debug, Default, PartialEq)]
114 #[cfg_attr(
115 feature = "rkyv",
116 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
117 )]
118 pub struct HiddenOsu {
119 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
121 pub only_fade_approach_circles: Option<bool>,
122 }
123 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
125 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
126 pub struct TraceableOsu {}
127 #[derive(Clone, Debug, Default, PartialEq)]
129 #[cfg_attr(
130 feature = "rkyv",
131 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
132 )]
133 pub struct FlashlightOsu {
134 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
136 pub follow_delay: Option<f64>,
137 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
139 pub size_multiplier: Option<f64>,
140 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
142 pub combo_based_size: Option<bool>,
143 }
144 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
146 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
147 pub struct BlindsOsu {}
148 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
150 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
151 pub struct StrictTrackingOsu {}
152 #[derive(Clone, Debug, Default, PartialEq)]
154 #[cfg_attr(
155 feature = "rkyv",
156 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
157 )]
158 pub struct AccuracyChallengeOsu {
159 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
161 pub minimum_accuracy: Option<f64>,
162 pub accuracy_judge_mode: Option<String>,
164 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
166 pub restart: Option<bool>,
167 }
168 #[derive(Clone, Debug, Default, PartialEq)]
170 #[cfg_attr(
171 feature = "rkyv",
172 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
173 )]
174 pub struct TargetPracticeOsu {
175 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
177 pub seed: Option<f64>,
178 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
180 pub metronome: Option<bool>,
181 }
182 #[derive(Clone, Debug, Default, PartialEq)]
184 #[cfg_attr(
185 feature = "rkyv",
186 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
187 )]
188 pub struct DifficultyAdjustOsu {
189 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
191 pub circle_size: Option<f64>,
192 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
194 pub approach_rate: Option<f64>,
195 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
197 pub drain_rate: Option<f64>,
198 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
200 pub overall_difficulty: Option<f64>,
201 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
203 pub extended_limits: Option<bool>,
204 }
205 #[derive(Clone, Debug, Default, PartialEq)]
207 #[cfg_attr(
208 feature = "rkyv",
209 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
210 )]
211 pub struct ClassicOsu {
212 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
214 pub no_slider_head_accuracy: Option<bool>,
215 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
217 pub classic_note_lock: Option<bool>,
218 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
220 pub always_play_tail_sample: Option<bool>,
221 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
223 pub fade_hit_circle_early: Option<bool>,
224 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
226 pub classic_health: Option<bool>,
227 }
228 #[derive(Clone, Debug, Default, PartialEq)]
230 #[cfg_attr(
231 feature = "rkyv",
232 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
233 )]
234 pub struct RandomOsu {
235 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
237 pub angle_sharpness: Option<f64>,
238 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
240 pub seed: Option<f64>,
241 }
242 #[derive(Clone, Debug, Default, PartialEq)]
244 #[cfg_attr(
245 feature = "rkyv",
246 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
247 )]
248 pub struct MirrorOsu {
249 pub reflection: Option<String>,
251 }
252 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
254 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
255 pub struct AlternateOsu {}
256 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
258 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
259 pub struct SingleTapOsu {}
260 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
262 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
263 pub struct AutoplayOsu {}
264 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
266 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
267 pub struct CinemaOsu {}
268 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
270 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
271 pub struct RelaxOsu {}
272 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
274 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
275 pub struct AutopilotOsu {}
276 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
278 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
279 pub struct SpunOutOsu {}
280 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
282 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
283 pub struct TransformOsu {}
284 #[derive(Clone, Debug, Default, PartialEq)]
286 #[cfg_attr(
287 feature = "rkyv",
288 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
289 )]
290 pub struct WiggleOsu {
291 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
293 pub strength: Option<f64>,
294 }
295 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
297 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
298 pub struct SpinInOsu {}
299 #[derive(Clone, Debug, Default, PartialEq)]
301 #[cfg_attr(
302 feature = "rkyv",
303 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
304 )]
305 pub struct GrowOsu {
306 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
308 pub start_scale: Option<f64>,
309 }
310 #[derive(Clone, Debug, Default, PartialEq)]
312 #[cfg_attr(
313 feature = "rkyv",
314 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
315 )]
316 pub struct DeflateOsu {
317 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
319 pub start_scale: Option<f64>,
320 }
321 #[derive(Clone, Debug, Default, PartialEq)]
323 #[cfg_attr(
324 feature = "rkyv",
325 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
326 )]
327 pub struct WindUpOsu {
328 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
330 pub initial_rate: Option<f64>,
331 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
333 pub final_rate: Option<f64>,
334 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
336 pub adjust_pitch: Option<bool>,
337 }
338 #[derive(Clone, Debug, Default, PartialEq)]
340 #[cfg_attr(
341 feature = "rkyv",
342 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
343 )]
344 pub struct WindDownOsu {
345 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
347 pub initial_rate: Option<f64>,
348 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
350 pub final_rate: Option<f64>,
351 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
353 pub adjust_pitch: Option<bool>,
354 }
355 #[derive(Clone, Debug, Default, PartialEq)]
357 #[cfg_attr(
358 feature = "rkyv",
359 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
360 )]
361 pub struct BarrelRollOsu {
362 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
364 pub spin_speed: Option<f64>,
365 pub direction: Option<String>,
367 }
368 #[derive(Clone, Debug, Default, PartialEq)]
370 #[cfg_attr(
371 feature = "rkyv",
372 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
373 )]
374 pub struct ApproachDifferentOsu {
375 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
377 pub scale: Option<f64>,
378 pub style: Option<String>,
380 }
381 #[derive(Clone, Debug, Default, PartialEq)]
383 #[cfg_attr(
384 feature = "rkyv",
385 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
386 )]
387 pub struct MutedOsu {
388 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
390 pub inverse_muting: Option<bool>,
391 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
393 pub enable_metronome: Option<bool>,
394 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
396 pub mute_combo_count: Option<f64>,
397 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
399 pub affects_hit_sounds: Option<bool>,
400 }
401 #[derive(Clone, Debug, Default, PartialEq)]
403 #[cfg_attr(
404 feature = "rkyv",
405 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
406 )]
407 pub struct NoScopeOsu {
408 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
410 pub hidden_combo_count: Option<f64>,
411 }
412 #[derive(Clone, Debug, Default, PartialEq)]
414 #[cfg_attr(
415 feature = "rkyv",
416 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
417 )]
418 pub struct MagnetisedOsu {
419 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
421 pub attraction_strength: Option<f64>,
422 }
423 #[derive(Clone, Debug, Default, PartialEq)]
425 #[cfg_attr(
426 feature = "rkyv",
427 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
428 )]
429 pub struct RepelOsu {
430 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
432 pub repulsion_strength: Option<f64>,
433 }
434 #[derive(Clone, Debug, Default, PartialEq)]
436 #[cfg_attr(
437 feature = "rkyv",
438 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
439 )]
440 pub struct AdaptiveSpeedOsu {
441 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
443 pub initial_rate: Option<f64>,
444 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
446 pub adjust_pitch: Option<bool>,
447 }
448 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
450 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
451 pub struct FreezeFrameOsu {}
452 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
454 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
455 pub struct BubblesOsu {}
456 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
458 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
459 pub struct SynesthesiaOsu {}
460 #[derive(Clone, Debug, Default, PartialEq)]
462 #[cfg_attr(
463 feature = "rkyv",
464 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
465 )]
466 pub struct DepthOsu {
467 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
469 pub max_depth: Option<f64>,
470 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
472 pub show_approach_circles: Option<bool>,
473 }
474 #[derive(Clone, Debug, Default, PartialEq)]
476 #[cfg_attr(
477 feature = "rkyv",
478 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
479 )]
480 pub struct BloomOsu {
481 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
483 pub max_size_combo_count: Option<f64>,
484 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
486 pub max_cursor_size: Option<f64>,
487 }
488 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
490 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
491 pub struct TouchDeviceOsu {}
492 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
494 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
495 pub struct ScoreV2Osu {}
496 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
498 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
499 pub struct EasyTaiko {}
500 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
502 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
503 pub struct NoFailTaiko {}
504 #[derive(Clone, Debug, Default, PartialEq)]
506 #[cfg_attr(
507 feature = "rkyv",
508 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
509 )]
510 pub struct HalfTimeTaiko {
511 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
513 pub speed_change: Option<f64>,
514 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
516 pub adjust_pitch: Option<bool>,
517 }
518 #[derive(Clone, Debug, Default, PartialEq)]
520 #[cfg_attr(
521 feature = "rkyv",
522 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
523 )]
524 pub struct DaycoreTaiko {
525 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
527 pub speed_change: Option<f64>,
528 }
529 #[derive(Clone, Debug, Default, PartialEq)]
531 #[cfg_attr(
532 feature = "rkyv",
533 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
534 )]
535 pub struct SimplifiedRhythmTaiko {
536 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
538 pub one_third_conversion: Option<bool>,
539 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
541 pub one_sixth_conversion: Option<bool>,
542 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
544 pub one_eighth_conversion: Option<bool>,
545 }
546 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
548 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
549 pub struct HardRockTaiko {}
550 #[derive(Clone, Debug, Default, PartialEq)]
552 #[cfg_attr(
553 feature = "rkyv",
554 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
555 )]
556 pub struct SuddenDeathTaiko {
557 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
559 pub restart: Option<bool>,
560 }
561 #[derive(Clone, Debug, Default, PartialEq)]
563 #[cfg_attr(
564 feature = "rkyv",
565 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
566 )]
567 pub struct PerfectTaiko {
568 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
570 pub restart: Option<bool>,
571 }
572 #[derive(Clone, Debug, Default, PartialEq)]
574 #[cfg_attr(
575 feature = "rkyv",
576 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
577 )]
578 pub struct DoubleTimeTaiko {
579 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
581 pub speed_change: Option<f64>,
582 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
584 pub adjust_pitch: Option<bool>,
585 }
586 #[derive(Clone, Debug, Default, PartialEq)]
588 #[cfg_attr(
589 feature = "rkyv",
590 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
591 )]
592 pub struct NightcoreTaiko {
593 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
595 pub speed_change: Option<f64>,
596 }
597 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
599 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
600 pub struct HiddenTaiko {}
601 #[derive(Clone, Debug, Default, PartialEq)]
603 #[cfg_attr(
604 feature = "rkyv",
605 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
606 )]
607 pub struct FlashlightTaiko {
608 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
610 pub size_multiplier: Option<f64>,
611 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
613 pub combo_based_size: Option<bool>,
614 }
615 #[derive(Clone, Debug, Default, PartialEq)]
617 #[cfg_attr(
618 feature = "rkyv",
619 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
620 )]
621 pub struct AccuracyChallengeTaiko {
622 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
624 pub minimum_accuracy: Option<f64>,
625 pub accuracy_judge_mode: Option<String>,
627 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
629 pub restart: Option<bool>,
630 }
631 #[derive(Clone, Debug, Default, PartialEq)]
633 #[cfg_attr(
634 feature = "rkyv",
635 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
636 )]
637 pub struct RandomTaiko {
638 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
640 pub seed: Option<f64>,
641 }
642 #[derive(Clone, Debug, Default, PartialEq)]
644 #[cfg_attr(
645 feature = "rkyv",
646 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
647 )]
648 pub struct DifficultyAdjustTaiko {
649 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
651 pub scroll_speed: Option<f64>,
652 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
654 pub drain_rate: Option<f64>,
655 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
657 pub overall_difficulty: Option<f64>,
658 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
660 pub extended_limits: Option<bool>,
661 }
662 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
664 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
665 pub struct ClassicTaiko {}
666 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
668 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
669 pub struct SwapTaiko {}
670 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
672 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
673 pub struct SingleTapTaiko {}
674 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
676 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
677 pub struct ConstantSpeedTaiko {}
678 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
680 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
681 pub struct AutoplayTaiko {}
682 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
684 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
685 pub struct CinemaTaiko {}
686 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
688 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
689 pub struct RelaxTaiko {}
690 #[derive(Clone, Debug, Default, PartialEq)]
692 #[cfg_attr(
693 feature = "rkyv",
694 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
695 )]
696 pub struct WindUpTaiko {
697 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
699 pub initial_rate: Option<f64>,
700 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
702 pub final_rate: Option<f64>,
703 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
705 pub adjust_pitch: Option<bool>,
706 }
707 #[derive(Clone, Debug, Default, PartialEq)]
709 #[cfg_attr(
710 feature = "rkyv",
711 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
712 )]
713 pub struct WindDownTaiko {
714 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
716 pub initial_rate: Option<f64>,
717 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
719 pub final_rate: Option<f64>,
720 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
722 pub adjust_pitch: Option<bool>,
723 }
724 #[derive(Clone, Debug, Default, PartialEq)]
726 #[cfg_attr(
727 feature = "rkyv",
728 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
729 )]
730 pub struct MutedTaiko {
731 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
733 pub inverse_muting: Option<bool>,
734 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
736 pub enable_metronome: Option<bool>,
737 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
739 pub mute_combo_count: Option<f64>,
740 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
742 pub affects_hit_sounds: Option<bool>,
743 }
744 #[derive(Clone, Debug, Default, PartialEq)]
746 #[cfg_attr(
747 feature = "rkyv",
748 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
749 )]
750 pub struct AdaptiveSpeedTaiko {
751 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
753 pub initial_rate: Option<f64>,
754 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
756 pub adjust_pitch: Option<bool>,
757 }
758 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
760 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
761 pub struct ScoreV2Taiko {}
762 #[derive(Clone, Debug, Default, PartialEq)]
764 #[cfg_attr(
765 feature = "rkyv",
766 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
767 )]
768 pub struct EasyCatch {
769 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
771 pub retries: Option<f64>,
772 }
773 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
775 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
776 pub struct NoFailCatch {}
777 #[derive(Clone, Debug, Default, PartialEq)]
779 #[cfg_attr(
780 feature = "rkyv",
781 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
782 )]
783 pub struct HalfTimeCatch {
784 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
786 pub speed_change: Option<f64>,
787 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
789 pub adjust_pitch: Option<bool>,
790 }
791 #[derive(Clone, Debug, Default, PartialEq)]
793 #[cfg_attr(
794 feature = "rkyv",
795 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
796 )]
797 pub struct DaycoreCatch {
798 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
800 pub speed_change: Option<f64>,
801 }
802 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
804 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
805 pub struct HardRockCatch {}
806 #[derive(Clone, Debug, Default, PartialEq)]
808 #[cfg_attr(
809 feature = "rkyv",
810 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
811 )]
812 pub struct SuddenDeathCatch {
813 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
815 pub restart: Option<bool>,
816 }
817 #[derive(Clone, Debug, Default, PartialEq)]
819 #[cfg_attr(
820 feature = "rkyv",
821 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
822 )]
823 pub struct PerfectCatch {
824 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
826 pub restart: Option<bool>,
827 }
828 #[derive(Clone, Debug, Default, PartialEq)]
830 #[cfg_attr(
831 feature = "rkyv",
832 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
833 )]
834 pub struct DoubleTimeCatch {
835 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
837 pub speed_change: Option<f64>,
838 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
840 pub adjust_pitch: Option<bool>,
841 }
842 #[derive(Clone, Debug, Default, PartialEq)]
844 #[cfg_attr(
845 feature = "rkyv",
846 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
847 )]
848 pub struct NightcoreCatch {
849 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
851 pub speed_change: Option<f64>,
852 }
853 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
855 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
856 pub struct HiddenCatch {}
857 #[derive(Clone, Debug, Default, PartialEq)]
859 #[cfg_attr(
860 feature = "rkyv",
861 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
862 )]
863 pub struct FlashlightCatch {
864 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
866 pub size_multiplier: Option<f64>,
867 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
869 pub combo_based_size: Option<bool>,
870 }
871 #[derive(Clone, Debug, Default, PartialEq)]
873 #[cfg_attr(
874 feature = "rkyv",
875 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
876 )]
877 pub struct AccuracyChallengeCatch {
878 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
880 pub minimum_accuracy: Option<f64>,
881 pub accuracy_judge_mode: Option<String>,
883 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
885 pub restart: Option<bool>,
886 }
887 #[derive(Clone, Debug, Default, PartialEq)]
889 #[cfg_attr(
890 feature = "rkyv",
891 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
892 )]
893 pub struct DifficultyAdjustCatch {
894 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
896 pub circle_size: Option<f64>,
897 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
899 pub approach_rate: Option<f64>,
900 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
902 pub hard_rock_offsets: Option<bool>,
903 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
905 pub drain_rate: Option<f64>,
906 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
908 pub overall_difficulty: Option<f64>,
909 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
911 pub extended_limits: Option<bool>,
912 }
913 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
915 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
916 pub struct ClassicCatch {}
917 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
919 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
920 pub struct MirrorCatch {}
921 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
923 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
924 pub struct AutoplayCatch {}
925 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
927 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
928 pub struct CinemaCatch {}
929 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
931 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
932 pub struct RelaxCatch {}
933 #[derive(Clone, Debug, Default, PartialEq)]
935 #[cfg_attr(
936 feature = "rkyv",
937 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
938 )]
939 pub struct WindUpCatch {
940 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
942 pub initial_rate: Option<f64>,
943 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
945 pub final_rate: Option<f64>,
946 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
948 pub adjust_pitch: Option<bool>,
949 }
950 #[derive(Clone, Debug, Default, PartialEq)]
952 #[cfg_attr(
953 feature = "rkyv",
954 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
955 )]
956 pub struct WindDownCatch {
957 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
959 pub initial_rate: Option<f64>,
960 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
962 pub final_rate: Option<f64>,
963 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
965 pub adjust_pitch: Option<bool>,
966 }
967 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
969 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
970 pub struct FloatingFruitsCatch {}
971 #[derive(Clone, Debug, Default, PartialEq)]
973 #[cfg_attr(
974 feature = "rkyv",
975 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
976 )]
977 pub struct MutedCatch {
978 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
980 pub inverse_muting: Option<bool>,
981 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
983 pub enable_metronome: Option<bool>,
984 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
986 pub mute_combo_count: Option<f64>,
987 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
989 pub affects_hit_sounds: Option<bool>,
990 }
991 #[derive(Clone, Debug, Default, PartialEq)]
993 #[cfg_attr(
994 feature = "rkyv",
995 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
996 )]
997 pub struct NoScopeCatch {
998 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1000 pub hidden_combo_count: Option<f64>,
1001 }
1002 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1004 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1005 pub struct MovingFastCatch {}
1006 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1008 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1009 pub struct ScoreV2Catch {}
1010 #[derive(Clone, Debug, Default, PartialEq)]
1012 #[cfg_attr(
1013 feature = "rkyv",
1014 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1015 )]
1016 pub struct EasyMania {
1017 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1019 pub retries: Option<f64>,
1020 }
1021 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1023 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1024 pub struct NoFailMania {}
1025 #[derive(Clone, Debug, Default, PartialEq)]
1027 #[cfg_attr(
1028 feature = "rkyv",
1029 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1030 )]
1031 pub struct HalfTimeMania {
1032 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1034 pub speed_change: Option<f64>,
1035 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1037 pub adjust_pitch: Option<bool>,
1038 }
1039 #[derive(Clone, Debug, Default, PartialEq)]
1041 #[cfg_attr(
1042 feature = "rkyv",
1043 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1044 )]
1045 pub struct DaycoreMania {
1046 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1048 pub speed_change: Option<f64>,
1049 }
1050 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1052 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1053 pub struct NoReleaseMania {}
1054 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1056 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1057 pub struct HardRockMania {}
1058 #[derive(Clone, Debug, Default, PartialEq)]
1060 #[cfg_attr(
1061 feature = "rkyv",
1062 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1063 )]
1064 pub struct SuddenDeathMania {
1065 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1067 pub restart: Option<bool>,
1068 }
1069 #[derive(Clone, Debug, Default, PartialEq)]
1071 #[cfg_attr(
1072 feature = "rkyv",
1073 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1074 )]
1075 pub struct PerfectMania {
1076 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1078 pub require_perfect_hits: Option<bool>,
1079 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1081 pub restart: Option<bool>,
1082 }
1083 #[derive(Clone, Debug, Default, PartialEq)]
1085 #[cfg_attr(
1086 feature = "rkyv",
1087 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1088 )]
1089 pub struct DoubleTimeMania {
1090 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1092 pub speed_change: Option<f64>,
1093 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1095 pub adjust_pitch: Option<bool>,
1096 }
1097 #[derive(Clone, Debug, Default, PartialEq)]
1099 #[cfg_attr(
1100 feature = "rkyv",
1101 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1102 )]
1103 pub struct NightcoreMania {
1104 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1106 pub speed_change: Option<f64>,
1107 }
1108 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1110 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1111 pub struct FadeInMania {}
1112 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1114 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1115 pub struct HiddenMania {}
1116 #[derive(Clone, Debug, Default, PartialEq)]
1118 #[cfg_attr(
1119 feature = "rkyv",
1120 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1121 )]
1122 pub struct CoverMania {
1123 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1125 pub coverage: Option<f64>,
1126 pub direction: Option<String>,
1128 }
1129 #[derive(Clone, Debug, Default, PartialEq)]
1131 #[cfg_attr(
1132 feature = "rkyv",
1133 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1134 )]
1135 pub struct FlashlightMania {
1136 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1138 pub size_multiplier: Option<f64>,
1139 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1141 pub combo_based_size: Option<bool>,
1142 }
1143 #[derive(Clone, Debug, Default, PartialEq)]
1145 #[cfg_attr(
1146 feature = "rkyv",
1147 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1148 )]
1149 pub struct AccuracyChallengeMania {
1150 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1152 pub minimum_accuracy: Option<f64>,
1153 pub accuracy_judge_mode: Option<String>,
1155 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1157 pub restart: Option<bool>,
1158 }
1159 #[derive(Clone, Debug, Default, PartialEq)]
1161 #[cfg_attr(
1162 feature = "rkyv",
1163 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1164 )]
1165 pub struct RandomMania {
1166 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1168 pub seed: Option<f64>,
1169 }
1170 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1172 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1173 pub struct DualStagesMania {}
1174 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1176 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1177 pub struct MirrorMania {}
1178 #[derive(Clone, Debug, Default, PartialEq)]
1180 #[cfg_attr(
1181 feature = "rkyv",
1182 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1183 )]
1184 pub struct DifficultyAdjustMania {
1185 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1187 pub overall_difficulty: Option<f64>,
1188 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1190 pub drain_rate: Option<f64>,
1191 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1193 pub extended_limits: Option<bool>,
1194 }
1195 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1197 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1198 pub struct ClassicMania {}
1199 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1201 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1202 pub struct InvertMania {}
1203 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1205 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1206 pub struct ConstantSpeedMania {}
1207 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1209 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1210 pub struct HoldOffMania {}
1211 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1213 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1214 pub struct OneKeyMania {}
1215 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1217 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1218 pub struct TwoKeysMania {}
1219 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1221 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1222 pub struct ThreeKeysMania {}
1223 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1225 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1226 pub struct FourKeysMania {}
1227 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1229 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1230 pub struct FiveKeysMania {}
1231 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1233 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1234 pub struct SixKeysMania {}
1235 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1237 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1238 pub struct SevenKeysMania {}
1239 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1241 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1242 pub struct EightKeysMania {}
1243 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1245 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1246 pub struct NineKeysMania {}
1247 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1249 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1250 pub struct TenKeysMania {}
1251 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1253 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1254 pub struct AutoplayMania {}
1255 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1257 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1258 pub struct CinemaMania {}
1259 #[derive(Clone, Debug, Default, PartialEq)]
1261 #[cfg_attr(
1262 feature = "rkyv",
1263 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1264 )]
1265 pub struct WindUpMania {
1266 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1268 pub initial_rate: Option<f64>,
1269 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1271 pub final_rate: Option<f64>,
1272 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1274 pub adjust_pitch: Option<bool>,
1275 }
1276 #[derive(Clone, Debug, Default, PartialEq)]
1278 #[cfg_attr(
1279 feature = "rkyv",
1280 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1281 )]
1282 pub struct WindDownMania {
1283 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1285 pub initial_rate: Option<f64>,
1286 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1288 pub final_rate: Option<f64>,
1289 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1291 pub adjust_pitch: Option<bool>,
1292 }
1293 #[derive(Clone, Debug, Default, PartialEq)]
1295 #[cfg_attr(
1296 feature = "rkyv",
1297 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1298 )]
1299 pub struct MutedMania {
1300 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1302 pub inverse_muting: Option<bool>,
1303 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1305 pub enable_metronome: Option<bool>,
1306 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1308 pub mute_combo_count: Option<f64>,
1309 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1311 pub affects_hit_sounds: Option<bool>,
1312 }
1313 #[derive(Clone, Debug, Default, PartialEq)]
1315 #[cfg_attr(
1316 feature = "rkyv",
1317 derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
1318 )]
1319 pub struct AdaptiveSpeedMania {
1320 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::NaN>))]
1322 pub initial_rate: Option<f64>,
1323 #[cfg_attr(feature = "rkyv", rkyv(with = rkyv::with::NicheInto<rkyv::niche::niching::Bool>))]
1325 pub adjust_pitch: Option<bool>,
1326 }
1327 #[derive(Copy, Eq, Clone, Debug, Default, PartialEq)]
1329 #[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self), repr(transparent))]
1330 pub struct ScoreV2Mania {}
1331 #[derive(Copy, Eq, Clone, Debug, PartialEq, PartialOrd, Ord, Hash)]
1333 #[cfg_attr(feature = "rkyv",derive(rkyv::Archive,rkyv::Serialize,rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),bytecheck(crate = rkyv::bytecheck),rkyv(as = Self),repr(transparent),)]
1334 pub struct UnknownMod {
1335 pub acronym: crate::Acronym,
1336 }
1337}
1338use crate::GameModKind;
1339pub use all_structs::{
1340 AccuracyChallengeCatch, AccuracyChallengeMania, AccuracyChallengeOsu, AccuracyChallengeTaiko,
1341 AdaptiveSpeedMania, AdaptiveSpeedOsu, AdaptiveSpeedTaiko, AlternateOsu, ApproachDifferentOsu,
1342 AutopilotOsu, AutoplayCatch, AutoplayMania, AutoplayOsu, AutoplayTaiko, BarrelRollOsu,
1343 BlindsOsu, BloomOsu, BubblesOsu, CinemaCatch, CinemaMania, CinemaOsu, CinemaTaiko,
1344 ClassicCatch, ClassicMania, ClassicOsu, ClassicTaiko, ConstantSpeedMania, ConstantSpeedTaiko,
1345 CoverMania, DaycoreCatch, DaycoreMania, DaycoreOsu, DaycoreTaiko, DeflateOsu, DepthOsu,
1346 DifficultyAdjustCatch, DifficultyAdjustMania, DifficultyAdjustOsu, DifficultyAdjustTaiko,
1347 DoubleTimeCatch, DoubleTimeMania, DoubleTimeOsu, DoubleTimeTaiko, DualStagesMania, EasyCatch,
1348 EasyMania, EasyOsu, EasyTaiko, EightKeysMania, FadeInMania, FiveKeysMania, FlashlightCatch,
1349 FlashlightMania, FlashlightOsu, FlashlightTaiko, FloatingFruitsCatch, FourKeysMania,
1350 FreezeFrameOsu, GrowOsu, HalfTimeCatch, HalfTimeMania, HalfTimeOsu, HalfTimeTaiko,
1351 HardRockCatch, HardRockMania, HardRockOsu, HardRockTaiko, HiddenCatch, HiddenMania, HiddenOsu,
1352 HiddenTaiko, HoldOffMania, InvertMania, MagnetisedOsu, MirrorCatch, MirrorMania, MirrorOsu,
1353 MovingFastCatch, MutedCatch, MutedMania, MutedOsu, MutedTaiko, NightcoreCatch, NightcoreMania,
1354 NightcoreOsu, NightcoreTaiko, NineKeysMania, NoFailCatch, NoFailMania, NoFailOsu, NoFailTaiko,
1355 NoReleaseMania, NoScopeCatch, NoScopeOsu, OneKeyMania, PerfectCatch, PerfectMania, PerfectOsu,
1356 PerfectTaiko, RandomMania, RandomOsu, RandomTaiko, RelaxCatch, RelaxOsu, RelaxTaiko, RepelOsu,
1357 ScoreV2Catch, ScoreV2Mania, ScoreV2Osu, ScoreV2Taiko, SevenKeysMania, SimplifiedRhythmTaiko,
1358 SingleTapOsu, SingleTapTaiko, SixKeysMania, SpinInOsu, SpunOutOsu, StrictTrackingOsu,
1359 SuddenDeathCatch, SuddenDeathMania, SuddenDeathOsu, SuddenDeathTaiko, SwapTaiko,
1360 SynesthesiaOsu, TargetPracticeOsu, TenKeysMania, ThreeKeysMania, TouchDeviceOsu, TraceableOsu,
1361 TransformOsu, TwoKeysMania, UnknownMod, WiggleOsu, WindDownCatch, WindDownMania, WindDownOsu,
1362 WindDownTaiko, WindUpCatch, WindUpMania, WindUpOsu, WindUpTaiko,
1363};
1364pub use gamemod::GameMod;
1365pub use intermode::GameModIntermode;
1366#[cfg(feature = "rkyv")]
1368#[cfg_attr(all(docsrs, not(doctest)), doc(cfg(feature = "rkyv")))]
1369#[doc(hidden)]
1370pub mod rkyv {
1371 pub use super::all_structs::{
1372 AccuracyChallengeCatchResolver, AccuracyChallengeManiaResolver,
1373 AccuracyChallengeOsuResolver, AccuracyChallengeTaikoResolver, AdaptiveSpeedManiaResolver,
1374 AdaptiveSpeedOsuResolver, AdaptiveSpeedTaikoResolver, AlternateOsuResolver,
1375 ApproachDifferentOsuResolver, ArchivedAccuracyChallengeCatch,
1376 ArchivedAccuracyChallengeMania, ArchivedAccuracyChallengeOsu,
1377 ArchivedAccuracyChallengeTaiko, ArchivedAdaptiveSpeedMania, ArchivedAdaptiveSpeedOsu,
1378 ArchivedAdaptiveSpeedTaiko, ArchivedApproachDifferentOsu, ArchivedBarrelRollOsu,
1379 ArchivedBloomOsu, ArchivedClassicOsu, ArchivedCoverMania, ArchivedDaycoreCatch,
1380 ArchivedDaycoreMania, ArchivedDaycoreOsu, ArchivedDaycoreTaiko, ArchivedDeflateOsu,
1381 ArchivedDepthOsu, ArchivedDifficultyAdjustCatch, ArchivedDifficultyAdjustMania,
1382 ArchivedDifficultyAdjustOsu, ArchivedDifficultyAdjustTaiko, ArchivedDoubleTimeCatch,
1383 ArchivedDoubleTimeMania, ArchivedDoubleTimeOsu, ArchivedDoubleTimeTaiko, ArchivedEasyCatch,
1384 ArchivedEasyMania, ArchivedEasyOsu, ArchivedFlashlightCatch, ArchivedFlashlightMania,
1385 ArchivedFlashlightOsu, ArchivedFlashlightTaiko, ArchivedGrowOsu, ArchivedHalfTimeCatch,
1386 ArchivedHalfTimeMania, ArchivedHalfTimeOsu, ArchivedHalfTimeTaiko, ArchivedHiddenOsu,
1387 ArchivedMagnetisedOsu, ArchivedMirrorOsu, ArchivedMutedCatch, ArchivedMutedMania,
1388 ArchivedMutedOsu, ArchivedMutedTaiko, ArchivedNightcoreCatch, ArchivedNightcoreMania,
1389 ArchivedNightcoreOsu, ArchivedNightcoreTaiko, ArchivedNoScopeCatch, ArchivedNoScopeOsu,
1390 ArchivedPerfectCatch, ArchivedPerfectMania, ArchivedPerfectOsu, ArchivedPerfectTaiko,
1391 ArchivedRandomMania, ArchivedRandomOsu, ArchivedRandomTaiko, ArchivedRepelOsu,
1392 ArchivedSimplifiedRhythmTaiko, ArchivedSuddenDeathCatch, ArchivedSuddenDeathMania,
1393 ArchivedSuddenDeathOsu, ArchivedSuddenDeathTaiko, ArchivedTargetPracticeOsu,
1394 ArchivedWiggleOsu, ArchivedWindDownCatch, ArchivedWindDownMania, ArchivedWindDownOsu,
1395 ArchivedWindDownTaiko, ArchivedWindUpCatch, ArchivedWindUpMania, ArchivedWindUpOsu,
1396 ArchivedWindUpTaiko, AutopilotOsuResolver, AutoplayCatchResolver, AutoplayManiaResolver,
1397 AutoplayOsuResolver, AutoplayTaikoResolver, BarrelRollOsuResolver, BlindsOsuResolver,
1398 BloomOsuResolver, BubblesOsuResolver, CinemaCatchResolver, CinemaManiaResolver,
1399 CinemaOsuResolver, CinemaTaikoResolver, ClassicCatchResolver, ClassicManiaResolver,
1400 ClassicOsuResolver, ClassicTaikoResolver, ConstantSpeedManiaResolver,
1401 ConstantSpeedTaikoResolver, CoverManiaResolver, DaycoreCatchResolver, DaycoreManiaResolver,
1402 DaycoreOsuResolver, DaycoreTaikoResolver, DeflateOsuResolver, DepthOsuResolver,
1403 DifficultyAdjustCatchResolver, DifficultyAdjustManiaResolver, DifficultyAdjustOsuResolver,
1404 DifficultyAdjustTaikoResolver, DoubleTimeCatchResolver, DoubleTimeManiaResolver,
1405 DoubleTimeOsuResolver, DoubleTimeTaikoResolver, DualStagesManiaResolver, EasyCatchResolver,
1406 EasyManiaResolver, EasyOsuResolver, EasyTaikoResolver, EightKeysManiaResolver,
1407 FadeInManiaResolver, FiveKeysManiaResolver, FlashlightCatchResolver,
1408 FlashlightManiaResolver, FlashlightOsuResolver, FlashlightTaikoResolver,
1409 FloatingFruitsCatchResolver, FourKeysManiaResolver, FreezeFrameOsuResolver,
1410 GrowOsuResolver, HalfTimeCatchResolver, HalfTimeManiaResolver, HalfTimeOsuResolver,
1411 HalfTimeTaikoResolver, HardRockCatchResolver, HardRockManiaResolver, HardRockOsuResolver,
1412 HardRockTaikoResolver, HiddenCatchResolver, HiddenManiaResolver, HiddenOsuResolver,
1413 HiddenTaikoResolver, HoldOffManiaResolver, InvertManiaResolver, MagnetisedOsuResolver,
1414 MirrorCatchResolver, MirrorManiaResolver, MirrorOsuResolver, MovingFastCatchResolver,
1415 MutedCatchResolver, MutedManiaResolver, MutedOsuResolver, MutedTaikoResolver,
1416 NightcoreCatchResolver, NightcoreManiaResolver, NightcoreOsuResolver,
1417 NightcoreTaikoResolver, NineKeysManiaResolver, NoFailCatchResolver, NoFailManiaResolver,
1418 NoFailOsuResolver, NoFailTaikoResolver, NoReleaseManiaResolver, NoScopeCatchResolver,
1419 NoScopeOsuResolver, OneKeyManiaResolver, PerfectCatchResolver, PerfectManiaResolver,
1420 PerfectOsuResolver, PerfectTaikoResolver, RandomManiaResolver, RandomOsuResolver,
1421 RandomTaikoResolver, RelaxCatchResolver, RelaxOsuResolver, RelaxTaikoResolver,
1422 RepelOsuResolver, ScoreV2CatchResolver, ScoreV2ManiaResolver, ScoreV2OsuResolver,
1423 ScoreV2TaikoResolver, SevenKeysManiaResolver, SimplifiedRhythmTaikoResolver,
1424 SingleTapOsuResolver, SingleTapTaikoResolver, SixKeysManiaResolver, SpinInOsuResolver,
1425 SpunOutOsuResolver, StrictTrackingOsuResolver, SuddenDeathCatchResolver,
1426 SuddenDeathManiaResolver, SuddenDeathOsuResolver, SuddenDeathTaikoResolver,
1427 SwapTaikoResolver, SynesthesiaOsuResolver, TargetPracticeOsuResolver, TenKeysManiaResolver,
1428 ThreeKeysManiaResolver, TouchDeviceOsuResolver, TraceableOsuResolver, TransformOsuResolver,
1429 TwoKeysManiaResolver, UnknownModResolver, WiggleOsuResolver, WindDownCatchResolver,
1430 WindDownManiaResolver, WindDownOsuResolver, WindDownTaikoResolver, WindUpCatchResolver,
1431 WindUpManiaResolver, WindUpOsuResolver, WindUpTaikoResolver,
1432 };
1433 pub use super::gamemod::{ArchivedGameMod, GameModResolver};
1434 pub use super::intermode::GameModIntermodeResolver;
1435 pub use crate::kind::GameModKindResolver;
1436}
1437impl EasyOsu {
1438 pub const fn acronym() -> Acronym {
1440 unsafe { Acronym::from_str_unchecked("EZ") }
1441 }
1442 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1444 unsafe {
1445 [
1446 Acronym::from_str_unchecked("HR"),
1447 Acronym::from_str_unchecked("AC"),
1448 Acronym::from_str_unchecked("DA"),
1449 ]
1450 }
1451 .into_iter()
1452 }
1453 pub const fn description() -> &'static str {
1455 "Larger circles, more forgiving HP drain, less accuracy required, and extra lives!"
1456 }
1457 pub const fn kind() -> GameModKind {
1459 GameModKind::DifficultyReduction
1460 }
1461 pub const fn bits() -> u32 {
1465 2
1466 }
1467}
1468impl NoFailOsu {
1469 pub const fn acronym() -> Acronym {
1471 unsafe { Acronym::from_str_unchecked("NF") }
1472 }
1473 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1475 unsafe {
1476 [
1477 Acronym::from_str_unchecked("SD"),
1478 Acronym::from_str_unchecked("PF"),
1479 Acronym::from_str_unchecked("AC"),
1480 Acronym::from_str_unchecked("CN"),
1481 ]
1482 }
1483 .into_iter()
1484 }
1485 pub const fn description() -> &'static str {
1487 "You can't fail, no matter what."
1488 }
1489 pub const fn kind() -> GameModKind {
1491 GameModKind::DifficultyReduction
1492 }
1493 pub const fn bits() -> u32 {
1497 1
1498 }
1499}
1500impl HalfTimeOsu {
1501 pub const fn acronym() -> Acronym {
1503 unsafe { Acronym::from_str_unchecked("HT") }
1504 }
1505 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1507 unsafe {
1508 [
1509 Acronym::from_str_unchecked("DC"),
1510 Acronym::from_str_unchecked("DT"),
1511 Acronym::from_str_unchecked("NC"),
1512 Acronym::from_str_unchecked("WU"),
1513 Acronym::from_str_unchecked("WD"),
1514 Acronym::from_str_unchecked("AS"),
1515 ]
1516 }
1517 .into_iter()
1518 }
1519 pub const fn description() -> &'static str {
1521 "Less zoom..."
1522 }
1523 pub const fn kind() -> GameModKind {
1525 GameModKind::DifficultyReduction
1526 }
1527 pub const fn bits() -> u32 {
1531 256
1532 }
1533}
1534impl DaycoreOsu {
1535 pub const fn acronym() -> Acronym {
1537 unsafe { Acronym::from_str_unchecked("DC") }
1538 }
1539 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1541 unsafe {
1542 [
1543 Acronym::from_str_unchecked("HT"),
1544 Acronym::from_str_unchecked("DT"),
1545 Acronym::from_str_unchecked("NC"),
1546 Acronym::from_str_unchecked("WU"),
1547 Acronym::from_str_unchecked("WD"),
1548 Acronym::from_str_unchecked("AS"),
1549 ]
1550 }
1551 .into_iter()
1552 }
1553 pub const fn description() -> &'static str {
1555 "Whoaaaaa..."
1556 }
1557 pub const fn kind() -> GameModKind {
1559 GameModKind::DifficultyReduction
1560 }
1561}
1562impl HardRockOsu {
1563 pub const fn acronym() -> Acronym {
1565 unsafe { Acronym::from_str_unchecked("HR") }
1566 }
1567 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1569 unsafe {
1570 [
1571 Acronym::from_str_unchecked("EZ"),
1572 Acronym::from_str_unchecked("DA"),
1573 Acronym::from_str_unchecked("MR"),
1574 ]
1575 }
1576 .into_iter()
1577 }
1578 pub const fn description() -> &'static str {
1580 "Everything just got a bit harder..."
1581 }
1582 pub const fn kind() -> GameModKind {
1584 GameModKind::DifficultyIncrease
1585 }
1586 pub const fn bits() -> u32 {
1590 16
1591 }
1592}
1593impl SuddenDeathOsu {
1594 pub const fn acronym() -> Acronym {
1596 unsafe { Acronym::from_str_unchecked("SD") }
1597 }
1598 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1600 unsafe {
1601 [
1602 Acronym::from_str_unchecked("NF"),
1603 Acronym::from_str_unchecked("PF"),
1604 Acronym::from_str_unchecked("TP"),
1605 Acronym::from_str_unchecked("CN"),
1606 ]
1607 }
1608 .into_iter()
1609 }
1610 pub const fn description() -> &'static str {
1612 "Miss and fail."
1613 }
1614 pub const fn kind() -> GameModKind {
1616 GameModKind::DifficultyIncrease
1617 }
1618 pub const fn bits() -> u32 {
1622 32
1623 }
1624}
1625impl PerfectOsu {
1626 pub const fn acronym() -> Acronym {
1628 unsafe { Acronym::from_str_unchecked("PF") }
1629 }
1630 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1632 unsafe {
1633 [
1634 Acronym::from_str_unchecked("NF"),
1635 Acronym::from_str_unchecked("SD"),
1636 Acronym::from_str_unchecked("AC"),
1637 Acronym::from_str_unchecked("CN"),
1638 ]
1639 }
1640 .into_iter()
1641 }
1642 pub const fn description() -> &'static str {
1644 "SS or quit."
1645 }
1646 pub const fn kind() -> GameModKind {
1648 GameModKind::DifficultyIncrease
1649 }
1650 pub const fn bits() -> u32 {
1654 16416
1655 }
1656}
1657impl DoubleTimeOsu {
1658 pub const fn acronym() -> Acronym {
1660 unsafe { Acronym::from_str_unchecked("DT") }
1661 }
1662 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1664 unsafe {
1665 [
1666 Acronym::from_str_unchecked("HT"),
1667 Acronym::from_str_unchecked("DC"),
1668 Acronym::from_str_unchecked("NC"),
1669 Acronym::from_str_unchecked("WU"),
1670 Acronym::from_str_unchecked("WD"),
1671 Acronym::from_str_unchecked("AS"),
1672 ]
1673 }
1674 .into_iter()
1675 }
1676 pub const fn description() -> &'static str {
1678 "Zoooooooooom..."
1679 }
1680 pub const fn kind() -> GameModKind {
1682 GameModKind::DifficultyIncrease
1683 }
1684 pub const fn bits() -> u32 {
1688 64
1689 }
1690}
1691impl NightcoreOsu {
1692 pub const fn acronym() -> Acronym {
1694 unsafe { Acronym::from_str_unchecked("NC") }
1695 }
1696 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1698 unsafe {
1699 [
1700 Acronym::from_str_unchecked("HT"),
1701 Acronym::from_str_unchecked("DC"),
1702 Acronym::from_str_unchecked("DT"),
1703 Acronym::from_str_unchecked("WU"),
1704 Acronym::from_str_unchecked("WD"),
1705 Acronym::from_str_unchecked("AS"),
1706 ]
1707 }
1708 .into_iter()
1709 }
1710 pub const fn description() -> &'static str {
1712 "Uguuuuuuuu..."
1713 }
1714 pub const fn kind() -> GameModKind {
1716 GameModKind::DifficultyIncrease
1717 }
1718 pub const fn bits() -> u32 {
1722 576
1723 }
1724}
1725impl HiddenOsu {
1726 pub const fn acronym() -> Acronym {
1728 unsafe { Acronym::from_str_unchecked("HD") }
1729 }
1730 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1732 unsafe {
1733 [
1734 Acronym::from_str_unchecked("TC"),
1735 Acronym::from_str_unchecked("SI"),
1736 Acronym::from_str_unchecked("AD"),
1737 Acronym::from_str_unchecked("FR"),
1738 Acronym::from_str_unchecked("DP"),
1739 ]
1740 }
1741 .into_iter()
1742 }
1743 pub const fn description() -> &'static str {
1745 "Play with no approach circles and fading circles/sliders."
1746 }
1747 pub const fn kind() -> GameModKind {
1749 GameModKind::DifficultyIncrease
1750 }
1751 pub const fn bits() -> u32 {
1755 8
1756 }
1757}
1758impl TraceableOsu {
1759 pub const fn acronym() -> Acronym {
1761 unsafe { Acronym::from_str_unchecked("TC") }
1762 }
1763 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1765 unsafe {
1766 [
1767 Acronym::from_str_unchecked("HD"),
1768 Acronym::from_str_unchecked("TP"),
1769 Acronym::from_str_unchecked("SI"),
1770 Acronym::from_str_unchecked("GR"),
1771 Acronym::from_str_unchecked("DF"),
1772 Acronym::from_str_unchecked("DP"),
1773 ]
1774 }
1775 .into_iter()
1776 }
1777 pub const fn description() -> &'static str {
1779 "Put your faith in the approach circles..."
1780 }
1781 pub const fn kind() -> GameModKind {
1783 GameModKind::DifficultyIncrease
1784 }
1785}
1786impl FlashlightOsu {
1787 pub const fn acronym() -> Acronym {
1789 unsafe { Acronym::from_str_unchecked("FL") }
1790 }
1791 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1793 unsafe {
1794 [
1795 Acronym::from_str_unchecked("BL"),
1796 Acronym::from_str_unchecked("BM"),
1797 ]
1798 }
1799 .into_iter()
1800 }
1801 pub const fn description() -> &'static str {
1803 "Restricted view area."
1804 }
1805 pub const fn kind() -> GameModKind {
1807 GameModKind::DifficultyIncrease
1808 }
1809 pub const fn bits() -> u32 {
1813 1024
1814 }
1815}
1816impl BlindsOsu {
1817 pub const fn acronym() -> Acronym {
1819 unsafe { Acronym::from_str_unchecked("BL") }
1820 }
1821 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1823 unsafe { [Acronym::from_str_unchecked("FL")] }.into_iter()
1824 }
1825 pub const fn description() -> &'static str {
1827 "Play with blinds on your screen."
1828 }
1829 pub const fn kind() -> GameModKind {
1831 GameModKind::DifficultyIncrease
1832 }
1833}
1834impl StrictTrackingOsu {
1835 pub const fn acronym() -> Acronym {
1837 unsafe { Acronym::from_str_unchecked("ST") }
1838 }
1839 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1841 unsafe {
1842 [
1843 Acronym::from_str_unchecked("TP"),
1844 Acronym::from_str_unchecked("CL"),
1845 ]
1846 }
1847 .into_iter()
1848 }
1849 pub const fn description() -> &'static str {
1851 "Once you start a slider, follow precisely or get a miss."
1852 }
1853 pub const fn kind() -> GameModKind {
1855 GameModKind::DifficultyIncrease
1856 }
1857}
1858impl AccuracyChallengeOsu {
1859 pub const fn acronym() -> Acronym {
1861 unsafe { Acronym::from_str_unchecked("AC") }
1862 }
1863 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1865 unsafe {
1866 [
1867 Acronym::from_str_unchecked("EZ"),
1868 Acronym::from_str_unchecked("NF"),
1869 Acronym::from_str_unchecked("PF"),
1870 Acronym::from_str_unchecked("CN"),
1871 ]
1872 }
1873 .into_iter()
1874 }
1875 pub const fn description() -> &'static str {
1877 "Fail if your accuracy drops too low!"
1878 }
1879 pub const fn kind() -> GameModKind {
1881 GameModKind::DifficultyIncrease
1882 }
1883}
1884impl TargetPracticeOsu {
1885 pub const fn acronym() -> Acronym {
1887 unsafe { Acronym::from_str_unchecked("TP") }
1888 }
1889 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1891 unsafe {
1892 [
1893 Acronym::from_str_unchecked("SD"),
1894 Acronym::from_str_unchecked("TC"),
1895 Acronym::from_str_unchecked("ST"),
1896 Acronym::from_str_unchecked("DA"),
1897 Acronym::from_str_unchecked("RD"),
1898 Acronym::from_str_unchecked("SO"),
1899 Acronym::from_str_unchecked("AD"),
1900 Acronym::from_str_unchecked("DP"),
1901 ]
1902 }
1903 .into_iter()
1904 }
1905 pub const fn description() -> &'static str {
1907 "Practice keeping up with the beat of the song."
1908 }
1909 pub const fn kind() -> GameModKind {
1911 GameModKind::Conversion
1912 }
1913 pub const fn bits() -> u32 {
1917 8388608
1918 }
1919}
1920impl DifficultyAdjustOsu {
1921 pub const fn acronym() -> Acronym {
1923 unsafe { Acronym::from_str_unchecked("DA") }
1924 }
1925 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1927 unsafe {
1928 [
1929 Acronym::from_str_unchecked("EZ"),
1930 Acronym::from_str_unchecked("HR"),
1931 Acronym::from_str_unchecked("TP"),
1932 ]
1933 }
1934 .into_iter()
1935 }
1936 pub const fn description() -> &'static str {
1938 "Override a beatmap's difficulty settings."
1939 }
1940 pub const fn kind() -> GameModKind {
1942 GameModKind::Conversion
1943 }
1944}
1945impl ClassicOsu {
1946 pub const fn acronym() -> Acronym {
1948 unsafe { Acronym::from_str_unchecked("CL") }
1949 }
1950 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1952 unsafe { [Acronym::from_str_unchecked("ST")] }.into_iter()
1953 }
1954 pub const fn description() -> &'static str {
1956 "Feeling nostalgic?"
1957 }
1958 pub const fn kind() -> GameModKind {
1960 GameModKind::Conversion
1961 }
1962}
1963impl RandomOsu {
1964 pub const fn acronym() -> Acronym {
1966 unsafe { Acronym::from_str_unchecked("RD") }
1967 }
1968 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1970 unsafe { [Acronym::from_str_unchecked("TP")] }.into_iter()
1971 }
1972 pub const fn description() -> &'static str {
1974 "It never gets boring!"
1975 }
1976 pub const fn kind() -> GameModKind {
1978 GameModKind::Conversion
1979 }
1980 pub const fn bits() -> u32 {
1984 2097152
1985 }
1986}
1987impl MirrorOsu {
1988 pub const fn acronym() -> Acronym {
1990 unsafe { Acronym::from_str_unchecked("MR") }
1991 }
1992 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
1994 unsafe { [Acronym::from_str_unchecked("HR")] }.into_iter()
1995 }
1996 pub const fn description() -> &'static str {
1998 "Flip objects on the chosen axes."
1999 }
2000 pub const fn kind() -> GameModKind {
2002 GameModKind::Conversion
2003 }
2004 pub const fn bits() -> u32 {
2008 1073741824
2009 }
2010}
2011impl AlternateOsu {
2012 pub const fn acronym() -> Acronym {
2014 unsafe { Acronym::from_str_unchecked("AL") }
2015 }
2016 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2018 unsafe {
2019 [
2020 Acronym::from_str_unchecked("SG"),
2021 Acronym::from_str_unchecked("AT"),
2022 Acronym::from_str_unchecked("CN"),
2023 Acronym::from_str_unchecked("RX"),
2024 ]
2025 }
2026 .into_iter()
2027 }
2028 pub const fn description() -> &'static str {
2030 "Don't use the same key twice in a row!"
2031 }
2032 pub const fn kind() -> GameModKind {
2034 GameModKind::Conversion
2035 }
2036}
2037impl SingleTapOsu {
2038 pub const fn acronym() -> Acronym {
2040 unsafe { Acronym::from_str_unchecked("SG") }
2041 }
2042 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2044 unsafe {
2045 [
2046 Acronym::from_str_unchecked("AL"),
2047 Acronym::from_str_unchecked("AT"),
2048 Acronym::from_str_unchecked("CN"),
2049 Acronym::from_str_unchecked("RX"),
2050 ]
2051 }
2052 .into_iter()
2053 }
2054 pub const fn description() -> &'static str {
2056 "You must only use one key!"
2057 }
2058 pub const fn kind() -> GameModKind {
2060 GameModKind::Conversion
2061 }
2062}
2063impl AutoplayOsu {
2064 pub const fn acronym() -> Acronym {
2066 unsafe { Acronym::from_str_unchecked("AT") }
2067 }
2068 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2070 unsafe {
2071 [
2072 Acronym::from_str_unchecked("AL"),
2073 Acronym::from_str_unchecked("SG"),
2074 Acronym::from_str_unchecked("CN"),
2075 Acronym::from_str_unchecked("RX"),
2076 Acronym::from_str_unchecked("AP"),
2077 Acronym::from_str_unchecked("SO"),
2078 Acronym::from_str_unchecked("MG"),
2079 Acronym::from_str_unchecked("RP"),
2080 Acronym::from_str_unchecked("AS"),
2081 Acronym::from_str_unchecked("TD"),
2082 ]
2083 }
2084 .into_iter()
2085 }
2086 pub const fn description() -> &'static str {
2088 "Watch a perfect automated play through the song."
2089 }
2090 pub const fn kind() -> GameModKind {
2092 GameModKind::Automation
2093 }
2094 pub const fn bits() -> u32 {
2098 2048
2099 }
2100}
2101impl CinemaOsu {
2102 pub const fn acronym() -> Acronym {
2104 unsafe { Acronym::from_str_unchecked("CN") }
2105 }
2106 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2108 unsafe {
2109 [
2110 Acronym::from_str_unchecked("NF"),
2111 Acronym::from_str_unchecked("SD"),
2112 Acronym::from_str_unchecked("PF"),
2113 Acronym::from_str_unchecked("AC"),
2114 Acronym::from_str_unchecked("AL"),
2115 Acronym::from_str_unchecked("SG"),
2116 Acronym::from_str_unchecked("AT"),
2117 Acronym::from_str_unchecked("RX"),
2118 Acronym::from_str_unchecked("AP"),
2119 Acronym::from_str_unchecked("SO"),
2120 Acronym::from_str_unchecked("MG"),
2121 Acronym::from_str_unchecked("RP"),
2122 Acronym::from_str_unchecked("AS"),
2123 Acronym::from_str_unchecked("TD"),
2124 ]
2125 }
2126 .into_iter()
2127 }
2128 pub const fn description() -> &'static str {
2130 "Watch the video without visual distractions."
2131 }
2132 pub const fn kind() -> GameModKind {
2134 GameModKind::Automation
2135 }
2136 pub const fn bits() -> u32 {
2140 4194304
2141 }
2142}
2143impl RelaxOsu {
2144 pub const fn acronym() -> Acronym {
2146 unsafe { Acronym::from_str_unchecked("RX") }
2147 }
2148 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2150 unsafe {
2151 [
2152 Acronym::from_str_unchecked("AL"),
2153 Acronym::from_str_unchecked("SG"),
2154 Acronym::from_str_unchecked("AT"),
2155 Acronym::from_str_unchecked("CN"),
2156 Acronym::from_str_unchecked("AP"),
2157 Acronym::from_str_unchecked("MG"),
2158 ]
2159 }
2160 .into_iter()
2161 }
2162 pub const fn description() -> &'static str {
2164 "You don't need to click. Give your clicking/tapping fingers a break from the heat of things."
2165 }
2166 pub const fn kind() -> GameModKind {
2168 GameModKind::Automation
2169 }
2170 pub const fn bits() -> u32 {
2174 128
2175 }
2176}
2177impl AutopilotOsu {
2178 pub const fn acronym() -> Acronym {
2180 unsafe { Acronym::from_str_unchecked("AP") }
2181 }
2182 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2184 unsafe {
2185 [
2186 Acronym::from_str_unchecked("AT"),
2187 Acronym::from_str_unchecked("CN"),
2188 Acronym::from_str_unchecked("RX"),
2189 Acronym::from_str_unchecked("SO"),
2190 Acronym::from_str_unchecked("MG"),
2191 Acronym::from_str_unchecked("RP"),
2192 Acronym::from_str_unchecked("TD"),
2193 ]
2194 }
2195 .into_iter()
2196 }
2197 pub const fn description() -> &'static str {
2199 "Automatic cursor movement - just follow the rhythm."
2200 }
2201 pub const fn kind() -> GameModKind {
2203 GameModKind::Automation
2204 }
2205 pub const fn bits() -> u32 {
2209 8192
2210 }
2211}
2212impl SpunOutOsu {
2213 pub const fn acronym() -> Acronym {
2215 unsafe { Acronym::from_str_unchecked("SO") }
2216 }
2217 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2219 unsafe {
2220 [
2221 Acronym::from_str_unchecked("TP"),
2222 Acronym::from_str_unchecked("AT"),
2223 Acronym::from_str_unchecked("CN"),
2224 Acronym::from_str_unchecked("AP"),
2225 ]
2226 }
2227 .into_iter()
2228 }
2229 pub const fn description() -> &'static str {
2231 "Spinners will be automatically completed."
2232 }
2233 pub const fn kind() -> GameModKind {
2235 GameModKind::Automation
2236 }
2237 pub const fn bits() -> u32 {
2241 4096
2242 }
2243}
2244impl TransformOsu {
2245 pub const fn acronym() -> Acronym {
2247 unsafe { Acronym::from_str_unchecked("TR") }
2248 }
2249 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2251 unsafe {
2252 [
2253 Acronym::from_str_unchecked("WG"),
2254 Acronym::from_str_unchecked("MG"),
2255 Acronym::from_str_unchecked("RP"),
2256 Acronym::from_str_unchecked("FR"),
2257 Acronym::from_str_unchecked("DP"),
2258 ]
2259 }
2260 .into_iter()
2261 }
2262 pub const fn description() -> &'static str {
2264 "Everything rotates. EVERYTHING."
2265 }
2266 pub const fn kind() -> GameModKind {
2268 GameModKind::Fun
2269 }
2270}
2271impl WiggleOsu {
2272 pub const fn acronym() -> Acronym {
2274 unsafe { Acronym::from_str_unchecked("WG") }
2275 }
2276 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2278 unsafe {
2279 [
2280 Acronym::from_str_unchecked("TR"),
2281 Acronym::from_str_unchecked("MG"),
2282 Acronym::from_str_unchecked("RP"),
2283 Acronym::from_str_unchecked("DP"),
2284 ]
2285 }
2286 .into_iter()
2287 }
2288 pub const fn description() -> &'static str {
2290 "They just won't stay still..."
2291 }
2292 pub const fn kind() -> GameModKind {
2294 GameModKind::Fun
2295 }
2296}
2297impl SpinInOsu {
2298 pub const fn acronym() -> Acronym {
2300 unsafe { Acronym::from_str_unchecked("SI") }
2301 }
2302 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2304 unsafe {
2305 [
2306 Acronym::from_str_unchecked("HD"),
2307 Acronym::from_str_unchecked("TC"),
2308 Acronym::from_str_unchecked("GR"),
2309 Acronym::from_str_unchecked("DF"),
2310 Acronym::from_str_unchecked("AD"),
2311 Acronym::from_str_unchecked("DP"),
2312 ]
2313 }
2314 .into_iter()
2315 }
2316 pub const fn description() -> &'static str {
2318 "Circles spin in. No approach circles."
2319 }
2320 pub const fn kind() -> GameModKind {
2322 GameModKind::Fun
2323 }
2324}
2325impl GrowOsu {
2326 pub const fn acronym() -> Acronym {
2328 unsafe { Acronym::from_str_unchecked("GR") }
2329 }
2330 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2332 unsafe {
2333 [
2334 Acronym::from_str_unchecked("TC"),
2335 Acronym::from_str_unchecked("SI"),
2336 Acronym::from_str_unchecked("DF"),
2337 Acronym::from_str_unchecked("AD"),
2338 Acronym::from_str_unchecked("DP"),
2339 ]
2340 }
2341 .into_iter()
2342 }
2343 pub const fn description() -> &'static str {
2345 "Hit them at the right size!"
2346 }
2347 pub const fn kind() -> GameModKind {
2349 GameModKind::Fun
2350 }
2351}
2352impl DeflateOsu {
2353 pub const fn acronym() -> Acronym {
2355 unsafe { Acronym::from_str_unchecked("DF") }
2356 }
2357 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2359 unsafe {
2360 [
2361 Acronym::from_str_unchecked("TC"),
2362 Acronym::from_str_unchecked("SI"),
2363 Acronym::from_str_unchecked("GR"),
2364 Acronym::from_str_unchecked("AD"),
2365 Acronym::from_str_unchecked("DP"),
2366 ]
2367 }
2368 .into_iter()
2369 }
2370 pub const fn description() -> &'static str {
2372 "Hit them at the right size!"
2373 }
2374 pub const fn kind() -> GameModKind {
2376 GameModKind::Fun
2377 }
2378}
2379impl WindUpOsu {
2380 pub const fn acronym() -> Acronym {
2382 unsafe { Acronym::from_str_unchecked("WU") }
2383 }
2384 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2386 unsafe {
2387 [
2388 Acronym::from_str_unchecked("HT"),
2389 Acronym::from_str_unchecked("DC"),
2390 Acronym::from_str_unchecked("DT"),
2391 Acronym::from_str_unchecked("NC"),
2392 Acronym::from_str_unchecked("WD"),
2393 Acronym::from_str_unchecked("AS"),
2394 ]
2395 }
2396 .into_iter()
2397 }
2398 pub const fn description() -> &'static str {
2400 "Can you keep up?"
2401 }
2402 pub const fn kind() -> GameModKind {
2404 GameModKind::Fun
2405 }
2406}
2407impl WindDownOsu {
2408 pub const fn acronym() -> Acronym {
2410 unsafe { Acronym::from_str_unchecked("WD") }
2411 }
2412 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2414 unsafe {
2415 [
2416 Acronym::from_str_unchecked("HT"),
2417 Acronym::from_str_unchecked("DC"),
2418 Acronym::from_str_unchecked("DT"),
2419 Acronym::from_str_unchecked("NC"),
2420 Acronym::from_str_unchecked("WU"),
2421 Acronym::from_str_unchecked("AS"),
2422 ]
2423 }
2424 .into_iter()
2425 }
2426 pub const fn description() -> &'static str {
2428 "Sloooow doooown..."
2429 }
2430 pub const fn kind() -> GameModKind {
2432 GameModKind::Fun
2433 }
2434}
2435impl BarrelRollOsu {
2436 pub const fn acronym() -> Acronym {
2438 unsafe { Acronym::from_str_unchecked("BR") }
2439 }
2440 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2442 unsafe { [Acronym::from_str_unchecked("BU")] }.into_iter()
2443 }
2444 pub const fn description() -> &'static str {
2446 "The whole playfield is on a wheel!"
2447 }
2448 pub const fn kind() -> GameModKind {
2450 GameModKind::Fun
2451 }
2452}
2453impl ApproachDifferentOsu {
2454 pub const fn acronym() -> Acronym {
2456 unsafe { Acronym::from_str_unchecked("AD") }
2457 }
2458 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2460 unsafe {
2461 [
2462 Acronym::from_str_unchecked("HD"),
2463 Acronym::from_str_unchecked("TP"),
2464 Acronym::from_str_unchecked("SI"),
2465 Acronym::from_str_unchecked("GR"),
2466 Acronym::from_str_unchecked("DF"),
2467 Acronym::from_str_unchecked("FR"),
2468 ]
2469 }
2470 .into_iter()
2471 }
2472 pub const fn description() -> &'static str {
2474 "Never trust the approach circles..."
2475 }
2476 pub const fn kind() -> GameModKind {
2478 GameModKind::Fun
2479 }
2480}
2481impl MutedOsu {
2482 pub const fn acronym() -> Acronym {
2484 unsafe { Acronym::from_str_unchecked("MU") }
2485 }
2486 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2488 [].into_iter()
2489 }
2490 pub const fn description() -> &'static str {
2492 "Can you still feel the rhythm without music?"
2493 }
2494 pub const fn kind() -> GameModKind {
2496 GameModKind::Fun
2497 }
2498}
2499impl NoScopeOsu {
2500 pub const fn acronym() -> Acronym {
2502 unsafe { Acronym::from_str_unchecked("NS") }
2503 }
2504 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2506 unsafe { [Acronym::from_str_unchecked("BM")] }.into_iter()
2507 }
2508 pub const fn description() -> &'static str {
2510 "Where's the cursor?"
2511 }
2512 pub const fn kind() -> GameModKind {
2514 GameModKind::Fun
2515 }
2516}
2517impl MagnetisedOsu {
2518 pub const fn acronym() -> Acronym {
2520 unsafe { Acronym::from_str_unchecked("MG") }
2521 }
2522 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2524 unsafe {
2525 [
2526 Acronym::from_str_unchecked("AT"),
2527 Acronym::from_str_unchecked("CN"),
2528 Acronym::from_str_unchecked("RX"),
2529 Acronym::from_str_unchecked("AP"),
2530 Acronym::from_str_unchecked("TR"),
2531 Acronym::from_str_unchecked("WG"),
2532 Acronym::from_str_unchecked("RP"),
2533 Acronym::from_str_unchecked("BU"),
2534 Acronym::from_str_unchecked("DP"),
2535 ]
2536 }
2537 .into_iter()
2538 }
2539 pub const fn description() -> &'static str {
2541 "No need to chase the circles – your cursor is a magnet!"
2542 }
2543 pub const fn kind() -> GameModKind {
2545 GameModKind::Fun
2546 }
2547}
2548impl RepelOsu {
2549 pub const fn acronym() -> Acronym {
2551 unsafe { Acronym::from_str_unchecked("RP") }
2552 }
2553 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2555 unsafe {
2556 [
2557 Acronym::from_str_unchecked("AT"),
2558 Acronym::from_str_unchecked("CN"),
2559 Acronym::from_str_unchecked("AP"),
2560 Acronym::from_str_unchecked("TR"),
2561 Acronym::from_str_unchecked("WG"),
2562 Acronym::from_str_unchecked("MG"),
2563 Acronym::from_str_unchecked("BU"),
2564 Acronym::from_str_unchecked("DP"),
2565 ]
2566 }
2567 .into_iter()
2568 }
2569 pub const fn description() -> &'static str {
2571 "Hit objects run away!"
2572 }
2573 pub const fn kind() -> GameModKind {
2575 GameModKind::Fun
2576 }
2577}
2578impl AdaptiveSpeedOsu {
2579 pub const fn acronym() -> Acronym {
2581 unsafe { Acronym::from_str_unchecked("AS") }
2582 }
2583 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2585 unsafe {
2586 [
2587 Acronym::from_str_unchecked("HT"),
2588 Acronym::from_str_unchecked("DC"),
2589 Acronym::from_str_unchecked("DT"),
2590 Acronym::from_str_unchecked("NC"),
2591 Acronym::from_str_unchecked("AT"),
2592 Acronym::from_str_unchecked("CN"),
2593 Acronym::from_str_unchecked("WU"),
2594 Acronym::from_str_unchecked("WD"),
2595 ]
2596 }
2597 .into_iter()
2598 }
2599 pub const fn description() -> &'static str {
2601 "Let track speed adapt to you."
2602 }
2603 pub const fn kind() -> GameModKind {
2605 GameModKind::Fun
2606 }
2607}
2608impl FreezeFrameOsu {
2609 pub const fn acronym() -> Acronym {
2611 unsafe { Acronym::from_str_unchecked("FR") }
2612 }
2613 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2615 unsafe {
2616 [
2617 Acronym::from_str_unchecked("HD"),
2618 Acronym::from_str_unchecked("TR"),
2619 Acronym::from_str_unchecked("AD"),
2620 Acronym::from_str_unchecked("DP"),
2621 ]
2622 }
2623 .into_iter()
2624 }
2625 pub const fn description() -> &'static str {
2627 "Burn the notes into your memory."
2628 }
2629 pub const fn kind() -> GameModKind {
2631 GameModKind::Fun
2632 }
2633}
2634impl BubblesOsu {
2635 pub const fn acronym() -> Acronym {
2637 unsafe { Acronym::from_str_unchecked("BU") }
2638 }
2639 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2641 unsafe {
2642 [
2643 Acronym::from_str_unchecked("BR"),
2644 Acronym::from_str_unchecked("MG"),
2645 Acronym::from_str_unchecked("RP"),
2646 ]
2647 }
2648 .into_iter()
2649 }
2650 pub const fn description() -> &'static str {
2652 "Don't let their popping distract you!"
2653 }
2654 pub const fn kind() -> GameModKind {
2656 GameModKind::Fun
2657 }
2658}
2659impl SynesthesiaOsu {
2660 pub const fn acronym() -> Acronym {
2662 unsafe { Acronym::from_str_unchecked("SY") }
2663 }
2664 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2666 [].into_iter()
2667 }
2668 pub const fn description() -> &'static str {
2670 "Colours hit objects based on the rhythm."
2671 }
2672 pub const fn kind() -> GameModKind {
2674 GameModKind::Fun
2675 }
2676}
2677impl DepthOsu {
2678 pub const fn acronym() -> Acronym {
2680 unsafe { Acronym::from_str_unchecked("DP") }
2681 }
2682 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2684 unsafe {
2685 [
2686 Acronym::from_str_unchecked("HD"),
2687 Acronym::from_str_unchecked("TC"),
2688 Acronym::from_str_unchecked("TP"),
2689 Acronym::from_str_unchecked("TR"),
2690 Acronym::from_str_unchecked("WG"),
2691 Acronym::from_str_unchecked("SI"),
2692 Acronym::from_str_unchecked("GR"),
2693 Acronym::from_str_unchecked("DF"),
2694 Acronym::from_str_unchecked("MG"),
2695 Acronym::from_str_unchecked("RP"),
2696 Acronym::from_str_unchecked("FR"),
2697 ]
2698 }
2699 .into_iter()
2700 }
2701 pub const fn description() -> &'static str {
2703 "3D. Almost."
2704 }
2705 pub const fn kind() -> GameModKind {
2707 GameModKind::Fun
2708 }
2709}
2710impl BloomOsu {
2711 pub const fn acronym() -> Acronym {
2713 unsafe { Acronym::from_str_unchecked("BM") }
2714 }
2715 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2717 unsafe {
2718 [
2719 Acronym::from_str_unchecked("FL"),
2720 Acronym::from_str_unchecked("NS"),
2721 Acronym::from_str_unchecked("TD"),
2722 ]
2723 }
2724 .into_iter()
2725 }
2726 pub const fn description() -> &'static str {
2728 "The cursor blooms into.. a larger cursor!"
2729 }
2730 pub const fn kind() -> GameModKind {
2732 GameModKind::Fun
2733 }
2734}
2735impl TouchDeviceOsu {
2736 pub const fn acronym() -> Acronym {
2738 unsafe { Acronym::from_str_unchecked("TD") }
2739 }
2740 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2742 unsafe {
2743 [
2744 Acronym::from_str_unchecked("AT"),
2745 Acronym::from_str_unchecked("CN"),
2746 Acronym::from_str_unchecked("AP"),
2747 Acronym::from_str_unchecked("BM"),
2748 ]
2749 }
2750 .into_iter()
2751 }
2752 pub const fn description() -> &'static str {
2754 "Automatically applied to plays on devices with a touchscreen."
2755 }
2756 pub const fn kind() -> GameModKind {
2758 GameModKind::System
2759 }
2760 pub const fn bits() -> u32 {
2764 4
2765 }
2766}
2767impl ScoreV2Osu {
2768 pub const fn acronym() -> Acronym {
2770 unsafe { Acronym::from_str_unchecked("SV2") }
2771 }
2772 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2774 [].into_iter()
2775 }
2776 pub const fn description() -> &'static str {
2778 "Score set on earlier osu! versions with the V2 scoring algorithm active."
2779 }
2780 pub const fn kind() -> GameModKind {
2782 GameModKind::System
2783 }
2784 pub const fn bits() -> u32 {
2788 536870912
2789 }
2790}
2791impl EasyTaiko {
2792 pub const fn acronym() -> Acronym {
2794 unsafe { Acronym::from_str_unchecked("EZ") }
2795 }
2796 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2798 unsafe {
2799 [
2800 Acronym::from_str_unchecked("HR"),
2801 Acronym::from_str_unchecked("DA"),
2802 ]
2803 }
2804 .into_iter()
2805 }
2806 pub const fn description() -> &'static str {
2808 "Beats move slower, and less accuracy required!"
2809 }
2810 pub const fn kind() -> GameModKind {
2812 GameModKind::DifficultyReduction
2813 }
2814 pub const fn bits() -> u32 {
2818 2
2819 }
2820}
2821impl NoFailTaiko {
2822 pub const fn acronym() -> Acronym {
2824 unsafe { Acronym::from_str_unchecked("NF") }
2825 }
2826 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2828 unsafe {
2829 [
2830 Acronym::from_str_unchecked("SD"),
2831 Acronym::from_str_unchecked("PF"),
2832 Acronym::from_str_unchecked("AC"),
2833 Acronym::from_str_unchecked("CN"),
2834 ]
2835 }
2836 .into_iter()
2837 }
2838 pub const fn description() -> &'static str {
2840 "You can't fail, no matter what."
2841 }
2842 pub const fn kind() -> GameModKind {
2844 GameModKind::DifficultyReduction
2845 }
2846 pub const fn bits() -> u32 {
2850 1
2851 }
2852}
2853impl HalfTimeTaiko {
2854 pub const fn acronym() -> Acronym {
2856 unsafe { Acronym::from_str_unchecked("HT") }
2857 }
2858 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2860 unsafe {
2861 [
2862 Acronym::from_str_unchecked("DC"),
2863 Acronym::from_str_unchecked("DT"),
2864 Acronym::from_str_unchecked("NC"),
2865 Acronym::from_str_unchecked("WU"),
2866 Acronym::from_str_unchecked("WD"),
2867 Acronym::from_str_unchecked("AS"),
2868 ]
2869 }
2870 .into_iter()
2871 }
2872 pub const fn description() -> &'static str {
2874 "Less zoom..."
2875 }
2876 pub const fn kind() -> GameModKind {
2878 GameModKind::DifficultyReduction
2879 }
2880 pub const fn bits() -> u32 {
2884 256
2885 }
2886}
2887impl DaycoreTaiko {
2888 pub const fn acronym() -> Acronym {
2890 unsafe { Acronym::from_str_unchecked("DC") }
2891 }
2892 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2894 unsafe {
2895 [
2896 Acronym::from_str_unchecked("HT"),
2897 Acronym::from_str_unchecked("DT"),
2898 Acronym::from_str_unchecked("NC"),
2899 Acronym::from_str_unchecked("WU"),
2900 Acronym::from_str_unchecked("WD"),
2901 Acronym::from_str_unchecked("AS"),
2902 ]
2903 }
2904 .into_iter()
2905 }
2906 pub const fn description() -> &'static str {
2908 "Whoaaaaa..."
2909 }
2910 pub const fn kind() -> GameModKind {
2912 GameModKind::DifficultyReduction
2913 }
2914}
2915impl SimplifiedRhythmTaiko {
2916 pub const fn acronym() -> Acronym {
2918 unsafe { Acronym::from_str_unchecked("SR") }
2919 }
2920 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2922 [].into_iter()
2923 }
2924 pub const fn description() -> &'static str {
2926 "Simplify tricky rhythms!"
2927 }
2928 pub const fn kind() -> GameModKind {
2930 GameModKind::DifficultyReduction
2931 }
2932}
2933impl HardRockTaiko {
2934 pub const fn acronym() -> Acronym {
2936 unsafe { Acronym::from_str_unchecked("HR") }
2937 }
2938 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2940 unsafe {
2941 [
2942 Acronym::from_str_unchecked("EZ"),
2943 Acronym::from_str_unchecked("DA"),
2944 ]
2945 }
2946 .into_iter()
2947 }
2948 pub const fn description() -> &'static str {
2950 "Everything just got a bit harder..."
2951 }
2952 pub const fn kind() -> GameModKind {
2954 GameModKind::DifficultyIncrease
2955 }
2956 pub const fn bits() -> u32 {
2960 16
2961 }
2962}
2963impl SuddenDeathTaiko {
2964 pub const fn acronym() -> Acronym {
2966 unsafe { Acronym::from_str_unchecked("SD") }
2967 }
2968 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
2970 unsafe {
2971 [
2972 Acronym::from_str_unchecked("NF"),
2973 Acronym::from_str_unchecked("PF"),
2974 Acronym::from_str_unchecked("CN"),
2975 ]
2976 }
2977 .into_iter()
2978 }
2979 pub const fn description() -> &'static str {
2981 "Miss and fail."
2982 }
2983 pub const fn kind() -> GameModKind {
2985 GameModKind::DifficultyIncrease
2986 }
2987 pub const fn bits() -> u32 {
2991 32
2992 }
2993}
2994impl PerfectTaiko {
2995 pub const fn acronym() -> Acronym {
2997 unsafe { Acronym::from_str_unchecked("PF") }
2998 }
2999 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3001 unsafe {
3002 [
3003 Acronym::from_str_unchecked("NF"),
3004 Acronym::from_str_unchecked("SD"),
3005 Acronym::from_str_unchecked("AC"),
3006 Acronym::from_str_unchecked("CN"),
3007 ]
3008 }
3009 .into_iter()
3010 }
3011 pub const fn description() -> &'static str {
3013 "SS or quit."
3014 }
3015 pub const fn kind() -> GameModKind {
3017 GameModKind::DifficultyIncrease
3018 }
3019 pub const fn bits() -> u32 {
3023 16416
3024 }
3025}
3026impl DoubleTimeTaiko {
3027 pub const fn acronym() -> Acronym {
3029 unsafe { Acronym::from_str_unchecked("DT") }
3030 }
3031 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3033 unsafe {
3034 [
3035 Acronym::from_str_unchecked("HT"),
3036 Acronym::from_str_unchecked("DC"),
3037 Acronym::from_str_unchecked("NC"),
3038 Acronym::from_str_unchecked("WU"),
3039 Acronym::from_str_unchecked("WD"),
3040 Acronym::from_str_unchecked("AS"),
3041 ]
3042 }
3043 .into_iter()
3044 }
3045 pub const fn description() -> &'static str {
3047 "Zoooooooooom..."
3048 }
3049 pub const fn kind() -> GameModKind {
3051 GameModKind::DifficultyIncrease
3052 }
3053 pub const fn bits() -> u32 {
3057 64
3058 }
3059}
3060impl NightcoreTaiko {
3061 pub const fn acronym() -> Acronym {
3063 unsafe { Acronym::from_str_unchecked("NC") }
3064 }
3065 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3067 unsafe {
3068 [
3069 Acronym::from_str_unchecked("HT"),
3070 Acronym::from_str_unchecked("DC"),
3071 Acronym::from_str_unchecked("DT"),
3072 Acronym::from_str_unchecked("WU"),
3073 Acronym::from_str_unchecked("WD"),
3074 Acronym::from_str_unchecked("AS"),
3075 ]
3076 }
3077 .into_iter()
3078 }
3079 pub const fn description() -> &'static str {
3081 "Uguuuuuuuu..."
3082 }
3083 pub const fn kind() -> GameModKind {
3085 GameModKind::DifficultyIncrease
3086 }
3087 pub const fn bits() -> u32 {
3091 576
3092 }
3093}
3094impl HiddenTaiko {
3095 pub const fn acronym() -> Acronym {
3097 unsafe { Acronym::from_str_unchecked("HD") }
3098 }
3099 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3101 [].into_iter()
3102 }
3103 pub const fn description() -> &'static str {
3105 "Beats fade out before you hit them!"
3106 }
3107 pub const fn kind() -> GameModKind {
3109 GameModKind::DifficultyIncrease
3110 }
3111 pub const fn bits() -> u32 {
3115 8
3116 }
3117}
3118impl FlashlightTaiko {
3119 pub const fn acronym() -> Acronym {
3121 unsafe { Acronym::from_str_unchecked("FL") }
3122 }
3123 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3125 [].into_iter()
3126 }
3127 pub const fn description() -> &'static str {
3129 "Restricted view area."
3130 }
3131 pub const fn kind() -> GameModKind {
3133 GameModKind::DifficultyIncrease
3134 }
3135 pub const fn bits() -> u32 {
3139 1024
3140 }
3141}
3142impl AccuracyChallengeTaiko {
3143 pub const fn acronym() -> Acronym {
3145 unsafe { Acronym::from_str_unchecked("AC") }
3146 }
3147 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3149 unsafe {
3150 [
3151 Acronym::from_str_unchecked("NF"),
3152 Acronym::from_str_unchecked("PF"),
3153 Acronym::from_str_unchecked("CN"),
3154 ]
3155 }
3156 .into_iter()
3157 }
3158 pub const fn description() -> &'static str {
3160 "Fail if your accuracy drops too low!"
3161 }
3162 pub const fn kind() -> GameModKind {
3164 GameModKind::DifficultyIncrease
3165 }
3166}
3167impl RandomTaiko {
3168 pub const fn acronym() -> Acronym {
3170 unsafe { Acronym::from_str_unchecked("RD") }
3171 }
3172 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3174 unsafe { [Acronym::from_str_unchecked("SW")] }.into_iter()
3175 }
3176 pub const fn description() -> &'static str {
3178 "Shuffle around the colours!"
3179 }
3180 pub const fn kind() -> GameModKind {
3182 GameModKind::Conversion
3183 }
3184 pub const fn bits() -> u32 {
3188 2097152
3189 }
3190}
3191impl DifficultyAdjustTaiko {
3192 pub const fn acronym() -> Acronym {
3194 unsafe { Acronym::from_str_unchecked("DA") }
3195 }
3196 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3198 unsafe {
3199 [
3200 Acronym::from_str_unchecked("EZ"),
3201 Acronym::from_str_unchecked("HR"),
3202 ]
3203 }
3204 .into_iter()
3205 }
3206 pub const fn description() -> &'static str {
3208 "Override a beatmap's difficulty settings."
3209 }
3210 pub const fn kind() -> GameModKind {
3212 GameModKind::Conversion
3213 }
3214}
3215impl ClassicTaiko {
3216 pub const fn acronym() -> Acronym {
3218 unsafe { Acronym::from_str_unchecked("CL") }
3219 }
3220 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3222 [].into_iter()
3223 }
3224 pub const fn description() -> &'static str {
3226 "Feeling nostalgic?"
3227 }
3228 pub const fn kind() -> GameModKind {
3230 GameModKind::Conversion
3231 }
3232}
3233impl SwapTaiko {
3234 pub const fn acronym() -> Acronym {
3236 unsafe { Acronym::from_str_unchecked("SW") }
3237 }
3238 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3240 unsafe { [Acronym::from_str_unchecked("RD")] }.into_iter()
3241 }
3242 pub const fn description() -> &'static str {
3244 "Dons become kats, kats become dons"
3245 }
3246 pub const fn kind() -> GameModKind {
3248 GameModKind::Conversion
3249 }
3250}
3251impl SingleTapTaiko {
3252 pub const fn acronym() -> Acronym {
3254 unsafe { Acronym::from_str_unchecked("SG") }
3255 }
3256 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3258 unsafe {
3259 [
3260 Acronym::from_str_unchecked("AT"),
3261 Acronym::from_str_unchecked("CN"),
3262 Acronym::from_str_unchecked("RX"),
3263 ]
3264 }
3265 .into_iter()
3266 }
3267 pub const fn description() -> &'static str {
3269 "One key for dons, one key for kats."
3270 }
3271 pub const fn kind() -> GameModKind {
3273 GameModKind::Conversion
3274 }
3275}
3276impl ConstantSpeedTaiko {
3277 pub const fn acronym() -> Acronym {
3279 unsafe { Acronym::from_str_unchecked("CS") }
3280 }
3281 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3283 [].into_iter()
3284 }
3285 pub const fn description() -> &'static str {
3287 "No more tricky speed changes!"
3288 }
3289 pub const fn kind() -> GameModKind {
3291 GameModKind::Conversion
3292 }
3293}
3294impl AutoplayTaiko {
3295 pub const fn acronym() -> Acronym {
3297 unsafe { Acronym::from_str_unchecked("AT") }
3298 }
3299 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3301 unsafe {
3302 [
3303 Acronym::from_str_unchecked("SG"),
3304 Acronym::from_str_unchecked("CN"),
3305 Acronym::from_str_unchecked("RX"),
3306 Acronym::from_str_unchecked("AS"),
3307 ]
3308 }
3309 .into_iter()
3310 }
3311 pub const fn description() -> &'static str {
3313 "Watch a perfect automated play through the song."
3314 }
3315 pub const fn kind() -> GameModKind {
3317 GameModKind::Automation
3318 }
3319 pub const fn bits() -> u32 {
3323 2048
3324 }
3325}
3326impl CinemaTaiko {
3327 pub const fn acronym() -> Acronym {
3329 unsafe { Acronym::from_str_unchecked("CN") }
3330 }
3331 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3333 unsafe {
3334 [
3335 Acronym::from_str_unchecked("NF"),
3336 Acronym::from_str_unchecked("SD"),
3337 Acronym::from_str_unchecked("PF"),
3338 Acronym::from_str_unchecked("AC"),
3339 Acronym::from_str_unchecked("SG"),
3340 Acronym::from_str_unchecked("AT"),
3341 Acronym::from_str_unchecked("RX"),
3342 Acronym::from_str_unchecked("AS"),
3343 ]
3344 }
3345 .into_iter()
3346 }
3347 pub const fn description() -> &'static str {
3349 "Watch the video without visual distractions."
3350 }
3351 pub const fn kind() -> GameModKind {
3353 GameModKind::Automation
3354 }
3355 pub const fn bits() -> u32 {
3359 4194304
3360 }
3361}
3362impl RelaxTaiko {
3363 pub const fn acronym() -> Acronym {
3365 unsafe { Acronym::from_str_unchecked("RX") }
3366 }
3367 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3369 unsafe {
3370 [
3371 Acronym::from_str_unchecked("SG"),
3372 Acronym::from_str_unchecked("AT"),
3373 Acronym::from_str_unchecked("CN"),
3374 ]
3375 }
3376 .into_iter()
3377 }
3378 pub const fn description() -> &'static str {
3380 "No need to remember which key is correct anymore!"
3381 }
3382 pub const fn kind() -> GameModKind {
3384 GameModKind::Automation
3385 }
3386 pub const fn bits() -> u32 {
3390 128
3391 }
3392}
3393impl WindUpTaiko {
3394 pub const fn acronym() -> Acronym {
3396 unsafe { Acronym::from_str_unchecked("WU") }
3397 }
3398 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3400 unsafe {
3401 [
3402 Acronym::from_str_unchecked("HT"),
3403 Acronym::from_str_unchecked("DC"),
3404 Acronym::from_str_unchecked("DT"),
3405 Acronym::from_str_unchecked("NC"),
3406 Acronym::from_str_unchecked("WD"),
3407 Acronym::from_str_unchecked("AS"),
3408 ]
3409 }
3410 .into_iter()
3411 }
3412 pub const fn description() -> &'static str {
3414 "Can you keep up?"
3415 }
3416 pub const fn kind() -> GameModKind {
3418 GameModKind::Fun
3419 }
3420}
3421impl WindDownTaiko {
3422 pub const fn acronym() -> Acronym {
3424 unsafe { Acronym::from_str_unchecked("WD") }
3425 }
3426 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3428 unsafe {
3429 [
3430 Acronym::from_str_unchecked("HT"),
3431 Acronym::from_str_unchecked("DC"),
3432 Acronym::from_str_unchecked("DT"),
3433 Acronym::from_str_unchecked("NC"),
3434 Acronym::from_str_unchecked("WU"),
3435 Acronym::from_str_unchecked("AS"),
3436 ]
3437 }
3438 .into_iter()
3439 }
3440 pub const fn description() -> &'static str {
3442 "Sloooow doooown..."
3443 }
3444 pub const fn kind() -> GameModKind {
3446 GameModKind::Fun
3447 }
3448}
3449impl MutedTaiko {
3450 pub const fn acronym() -> Acronym {
3452 unsafe { Acronym::from_str_unchecked("MU") }
3453 }
3454 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3456 [].into_iter()
3457 }
3458 pub const fn description() -> &'static str {
3460 "Can you still feel the rhythm without music?"
3461 }
3462 pub const fn kind() -> GameModKind {
3464 GameModKind::Fun
3465 }
3466}
3467impl AdaptiveSpeedTaiko {
3468 pub const fn acronym() -> Acronym {
3470 unsafe { Acronym::from_str_unchecked("AS") }
3471 }
3472 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3474 unsafe {
3475 [
3476 Acronym::from_str_unchecked("HT"),
3477 Acronym::from_str_unchecked("DC"),
3478 Acronym::from_str_unchecked("DT"),
3479 Acronym::from_str_unchecked("NC"),
3480 Acronym::from_str_unchecked("AT"),
3481 Acronym::from_str_unchecked("CN"),
3482 Acronym::from_str_unchecked("WU"),
3483 Acronym::from_str_unchecked("WD"),
3484 ]
3485 }
3486 .into_iter()
3487 }
3488 pub const fn description() -> &'static str {
3490 "Let track speed adapt to you."
3491 }
3492 pub const fn kind() -> GameModKind {
3494 GameModKind::Fun
3495 }
3496}
3497impl ScoreV2Taiko {
3498 pub const fn acronym() -> Acronym {
3500 unsafe { Acronym::from_str_unchecked("SV2") }
3501 }
3502 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3504 [].into_iter()
3505 }
3506 pub const fn description() -> &'static str {
3508 "Score set on earlier osu! versions with the V2 scoring algorithm active."
3509 }
3510 pub const fn kind() -> GameModKind {
3512 GameModKind::System
3513 }
3514 pub const fn bits() -> u32 {
3518 536870912
3519 }
3520}
3521impl EasyCatch {
3522 pub const fn acronym() -> Acronym {
3524 unsafe { Acronym::from_str_unchecked("EZ") }
3525 }
3526 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3528 unsafe {
3529 [
3530 Acronym::from_str_unchecked("HR"),
3531 Acronym::from_str_unchecked("AC"),
3532 Acronym::from_str_unchecked("DA"),
3533 ]
3534 }
3535 .into_iter()
3536 }
3537 pub const fn description() -> &'static str {
3539 "Larger fruits, more forgiving HP drain, less accuracy required, and extra lives!"
3540 }
3541 pub const fn kind() -> GameModKind {
3543 GameModKind::DifficultyReduction
3544 }
3545 pub const fn bits() -> u32 {
3549 2
3550 }
3551}
3552impl NoFailCatch {
3553 pub const fn acronym() -> Acronym {
3555 unsafe { Acronym::from_str_unchecked("NF") }
3556 }
3557 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3559 unsafe {
3560 [
3561 Acronym::from_str_unchecked("SD"),
3562 Acronym::from_str_unchecked("PF"),
3563 Acronym::from_str_unchecked("AC"),
3564 Acronym::from_str_unchecked("CN"),
3565 ]
3566 }
3567 .into_iter()
3568 }
3569 pub const fn description() -> &'static str {
3571 "You can't fail, no matter what."
3572 }
3573 pub const fn kind() -> GameModKind {
3575 GameModKind::DifficultyReduction
3576 }
3577 pub const fn bits() -> u32 {
3581 1
3582 }
3583}
3584impl HalfTimeCatch {
3585 pub const fn acronym() -> Acronym {
3587 unsafe { Acronym::from_str_unchecked("HT") }
3588 }
3589 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3591 unsafe {
3592 [
3593 Acronym::from_str_unchecked("DC"),
3594 Acronym::from_str_unchecked("DT"),
3595 Acronym::from_str_unchecked("NC"),
3596 Acronym::from_str_unchecked("WU"),
3597 Acronym::from_str_unchecked("WD"),
3598 ]
3599 }
3600 .into_iter()
3601 }
3602 pub const fn description() -> &'static str {
3604 "Less zoom..."
3605 }
3606 pub const fn kind() -> GameModKind {
3608 GameModKind::DifficultyReduction
3609 }
3610 pub const fn bits() -> u32 {
3614 256
3615 }
3616}
3617impl DaycoreCatch {
3618 pub const fn acronym() -> Acronym {
3620 unsafe { Acronym::from_str_unchecked("DC") }
3621 }
3622 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3624 unsafe {
3625 [
3626 Acronym::from_str_unchecked("HT"),
3627 Acronym::from_str_unchecked("DT"),
3628 Acronym::from_str_unchecked("NC"),
3629 Acronym::from_str_unchecked("WU"),
3630 Acronym::from_str_unchecked("WD"),
3631 ]
3632 }
3633 .into_iter()
3634 }
3635 pub const fn description() -> &'static str {
3637 "Whoaaaaa..."
3638 }
3639 pub const fn kind() -> GameModKind {
3641 GameModKind::DifficultyReduction
3642 }
3643}
3644impl HardRockCatch {
3645 pub const fn acronym() -> Acronym {
3647 unsafe { Acronym::from_str_unchecked("HR") }
3648 }
3649 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3651 unsafe {
3652 [
3653 Acronym::from_str_unchecked("EZ"),
3654 Acronym::from_str_unchecked("DA"),
3655 ]
3656 }
3657 .into_iter()
3658 }
3659 pub const fn description() -> &'static str {
3661 "Everything just got a bit harder..."
3662 }
3663 pub const fn kind() -> GameModKind {
3665 GameModKind::DifficultyIncrease
3666 }
3667 pub const fn bits() -> u32 {
3671 16
3672 }
3673}
3674impl SuddenDeathCatch {
3675 pub const fn acronym() -> Acronym {
3677 unsafe { Acronym::from_str_unchecked("SD") }
3678 }
3679 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3681 unsafe {
3682 [
3683 Acronym::from_str_unchecked("NF"),
3684 Acronym::from_str_unchecked("PF"),
3685 Acronym::from_str_unchecked("CN"),
3686 ]
3687 }
3688 .into_iter()
3689 }
3690 pub const fn description() -> &'static str {
3692 "Miss and fail."
3693 }
3694 pub const fn kind() -> GameModKind {
3696 GameModKind::DifficultyIncrease
3697 }
3698 pub const fn bits() -> u32 {
3702 32
3703 }
3704}
3705impl PerfectCatch {
3706 pub const fn acronym() -> Acronym {
3708 unsafe { Acronym::from_str_unchecked("PF") }
3709 }
3710 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3712 unsafe {
3713 [
3714 Acronym::from_str_unchecked("NF"),
3715 Acronym::from_str_unchecked("SD"),
3716 Acronym::from_str_unchecked("AC"),
3717 Acronym::from_str_unchecked("CN"),
3718 ]
3719 }
3720 .into_iter()
3721 }
3722 pub const fn description() -> &'static str {
3724 "SS or quit."
3725 }
3726 pub const fn kind() -> GameModKind {
3728 GameModKind::DifficultyIncrease
3729 }
3730 pub const fn bits() -> u32 {
3734 16416
3735 }
3736}
3737impl DoubleTimeCatch {
3738 pub const fn acronym() -> Acronym {
3740 unsafe { Acronym::from_str_unchecked("DT") }
3741 }
3742 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3744 unsafe {
3745 [
3746 Acronym::from_str_unchecked("HT"),
3747 Acronym::from_str_unchecked("DC"),
3748 Acronym::from_str_unchecked("NC"),
3749 Acronym::from_str_unchecked("WU"),
3750 Acronym::from_str_unchecked("WD"),
3751 ]
3752 }
3753 .into_iter()
3754 }
3755 pub const fn description() -> &'static str {
3757 "Zoooooooooom..."
3758 }
3759 pub const fn kind() -> GameModKind {
3761 GameModKind::DifficultyIncrease
3762 }
3763 pub const fn bits() -> u32 {
3767 64
3768 }
3769}
3770impl NightcoreCatch {
3771 pub const fn acronym() -> Acronym {
3773 unsafe { Acronym::from_str_unchecked("NC") }
3774 }
3775 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3777 unsafe {
3778 [
3779 Acronym::from_str_unchecked("HT"),
3780 Acronym::from_str_unchecked("DC"),
3781 Acronym::from_str_unchecked("DT"),
3782 Acronym::from_str_unchecked("WU"),
3783 Acronym::from_str_unchecked("WD"),
3784 ]
3785 }
3786 .into_iter()
3787 }
3788 pub const fn description() -> &'static str {
3790 "Uguuuuuuuu..."
3791 }
3792 pub const fn kind() -> GameModKind {
3794 GameModKind::DifficultyIncrease
3795 }
3796 pub const fn bits() -> u32 {
3800 576
3801 }
3802}
3803impl HiddenCatch {
3804 pub const fn acronym() -> Acronym {
3806 unsafe { Acronym::from_str_unchecked("HD") }
3807 }
3808 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3810 [].into_iter()
3811 }
3812 pub const fn description() -> &'static str {
3814 "Play with fading fruits."
3815 }
3816 pub const fn kind() -> GameModKind {
3818 GameModKind::DifficultyIncrease
3819 }
3820 pub const fn bits() -> u32 {
3824 8
3825 }
3826}
3827impl FlashlightCatch {
3828 pub const fn acronym() -> Acronym {
3830 unsafe { Acronym::from_str_unchecked("FL") }
3831 }
3832 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3834 [].into_iter()
3835 }
3836 pub const fn description() -> &'static str {
3838 "Restricted view area."
3839 }
3840 pub const fn kind() -> GameModKind {
3842 GameModKind::DifficultyIncrease
3843 }
3844 pub const fn bits() -> u32 {
3848 1024
3849 }
3850}
3851impl AccuracyChallengeCatch {
3852 pub const fn acronym() -> Acronym {
3854 unsafe { Acronym::from_str_unchecked("AC") }
3855 }
3856 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3858 unsafe {
3859 [
3860 Acronym::from_str_unchecked("EZ"),
3861 Acronym::from_str_unchecked("NF"),
3862 Acronym::from_str_unchecked("PF"),
3863 Acronym::from_str_unchecked("CN"),
3864 ]
3865 }
3866 .into_iter()
3867 }
3868 pub const fn description() -> &'static str {
3870 "Fail if your accuracy drops too low!"
3871 }
3872 pub const fn kind() -> GameModKind {
3874 GameModKind::DifficultyIncrease
3875 }
3876}
3877impl DifficultyAdjustCatch {
3878 pub const fn acronym() -> Acronym {
3880 unsafe { Acronym::from_str_unchecked("DA") }
3881 }
3882 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3884 unsafe {
3885 [
3886 Acronym::from_str_unchecked("EZ"),
3887 Acronym::from_str_unchecked("HR"),
3888 ]
3889 }
3890 .into_iter()
3891 }
3892 pub const fn description() -> &'static str {
3894 "Override a beatmap's difficulty settings."
3895 }
3896 pub const fn kind() -> GameModKind {
3898 GameModKind::Conversion
3899 }
3900}
3901impl ClassicCatch {
3902 pub const fn acronym() -> Acronym {
3904 unsafe { Acronym::from_str_unchecked("CL") }
3905 }
3906 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3908 [].into_iter()
3909 }
3910 pub const fn description() -> &'static str {
3912 "Feeling nostalgic?"
3913 }
3914 pub const fn kind() -> GameModKind {
3916 GameModKind::Conversion
3917 }
3918}
3919impl MirrorCatch {
3920 pub const fn acronym() -> Acronym {
3922 unsafe { Acronym::from_str_unchecked("MR") }
3923 }
3924 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3926 [].into_iter()
3927 }
3928 pub const fn description() -> &'static str {
3930 "Fruits are flipped horizontally."
3931 }
3932 pub const fn kind() -> GameModKind {
3934 GameModKind::Conversion
3935 }
3936 pub const fn bits() -> u32 {
3940 1073741824
3941 }
3942}
3943impl AutoplayCatch {
3944 pub const fn acronym() -> Acronym {
3946 unsafe { Acronym::from_str_unchecked("AT") }
3947 }
3948 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3950 unsafe {
3951 [
3952 Acronym::from_str_unchecked("CN"),
3953 Acronym::from_str_unchecked("RX"),
3954 Acronym::from_str_unchecked("MF"),
3955 ]
3956 }
3957 .into_iter()
3958 }
3959 pub const fn description() -> &'static str {
3961 "Watch a perfect automated play through the song."
3962 }
3963 pub const fn kind() -> GameModKind {
3965 GameModKind::Automation
3966 }
3967 pub const fn bits() -> u32 {
3971 2048
3972 }
3973}
3974impl CinemaCatch {
3975 pub const fn acronym() -> Acronym {
3977 unsafe { Acronym::from_str_unchecked("CN") }
3978 }
3979 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
3981 unsafe {
3982 [
3983 Acronym::from_str_unchecked("NF"),
3984 Acronym::from_str_unchecked("SD"),
3985 Acronym::from_str_unchecked("PF"),
3986 Acronym::from_str_unchecked("AC"),
3987 Acronym::from_str_unchecked("AT"),
3988 Acronym::from_str_unchecked("RX"),
3989 Acronym::from_str_unchecked("MF"),
3990 ]
3991 }
3992 .into_iter()
3993 }
3994 pub const fn description() -> &'static str {
3996 "Watch the video without visual distractions."
3997 }
3998 pub const fn kind() -> GameModKind {
4000 GameModKind::Automation
4001 }
4002 pub const fn bits() -> u32 {
4006 4194304
4007 }
4008}
4009impl RelaxCatch {
4010 pub const fn acronym() -> Acronym {
4012 unsafe { Acronym::from_str_unchecked("RX") }
4013 }
4014 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4016 unsafe {
4017 [
4018 Acronym::from_str_unchecked("AT"),
4019 Acronym::from_str_unchecked("CN"),
4020 Acronym::from_str_unchecked("MF"),
4021 ]
4022 }
4023 .into_iter()
4024 }
4025 pub const fn description() -> &'static str {
4027 "Use the mouse to control the catcher."
4028 }
4029 pub const fn kind() -> GameModKind {
4031 GameModKind::Automation
4032 }
4033 pub const fn bits() -> u32 {
4037 128
4038 }
4039}
4040impl WindUpCatch {
4041 pub const fn acronym() -> Acronym {
4043 unsafe { Acronym::from_str_unchecked("WU") }
4044 }
4045 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4047 unsafe {
4048 [
4049 Acronym::from_str_unchecked("HT"),
4050 Acronym::from_str_unchecked("DC"),
4051 Acronym::from_str_unchecked("DT"),
4052 Acronym::from_str_unchecked("NC"),
4053 Acronym::from_str_unchecked("WD"),
4054 ]
4055 }
4056 .into_iter()
4057 }
4058 pub const fn description() -> &'static str {
4060 "Can you keep up?"
4061 }
4062 pub const fn kind() -> GameModKind {
4064 GameModKind::Fun
4065 }
4066}
4067impl WindDownCatch {
4068 pub const fn acronym() -> Acronym {
4070 unsafe { Acronym::from_str_unchecked("WD") }
4071 }
4072 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4074 unsafe {
4075 [
4076 Acronym::from_str_unchecked("HT"),
4077 Acronym::from_str_unchecked("DC"),
4078 Acronym::from_str_unchecked("DT"),
4079 Acronym::from_str_unchecked("NC"),
4080 Acronym::from_str_unchecked("WU"),
4081 ]
4082 }
4083 .into_iter()
4084 }
4085 pub const fn description() -> &'static str {
4087 "Sloooow doooown..."
4088 }
4089 pub const fn kind() -> GameModKind {
4091 GameModKind::Fun
4092 }
4093}
4094impl FloatingFruitsCatch {
4095 pub const fn acronym() -> Acronym {
4097 unsafe { Acronym::from_str_unchecked("FF") }
4098 }
4099 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4101 [].into_iter()
4102 }
4103 pub const fn description() -> &'static str {
4105 "The fruits are... floating?"
4106 }
4107 pub const fn kind() -> GameModKind {
4109 GameModKind::Fun
4110 }
4111}
4112impl MutedCatch {
4113 pub const fn acronym() -> Acronym {
4115 unsafe { Acronym::from_str_unchecked("MU") }
4116 }
4117 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4119 [].into_iter()
4120 }
4121 pub const fn description() -> &'static str {
4123 "Can you still feel the rhythm without music?"
4124 }
4125 pub const fn kind() -> GameModKind {
4127 GameModKind::Fun
4128 }
4129}
4130impl NoScopeCatch {
4131 pub const fn acronym() -> Acronym {
4133 unsafe { Acronym::from_str_unchecked("NS") }
4134 }
4135 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4137 [].into_iter()
4138 }
4139 pub const fn description() -> &'static str {
4141 "Where's the catcher?"
4142 }
4143 pub const fn kind() -> GameModKind {
4145 GameModKind::Fun
4146 }
4147}
4148impl MovingFastCatch {
4149 pub const fn acronym() -> Acronym {
4151 unsafe { Acronym::from_str_unchecked("MF") }
4152 }
4153 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4155 unsafe {
4156 [
4157 Acronym::from_str_unchecked("AT"),
4158 Acronym::from_str_unchecked("CN"),
4159 Acronym::from_str_unchecked("RX"),
4160 ]
4161 }
4162 .into_iter()
4163 }
4164 pub const fn description() -> &'static str {
4166 "Dashing by default, slow down!"
4167 }
4168 pub const fn kind() -> GameModKind {
4170 GameModKind::Fun
4171 }
4172}
4173impl ScoreV2Catch {
4174 pub const fn acronym() -> Acronym {
4176 unsafe { Acronym::from_str_unchecked("SV2") }
4177 }
4178 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4180 [].into_iter()
4181 }
4182 pub const fn description() -> &'static str {
4184 "Score set on earlier osu! versions with the V2 scoring algorithm active."
4185 }
4186 pub const fn kind() -> GameModKind {
4188 GameModKind::System
4189 }
4190 pub const fn bits() -> u32 {
4194 536870912
4195 }
4196}
4197impl EasyMania {
4198 pub const fn acronym() -> Acronym {
4200 unsafe { Acronym::from_str_unchecked("EZ") }
4201 }
4202 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4204 unsafe {
4205 [
4206 Acronym::from_str_unchecked("HR"),
4207 Acronym::from_str_unchecked("AC"),
4208 Acronym::from_str_unchecked("DA"),
4209 ]
4210 }
4211 .into_iter()
4212 }
4213 pub const fn description() -> &'static str {
4215 "More forgiving HP drain, less accuracy required, and extra lives!"
4216 }
4217 pub const fn kind() -> GameModKind {
4219 GameModKind::DifficultyReduction
4220 }
4221 pub const fn bits() -> u32 {
4225 2
4226 }
4227}
4228impl NoFailMania {
4229 pub const fn acronym() -> Acronym {
4231 unsafe { Acronym::from_str_unchecked("NF") }
4232 }
4233 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4235 unsafe {
4236 [
4237 Acronym::from_str_unchecked("SD"),
4238 Acronym::from_str_unchecked("PF"),
4239 Acronym::from_str_unchecked("AC"),
4240 Acronym::from_str_unchecked("CN"),
4241 ]
4242 }
4243 .into_iter()
4244 }
4245 pub const fn description() -> &'static str {
4247 "You can't fail, no matter what."
4248 }
4249 pub const fn kind() -> GameModKind {
4251 GameModKind::DifficultyReduction
4252 }
4253 pub const fn bits() -> u32 {
4257 1
4258 }
4259}
4260impl HalfTimeMania {
4261 pub const fn acronym() -> Acronym {
4263 unsafe { Acronym::from_str_unchecked("HT") }
4264 }
4265 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4267 unsafe {
4268 [
4269 Acronym::from_str_unchecked("DC"),
4270 Acronym::from_str_unchecked("DT"),
4271 Acronym::from_str_unchecked("NC"),
4272 Acronym::from_str_unchecked("WU"),
4273 Acronym::from_str_unchecked("WD"),
4274 Acronym::from_str_unchecked("AS"),
4275 ]
4276 }
4277 .into_iter()
4278 }
4279 pub const fn description() -> &'static str {
4281 "Less zoom..."
4282 }
4283 pub const fn kind() -> GameModKind {
4285 GameModKind::DifficultyReduction
4286 }
4287 pub const fn bits() -> u32 {
4291 256
4292 }
4293}
4294impl DaycoreMania {
4295 pub const fn acronym() -> Acronym {
4297 unsafe { Acronym::from_str_unchecked("DC") }
4298 }
4299 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4301 unsafe {
4302 [
4303 Acronym::from_str_unchecked("HT"),
4304 Acronym::from_str_unchecked("DT"),
4305 Acronym::from_str_unchecked("NC"),
4306 Acronym::from_str_unchecked("WU"),
4307 Acronym::from_str_unchecked("WD"),
4308 Acronym::from_str_unchecked("AS"),
4309 ]
4310 }
4311 .into_iter()
4312 }
4313 pub const fn description() -> &'static str {
4315 "Whoaaaaa..."
4316 }
4317 pub const fn kind() -> GameModKind {
4319 GameModKind::DifficultyReduction
4320 }
4321}
4322impl NoReleaseMania {
4323 pub const fn acronym() -> Acronym {
4325 unsafe { Acronym::from_str_unchecked("NR") }
4326 }
4327 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4329 unsafe { [Acronym::from_str_unchecked("HO")] }.into_iter()
4330 }
4331 pub const fn description() -> &'static str {
4333 "No more timing the end of hold notes."
4334 }
4335 pub const fn kind() -> GameModKind {
4337 GameModKind::DifficultyReduction
4338 }
4339}
4340impl HardRockMania {
4341 pub const fn acronym() -> Acronym {
4343 unsafe { Acronym::from_str_unchecked("HR") }
4344 }
4345 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4347 unsafe {
4348 [
4349 Acronym::from_str_unchecked("EZ"),
4350 Acronym::from_str_unchecked("DA"),
4351 ]
4352 }
4353 .into_iter()
4354 }
4355 pub const fn description() -> &'static str {
4357 "Everything just got a bit harder..."
4358 }
4359 pub const fn kind() -> GameModKind {
4361 GameModKind::DifficultyIncrease
4362 }
4363 pub const fn bits() -> u32 {
4367 16
4368 }
4369}
4370impl SuddenDeathMania {
4371 pub const fn acronym() -> Acronym {
4373 unsafe { Acronym::from_str_unchecked("SD") }
4374 }
4375 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4377 unsafe {
4378 [
4379 Acronym::from_str_unchecked("NF"),
4380 Acronym::from_str_unchecked("PF"),
4381 Acronym::from_str_unchecked("CN"),
4382 ]
4383 }
4384 .into_iter()
4385 }
4386 pub const fn description() -> &'static str {
4388 "Miss and fail."
4389 }
4390 pub const fn kind() -> GameModKind {
4392 GameModKind::DifficultyIncrease
4393 }
4394 pub const fn bits() -> u32 {
4398 32
4399 }
4400}
4401impl PerfectMania {
4402 pub const fn acronym() -> Acronym {
4404 unsafe { Acronym::from_str_unchecked("PF") }
4405 }
4406 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4408 unsafe {
4409 [
4410 Acronym::from_str_unchecked("NF"),
4411 Acronym::from_str_unchecked("SD"),
4412 Acronym::from_str_unchecked("AC"),
4413 Acronym::from_str_unchecked("CN"),
4414 ]
4415 }
4416 .into_iter()
4417 }
4418 pub const fn description() -> &'static str {
4420 "SS or quit."
4421 }
4422 pub const fn kind() -> GameModKind {
4424 GameModKind::DifficultyIncrease
4425 }
4426 pub const fn bits() -> u32 {
4430 16416
4431 }
4432}
4433impl DoubleTimeMania {
4434 pub const fn acronym() -> Acronym {
4436 unsafe { Acronym::from_str_unchecked("DT") }
4437 }
4438 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4440 unsafe {
4441 [
4442 Acronym::from_str_unchecked("HT"),
4443 Acronym::from_str_unchecked("DC"),
4444 Acronym::from_str_unchecked("NC"),
4445 Acronym::from_str_unchecked("WU"),
4446 Acronym::from_str_unchecked("WD"),
4447 Acronym::from_str_unchecked("AS"),
4448 ]
4449 }
4450 .into_iter()
4451 }
4452 pub const fn description() -> &'static str {
4454 "Zoooooooooom..."
4455 }
4456 pub const fn kind() -> GameModKind {
4458 GameModKind::DifficultyIncrease
4459 }
4460 pub const fn bits() -> u32 {
4464 64
4465 }
4466}
4467impl NightcoreMania {
4468 pub const fn acronym() -> Acronym {
4470 unsafe { Acronym::from_str_unchecked("NC") }
4471 }
4472 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4474 unsafe {
4475 [
4476 Acronym::from_str_unchecked("HT"),
4477 Acronym::from_str_unchecked("DC"),
4478 Acronym::from_str_unchecked("DT"),
4479 Acronym::from_str_unchecked("WU"),
4480 Acronym::from_str_unchecked("WD"),
4481 Acronym::from_str_unchecked("AS"),
4482 ]
4483 }
4484 .into_iter()
4485 }
4486 pub const fn description() -> &'static str {
4488 "Uguuuuuuuu..."
4489 }
4490 pub const fn kind() -> GameModKind {
4492 GameModKind::DifficultyIncrease
4493 }
4494 pub const fn bits() -> u32 {
4498 576
4499 }
4500}
4501impl FadeInMania {
4502 pub const fn acronym() -> Acronym {
4504 unsafe { Acronym::from_str_unchecked("FI") }
4505 }
4506 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4508 unsafe {
4509 [
4510 Acronym::from_str_unchecked("HD"),
4511 Acronym::from_str_unchecked("CO"),
4512 Acronym::from_str_unchecked("FL"),
4513 ]
4514 }
4515 .into_iter()
4516 }
4517 pub const fn description() -> &'static str {
4519 "Keys appear out of nowhere!"
4520 }
4521 pub const fn kind() -> GameModKind {
4523 GameModKind::DifficultyIncrease
4524 }
4525 pub const fn bits() -> u32 {
4529 1048576
4530 }
4531}
4532impl HiddenMania {
4533 pub const fn acronym() -> Acronym {
4535 unsafe { Acronym::from_str_unchecked("HD") }
4536 }
4537 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4539 unsafe {
4540 [
4541 Acronym::from_str_unchecked("FI"),
4542 Acronym::from_str_unchecked("CO"),
4543 Acronym::from_str_unchecked("FL"),
4544 ]
4545 }
4546 .into_iter()
4547 }
4548 pub const fn description() -> &'static str {
4550 "Keys fade out before you hit them!"
4551 }
4552 pub const fn kind() -> GameModKind {
4554 GameModKind::DifficultyIncrease
4555 }
4556 pub const fn bits() -> u32 {
4560 8
4561 }
4562}
4563impl CoverMania {
4564 pub const fn acronym() -> Acronym {
4566 unsafe { Acronym::from_str_unchecked("CO") }
4567 }
4568 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4570 unsafe {
4571 [
4572 Acronym::from_str_unchecked("FI"),
4573 Acronym::from_str_unchecked("HD"),
4574 Acronym::from_str_unchecked("FL"),
4575 ]
4576 }
4577 .into_iter()
4578 }
4579 pub const fn description() -> &'static str {
4581 "Decrease the playfield's viewing area."
4582 }
4583 pub const fn kind() -> GameModKind {
4585 GameModKind::DifficultyIncrease
4586 }
4587}
4588impl FlashlightMania {
4589 pub const fn acronym() -> Acronym {
4591 unsafe { Acronym::from_str_unchecked("FL") }
4592 }
4593 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4595 unsafe {
4596 [
4597 Acronym::from_str_unchecked("FI"),
4598 Acronym::from_str_unchecked("HD"),
4599 Acronym::from_str_unchecked("CO"),
4600 ]
4601 }
4602 .into_iter()
4603 }
4604 pub const fn description() -> &'static str {
4606 "Restricted view area."
4607 }
4608 pub const fn kind() -> GameModKind {
4610 GameModKind::DifficultyIncrease
4611 }
4612 pub const fn bits() -> u32 {
4616 1024
4617 }
4618}
4619impl AccuracyChallengeMania {
4620 pub const fn acronym() -> Acronym {
4622 unsafe { Acronym::from_str_unchecked("AC") }
4623 }
4624 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4626 unsafe {
4627 [
4628 Acronym::from_str_unchecked("EZ"),
4629 Acronym::from_str_unchecked("NF"),
4630 Acronym::from_str_unchecked("PF"),
4631 Acronym::from_str_unchecked("CN"),
4632 ]
4633 }
4634 .into_iter()
4635 }
4636 pub const fn description() -> &'static str {
4638 "Fail if your accuracy drops too low!"
4639 }
4640 pub const fn kind() -> GameModKind {
4642 GameModKind::DifficultyIncrease
4643 }
4644}
4645impl RandomMania {
4646 pub const fn acronym() -> Acronym {
4648 unsafe { Acronym::from_str_unchecked("RD") }
4649 }
4650 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4652 [].into_iter()
4653 }
4654 pub const fn description() -> &'static str {
4656 "Shuffle around the keys!"
4657 }
4658 pub const fn kind() -> GameModKind {
4660 GameModKind::Conversion
4661 }
4662 pub const fn bits() -> u32 {
4666 2097152
4667 }
4668}
4669impl DualStagesMania {
4670 pub const fn acronym() -> Acronym {
4672 unsafe { Acronym::from_str_unchecked("DS") }
4673 }
4674 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4676 [].into_iter()
4677 }
4678 pub const fn description() -> &'static str {
4680 "Double the stages, double the fun!"
4681 }
4682 pub const fn kind() -> GameModKind {
4684 GameModKind::Conversion
4685 }
4686 pub const fn bits() -> u32 {
4690 33554432
4691 }
4692}
4693impl MirrorMania {
4694 pub const fn acronym() -> Acronym {
4696 unsafe { Acronym::from_str_unchecked("MR") }
4697 }
4698 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4700 [].into_iter()
4701 }
4702 pub const fn description() -> &'static str {
4704 "Notes are flipped horizontally."
4705 }
4706 pub const fn kind() -> GameModKind {
4708 GameModKind::Conversion
4709 }
4710 pub const fn bits() -> u32 {
4714 1073741824
4715 }
4716}
4717impl DifficultyAdjustMania {
4718 pub const fn acronym() -> Acronym {
4720 unsafe { Acronym::from_str_unchecked("DA") }
4721 }
4722 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4724 unsafe {
4725 [
4726 Acronym::from_str_unchecked("EZ"),
4727 Acronym::from_str_unchecked("HR"),
4728 ]
4729 }
4730 .into_iter()
4731 }
4732 pub const fn description() -> &'static str {
4734 "Override a beatmap's difficulty settings."
4735 }
4736 pub const fn kind() -> GameModKind {
4738 GameModKind::Conversion
4739 }
4740}
4741impl ClassicMania {
4742 pub const fn acronym() -> Acronym {
4744 unsafe { Acronym::from_str_unchecked("CL") }
4745 }
4746 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4748 [].into_iter()
4749 }
4750 pub const fn description() -> &'static str {
4752 "Feeling nostalgic?"
4753 }
4754 pub const fn kind() -> GameModKind {
4756 GameModKind::Conversion
4757 }
4758}
4759impl InvertMania {
4760 pub const fn acronym() -> Acronym {
4762 unsafe { Acronym::from_str_unchecked("IN") }
4763 }
4764 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4766 unsafe { [Acronym::from_str_unchecked("HO")] }.into_iter()
4767 }
4768 pub const fn description() -> &'static str {
4770 "Hold the keys. To the beat."
4771 }
4772 pub const fn kind() -> GameModKind {
4774 GameModKind::Conversion
4775 }
4776}
4777impl ConstantSpeedMania {
4778 pub const fn acronym() -> Acronym {
4780 unsafe { Acronym::from_str_unchecked("CS") }
4781 }
4782 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4784 [].into_iter()
4785 }
4786 pub const fn description() -> &'static str {
4788 "No more tricky speed changes!"
4789 }
4790 pub const fn kind() -> GameModKind {
4792 GameModKind::Conversion
4793 }
4794}
4795impl HoldOffMania {
4796 pub const fn acronym() -> Acronym {
4798 unsafe { Acronym::from_str_unchecked("HO") }
4799 }
4800 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4802 unsafe {
4803 [
4804 Acronym::from_str_unchecked("NR"),
4805 Acronym::from_str_unchecked("IN"),
4806 ]
4807 }
4808 .into_iter()
4809 }
4810 pub const fn description() -> &'static str {
4812 "Replaces all hold notes with normal notes."
4813 }
4814 pub const fn kind() -> GameModKind {
4816 GameModKind::Conversion
4817 }
4818}
4819impl OneKeyMania {
4820 pub const fn acronym() -> Acronym {
4822 unsafe { Acronym::from_str_unchecked("1K") }
4823 }
4824 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4826 unsafe {
4827 [
4828 Acronym::from_str_unchecked("2K"),
4829 Acronym::from_str_unchecked("3K"),
4830 Acronym::from_str_unchecked("4K"),
4831 Acronym::from_str_unchecked("5K"),
4832 Acronym::from_str_unchecked("6K"),
4833 Acronym::from_str_unchecked("7K"),
4834 Acronym::from_str_unchecked("8K"),
4835 Acronym::from_str_unchecked("9K"),
4836 Acronym::from_str_unchecked("10K"),
4837 ]
4838 }
4839 .into_iter()
4840 }
4841 pub const fn description() -> &'static str {
4843 "Play with one key."
4844 }
4845 pub const fn kind() -> GameModKind {
4847 GameModKind::Conversion
4848 }
4849 pub const fn bits() -> u32 {
4853 67108864
4854 }
4855}
4856impl TwoKeysMania {
4857 pub const fn acronym() -> Acronym {
4859 unsafe { Acronym::from_str_unchecked("2K") }
4860 }
4861 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4863 unsafe {
4864 [
4865 Acronym::from_str_unchecked("1K"),
4866 Acronym::from_str_unchecked("3K"),
4867 Acronym::from_str_unchecked("4K"),
4868 Acronym::from_str_unchecked("5K"),
4869 Acronym::from_str_unchecked("6K"),
4870 Acronym::from_str_unchecked("7K"),
4871 Acronym::from_str_unchecked("8K"),
4872 Acronym::from_str_unchecked("9K"),
4873 Acronym::from_str_unchecked("10K"),
4874 ]
4875 }
4876 .into_iter()
4877 }
4878 pub const fn description() -> &'static str {
4880 "Play with two keys."
4881 }
4882 pub const fn kind() -> GameModKind {
4884 GameModKind::Conversion
4885 }
4886 pub const fn bits() -> u32 {
4890 268435456
4891 }
4892}
4893impl ThreeKeysMania {
4894 pub const fn acronym() -> Acronym {
4896 unsafe { Acronym::from_str_unchecked("3K") }
4897 }
4898 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4900 unsafe {
4901 [
4902 Acronym::from_str_unchecked("1K"),
4903 Acronym::from_str_unchecked("2K"),
4904 Acronym::from_str_unchecked("4K"),
4905 Acronym::from_str_unchecked("5K"),
4906 Acronym::from_str_unchecked("6K"),
4907 Acronym::from_str_unchecked("7K"),
4908 Acronym::from_str_unchecked("8K"),
4909 Acronym::from_str_unchecked("9K"),
4910 Acronym::from_str_unchecked("10K"),
4911 ]
4912 }
4913 .into_iter()
4914 }
4915 pub const fn description() -> &'static str {
4917 "Play with three keys."
4918 }
4919 pub const fn kind() -> GameModKind {
4921 GameModKind::Conversion
4922 }
4923 pub const fn bits() -> u32 {
4927 134217728
4928 }
4929}
4930impl FourKeysMania {
4931 pub const fn acronym() -> Acronym {
4933 unsafe { Acronym::from_str_unchecked("4K") }
4934 }
4935 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4937 unsafe {
4938 [
4939 Acronym::from_str_unchecked("1K"),
4940 Acronym::from_str_unchecked("2K"),
4941 Acronym::from_str_unchecked("3K"),
4942 Acronym::from_str_unchecked("5K"),
4943 Acronym::from_str_unchecked("6K"),
4944 Acronym::from_str_unchecked("7K"),
4945 Acronym::from_str_unchecked("8K"),
4946 Acronym::from_str_unchecked("9K"),
4947 Acronym::from_str_unchecked("10K"),
4948 ]
4949 }
4950 .into_iter()
4951 }
4952 pub const fn description() -> &'static str {
4954 "Play with four keys."
4955 }
4956 pub const fn kind() -> GameModKind {
4958 GameModKind::Conversion
4959 }
4960 pub const fn bits() -> u32 {
4964 32768
4965 }
4966}
4967impl FiveKeysMania {
4968 pub const fn acronym() -> Acronym {
4970 unsafe { Acronym::from_str_unchecked("5K") }
4971 }
4972 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
4974 unsafe {
4975 [
4976 Acronym::from_str_unchecked("1K"),
4977 Acronym::from_str_unchecked("2K"),
4978 Acronym::from_str_unchecked("3K"),
4979 Acronym::from_str_unchecked("4K"),
4980 Acronym::from_str_unchecked("6K"),
4981 Acronym::from_str_unchecked("7K"),
4982 Acronym::from_str_unchecked("8K"),
4983 Acronym::from_str_unchecked("9K"),
4984 Acronym::from_str_unchecked("10K"),
4985 ]
4986 }
4987 .into_iter()
4988 }
4989 pub const fn description() -> &'static str {
4991 "Play with five keys."
4992 }
4993 pub const fn kind() -> GameModKind {
4995 GameModKind::Conversion
4996 }
4997 pub const fn bits() -> u32 {
5001 65536
5002 }
5003}
5004impl SixKeysMania {
5005 pub const fn acronym() -> Acronym {
5007 unsafe { Acronym::from_str_unchecked("6K") }
5008 }
5009 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5011 unsafe {
5012 [
5013 Acronym::from_str_unchecked("1K"),
5014 Acronym::from_str_unchecked("2K"),
5015 Acronym::from_str_unchecked("3K"),
5016 Acronym::from_str_unchecked("4K"),
5017 Acronym::from_str_unchecked("5K"),
5018 Acronym::from_str_unchecked("7K"),
5019 Acronym::from_str_unchecked("8K"),
5020 Acronym::from_str_unchecked("9K"),
5021 Acronym::from_str_unchecked("10K"),
5022 ]
5023 }
5024 .into_iter()
5025 }
5026 pub const fn description() -> &'static str {
5028 "Play with six keys."
5029 }
5030 pub const fn kind() -> GameModKind {
5032 GameModKind::Conversion
5033 }
5034 pub const fn bits() -> u32 {
5038 131072
5039 }
5040}
5041impl SevenKeysMania {
5042 pub const fn acronym() -> Acronym {
5044 unsafe { Acronym::from_str_unchecked("7K") }
5045 }
5046 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5048 unsafe {
5049 [
5050 Acronym::from_str_unchecked("1K"),
5051 Acronym::from_str_unchecked("2K"),
5052 Acronym::from_str_unchecked("3K"),
5053 Acronym::from_str_unchecked("4K"),
5054 Acronym::from_str_unchecked("5K"),
5055 Acronym::from_str_unchecked("6K"),
5056 Acronym::from_str_unchecked("8K"),
5057 Acronym::from_str_unchecked("9K"),
5058 Acronym::from_str_unchecked("10K"),
5059 ]
5060 }
5061 .into_iter()
5062 }
5063 pub const fn description() -> &'static str {
5065 "Play with seven keys."
5066 }
5067 pub const fn kind() -> GameModKind {
5069 GameModKind::Conversion
5070 }
5071 pub const fn bits() -> u32 {
5075 262144
5076 }
5077}
5078impl EightKeysMania {
5079 pub const fn acronym() -> Acronym {
5081 unsafe { Acronym::from_str_unchecked("8K") }
5082 }
5083 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5085 unsafe {
5086 [
5087 Acronym::from_str_unchecked("1K"),
5088 Acronym::from_str_unchecked("2K"),
5089 Acronym::from_str_unchecked("3K"),
5090 Acronym::from_str_unchecked("4K"),
5091 Acronym::from_str_unchecked("5K"),
5092 Acronym::from_str_unchecked("6K"),
5093 Acronym::from_str_unchecked("7K"),
5094 Acronym::from_str_unchecked("9K"),
5095 Acronym::from_str_unchecked("10K"),
5096 ]
5097 }
5098 .into_iter()
5099 }
5100 pub const fn description() -> &'static str {
5102 "Play with eight keys."
5103 }
5104 pub const fn kind() -> GameModKind {
5106 GameModKind::Conversion
5107 }
5108 pub const fn bits() -> u32 {
5112 524288
5113 }
5114}
5115impl NineKeysMania {
5116 pub const fn acronym() -> Acronym {
5118 unsafe { Acronym::from_str_unchecked("9K") }
5119 }
5120 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5122 unsafe {
5123 [
5124 Acronym::from_str_unchecked("1K"),
5125 Acronym::from_str_unchecked("2K"),
5126 Acronym::from_str_unchecked("3K"),
5127 Acronym::from_str_unchecked("4K"),
5128 Acronym::from_str_unchecked("5K"),
5129 Acronym::from_str_unchecked("6K"),
5130 Acronym::from_str_unchecked("7K"),
5131 Acronym::from_str_unchecked("8K"),
5132 Acronym::from_str_unchecked("10K"),
5133 ]
5134 }
5135 .into_iter()
5136 }
5137 pub const fn description() -> &'static str {
5139 "Play with nine keys."
5140 }
5141 pub const fn kind() -> GameModKind {
5143 GameModKind::Conversion
5144 }
5145 pub const fn bits() -> u32 {
5149 16777216
5150 }
5151}
5152impl TenKeysMania {
5153 pub const fn acronym() -> Acronym {
5155 unsafe { Acronym::from_str_unchecked("10K") }
5156 }
5157 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5159 unsafe {
5160 [
5161 Acronym::from_str_unchecked("1K"),
5162 Acronym::from_str_unchecked("2K"),
5163 Acronym::from_str_unchecked("3K"),
5164 Acronym::from_str_unchecked("4K"),
5165 Acronym::from_str_unchecked("5K"),
5166 Acronym::from_str_unchecked("6K"),
5167 Acronym::from_str_unchecked("7K"),
5168 Acronym::from_str_unchecked("8K"),
5169 Acronym::from_str_unchecked("9K"),
5170 ]
5171 }
5172 .into_iter()
5173 }
5174 pub const fn description() -> &'static str {
5176 "Play with ten keys."
5177 }
5178 pub const fn kind() -> GameModKind {
5180 GameModKind::Conversion
5181 }
5182}
5183impl AutoplayMania {
5184 pub const fn acronym() -> Acronym {
5186 unsafe { Acronym::from_str_unchecked("AT") }
5187 }
5188 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5190 unsafe {
5191 [
5192 Acronym::from_str_unchecked("CN"),
5193 Acronym::from_str_unchecked("AS"),
5194 ]
5195 }
5196 .into_iter()
5197 }
5198 pub const fn description() -> &'static str {
5200 "Watch a perfect automated play through the song."
5201 }
5202 pub const fn kind() -> GameModKind {
5204 GameModKind::Automation
5205 }
5206 pub const fn bits() -> u32 {
5210 2048
5211 }
5212}
5213impl CinemaMania {
5214 pub const fn acronym() -> Acronym {
5216 unsafe { Acronym::from_str_unchecked("CN") }
5217 }
5218 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5220 unsafe {
5221 [
5222 Acronym::from_str_unchecked("NF"),
5223 Acronym::from_str_unchecked("SD"),
5224 Acronym::from_str_unchecked("PF"),
5225 Acronym::from_str_unchecked("AC"),
5226 Acronym::from_str_unchecked("AT"),
5227 Acronym::from_str_unchecked("AS"),
5228 ]
5229 }
5230 .into_iter()
5231 }
5232 pub const fn description() -> &'static str {
5234 "Watch the video without visual distractions."
5235 }
5236 pub const fn kind() -> GameModKind {
5238 GameModKind::Automation
5239 }
5240 pub const fn bits() -> u32 {
5244 4194304
5245 }
5246}
5247impl WindUpMania {
5248 pub const fn acronym() -> Acronym {
5250 unsafe { Acronym::from_str_unchecked("WU") }
5251 }
5252 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5254 unsafe {
5255 [
5256 Acronym::from_str_unchecked("HT"),
5257 Acronym::from_str_unchecked("DC"),
5258 Acronym::from_str_unchecked("DT"),
5259 Acronym::from_str_unchecked("NC"),
5260 Acronym::from_str_unchecked("WD"),
5261 Acronym::from_str_unchecked("AS"),
5262 ]
5263 }
5264 .into_iter()
5265 }
5266 pub const fn description() -> &'static str {
5268 "Can you keep up?"
5269 }
5270 pub const fn kind() -> GameModKind {
5272 GameModKind::Fun
5273 }
5274}
5275impl WindDownMania {
5276 pub const fn acronym() -> Acronym {
5278 unsafe { Acronym::from_str_unchecked("WD") }
5279 }
5280 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5282 unsafe {
5283 [
5284 Acronym::from_str_unchecked("HT"),
5285 Acronym::from_str_unchecked("DC"),
5286 Acronym::from_str_unchecked("DT"),
5287 Acronym::from_str_unchecked("NC"),
5288 Acronym::from_str_unchecked("WU"),
5289 Acronym::from_str_unchecked("AS"),
5290 ]
5291 }
5292 .into_iter()
5293 }
5294 pub const fn description() -> &'static str {
5296 "Sloooow doooown..."
5297 }
5298 pub const fn kind() -> GameModKind {
5300 GameModKind::Fun
5301 }
5302}
5303impl MutedMania {
5304 pub const fn acronym() -> Acronym {
5306 unsafe { Acronym::from_str_unchecked("MU") }
5307 }
5308 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5310 [].into_iter()
5311 }
5312 pub const fn description() -> &'static str {
5314 "Can you still feel the rhythm without music?"
5315 }
5316 pub const fn kind() -> GameModKind {
5318 GameModKind::Fun
5319 }
5320}
5321impl AdaptiveSpeedMania {
5322 pub const fn acronym() -> Acronym {
5324 unsafe { Acronym::from_str_unchecked("AS") }
5325 }
5326 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5328 unsafe {
5329 [
5330 Acronym::from_str_unchecked("HT"),
5331 Acronym::from_str_unchecked("DC"),
5332 Acronym::from_str_unchecked("DT"),
5333 Acronym::from_str_unchecked("NC"),
5334 Acronym::from_str_unchecked("AT"),
5335 Acronym::from_str_unchecked("CN"),
5336 Acronym::from_str_unchecked("WU"),
5337 Acronym::from_str_unchecked("WD"),
5338 ]
5339 }
5340 .into_iter()
5341 }
5342 pub const fn description() -> &'static str {
5344 "Let track speed adapt to you."
5345 }
5346 pub const fn kind() -> GameModKind {
5348 GameModKind::Fun
5349 }
5350}
5351impl ScoreV2Mania {
5352 pub const fn acronym() -> Acronym {
5354 unsafe { Acronym::from_str_unchecked("SV2") }
5355 }
5356 pub fn incompatible_mods() -> impl Iterator<Item = Acronym> {
5358 [].into_iter()
5359 }
5360 pub const fn description() -> &'static str {
5362 "Score set on earlier osu! versions with the V2 scoring algorithm active."
5363 }
5364 pub const fn kind() -> GameModKind {
5366 GameModKind::System
5367 }
5368 pub const fn bits() -> u32 {
5372 536870912
5373 }
5374}
5375impl UnknownMod {
5376 pub const UNKNOWN_ACRONYM: Acronym = unsafe { Acronym::from_str_unchecked("??") };
5379 pub const fn acronym(self) -> Acronym {
5381 self.acronym
5382 }
5383 pub const fn incompatible_mods() -> std::iter::Empty<Acronym> {
5385 std::iter::empty()
5386 }
5387 pub const fn description() -> &'static str {
5389 "Some unknown mod"
5390 }
5391 pub const fn kind() -> GameModKind {
5393 GameModKind::System
5394 }
5395}
5396impl Default for UnknownMod {
5397 fn default() -> Self {
5398 Self {
5399 acronym: Self::UNKNOWN_ACRONYM,
5400 }
5401 }
5402}
5403pub(crate) mod intermode {
5404 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
5406 #[cfg_attr(feature = "rkyv",derive(rkyv::Archive,rkyv::Serialize,rkyv::Deserialize,rkyv::Portable,rkyv::bytecheck::CheckBytes,),rkyv(as = Self),bytecheck(crate = rkyv::bytecheck),repr(u8),)]
5407 #[non_exhaustive]
5408 pub enum GameModIntermode {
5409 AccuracyChallenge,
5410 AdaptiveSpeed,
5411 Alternate,
5412 ApproachDifferent,
5413 Autopilot,
5414 Autoplay,
5415 BarrelRoll,
5416 Blinds,
5417 Bloom,
5418 Bubbles,
5419 Cinema,
5420 Classic,
5421 ConstantSpeed,
5422 Cover,
5423 Daycore,
5424 Deflate,
5425 Depth,
5426 DifficultyAdjust,
5427 DoubleTime,
5428 DualStages,
5429 Easy,
5430 EightKeys,
5431 FadeIn,
5432 FiveKeys,
5433 Flashlight,
5434 FloatingFruits,
5435 FourKeys,
5436 FreezeFrame,
5437 Grow,
5438 HalfTime,
5439 HardRock,
5440 Hidden,
5441 HoldOff,
5442 Invert,
5443 Magnetised,
5444 Mirror,
5445 MovingFast,
5446 Muted,
5447 Nightcore,
5448 NineKeys,
5449 NoFail,
5450 NoRelease,
5451 NoScope,
5452 OneKey,
5453 Perfect,
5454 Random,
5455 Relax,
5456 Repel,
5457 ScoreV2,
5458 SevenKeys,
5459 SimplifiedRhythm,
5460 SingleTap,
5461 SixKeys,
5462 SpinIn,
5463 SpunOut,
5464 StrictTracking,
5465 SuddenDeath,
5466 Swap,
5467 Synesthesia,
5468 TargetPractice,
5469 TenKeys,
5470 ThreeKeys,
5471 TouchDevice,
5472 Traceable,
5473 Transform,
5474 TwoKeys,
5475 Wiggle,
5476 WindDown,
5477 WindUp,
5478 Unknown(super::UnknownMod),
5479 }
5480}
5481impl GameModIntermode {
5482 pub const fn acronym(&self) -> Acronym {
5484 unsafe {
5485 match self {
5486 Self::AccuracyChallenge => Acronym::from_str_unchecked("AC"),
5487 Self::AdaptiveSpeed => Acronym::from_str_unchecked("AS"),
5488 Self::Alternate => Acronym::from_str_unchecked("AL"),
5489 Self::ApproachDifferent => Acronym::from_str_unchecked("AD"),
5490 Self::Autopilot => Acronym::from_str_unchecked("AP"),
5491 Self::Autoplay => Acronym::from_str_unchecked("AT"),
5492 Self::BarrelRoll => Acronym::from_str_unchecked("BR"),
5493 Self::Blinds => Acronym::from_str_unchecked("BL"),
5494 Self::Bloom => Acronym::from_str_unchecked("BM"),
5495 Self::Bubbles => Acronym::from_str_unchecked("BU"),
5496 Self::Cinema => Acronym::from_str_unchecked("CN"),
5497 Self::Classic => Acronym::from_str_unchecked("CL"),
5498 Self::ConstantSpeed => Acronym::from_str_unchecked("CS"),
5499 Self::Cover => Acronym::from_str_unchecked("CO"),
5500 Self::Daycore => Acronym::from_str_unchecked("DC"),
5501 Self::Deflate => Acronym::from_str_unchecked("DF"),
5502 Self::Depth => Acronym::from_str_unchecked("DP"),
5503 Self::DifficultyAdjust => Acronym::from_str_unchecked("DA"),
5504 Self::DoubleTime => Acronym::from_str_unchecked("DT"),
5505 Self::DualStages => Acronym::from_str_unchecked("DS"),
5506 Self::Easy => Acronym::from_str_unchecked("EZ"),
5507 Self::EightKeys => Acronym::from_str_unchecked("8K"),
5508 Self::FadeIn => Acronym::from_str_unchecked("FI"),
5509 Self::FiveKeys => Acronym::from_str_unchecked("5K"),
5510 Self::Flashlight => Acronym::from_str_unchecked("FL"),
5511 Self::FloatingFruits => Acronym::from_str_unchecked("FF"),
5512 Self::FourKeys => Acronym::from_str_unchecked("4K"),
5513 Self::FreezeFrame => Acronym::from_str_unchecked("FR"),
5514 Self::Grow => Acronym::from_str_unchecked("GR"),
5515 Self::HalfTime => Acronym::from_str_unchecked("HT"),
5516 Self::HardRock => Acronym::from_str_unchecked("HR"),
5517 Self::Hidden => Acronym::from_str_unchecked("HD"),
5518 Self::HoldOff => Acronym::from_str_unchecked("HO"),
5519 Self::Invert => Acronym::from_str_unchecked("IN"),
5520 Self::Magnetised => Acronym::from_str_unchecked("MG"),
5521 Self::Mirror => Acronym::from_str_unchecked("MR"),
5522 Self::MovingFast => Acronym::from_str_unchecked("MF"),
5523 Self::Muted => Acronym::from_str_unchecked("MU"),
5524 Self::Nightcore => Acronym::from_str_unchecked("NC"),
5525 Self::NineKeys => Acronym::from_str_unchecked("9K"),
5526 Self::NoFail => Acronym::from_str_unchecked("NF"),
5527 Self::NoRelease => Acronym::from_str_unchecked("NR"),
5528 Self::NoScope => Acronym::from_str_unchecked("NS"),
5529 Self::OneKey => Acronym::from_str_unchecked("1K"),
5530 Self::Perfect => Acronym::from_str_unchecked("PF"),
5531 Self::Random => Acronym::from_str_unchecked("RD"),
5532 Self::Relax => Acronym::from_str_unchecked("RX"),
5533 Self::Repel => Acronym::from_str_unchecked("RP"),
5534 Self::ScoreV2 => Acronym::from_str_unchecked("SV2"),
5535 Self::SevenKeys => Acronym::from_str_unchecked("7K"),
5536 Self::SimplifiedRhythm => Acronym::from_str_unchecked("SR"),
5537 Self::SingleTap => Acronym::from_str_unchecked("SG"),
5538 Self::SixKeys => Acronym::from_str_unchecked("6K"),
5539 Self::SpinIn => Acronym::from_str_unchecked("SI"),
5540 Self::SpunOut => Acronym::from_str_unchecked("SO"),
5541 Self::StrictTracking => Acronym::from_str_unchecked("ST"),
5542 Self::SuddenDeath => Acronym::from_str_unchecked("SD"),
5543 Self::Swap => Acronym::from_str_unchecked("SW"),
5544 Self::Synesthesia => Acronym::from_str_unchecked("SY"),
5545 Self::TargetPractice => Acronym::from_str_unchecked("TP"),
5546 Self::TenKeys => Acronym::from_str_unchecked("10K"),
5547 Self::ThreeKeys => Acronym::from_str_unchecked("3K"),
5548 Self::TouchDevice => Acronym::from_str_unchecked("TD"),
5549 Self::Traceable => Acronym::from_str_unchecked("TC"),
5550 Self::Transform => Acronym::from_str_unchecked("TR"),
5551 Self::TwoKeys => Acronym::from_str_unchecked("2K"),
5552 Self::Wiggle => Acronym::from_str_unchecked("WG"),
5553 Self::WindDown => Acronym::from_str_unchecked("WD"),
5554 Self::WindUp => Acronym::from_str_unchecked("WU"),
5555 Self::Unknown(m) => m.acronym(),
5556 }
5557 }
5558 }
5559 pub const fn bits(self) -> Option<u32> {
5563 match self {
5564 Self::AccuracyChallenge => None,
5565 Self::AdaptiveSpeed => None,
5566 Self::Alternate => None,
5567 Self::ApproachDifferent => None,
5568 Self::Autopilot => Some(8192),
5569 Self::Autoplay => Some(2048),
5570 Self::BarrelRoll => None,
5571 Self::Blinds => None,
5572 Self::Bloom => None,
5573 Self::Bubbles => None,
5574 Self::Cinema => Some(4194304),
5575 Self::Classic => None,
5576 Self::ConstantSpeed => None,
5577 Self::Cover => None,
5578 Self::Daycore => None,
5579 Self::Deflate => None,
5580 Self::Depth => None,
5581 Self::DifficultyAdjust => None,
5582 Self::DoubleTime => Some(64),
5583 Self::DualStages => Some(33554432),
5584 Self::Easy => Some(2),
5585 Self::EightKeys => Some(524288),
5586 Self::FadeIn => Some(1048576),
5587 Self::FiveKeys => Some(65536),
5588 Self::Flashlight => Some(1024),
5589 Self::FloatingFruits => None,
5590 Self::FourKeys => Some(32768),
5591 Self::FreezeFrame => None,
5592 Self::Grow => None,
5593 Self::HalfTime => Some(256),
5594 Self::HardRock => Some(16),
5595 Self::Hidden => Some(8),
5596 Self::HoldOff => None,
5597 Self::Invert => None,
5598 Self::Magnetised => None,
5599 Self::Mirror => Some(1073741824),
5600 Self::MovingFast => None,
5601 Self::Muted => None,
5602 Self::Nightcore => Some(576),
5603 Self::NineKeys => Some(16777216),
5604 Self::NoFail => Some(1),
5605 Self::NoRelease => None,
5606 Self::NoScope => None,
5607 Self::OneKey => Some(67108864),
5608 Self::Perfect => Some(16416),
5609 Self::Random => Some(2097152),
5610 Self::Relax => Some(128),
5611 Self::Repel => None,
5612 Self::ScoreV2 => Some(536870912),
5613 Self::SevenKeys => Some(262144),
5614 Self::SimplifiedRhythm => None,
5615 Self::SingleTap => None,
5616 Self::SixKeys => Some(131072),
5617 Self::SpinIn => None,
5618 Self::SpunOut => Some(4096),
5619 Self::StrictTracking => None,
5620 Self::SuddenDeath => Some(32),
5621 Self::Swap => None,
5622 Self::Synesthesia => None,
5623 Self::TargetPractice => Some(8388608),
5624 Self::TenKeys => None,
5625 Self::ThreeKeys => Some(134217728),
5626 Self::TouchDevice => Some(4),
5627 Self::Traceable => None,
5628 Self::Transform => None,
5629 Self::TwoKeys => Some(268435456),
5630 Self::Wiggle => None,
5631 Self::WindDown => None,
5632 Self::WindUp => None,
5633 Self::Unknown(_) => None,
5634 }
5635 }
5636 pub const fn kind(&self) -> GameModKind {
5638 match self {
5639 Self::AccuracyChallenge => GameModKind::DifficultyIncrease,
5640 Self::AdaptiveSpeed => GameModKind::Fun,
5641 Self::Alternate => GameModKind::Conversion,
5642 Self::ApproachDifferent => GameModKind::Fun,
5643 Self::Autopilot => GameModKind::Automation,
5644 Self::Autoplay => GameModKind::Automation,
5645 Self::BarrelRoll => GameModKind::Fun,
5646 Self::Blinds => GameModKind::DifficultyIncrease,
5647 Self::Bloom => GameModKind::Fun,
5648 Self::Bubbles => GameModKind::Fun,
5649 Self::Cinema => GameModKind::Automation,
5650 Self::Classic => GameModKind::Conversion,
5651 Self::ConstantSpeed => GameModKind::Conversion,
5652 Self::Cover => GameModKind::DifficultyIncrease,
5653 Self::Daycore => GameModKind::DifficultyReduction,
5654 Self::Deflate => GameModKind::Fun,
5655 Self::Depth => GameModKind::Fun,
5656 Self::DifficultyAdjust => GameModKind::Conversion,
5657 Self::DoubleTime => GameModKind::DifficultyIncrease,
5658 Self::DualStages => GameModKind::Conversion,
5659 Self::Easy => GameModKind::DifficultyReduction,
5660 Self::EightKeys => GameModKind::Conversion,
5661 Self::FadeIn => GameModKind::DifficultyIncrease,
5662 Self::FiveKeys => GameModKind::Conversion,
5663 Self::Flashlight => GameModKind::DifficultyIncrease,
5664 Self::FloatingFruits => GameModKind::Fun,
5665 Self::FourKeys => GameModKind::Conversion,
5666 Self::FreezeFrame => GameModKind::Fun,
5667 Self::Grow => GameModKind::Fun,
5668 Self::HalfTime => GameModKind::DifficultyReduction,
5669 Self::HardRock => GameModKind::DifficultyIncrease,
5670 Self::Hidden => GameModKind::DifficultyIncrease,
5671 Self::HoldOff => GameModKind::Conversion,
5672 Self::Invert => GameModKind::Conversion,
5673 Self::Magnetised => GameModKind::Fun,
5674 Self::Mirror => GameModKind::Conversion,
5675 Self::MovingFast => GameModKind::Fun,
5676 Self::Muted => GameModKind::Fun,
5677 Self::Nightcore => GameModKind::DifficultyIncrease,
5678 Self::NineKeys => GameModKind::Conversion,
5679 Self::NoFail => GameModKind::DifficultyReduction,
5680 Self::NoRelease => GameModKind::DifficultyReduction,
5681 Self::NoScope => GameModKind::Fun,
5682 Self::OneKey => GameModKind::Conversion,
5683 Self::Perfect => GameModKind::DifficultyIncrease,
5684 Self::Random => GameModKind::Conversion,
5685 Self::Relax => GameModKind::Automation,
5686 Self::Repel => GameModKind::Fun,
5687 Self::ScoreV2 => GameModKind::System,
5688 Self::SevenKeys => GameModKind::Conversion,
5689 Self::SimplifiedRhythm => GameModKind::DifficultyReduction,
5690 Self::SingleTap => GameModKind::Conversion,
5691 Self::SixKeys => GameModKind::Conversion,
5692 Self::SpinIn => GameModKind::Fun,
5693 Self::SpunOut => GameModKind::Automation,
5694 Self::StrictTracking => GameModKind::DifficultyIncrease,
5695 Self::SuddenDeath => GameModKind::DifficultyIncrease,
5696 Self::Swap => GameModKind::Conversion,
5697 Self::Synesthesia => GameModKind::Fun,
5698 Self::TargetPractice => GameModKind::Conversion,
5699 Self::TenKeys => GameModKind::Conversion,
5700 Self::ThreeKeys => GameModKind::Conversion,
5701 Self::TouchDevice => GameModKind::System,
5702 Self::Traceable => GameModKind::DifficultyIncrease,
5703 Self::Transform => GameModKind::Fun,
5704 Self::TwoKeys => GameModKind::Conversion,
5705 Self::Wiggle => GameModKind::Fun,
5706 Self::WindDown => GameModKind::Fun,
5707 Self::WindUp => GameModKind::Fun,
5708 Self::Unknown(_) => GameModKind::System,
5709 }
5710 }
5711 pub fn from_acronym(acronym: Acronym) -> Self {
5713 match acronym.as_str() {
5714 "AC" => Self::AccuracyChallenge,
5715 "AS" => Self::AdaptiveSpeed,
5716 "AL" => Self::Alternate,
5717 "AD" => Self::ApproachDifferent,
5718 "AP" => Self::Autopilot,
5719 "AT" => Self::Autoplay,
5720 "BR" => Self::BarrelRoll,
5721 "BL" => Self::Blinds,
5722 "BM" => Self::Bloom,
5723 "BU" => Self::Bubbles,
5724 "CN" => Self::Cinema,
5725 "CL" => Self::Classic,
5726 "CS" => Self::ConstantSpeed,
5727 "CO" => Self::Cover,
5728 "DC" => Self::Daycore,
5729 "DF" => Self::Deflate,
5730 "DP" => Self::Depth,
5731 "DA" => Self::DifficultyAdjust,
5732 "DT" => Self::DoubleTime,
5733 "DS" => Self::DualStages,
5734 "EZ" => Self::Easy,
5735 "8K" => Self::EightKeys,
5736 "FI" => Self::FadeIn,
5737 "5K" => Self::FiveKeys,
5738 "FL" => Self::Flashlight,
5739 "FF" => Self::FloatingFruits,
5740 "4K" => Self::FourKeys,
5741 "FR" => Self::FreezeFrame,
5742 "GR" => Self::Grow,
5743 "HT" => Self::HalfTime,
5744 "HR" => Self::HardRock,
5745 "HD" => Self::Hidden,
5746 "HO" => Self::HoldOff,
5747 "IN" => Self::Invert,
5748 "MG" => Self::Magnetised,
5749 "MR" => Self::Mirror,
5750 "MF" => Self::MovingFast,
5751 "MU" => Self::Muted,
5752 "NC" => Self::Nightcore,
5753 "9K" => Self::NineKeys,
5754 "NF" => Self::NoFail,
5755 "NR" => Self::NoRelease,
5756 "NS" => Self::NoScope,
5757 "1K" => Self::OneKey,
5758 "PF" => Self::Perfect,
5759 "RD" => Self::Random,
5760 "RX" => Self::Relax,
5761 "RP" => Self::Repel,
5762 "SV2" => Self::ScoreV2,
5763 "7K" => Self::SevenKeys,
5764 "SR" => Self::SimplifiedRhythm,
5765 "SG" => Self::SingleTap,
5766 "6K" => Self::SixKeys,
5767 "SI" => Self::SpinIn,
5768 "SO" => Self::SpunOut,
5769 "ST" => Self::StrictTracking,
5770 "SD" => Self::SuddenDeath,
5771 "SW" => Self::Swap,
5772 "SY" => Self::Synesthesia,
5773 "TP" => Self::TargetPractice,
5774 "10K" => Self::TenKeys,
5775 "3K" => Self::ThreeKeys,
5776 "TD" => Self::TouchDevice,
5777 "TC" => Self::Traceable,
5778 "TR" => Self::Transform,
5779 "2K" => Self::TwoKeys,
5780 "WG" => Self::Wiggle,
5781 "WD" => Self::WindDown,
5782 "WU" => Self::WindUp,
5783 _ => Self::Unknown(UnknownMod { acronym }),
5784 }
5785 }
5786 pub const fn try_from_bits(bits: u32) -> Option<Self> {
5788 match bits {
5789 8192 => Some(Self::Autopilot),
5790 2048 => Some(Self::Autoplay),
5791 4194304 => Some(Self::Cinema),
5792 64 => Some(Self::DoubleTime),
5793 33554432 => Some(Self::DualStages),
5794 2 => Some(Self::Easy),
5795 524288 => Some(Self::EightKeys),
5796 1048576 => Some(Self::FadeIn),
5797 65536 => Some(Self::FiveKeys),
5798 1024 => Some(Self::Flashlight),
5799 32768 => Some(Self::FourKeys),
5800 256 => Some(Self::HalfTime),
5801 16 => Some(Self::HardRock),
5802 8 => Some(Self::Hidden),
5803 1073741824 => Some(Self::Mirror),
5804 576 => Some(Self::Nightcore),
5805 16777216 => Some(Self::NineKeys),
5806 1 => Some(Self::NoFail),
5807 67108864 => Some(Self::OneKey),
5808 16416 => Some(Self::Perfect),
5809 2097152 => Some(Self::Random),
5810 128 => Some(Self::Relax),
5811 536870912 => Some(Self::ScoreV2),
5812 262144 => Some(Self::SevenKeys),
5813 131072 => Some(Self::SixKeys),
5814 4096 => Some(Self::SpunOut),
5815 32 => Some(Self::SuddenDeath),
5816 8388608 => Some(Self::TargetPractice),
5817 134217728 => Some(Self::ThreeKeys),
5818 4 => Some(Self::TouchDevice),
5819 268435456 => Some(Self::TwoKeys),
5820 _ => None,
5821 }
5822 }
5823 pub fn as_simple(&self) -> GameModSimple {
5825 GameModSimple {
5826 acronym: self.acronym(),
5827 settings: HashMap::new(),
5828 }
5829 }
5830}
5831impl From<GameModIntermode> for GameModSimple {
5832 fn from(gamemod: GameModIntermode) -> Self {
5833 gamemod.as_simple()
5834 }
5835}
5836impl PartialOrd for GameModIntermode {
5837 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
5838 Some(self.cmp(other))
5839 }
5840}
5841impl Ord for GameModIntermode {
5842 fn cmp(&self, other: &Self) -> Ordering {
5843 self.kind()
5845 .cmp(&other.kind())
5846 .then_with(|| self.acronym().as_str().cmp(&other.acronym().as_str()))
5847 }
5848}
5849impl Display for GameModIntermode {
5850 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
5851 f.write_str(self.acronym().as_str())
5852 }
5853}
5854impl From<&GameModIntermode> for GameModIntermode {
5855 fn from(gamemod: &GameModIntermode) -> Self {
5856 *gamemod
5857 }
5858}
5859impl From<GameMod> for GameModIntermode {
5860 fn from(gamemod: GameMod) -> Self {
5861 gamemod.intermode()
5862 }
5863}
5864pub(crate) mod gamemod {
5865 use super::*;
5866 #[derive(Clone, Debug, PartialEq)]
5868 #[cfg_attr(
5869 feature = "rkyv",
5870 derive(::rkyv::Archive, ::rkyv::Serialize, ::rkyv::Deserialize)
5871 )]
5872 #[non_exhaustive]
5873 pub enum GameMod {
5874 EasyOsu(EasyOsu),
5875 NoFailOsu(NoFailOsu),
5876 HalfTimeOsu(HalfTimeOsu),
5877 DaycoreOsu(DaycoreOsu),
5878 HardRockOsu(HardRockOsu),
5879 SuddenDeathOsu(SuddenDeathOsu),
5880 PerfectOsu(PerfectOsu),
5881 DoubleTimeOsu(DoubleTimeOsu),
5882 NightcoreOsu(NightcoreOsu),
5883 HiddenOsu(HiddenOsu),
5884 TraceableOsu(TraceableOsu),
5885 FlashlightOsu(FlashlightOsu),
5886 BlindsOsu(BlindsOsu),
5887 StrictTrackingOsu(StrictTrackingOsu),
5888 AccuracyChallengeOsu(AccuracyChallengeOsu),
5889 TargetPracticeOsu(TargetPracticeOsu),
5890 DifficultyAdjustOsu(DifficultyAdjustOsu),
5891 ClassicOsu(ClassicOsu),
5892 RandomOsu(RandomOsu),
5893 MirrorOsu(MirrorOsu),
5894 AlternateOsu(AlternateOsu),
5895 SingleTapOsu(SingleTapOsu),
5896 AutoplayOsu(AutoplayOsu),
5897 CinemaOsu(CinemaOsu),
5898 RelaxOsu(RelaxOsu),
5899 AutopilotOsu(AutopilotOsu),
5900 SpunOutOsu(SpunOutOsu),
5901 TransformOsu(TransformOsu),
5902 WiggleOsu(WiggleOsu),
5903 SpinInOsu(SpinInOsu),
5904 GrowOsu(GrowOsu),
5905 DeflateOsu(DeflateOsu),
5906 WindUpOsu(WindUpOsu),
5907 WindDownOsu(WindDownOsu),
5908 BarrelRollOsu(BarrelRollOsu),
5909 ApproachDifferentOsu(ApproachDifferentOsu),
5910 MutedOsu(MutedOsu),
5911 NoScopeOsu(NoScopeOsu),
5912 MagnetisedOsu(MagnetisedOsu),
5913 RepelOsu(RepelOsu),
5914 AdaptiveSpeedOsu(AdaptiveSpeedOsu),
5915 FreezeFrameOsu(FreezeFrameOsu),
5916 BubblesOsu(BubblesOsu),
5917 SynesthesiaOsu(SynesthesiaOsu),
5918 DepthOsu(DepthOsu),
5919 BloomOsu(BloomOsu),
5920 TouchDeviceOsu(TouchDeviceOsu),
5921 ScoreV2Osu(ScoreV2Osu),
5922 UnknownOsu(UnknownMod),
5923 EasyTaiko(EasyTaiko),
5924 NoFailTaiko(NoFailTaiko),
5925 HalfTimeTaiko(HalfTimeTaiko),
5926 DaycoreTaiko(DaycoreTaiko),
5927 SimplifiedRhythmTaiko(SimplifiedRhythmTaiko),
5928 HardRockTaiko(HardRockTaiko),
5929 SuddenDeathTaiko(SuddenDeathTaiko),
5930 PerfectTaiko(PerfectTaiko),
5931 DoubleTimeTaiko(DoubleTimeTaiko),
5932 NightcoreTaiko(NightcoreTaiko),
5933 HiddenTaiko(HiddenTaiko),
5934 FlashlightTaiko(FlashlightTaiko),
5935 AccuracyChallengeTaiko(AccuracyChallengeTaiko),
5936 RandomTaiko(RandomTaiko),
5937 DifficultyAdjustTaiko(DifficultyAdjustTaiko),
5938 ClassicTaiko(ClassicTaiko),
5939 SwapTaiko(SwapTaiko),
5940 SingleTapTaiko(SingleTapTaiko),
5941 ConstantSpeedTaiko(ConstantSpeedTaiko),
5942 AutoplayTaiko(AutoplayTaiko),
5943 CinemaTaiko(CinemaTaiko),
5944 RelaxTaiko(RelaxTaiko),
5945 WindUpTaiko(WindUpTaiko),
5946 WindDownTaiko(WindDownTaiko),
5947 MutedTaiko(MutedTaiko),
5948 AdaptiveSpeedTaiko(AdaptiveSpeedTaiko),
5949 ScoreV2Taiko(ScoreV2Taiko),
5950 UnknownTaiko(UnknownMod),
5951 EasyCatch(EasyCatch),
5952 NoFailCatch(NoFailCatch),
5953 HalfTimeCatch(HalfTimeCatch),
5954 DaycoreCatch(DaycoreCatch),
5955 HardRockCatch(HardRockCatch),
5956 SuddenDeathCatch(SuddenDeathCatch),
5957 PerfectCatch(PerfectCatch),
5958 DoubleTimeCatch(DoubleTimeCatch),
5959 NightcoreCatch(NightcoreCatch),
5960 HiddenCatch(HiddenCatch),
5961 FlashlightCatch(FlashlightCatch),
5962 AccuracyChallengeCatch(AccuracyChallengeCatch),
5963 DifficultyAdjustCatch(DifficultyAdjustCatch),
5964 ClassicCatch(ClassicCatch),
5965 MirrorCatch(MirrorCatch),
5966 AutoplayCatch(AutoplayCatch),
5967 CinemaCatch(CinemaCatch),
5968 RelaxCatch(RelaxCatch),
5969 WindUpCatch(WindUpCatch),
5970 WindDownCatch(WindDownCatch),
5971 FloatingFruitsCatch(FloatingFruitsCatch),
5972 MutedCatch(MutedCatch),
5973 NoScopeCatch(NoScopeCatch),
5974 MovingFastCatch(MovingFastCatch),
5975 ScoreV2Catch(ScoreV2Catch),
5976 UnknownCatch(UnknownMod),
5977 EasyMania(EasyMania),
5978 NoFailMania(NoFailMania),
5979 HalfTimeMania(HalfTimeMania),
5980 DaycoreMania(DaycoreMania),
5981 NoReleaseMania(NoReleaseMania),
5982 HardRockMania(HardRockMania),
5983 SuddenDeathMania(SuddenDeathMania),
5984 PerfectMania(PerfectMania),
5985 DoubleTimeMania(DoubleTimeMania),
5986 NightcoreMania(NightcoreMania),
5987 FadeInMania(FadeInMania),
5988 HiddenMania(HiddenMania),
5989 CoverMania(CoverMania),
5990 FlashlightMania(FlashlightMania),
5991 AccuracyChallengeMania(AccuracyChallengeMania),
5992 RandomMania(RandomMania),
5993 DualStagesMania(DualStagesMania),
5994 MirrorMania(MirrorMania),
5995 DifficultyAdjustMania(DifficultyAdjustMania),
5996 ClassicMania(ClassicMania),
5997 InvertMania(InvertMania),
5998 ConstantSpeedMania(ConstantSpeedMania),
5999 HoldOffMania(HoldOffMania),
6000 OneKeyMania(OneKeyMania),
6001 TwoKeysMania(TwoKeysMania),
6002 ThreeKeysMania(ThreeKeysMania),
6003 FourKeysMania(FourKeysMania),
6004 FiveKeysMania(FiveKeysMania),
6005 SixKeysMania(SixKeysMania),
6006 SevenKeysMania(SevenKeysMania),
6007 EightKeysMania(EightKeysMania),
6008 NineKeysMania(NineKeysMania),
6009 TenKeysMania(TenKeysMania),
6010 AutoplayMania(AutoplayMania),
6011 CinemaMania(CinemaMania),
6012 WindUpMania(WindUpMania),
6013 WindDownMania(WindDownMania),
6014 MutedMania(MutedMania),
6015 AdaptiveSpeedMania(AdaptiveSpeedMania),
6016 ScoreV2Mania(ScoreV2Mania),
6017 UnknownMania(UnknownMod),
6018 }
6019}
6020impl GameMod {
6021 pub fn new(acronym: &str, mode: GameMode) -> Self {
6023 match (acronym, mode) {
6024 ("EZ", GameMode::Osu) => Self::EasyOsu(Default::default()),
6025 ("NF", GameMode::Osu) => Self::NoFailOsu(Default::default()),
6026 ("HT", GameMode::Osu) => Self::HalfTimeOsu(Default::default()),
6027 ("DC", GameMode::Osu) => Self::DaycoreOsu(Default::default()),
6028 ("HR", GameMode::Osu) => Self::HardRockOsu(Default::default()),
6029 ("SD", GameMode::Osu) => Self::SuddenDeathOsu(Default::default()),
6030 ("PF", GameMode::Osu) => Self::PerfectOsu(Default::default()),
6031 ("DT", GameMode::Osu) => Self::DoubleTimeOsu(Default::default()),
6032 ("NC", GameMode::Osu) => Self::NightcoreOsu(Default::default()),
6033 ("HD", GameMode::Osu) => Self::HiddenOsu(Default::default()),
6034 ("TC", GameMode::Osu) => Self::TraceableOsu(Default::default()),
6035 ("FL", GameMode::Osu) => Self::FlashlightOsu(Default::default()),
6036 ("BL", GameMode::Osu) => Self::BlindsOsu(Default::default()),
6037 ("ST", GameMode::Osu) => Self::StrictTrackingOsu(Default::default()),
6038 ("AC", GameMode::Osu) => Self::AccuracyChallengeOsu(Default::default()),
6039 ("TP", GameMode::Osu) => Self::TargetPracticeOsu(Default::default()),
6040 ("DA", GameMode::Osu) => Self::DifficultyAdjustOsu(Default::default()),
6041 ("CL", GameMode::Osu) => Self::ClassicOsu(Default::default()),
6042 ("RD", GameMode::Osu) => Self::RandomOsu(Default::default()),
6043 ("MR", GameMode::Osu) => Self::MirrorOsu(Default::default()),
6044 ("AL", GameMode::Osu) => Self::AlternateOsu(Default::default()),
6045 ("SG", GameMode::Osu) => Self::SingleTapOsu(Default::default()),
6046 ("AT", GameMode::Osu) => Self::AutoplayOsu(Default::default()),
6047 ("CN", GameMode::Osu) => Self::CinemaOsu(Default::default()),
6048 ("RX", GameMode::Osu) => Self::RelaxOsu(Default::default()),
6049 ("AP", GameMode::Osu) => Self::AutopilotOsu(Default::default()),
6050 ("SO", GameMode::Osu) => Self::SpunOutOsu(Default::default()),
6051 ("TR", GameMode::Osu) => Self::TransformOsu(Default::default()),
6052 ("WG", GameMode::Osu) => Self::WiggleOsu(Default::default()),
6053 ("SI", GameMode::Osu) => Self::SpinInOsu(Default::default()),
6054 ("GR", GameMode::Osu) => Self::GrowOsu(Default::default()),
6055 ("DF", GameMode::Osu) => Self::DeflateOsu(Default::default()),
6056 ("WU", GameMode::Osu) => Self::WindUpOsu(Default::default()),
6057 ("WD", GameMode::Osu) => Self::WindDownOsu(Default::default()),
6058 ("BR", GameMode::Osu) => Self::BarrelRollOsu(Default::default()),
6059 ("AD", GameMode::Osu) => Self::ApproachDifferentOsu(Default::default()),
6060 ("MU", GameMode::Osu) => Self::MutedOsu(Default::default()),
6061 ("NS", GameMode::Osu) => Self::NoScopeOsu(Default::default()),
6062 ("MG", GameMode::Osu) => Self::MagnetisedOsu(Default::default()),
6063 ("RP", GameMode::Osu) => Self::RepelOsu(Default::default()),
6064 ("AS", GameMode::Osu) => Self::AdaptiveSpeedOsu(Default::default()),
6065 ("FR", GameMode::Osu) => Self::FreezeFrameOsu(Default::default()),
6066 ("BU", GameMode::Osu) => Self::BubblesOsu(Default::default()),
6067 ("SY", GameMode::Osu) => Self::SynesthesiaOsu(Default::default()),
6068 ("DP", GameMode::Osu) => Self::DepthOsu(Default::default()),
6069 ("BM", GameMode::Osu) => Self::BloomOsu(Default::default()),
6070 ("TD", GameMode::Osu) => Self::TouchDeviceOsu(Default::default()),
6071 ("SV2", GameMode::Osu) => Self::ScoreV2Osu(Default::default()),
6072 ("EZ", GameMode::Taiko) => Self::EasyTaiko(Default::default()),
6073 ("NF", GameMode::Taiko) => Self::NoFailTaiko(Default::default()),
6074 ("HT", GameMode::Taiko) => Self::HalfTimeTaiko(Default::default()),
6075 ("DC", GameMode::Taiko) => Self::DaycoreTaiko(Default::default()),
6076 ("SR", GameMode::Taiko) => Self::SimplifiedRhythmTaiko(Default::default()),
6077 ("HR", GameMode::Taiko) => Self::HardRockTaiko(Default::default()),
6078 ("SD", GameMode::Taiko) => Self::SuddenDeathTaiko(Default::default()),
6079 ("PF", GameMode::Taiko) => Self::PerfectTaiko(Default::default()),
6080 ("DT", GameMode::Taiko) => Self::DoubleTimeTaiko(Default::default()),
6081 ("NC", GameMode::Taiko) => Self::NightcoreTaiko(Default::default()),
6082 ("HD", GameMode::Taiko) => Self::HiddenTaiko(Default::default()),
6083 ("FL", GameMode::Taiko) => Self::FlashlightTaiko(Default::default()),
6084 ("AC", GameMode::Taiko) => Self::AccuracyChallengeTaiko(Default::default()),
6085 ("RD", GameMode::Taiko) => Self::RandomTaiko(Default::default()),
6086 ("DA", GameMode::Taiko) => Self::DifficultyAdjustTaiko(Default::default()),
6087 ("CL", GameMode::Taiko) => Self::ClassicTaiko(Default::default()),
6088 ("SW", GameMode::Taiko) => Self::SwapTaiko(Default::default()),
6089 ("SG", GameMode::Taiko) => Self::SingleTapTaiko(Default::default()),
6090 ("CS", GameMode::Taiko) => Self::ConstantSpeedTaiko(Default::default()),
6091 ("AT", GameMode::Taiko) => Self::AutoplayTaiko(Default::default()),
6092 ("CN", GameMode::Taiko) => Self::CinemaTaiko(Default::default()),
6093 ("RX", GameMode::Taiko) => Self::RelaxTaiko(Default::default()),
6094 ("WU", GameMode::Taiko) => Self::WindUpTaiko(Default::default()),
6095 ("WD", GameMode::Taiko) => Self::WindDownTaiko(Default::default()),
6096 ("MU", GameMode::Taiko) => Self::MutedTaiko(Default::default()),
6097 ("AS", GameMode::Taiko) => Self::AdaptiveSpeedTaiko(Default::default()),
6098 ("SV2", GameMode::Taiko) => Self::ScoreV2Taiko(Default::default()),
6099 ("EZ", GameMode::Catch) => Self::EasyCatch(Default::default()),
6100 ("NF", GameMode::Catch) => Self::NoFailCatch(Default::default()),
6101 ("HT", GameMode::Catch) => Self::HalfTimeCatch(Default::default()),
6102 ("DC", GameMode::Catch) => Self::DaycoreCatch(Default::default()),
6103 ("HR", GameMode::Catch) => Self::HardRockCatch(Default::default()),
6104 ("SD", GameMode::Catch) => Self::SuddenDeathCatch(Default::default()),
6105 ("PF", GameMode::Catch) => Self::PerfectCatch(Default::default()),
6106 ("DT", GameMode::Catch) => Self::DoubleTimeCatch(Default::default()),
6107 ("NC", GameMode::Catch) => Self::NightcoreCatch(Default::default()),
6108 ("HD", GameMode::Catch) => Self::HiddenCatch(Default::default()),
6109 ("FL", GameMode::Catch) => Self::FlashlightCatch(Default::default()),
6110 ("AC", GameMode::Catch) => Self::AccuracyChallengeCatch(Default::default()),
6111 ("DA", GameMode::Catch) => Self::DifficultyAdjustCatch(Default::default()),
6112 ("CL", GameMode::Catch) => Self::ClassicCatch(Default::default()),
6113 ("MR", GameMode::Catch) => Self::MirrorCatch(Default::default()),
6114 ("AT", GameMode::Catch) => Self::AutoplayCatch(Default::default()),
6115 ("CN", GameMode::Catch) => Self::CinemaCatch(Default::default()),
6116 ("RX", GameMode::Catch) => Self::RelaxCatch(Default::default()),
6117 ("WU", GameMode::Catch) => Self::WindUpCatch(Default::default()),
6118 ("WD", GameMode::Catch) => Self::WindDownCatch(Default::default()),
6119 ("FF", GameMode::Catch) => Self::FloatingFruitsCatch(Default::default()),
6120 ("MU", GameMode::Catch) => Self::MutedCatch(Default::default()),
6121 ("NS", GameMode::Catch) => Self::NoScopeCatch(Default::default()),
6122 ("MF", GameMode::Catch) => Self::MovingFastCatch(Default::default()),
6123 ("SV2", GameMode::Catch) => Self::ScoreV2Catch(Default::default()),
6124 ("EZ", GameMode::Mania) => Self::EasyMania(Default::default()),
6125 ("NF", GameMode::Mania) => Self::NoFailMania(Default::default()),
6126 ("HT", GameMode::Mania) => Self::HalfTimeMania(Default::default()),
6127 ("DC", GameMode::Mania) => Self::DaycoreMania(Default::default()),
6128 ("NR", GameMode::Mania) => Self::NoReleaseMania(Default::default()),
6129 ("HR", GameMode::Mania) => Self::HardRockMania(Default::default()),
6130 ("SD", GameMode::Mania) => Self::SuddenDeathMania(Default::default()),
6131 ("PF", GameMode::Mania) => Self::PerfectMania(Default::default()),
6132 ("DT", GameMode::Mania) => Self::DoubleTimeMania(Default::default()),
6133 ("NC", GameMode::Mania) => Self::NightcoreMania(Default::default()),
6134 ("FI", GameMode::Mania) => Self::FadeInMania(Default::default()),
6135 ("HD", GameMode::Mania) => Self::HiddenMania(Default::default()),
6136 ("CO", GameMode::Mania) => Self::CoverMania(Default::default()),
6137 ("FL", GameMode::Mania) => Self::FlashlightMania(Default::default()),
6138 ("AC", GameMode::Mania) => Self::AccuracyChallengeMania(Default::default()),
6139 ("RD", GameMode::Mania) => Self::RandomMania(Default::default()),
6140 ("DS", GameMode::Mania) => Self::DualStagesMania(Default::default()),
6141 ("MR", GameMode::Mania) => Self::MirrorMania(Default::default()),
6142 ("DA", GameMode::Mania) => Self::DifficultyAdjustMania(Default::default()),
6143 ("CL", GameMode::Mania) => Self::ClassicMania(Default::default()),
6144 ("IN", GameMode::Mania) => Self::InvertMania(Default::default()),
6145 ("CS", GameMode::Mania) => Self::ConstantSpeedMania(Default::default()),
6146 ("HO", GameMode::Mania) => Self::HoldOffMania(Default::default()),
6147 ("1K", GameMode::Mania) => Self::OneKeyMania(Default::default()),
6148 ("2K", GameMode::Mania) => Self::TwoKeysMania(Default::default()),
6149 ("3K", GameMode::Mania) => Self::ThreeKeysMania(Default::default()),
6150 ("4K", GameMode::Mania) => Self::FourKeysMania(Default::default()),
6151 ("5K", GameMode::Mania) => Self::FiveKeysMania(Default::default()),
6152 ("6K", GameMode::Mania) => Self::SixKeysMania(Default::default()),
6153 ("7K", GameMode::Mania) => Self::SevenKeysMania(Default::default()),
6154 ("8K", GameMode::Mania) => Self::EightKeysMania(Default::default()),
6155 ("9K", GameMode::Mania) => Self::NineKeysMania(Default::default()),
6156 ("10K", GameMode::Mania) => Self::TenKeysMania(Default::default()),
6157 ("AT", GameMode::Mania) => Self::AutoplayMania(Default::default()),
6158 ("CN", GameMode::Mania) => Self::CinemaMania(Default::default()),
6159 ("WU", GameMode::Mania) => Self::WindUpMania(Default::default()),
6160 ("WD", GameMode::Mania) => Self::WindDownMania(Default::default()),
6161 ("MU", GameMode::Mania) => Self::MutedMania(Default::default()),
6162 ("AS", GameMode::Mania) => Self::AdaptiveSpeedMania(Default::default()),
6163 ("SV2", GameMode::Mania) => Self::ScoreV2Mania(Default::default()),
6164 _ => {
6165 let acronym = <Acronym as std::str::FromStr>::from_str(acronym)
6166 .unwrap_or(UnknownMod::UNKNOWN_ACRONYM);
6167 let unknown = UnknownMod { acronym };
6168 match mode {
6169 GameMode::Osu => GameMod::UnknownOsu(unknown),
6170 GameMode::Taiko => GameMod::UnknownTaiko(unknown),
6171 GameMode::Catch => GameMod::UnknownCatch(unknown),
6172 GameMode::Mania => GameMod::UnknownMania(unknown),
6173 }
6174 }
6175 }
6176 }
6177 pub const fn acronym(&self) -> Acronym {
6179 match self {
6180 Self::EasyOsu(_) => EasyOsu::acronym(),
6181 Self::NoFailOsu(_) => NoFailOsu::acronym(),
6182 Self::HalfTimeOsu(_) => HalfTimeOsu::acronym(),
6183 Self::DaycoreOsu(_) => DaycoreOsu::acronym(),
6184 Self::HardRockOsu(_) => HardRockOsu::acronym(),
6185 Self::SuddenDeathOsu(_) => SuddenDeathOsu::acronym(),
6186 Self::PerfectOsu(_) => PerfectOsu::acronym(),
6187 Self::DoubleTimeOsu(_) => DoubleTimeOsu::acronym(),
6188 Self::NightcoreOsu(_) => NightcoreOsu::acronym(),
6189 Self::HiddenOsu(_) => HiddenOsu::acronym(),
6190 Self::TraceableOsu(_) => TraceableOsu::acronym(),
6191 Self::FlashlightOsu(_) => FlashlightOsu::acronym(),
6192 Self::BlindsOsu(_) => BlindsOsu::acronym(),
6193 Self::StrictTrackingOsu(_) => StrictTrackingOsu::acronym(),
6194 Self::AccuracyChallengeOsu(_) => AccuracyChallengeOsu::acronym(),
6195 Self::TargetPracticeOsu(_) => TargetPracticeOsu::acronym(),
6196 Self::DifficultyAdjustOsu(_) => DifficultyAdjustOsu::acronym(),
6197 Self::ClassicOsu(_) => ClassicOsu::acronym(),
6198 Self::RandomOsu(_) => RandomOsu::acronym(),
6199 Self::MirrorOsu(_) => MirrorOsu::acronym(),
6200 Self::AlternateOsu(_) => AlternateOsu::acronym(),
6201 Self::SingleTapOsu(_) => SingleTapOsu::acronym(),
6202 Self::AutoplayOsu(_) => AutoplayOsu::acronym(),
6203 Self::CinemaOsu(_) => CinemaOsu::acronym(),
6204 Self::RelaxOsu(_) => RelaxOsu::acronym(),
6205 Self::AutopilotOsu(_) => AutopilotOsu::acronym(),
6206 Self::SpunOutOsu(_) => SpunOutOsu::acronym(),
6207 Self::TransformOsu(_) => TransformOsu::acronym(),
6208 Self::WiggleOsu(_) => WiggleOsu::acronym(),
6209 Self::SpinInOsu(_) => SpinInOsu::acronym(),
6210 Self::GrowOsu(_) => GrowOsu::acronym(),
6211 Self::DeflateOsu(_) => DeflateOsu::acronym(),
6212 Self::WindUpOsu(_) => WindUpOsu::acronym(),
6213 Self::WindDownOsu(_) => WindDownOsu::acronym(),
6214 Self::BarrelRollOsu(_) => BarrelRollOsu::acronym(),
6215 Self::ApproachDifferentOsu(_) => ApproachDifferentOsu::acronym(),
6216 Self::MutedOsu(_) => MutedOsu::acronym(),
6217 Self::NoScopeOsu(_) => NoScopeOsu::acronym(),
6218 Self::MagnetisedOsu(_) => MagnetisedOsu::acronym(),
6219 Self::RepelOsu(_) => RepelOsu::acronym(),
6220 Self::AdaptiveSpeedOsu(_) => AdaptiveSpeedOsu::acronym(),
6221 Self::FreezeFrameOsu(_) => FreezeFrameOsu::acronym(),
6222 Self::BubblesOsu(_) => BubblesOsu::acronym(),
6223 Self::SynesthesiaOsu(_) => SynesthesiaOsu::acronym(),
6224 Self::DepthOsu(_) => DepthOsu::acronym(),
6225 Self::BloomOsu(_) => BloomOsu::acronym(),
6226 Self::TouchDeviceOsu(_) => TouchDeviceOsu::acronym(),
6227 Self::ScoreV2Osu(_) => ScoreV2Osu::acronym(),
6228 Self::EasyTaiko(_) => EasyTaiko::acronym(),
6229 Self::NoFailTaiko(_) => NoFailTaiko::acronym(),
6230 Self::HalfTimeTaiko(_) => HalfTimeTaiko::acronym(),
6231 Self::DaycoreTaiko(_) => DaycoreTaiko::acronym(),
6232 Self::SimplifiedRhythmTaiko(_) => SimplifiedRhythmTaiko::acronym(),
6233 Self::HardRockTaiko(_) => HardRockTaiko::acronym(),
6234 Self::SuddenDeathTaiko(_) => SuddenDeathTaiko::acronym(),
6235 Self::PerfectTaiko(_) => PerfectTaiko::acronym(),
6236 Self::DoubleTimeTaiko(_) => DoubleTimeTaiko::acronym(),
6237 Self::NightcoreTaiko(_) => NightcoreTaiko::acronym(),
6238 Self::HiddenTaiko(_) => HiddenTaiko::acronym(),
6239 Self::FlashlightTaiko(_) => FlashlightTaiko::acronym(),
6240 Self::AccuracyChallengeTaiko(_) => AccuracyChallengeTaiko::acronym(),
6241 Self::RandomTaiko(_) => RandomTaiko::acronym(),
6242 Self::DifficultyAdjustTaiko(_) => DifficultyAdjustTaiko::acronym(),
6243 Self::ClassicTaiko(_) => ClassicTaiko::acronym(),
6244 Self::SwapTaiko(_) => SwapTaiko::acronym(),
6245 Self::SingleTapTaiko(_) => SingleTapTaiko::acronym(),
6246 Self::ConstantSpeedTaiko(_) => ConstantSpeedTaiko::acronym(),
6247 Self::AutoplayTaiko(_) => AutoplayTaiko::acronym(),
6248 Self::CinemaTaiko(_) => CinemaTaiko::acronym(),
6249 Self::RelaxTaiko(_) => RelaxTaiko::acronym(),
6250 Self::WindUpTaiko(_) => WindUpTaiko::acronym(),
6251 Self::WindDownTaiko(_) => WindDownTaiko::acronym(),
6252 Self::MutedTaiko(_) => MutedTaiko::acronym(),
6253 Self::AdaptiveSpeedTaiko(_) => AdaptiveSpeedTaiko::acronym(),
6254 Self::ScoreV2Taiko(_) => ScoreV2Taiko::acronym(),
6255 Self::EasyCatch(_) => EasyCatch::acronym(),
6256 Self::NoFailCatch(_) => NoFailCatch::acronym(),
6257 Self::HalfTimeCatch(_) => HalfTimeCatch::acronym(),
6258 Self::DaycoreCatch(_) => DaycoreCatch::acronym(),
6259 Self::HardRockCatch(_) => HardRockCatch::acronym(),
6260 Self::SuddenDeathCatch(_) => SuddenDeathCatch::acronym(),
6261 Self::PerfectCatch(_) => PerfectCatch::acronym(),
6262 Self::DoubleTimeCatch(_) => DoubleTimeCatch::acronym(),
6263 Self::NightcoreCatch(_) => NightcoreCatch::acronym(),
6264 Self::HiddenCatch(_) => HiddenCatch::acronym(),
6265 Self::FlashlightCatch(_) => FlashlightCatch::acronym(),
6266 Self::AccuracyChallengeCatch(_) => AccuracyChallengeCatch::acronym(),
6267 Self::DifficultyAdjustCatch(_) => DifficultyAdjustCatch::acronym(),
6268 Self::ClassicCatch(_) => ClassicCatch::acronym(),
6269 Self::MirrorCatch(_) => MirrorCatch::acronym(),
6270 Self::AutoplayCatch(_) => AutoplayCatch::acronym(),
6271 Self::CinemaCatch(_) => CinemaCatch::acronym(),
6272 Self::RelaxCatch(_) => RelaxCatch::acronym(),
6273 Self::WindUpCatch(_) => WindUpCatch::acronym(),
6274 Self::WindDownCatch(_) => WindDownCatch::acronym(),
6275 Self::FloatingFruitsCatch(_) => FloatingFruitsCatch::acronym(),
6276 Self::MutedCatch(_) => MutedCatch::acronym(),
6277 Self::NoScopeCatch(_) => NoScopeCatch::acronym(),
6278 Self::MovingFastCatch(_) => MovingFastCatch::acronym(),
6279 Self::ScoreV2Catch(_) => ScoreV2Catch::acronym(),
6280 Self::EasyMania(_) => EasyMania::acronym(),
6281 Self::NoFailMania(_) => NoFailMania::acronym(),
6282 Self::HalfTimeMania(_) => HalfTimeMania::acronym(),
6283 Self::DaycoreMania(_) => DaycoreMania::acronym(),
6284 Self::NoReleaseMania(_) => NoReleaseMania::acronym(),
6285 Self::HardRockMania(_) => HardRockMania::acronym(),
6286 Self::SuddenDeathMania(_) => SuddenDeathMania::acronym(),
6287 Self::PerfectMania(_) => PerfectMania::acronym(),
6288 Self::DoubleTimeMania(_) => DoubleTimeMania::acronym(),
6289 Self::NightcoreMania(_) => NightcoreMania::acronym(),
6290 Self::FadeInMania(_) => FadeInMania::acronym(),
6291 Self::HiddenMania(_) => HiddenMania::acronym(),
6292 Self::CoverMania(_) => CoverMania::acronym(),
6293 Self::FlashlightMania(_) => FlashlightMania::acronym(),
6294 Self::AccuracyChallengeMania(_) => AccuracyChallengeMania::acronym(),
6295 Self::RandomMania(_) => RandomMania::acronym(),
6296 Self::DualStagesMania(_) => DualStagesMania::acronym(),
6297 Self::MirrorMania(_) => MirrorMania::acronym(),
6298 Self::DifficultyAdjustMania(_) => DifficultyAdjustMania::acronym(),
6299 Self::ClassicMania(_) => ClassicMania::acronym(),
6300 Self::InvertMania(_) => InvertMania::acronym(),
6301 Self::ConstantSpeedMania(_) => ConstantSpeedMania::acronym(),
6302 Self::HoldOffMania(_) => HoldOffMania::acronym(),
6303 Self::OneKeyMania(_) => OneKeyMania::acronym(),
6304 Self::TwoKeysMania(_) => TwoKeysMania::acronym(),
6305 Self::ThreeKeysMania(_) => ThreeKeysMania::acronym(),
6306 Self::FourKeysMania(_) => FourKeysMania::acronym(),
6307 Self::FiveKeysMania(_) => FiveKeysMania::acronym(),
6308 Self::SixKeysMania(_) => SixKeysMania::acronym(),
6309 Self::SevenKeysMania(_) => SevenKeysMania::acronym(),
6310 Self::EightKeysMania(_) => EightKeysMania::acronym(),
6311 Self::NineKeysMania(_) => NineKeysMania::acronym(),
6312 Self::TenKeysMania(_) => TenKeysMania::acronym(),
6313 Self::AutoplayMania(_) => AutoplayMania::acronym(),
6314 Self::CinemaMania(_) => CinemaMania::acronym(),
6315 Self::WindUpMania(_) => WindUpMania::acronym(),
6316 Self::WindDownMania(_) => WindDownMania::acronym(),
6317 Self::MutedMania(_) => MutedMania::acronym(),
6318 Self::AdaptiveSpeedMania(_) => AdaptiveSpeedMania::acronym(),
6319 Self::ScoreV2Mania(_) => ScoreV2Mania::acronym(),
6320 Self::UnknownOsu(m)
6321 | Self::UnknownTaiko(m)
6322 | Self::UnknownCatch(m)
6323 | Self::UnknownMania(m) => m.acronym(),
6324 }
6325 }
6326 pub fn incompatible_mods(&self) -> Box<[Acronym]> {
6328 match self {
6329 Self::EasyOsu(_) => EasyOsu::incompatible_mods().collect(),
6330 Self::NoFailOsu(_) => NoFailOsu::incompatible_mods().collect(),
6331 Self::HalfTimeOsu(_) => HalfTimeOsu::incompatible_mods().collect(),
6332 Self::DaycoreOsu(_) => DaycoreOsu::incompatible_mods().collect(),
6333 Self::HardRockOsu(_) => HardRockOsu::incompatible_mods().collect(),
6334 Self::SuddenDeathOsu(_) => SuddenDeathOsu::incompatible_mods().collect(),
6335 Self::PerfectOsu(_) => PerfectOsu::incompatible_mods().collect(),
6336 Self::DoubleTimeOsu(_) => DoubleTimeOsu::incompatible_mods().collect(),
6337 Self::NightcoreOsu(_) => NightcoreOsu::incompatible_mods().collect(),
6338 Self::HiddenOsu(_) => HiddenOsu::incompatible_mods().collect(),
6339 Self::TraceableOsu(_) => TraceableOsu::incompatible_mods().collect(),
6340 Self::FlashlightOsu(_) => FlashlightOsu::incompatible_mods().collect(),
6341 Self::BlindsOsu(_) => BlindsOsu::incompatible_mods().collect(),
6342 Self::StrictTrackingOsu(_) => StrictTrackingOsu::incompatible_mods().collect(),
6343 Self::AccuracyChallengeOsu(_) => AccuracyChallengeOsu::incompatible_mods().collect(),
6344 Self::TargetPracticeOsu(_) => TargetPracticeOsu::incompatible_mods().collect(),
6345 Self::DifficultyAdjustOsu(_) => DifficultyAdjustOsu::incompatible_mods().collect(),
6346 Self::ClassicOsu(_) => ClassicOsu::incompatible_mods().collect(),
6347 Self::RandomOsu(_) => RandomOsu::incompatible_mods().collect(),
6348 Self::MirrorOsu(_) => MirrorOsu::incompatible_mods().collect(),
6349 Self::AlternateOsu(_) => AlternateOsu::incompatible_mods().collect(),
6350 Self::SingleTapOsu(_) => SingleTapOsu::incompatible_mods().collect(),
6351 Self::AutoplayOsu(_) => AutoplayOsu::incompatible_mods().collect(),
6352 Self::CinemaOsu(_) => CinemaOsu::incompatible_mods().collect(),
6353 Self::RelaxOsu(_) => RelaxOsu::incompatible_mods().collect(),
6354 Self::AutopilotOsu(_) => AutopilotOsu::incompatible_mods().collect(),
6355 Self::SpunOutOsu(_) => SpunOutOsu::incompatible_mods().collect(),
6356 Self::TransformOsu(_) => TransformOsu::incompatible_mods().collect(),
6357 Self::WiggleOsu(_) => WiggleOsu::incompatible_mods().collect(),
6358 Self::SpinInOsu(_) => SpinInOsu::incompatible_mods().collect(),
6359 Self::GrowOsu(_) => GrowOsu::incompatible_mods().collect(),
6360 Self::DeflateOsu(_) => DeflateOsu::incompatible_mods().collect(),
6361 Self::WindUpOsu(_) => WindUpOsu::incompatible_mods().collect(),
6362 Self::WindDownOsu(_) => WindDownOsu::incompatible_mods().collect(),
6363 Self::BarrelRollOsu(_) => BarrelRollOsu::incompatible_mods().collect(),
6364 Self::ApproachDifferentOsu(_) => ApproachDifferentOsu::incompatible_mods().collect(),
6365 Self::MutedOsu(_) => MutedOsu::incompatible_mods().collect(),
6366 Self::NoScopeOsu(_) => NoScopeOsu::incompatible_mods().collect(),
6367 Self::MagnetisedOsu(_) => MagnetisedOsu::incompatible_mods().collect(),
6368 Self::RepelOsu(_) => RepelOsu::incompatible_mods().collect(),
6369 Self::AdaptiveSpeedOsu(_) => AdaptiveSpeedOsu::incompatible_mods().collect(),
6370 Self::FreezeFrameOsu(_) => FreezeFrameOsu::incompatible_mods().collect(),
6371 Self::BubblesOsu(_) => BubblesOsu::incompatible_mods().collect(),
6372 Self::SynesthesiaOsu(_) => SynesthesiaOsu::incompatible_mods().collect(),
6373 Self::DepthOsu(_) => DepthOsu::incompatible_mods().collect(),
6374 Self::BloomOsu(_) => BloomOsu::incompatible_mods().collect(),
6375 Self::TouchDeviceOsu(_) => TouchDeviceOsu::incompatible_mods().collect(),
6376 Self::ScoreV2Osu(_) => ScoreV2Osu::incompatible_mods().collect(),
6377 Self::EasyTaiko(_) => EasyTaiko::incompatible_mods().collect(),
6378 Self::NoFailTaiko(_) => NoFailTaiko::incompatible_mods().collect(),
6379 Self::HalfTimeTaiko(_) => HalfTimeTaiko::incompatible_mods().collect(),
6380 Self::DaycoreTaiko(_) => DaycoreTaiko::incompatible_mods().collect(),
6381 Self::SimplifiedRhythmTaiko(_) => SimplifiedRhythmTaiko::incompatible_mods().collect(),
6382 Self::HardRockTaiko(_) => HardRockTaiko::incompatible_mods().collect(),
6383 Self::SuddenDeathTaiko(_) => SuddenDeathTaiko::incompatible_mods().collect(),
6384 Self::PerfectTaiko(_) => PerfectTaiko::incompatible_mods().collect(),
6385 Self::DoubleTimeTaiko(_) => DoubleTimeTaiko::incompatible_mods().collect(),
6386 Self::NightcoreTaiko(_) => NightcoreTaiko::incompatible_mods().collect(),
6387 Self::HiddenTaiko(_) => HiddenTaiko::incompatible_mods().collect(),
6388 Self::FlashlightTaiko(_) => FlashlightTaiko::incompatible_mods().collect(),
6389 Self::AccuracyChallengeTaiko(_) => {
6390 AccuracyChallengeTaiko::incompatible_mods().collect()
6391 }
6392 Self::RandomTaiko(_) => RandomTaiko::incompatible_mods().collect(),
6393 Self::DifficultyAdjustTaiko(_) => DifficultyAdjustTaiko::incompatible_mods().collect(),
6394 Self::ClassicTaiko(_) => ClassicTaiko::incompatible_mods().collect(),
6395 Self::SwapTaiko(_) => SwapTaiko::incompatible_mods().collect(),
6396 Self::SingleTapTaiko(_) => SingleTapTaiko::incompatible_mods().collect(),
6397 Self::ConstantSpeedTaiko(_) => ConstantSpeedTaiko::incompatible_mods().collect(),
6398 Self::AutoplayTaiko(_) => AutoplayTaiko::incompatible_mods().collect(),
6399 Self::CinemaTaiko(_) => CinemaTaiko::incompatible_mods().collect(),
6400 Self::RelaxTaiko(_) => RelaxTaiko::incompatible_mods().collect(),
6401 Self::WindUpTaiko(_) => WindUpTaiko::incompatible_mods().collect(),
6402 Self::WindDownTaiko(_) => WindDownTaiko::incompatible_mods().collect(),
6403 Self::MutedTaiko(_) => MutedTaiko::incompatible_mods().collect(),
6404 Self::AdaptiveSpeedTaiko(_) => AdaptiveSpeedTaiko::incompatible_mods().collect(),
6405 Self::ScoreV2Taiko(_) => ScoreV2Taiko::incompatible_mods().collect(),
6406 Self::EasyCatch(_) => EasyCatch::incompatible_mods().collect(),
6407 Self::NoFailCatch(_) => NoFailCatch::incompatible_mods().collect(),
6408 Self::HalfTimeCatch(_) => HalfTimeCatch::incompatible_mods().collect(),
6409 Self::DaycoreCatch(_) => DaycoreCatch::incompatible_mods().collect(),
6410 Self::HardRockCatch(_) => HardRockCatch::incompatible_mods().collect(),
6411 Self::SuddenDeathCatch(_) => SuddenDeathCatch::incompatible_mods().collect(),
6412 Self::PerfectCatch(_) => PerfectCatch::incompatible_mods().collect(),
6413 Self::DoubleTimeCatch(_) => DoubleTimeCatch::incompatible_mods().collect(),
6414 Self::NightcoreCatch(_) => NightcoreCatch::incompatible_mods().collect(),
6415 Self::HiddenCatch(_) => HiddenCatch::incompatible_mods().collect(),
6416 Self::FlashlightCatch(_) => FlashlightCatch::incompatible_mods().collect(),
6417 Self::AccuracyChallengeCatch(_) => {
6418 AccuracyChallengeCatch::incompatible_mods().collect()
6419 }
6420 Self::DifficultyAdjustCatch(_) => DifficultyAdjustCatch::incompatible_mods().collect(),
6421 Self::ClassicCatch(_) => ClassicCatch::incompatible_mods().collect(),
6422 Self::MirrorCatch(_) => MirrorCatch::incompatible_mods().collect(),
6423 Self::AutoplayCatch(_) => AutoplayCatch::incompatible_mods().collect(),
6424 Self::CinemaCatch(_) => CinemaCatch::incompatible_mods().collect(),
6425 Self::RelaxCatch(_) => RelaxCatch::incompatible_mods().collect(),
6426 Self::WindUpCatch(_) => WindUpCatch::incompatible_mods().collect(),
6427 Self::WindDownCatch(_) => WindDownCatch::incompatible_mods().collect(),
6428 Self::FloatingFruitsCatch(_) => FloatingFruitsCatch::incompatible_mods().collect(),
6429 Self::MutedCatch(_) => MutedCatch::incompatible_mods().collect(),
6430 Self::NoScopeCatch(_) => NoScopeCatch::incompatible_mods().collect(),
6431 Self::MovingFastCatch(_) => MovingFastCatch::incompatible_mods().collect(),
6432 Self::ScoreV2Catch(_) => ScoreV2Catch::incompatible_mods().collect(),
6433 Self::EasyMania(_) => EasyMania::incompatible_mods().collect(),
6434 Self::NoFailMania(_) => NoFailMania::incompatible_mods().collect(),
6435 Self::HalfTimeMania(_) => HalfTimeMania::incompatible_mods().collect(),
6436 Self::DaycoreMania(_) => DaycoreMania::incompatible_mods().collect(),
6437 Self::NoReleaseMania(_) => NoReleaseMania::incompatible_mods().collect(),
6438 Self::HardRockMania(_) => HardRockMania::incompatible_mods().collect(),
6439 Self::SuddenDeathMania(_) => SuddenDeathMania::incompatible_mods().collect(),
6440 Self::PerfectMania(_) => PerfectMania::incompatible_mods().collect(),
6441 Self::DoubleTimeMania(_) => DoubleTimeMania::incompatible_mods().collect(),
6442 Self::NightcoreMania(_) => NightcoreMania::incompatible_mods().collect(),
6443 Self::FadeInMania(_) => FadeInMania::incompatible_mods().collect(),
6444 Self::HiddenMania(_) => HiddenMania::incompatible_mods().collect(),
6445 Self::CoverMania(_) => CoverMania::incompatible_mods().collect(),
6446 Self::FlashlightMania(_) => FlashlightMania::incompatible_mods().collect(),
6447 Self::AccuracyChallengeMania(_) => {
6448 AccuracyChallengeMania::incompatible_mods().collect()
6449 }
6450 Self::RandomMania(_) => RandomMania::incompatible_mods().collect(),
6451 Self::DualStagesMania(_) => DualStagesMania::incompatible_mods().collect(),
6452 Self::MirrorMania(_) => MirrorMania::incompatible_mods().collect(),
6453 Self::DifficultyAdjustMania(_) => DifficultyAdjustMania::incompatible_mods().collect(),
6454 Self::ClassicMania(_) => ClassicMania::incompatible_mods().collect(),
6455 Self::InvertMania(_) => InvertMania::incompatible_mods().collect(),
6456 Self::ConstantSpeedMania(_) => ConstantSpeedMania::incompatible_mods().collect(),
6457 Self::HoldOffMania(_) => HoldOffMania::incompatible_mods().collect(),
6458 Self::OneKeyMania(_) => OneKeyMania::incompatible_mods().collect(),
6459 Self::TwoKeysMania(_) => TwoKeysMania::incompatible_mods().collect(),
6460 Self::ThreeKeysMania(_) => ThreeKeysMania::incompatible_mods().collect(),
6461 Self::FourKeysMania(_) => FourKeysMania::incompatible_mods().collect(),
6462 Self::FiveKeysMania(_) => FiveKeysMania::incompatible_mods().collect(),
6463 Self::SixKeysMania(_) => SixKeysMania::incompatible_mods().collect(),
6464 Self::SevenKeysMania(_) => SevenKeysMania::incompatible_mods().collect(),
6465 Self::EightKeysMania(_) => EightKeysMania::incompatible_mods().collect(),
6466 Self::NineKeysMania(_) => NineKeysMania::incompatible_mods().collect(),
6467 Self::TenKeysMania(_) => TenKeysMania::incompatible_mods().collect(),
6468 Self::AutoplayMania(_) => AutoplayMania::incompatible_mods().collect(),
6469 Self::CinemaMania(_) => CinemaMania::incompatible_mods().collect(),
6470 Self::WindUpMania(_) => WindUpMania::incompatible_mods().collect(),
6471 Self::WindDownMania(_) => WindDownMania::incompatible_mods().collect(),
6472 Self::MutedMania(_) => MutedMania::incompatible_mods().collect(),
6473 Self::AdaptiveSpeedMania(_) => AdaptiveSpeedMania::incompatible_mods().collect(),
6474 Self::ScoreV2Mania(_) => ScoreV2Mania::incompatible_mods().collect(),
6475 _ => UnknownMod::incompatible_mods().collect(),
6476 }
6477 }
6478 pub const fn description(&self) -> &'static str {
6480 match self {
6481 Self::EasyOsu(_) => EasyOsu::description(),
6482 Self::NoFailOsu(_) => NoFailOsu::description(),
6483 Self::HalfTimeOsu(_) => HalfTimeOsu::description(),
6484 Self::DaycoreOsu(_) => DaycoreOsu::description(),
6485 Self::HardRockOsu(_) => HardRockOsu::description(),
6486 Self::SuddenDeathOsu(_) => SuddenDeathOsu::description(),
6487 Self::PerfectOsu(_) => PerfectOsu::description(),
6488 Self::DoubleTimeOsu(_) => DoubleTimeOsu::description(),
6489 Self::NightcoreOsu(_) => NightcoreOsu::description(),
6490 Self::HiddenOsu(_) => HiddenOsu::description(),
6491 Self::TraceableOsu(_) => TraceableOsu::description(),
6492 Self::FlashlightOsu(_) => FlashlightOsu::description(),
6493 Self::BlindsOsu(_) => BlindsOsu::description(),
6494 Self::StrictTrackingOsu(_) => StrictTrackingOsu::description(),
6495 Self::AccuracyChallengeOsu(_) => AccuracyChallengeOsu::description(),
6496 Self::TargetPracticeOsu(_) => TargetPracticeOsu::description(),
6497 Self::DifficultyAdjustOsu(_) => DifficultyAdjustOsu::description(),
6498 Self::ClassicOsu(_) => ClassicOsu::description(),
6499 Self::RandomOsu(_) => RandomOsu::description(),
6500 Self::MirrorOsu(_) => MirrorOsu::description(),
6501 Self::AlternateOsu(_) => AlternateOsu::description(),
6502 Self::SingleTapOsu(_) => SingleTapOsu::description(),
6503 Self::AutoplayOsu(_) => AutoplayOsu::description(),
6504 Self::CinemaOsu(_) => CinemaOsu::description(),
6505 Self::RelaxOsu(_) => RelaxOsu::description(),
6506 Self::AutopilotOsu(_) => AutopilotOsu::description(),
6507 Self::SpunOutOsu(_) => SpunOutOsu::description(),
6508 Self::TransformOsu(_) => TransformOsu::description(),
6509 Self::WiggleOsu(_) => WiggleOsu::description(),
6510 Self::SpinInOsu(_) => SpinInOsu::description(),
6511 Self::GrowOsu(_) => GrowOsu::description(),
6512 Self::DeflateOsu(_) => DeflateOsu::description(),
6513 Self::WindUpOsu(_) => WindUpOsu::description(),
6514 Self::WindDownOsu(_) => WindDownOsu::description(),
6515 Self::BarrelRollOsu(_) => BarrelRollOsu::description(),
6516 Self::ApproachDifferentOsu(_) => ApproachDifferentOsu::description(),
6517 Self::MutedOsu(_) => MutedOsu::description(),
6518 Self::NoScopeOsu(_) => NoScopeOsu::description(),
6519 Self::MagnetisedOsu(_) => MagnetisedOsu::description(),
6520 Self::RepelOsu(_) => RepelOsu::description(),
6521 Self::AdaptiveSpeedOsu(_) => AdaptiveSpeedOsu::description(),
6522 Self::FreezeFrameOsu(_) => FreezeFrameOsu::description(),
6523 Self::BubblesOsu(_) => BubblesOsu::description(),
6524 Self::SynesthesiaOsu(_) => SynesthesiaOsu::description(),
6525 Self::DepthOsu(_) => DepthOsu::description(),
6526 Self::BloomOsu(_) => BloomOsu::description(),
6527 Self::TouchDeviceOsu(_) => TouchDeviceOsu::description(),
6528 Self::ScoreV2Osu(_) => ScoreV2Osu::description(),
6529 Self::EasyTaiko(_) => EasyTaiko::description(),
6530 Self::NoFailTaiko(_) => NoFailTaiko::description(),
6531 Self::HalfTimeTaiko(_) => HalfTimeTaiko::description(),
6532 Self::DaycoreTaiko(_) => DaycoreTaiko::description(),
6533 Self::SimplifiedRhythmTaiko(_) => SimplifiedRhythmTaiko::description(),
6534 Self::HardRockTaiko(_) => HardRockTaiko::description(),
6535 Self::SuddenDeathTaiko(_) => SuddenDeathTaiko::description(),
6536 Self::PerfectTaiko(_) => PerfectTaiko::description(),
6537 Self::DoubleTimeTaiko(_) => DoubleTimeTaiko::description(),
6538 Self::NightcoreTaiko(_) => NightcoreTaiko::description(),
6539 Self::HiddenTaiko(_) => HiddenTaiko::description(),
6540 Self::FlashlightTaiko(_) => FlashlightTaiko::description(),
6541 Self::AccuracyChallengeTaiko(_) => AccuracyChallengeTaiko::description(),
6542 Self::RandomTaiko(_) => RandomTaiko::description(),
6543 Self::DifficultyAdjustTaiko(_) => DifficultyAdjustTaiko::description(),
6544 Self::ClassicTaiko(_) => ClassicTaiko::description(),
6545 Self::SwapTaiko(_) => SwapTaiko::description(),
6546 Self::SingleTapTaiko(_) => SingleTapTaiko::description(),
6547 Self::ConstantSpeedTaiko(_) => ConstantSpeedTaiko::description(),
6548 Self::AutoplayTaiko(_) => AutoplayTaiko::description(),
6549 Self::CinemaTaiko(_) => CinemaTaiko::description(),
6550 Self::RelaxTaiko(_) => RelaxTaiko::description(),
6551 Self::WindUpTaiko(_) => WindUpTaiko::description(),
6552 Self::WindDownTaiko(_) => WindDownTaiko::description(),
6553 Self::MutedTaiko(_) => MutedTaiko::description(),
6554 Self::AdaptiveSpeedTaiko(_) => AdaptiveSpeedTaiko::description(),
6555 Self::ScoreV2Taiko(_) => ScoreV2Taiko::description(),
6556 Self::EasyCatch(_) => EasyCatch::description(),
6557 Self::NoFailCatch(_) => NoFailCatch::description(),
6558 Self::HalfTimeCatch(_) => HalfTimeCatch::description(),
6559 Self::DaycoreCatch(_) => DaycoreCatch::description(),
6560 Self::HardRockCatch(_) => HardRockCatch::description(),
6561 Self::SuddenDeathCatch(_) => SuddenDeathCatch::description(),
6562 Self::PerfectCatch(_) => PerfectCatch::description(),
6563 Self::DoubleTimeCatch(_) => DoubleTimeCatch::description(),
6564 Self::NightcoreCatch(_) => NightcoreCatch::description(),
6565 Self::HiddenCatch(_) => HiddenCatch::description(),
6566 Self::FlashlightCatch(_) => FlashlightCatch::description(),
6567 Self::AccuracyChallengeCatch(_) => AccuracyChallengeCatch::description(),
6568 Self::DifficultyAdjustCatch(_) => DifficultyAdjustCatch::description(),
6569 Self::ClassicCatch(_) => ClassicCatch::description(),
6570 Self::MirrorCatch(_) => MirrorCatch::description(),
6571 Self::AutoplayCatch(_) => AutoplayCatch::description(),
6572 Self::CinemaCatch(_) => CinemaCatch::description(),
6573 Self::RelaxCatch(_) => RelaxCatch::description(),
6574 Self::WindUpCatch(_) => WindUpCatch::description(),
6575 Self::WindDownCatch(_) => WindDownCatch::description(),
6576 Self::FloatingFruitsCatch(_) => FloatingFruitsCatch::description(),
6577 Self::MutedCatch(_) => MutedCatch::description(),
6578 Self::NoScopeCatch(_) => NoScopeCatch::description(),
6579 Self::MovingFastCatch(_) => MovingFastCatch::description(),
6580 Self::ScoreV2Catch(_) => ScoreV2Catch::description(),
6581 Self::EasyMania(_) => EasyMania::description(),
6582 Self::NoFailMania(_) => NoFailMania::description(),
6583 Self::HalfTimeMania(_) => HalfTimeMania::description(),
6584 Self::DaycoreMania(_) => DaycoreMania::description(),
6585 Self::NoReleaseMania(_) => NoReleaseMania::description(),
6586 Self::HardRockMania(_) => HardRockMania::description(),
6587 Self::SuddenDeathMania(_) => SuddenDeathMania::description(),
6588 Self::PerfectMania(_) => PerfectMania::description(),
6589 Self::DoubleTimeMania(_) => DoubleTimeMania::description(),
6590 Self::NightcoreMania(_) => NightcoreMania::description(),
6591 Self::FadeInMania(_) => FadeInMania::description(),
6592 Self::HiddenMania(_) => HiddenMania::description(),
6593 Self::CoverMania(_) => CoverMania::description(),
6594 Self::FlashlightMania(_) => FlashlightMania::description(),
6595 Self::AccuracyChallengeMania(_) => AccuracyChallengeMania::description(),
6596 Self::RandomMania(_) => RandomMania::description(),
6597 Self::DualStagesMania(_) => DualStagesMania::description(),
6598 Self::MirrorMania(_) => MirrorMania::description(),
6599 Self::DifficultyAdjustMania(_) => DifficultyAdjustMania::description(),
6600 Self::ClassicMania(_) => ClassicMania::description(),
6601 Self::InvertMania(_) => InvertMania::description(),
6602 Self::ConstantSpeedMania(_) => ConstantSpeedMania::description(),
6603 Self::HoldOffMania(_) => HoldOffMania::description(),
6604 Self::OneKeyMania(_) => OneKeyMania::description(),
6605 Self::TwoKeysMania(_) => TwoKeysMania::description(),
6606 Self::ThreeKeysMania(_) => ThreeKeysMania::description(),
6607 Self::FourKeysMania(_) => FourKeysMania::description(),
6608 Self::FiveKeysMania(_) => FiveKeysMania::description(),
6609 Self::SixKeysMania(_) => SixKeysMania::description(),
6610 Self::SevenKeysMania(_) => SevenKeysMania::description(),
6611 Self::EightKeysMania(_) => EightKeysMania::description(),
6612 Self::NineKeysMania(_) => NineKeysMania::description(),
6613 Self::TenKeysMania(_) => TenKeysMania::description(),
6614 Self::AutoplayMania(_) => AutoplayMania::description(),
6615 Self::CinemaMania(_) => CinemaMania::description(),
6616 Self::WindUpMania(_) => WindUpMania::description(),
6617 Self::WindDownMania(_) => WindDownMania::description(),
6618 Self::MutedMania(_) => MutedMania::description(),
6619 Self::AdaptiveSpeedMania(_) => AdaptiveSpeedMania::description(),
6620 Self::ScoreV2Mania(_) => ScoreV2Mania::description(),
6621 _ => UnknownMod::description(),
6622 }
6623 }
6624 pub const fn kind(&self) -> GameModKind {
6626 match self {
6627 Self::EasyOsu(_) => EasyOsu::kind(),
6628 Self::NoFailOsu(_) => NoFailOsu::kind(),
6629 Self::HalfTimeOsu(_) => HalfTimeOsu::kind(),
6630 Self::DaycoreOsu(_) => DaycoreOsu::kind(),
6631 Self::HardRockOsu(_) => HardRockOsu::kind(),
6632 Self::SuddenDeathOsu(_) => SuddenDeathOsu::kind(),
6633 Self::PerfectOsu(_) => PerfectOsu::kind(),
6634 Self::DoubleTimeOsu(_) => DoubleTimeOsu::kind(),
6635 Self::NightcoreOsu(_) => NightcoreOsu::kind(),
6636 Self::HiddenOsu(_) => HiddenOsu::kind(),
6637 Self::TraceableOsu(_) => TraceableOsu::kind(),
6638 Self::FlashlightOsu(_) => FlashlightOsu::kind(),
6639 Self::BlindsOsu(_) => BlindsOsu::kind(),
6640 Self::StrictTrackingOsu(_) => StrictTrackingOsu::kind(),
6641 Self::AccuracyChallengeOsu(_) => AccuracyChallengeOsu::kind(),
6642 Self::TargetPracticeOsu(_) => TargetPracticeOsu::kind(),
6643 Self::DifficultyAdjustOsu(_) => DifficultyAdjustOsu::kind(),
6644 Self::ClassicOsu(_) => ClassicOsu::kind(),
6645 Self::RandomOsu(_) => RandomOsu::kind(),
6646 Self::MirrorOsu(_) => MirrorOsu::kind(),
6647 Self::AlternateOsu(_) => AlternateOsu::kind(),
6648 Self::SingleTapOsu(_) => SingleTapOsu::kind(),
6649 Self::AutoplayOsu(_) => AutoplayOsu::kind(),
6650 Self::CinemaOsu(_) => CinemaOsu::kind(),
6651 Self::RelaxOsu(_) => RelaxOsu::kind(),
6652 Self::AutopilotOsu(_) => AutopilotOsu::kind(),
6653 Self::SpunOutOsu(_) => SpunOutOsu::kind(),
6654 Self::TransformOsu(_) => TransformOsu::kind(),
6655 Self::WiggleOsu(_) => WiggleOsu::kind(),
6656 Self::SpinInOsu(_) => SpinInOsu::kind(),
6657 Self::GrowOsu(_) => GrowOsu::kind(),
6658 Self::DeflateOsu(_) => DeflateOsu::kind(),
6659 Self::WindUpOsu(_) => WindUpOsu::kind(),
6660 Self::WindDownOsu(_) => WindDownOsu::kind(),
6661 Self::BarrelRollOsu(_) => BarrelRollOsu::kind(),
6662 Self::ApproachDifferentOsu(_) => ApproachDifferentOsu::kind(),
6663 Self::MutedOsu(_) => MutedOsu::kind(),
6664 Self::NoScopeOsu(_) => NoScopeOsu::kind(),
6665 Self::MagnetisedOsu(_) => MagnetisedOsu::kind(),
6666 Self::RepelOsu(_) => RepelOsu::kind(),
6667 Self::AdaptiveSpeedOsu(_) => AdaptiveSpeedOsu::kind(),
6668 Self::FreezeFrameOsu(_) => FreezeFrameOsu::kind(),
6669 Self::BubblesOsu(_) => BubblesOsu::kind(),
6670 Self::SynesthesiaOsu(_) => SynesthesiaOsu::kind(),
6671 Self::DepthOsu(_) => DepthOsu::kind(),
6672 Self::BloomOsu(_) => BloomOsu::kind(),
6673 Self::TouchDeviceOsu(_) => TouchDeviceOsu::kind(),
6674 Self::ScoreV2Osu(_) => ScoreV2Osu::kind(),
6675 Self::EasyTaiko(_) => EasyTaiko::kind(),
6676 Self::NoFailTaiko(_) => NoFailTaiko::kind(),
6677 Self::HalfTimeTaiko(_) => HalfTimeTaiko::kind(),
6678 Self::DaycoreTaiko(_) => DaycoreTaiko::kind(),
6679 Self::SimplifiedRhythmTaiko(_) => SimplifiedRhythmTaiko::kind(),
6680 Self::HardRockTaiko(_) => HardRockTaiko::kind(),
6681 Self::SuddenDeathTaiko(_) => SuddenDeathTaiko::kind(),
6682 Self::PerfectTaiko(_) => PerfectTaiko::kind(),
6683 Self::DoubleTimeTaiko(_) => DoubleTimeTaiko::kind(),
6684 Self::NightcoreTaiko(_) => NightcoreTaiko::kind(),
6685 Self::HiddenTaiko(_) => HiddenTaiko::kind(),
6686 Self::FlashlightTaiko(_) => FlashlightTaiko::kind(),
6687 Self::AccuracyChallengeTaiko(_) => AccuracyChallengeTaiko::kind(),
6688 Self::RandomTaiko(_) => RandomTaiko::kind(),
6689 Self::DifficultyAdjustTaiko(_) => DifficultyAdjustTaiko::kind(),
6690 Self::ClassicTaiko(_) => ClassicTaiko::kind(),
6691 Self::SwapTaiko(_) => SwapTaiko::kind(),
6692 Self::SingleTapTaiko(_) => SingleTapTaiko::kind(),
6693 Self::ConstantSpeedTaiko(_) => ConstantSpeedTaiko::kind(),
6694 Self::AutoplayTaiko(_) => AutoplayTaiko::kind(),
6695 Self::CinemaTaiko(_) => CinemaTaiko::kind(),
6696 Self::RelaxTaiko(_) => RelaxTaiko::kind(),
6697 Self::WindUpTaiko(_) => WindUpTaiko::kind(),
6698 Self::WindDownTaiko(_) => WindDownTaiko::kind(),
6699 Self::MutedTaiko(_) => MutedTaiko::kind(),
6700 Self::AdaptiveSpeedTaiko(_) => AdaptiveSpeedTaiko::kind(),
6701 Self::ScoreV2Taiko(_) => ScoreV2Taiko::kind(),
6702 Self::EasyCatch(_) => EasyCatch::kind(),
6703 Self::NoFailCatch(_) => NoFailCatch::kind(),
6704 Self::HalfTimeCatch(_) => HalfTimeCatch::kind(),
6705 Self::DaycoreCatch(_) => DaycoreCatch::kind(),
6706 Self::HardRockCatch(_) => HardRockCatch::kind(),
6707 Self::SuddenDeathCatch(_) => SuddenDeathCatch::kind(),
6708 Self::PerfectCatch(_) => PerfectCatch::kind(),
6709 Self::DoubleTimeCatch(_) => DoubleTimeCatch::kind(),
6710 Self::NightcoreCatch(_) => NightcoreCatch::kind(),
6711 Self::HiddenCatch(_) => HiddenCatch::kind(),
6712 Self::FlashlightCatch(_) => FlashlightCatch::kind(),
6713 Self::AccuracyChallengeCatch(_) => AccuracyChallengeCatch::kind(),
6714 Self::DifficultyAdjustCatch(_) => DifficultyAdjustCatch::kind(),
6715 Self::ClassicCatch(_) => ClassicCatch::kind(),
6716 Self::MirrorCatch(_) => MirrorCatch::kind(),
6717 Self::AutoplayCatch(_) => AutoplayCatch::kind(),
6718 Self::CinemaCatch(_) => CinemaCatch::kind(),
6719 Self::RelaxCatch(_) => RelaxCatch::kind(),
6720 Self::WindUpCatch(_) => WindUpCatch::kind(),
6721 Self::WindDownCatch(_) => WindDownCatch::kind(),
6722 Self::FloatingFruitsCatch(_) => FloatingFruitsCatch::kind(),
6723 Self::MutedCatch(_) => MutedCatch::kind(),
6724 Self::NoScopeCatch(_) => NoScopeCatch::kind(),
6725 Self::MovingFastCatch(_) => MovingFastCatch::kind(),
6726 Self::ScoreV2Catch(_) => ScoreV2Catch::kind(),
6727 Self::EasyMania(_) => EasyMania::kind(),
6728 Self::NoFailMania(_) => NoFailMania::kind(),
6729 Self::HalfTimeMania(_) => HalfTimeMania::kind(),
6730 Self::DaycoreMania(_) => DaycoreMania::kind(),
6731 Self::NoReleaseMania(_) => NoReleaseMania::kind(),
6732 Self::HardRockMania(_) => HardRockMania::kind(),
6733 Self::SuddenDeathMania(_) => SuddenDeathMania::kind(),
6734 Self::PerfectMania(_) => PerfectMania::kind(),
6735 Self::DoubleTimeMania(_) => DoubleTimeMania::kind(),
6736 Self::NightcoreMania(_) => NightcoreMania::kind(),
6737 Self::FadeInMania(_) => FadeInMania::kind(),
6738 Self::HiddenMania(_) => HiddenMania::kind(),
6739 Self::CoverMania(_) => CoverMania::kind(),
6740 Self::FlashlightMania(_) => FlashlightMania::kind(),
6741 Self::AccuracyChallengeMania(_) => AccuracyChallengeMania::kind(),
6742 Self::RandomMania(_) => RandomMania::kind(),
6743 Self::DualStagesMania(_) => DualStagesMania::kind(),
6744 Self::MirrorMania(_) => MirrorMania::kind(),
6745 Self::DifficultyAdjustMania(_) => DifficultyAdjustMania::kind(),
6746 Self::ClassicMania(_) => ClassicMania::kind(),
6747 Self::InvertMania(_) => InvertMania::kind(),
6748 Self::ConstantSpeedMania(_) => ConstantSpeedMania::kind(),
6749 Self::HoldOffMania(_) => HoldOffMania::kind(),
6750 Self::OneKeyMania(_) => OneKeyMania::kind(),
6751 Self::TwoKeysMania(_) => TwoKeysMania::kind(),
6752 Self::ThreeKeysMania(_) => ThreeKeysMania::kind(),
6753 Self::FourKeysMania(_) => FourKeysMania::kind(),
6754 Self::FiveKeysMania(_) => FiveKeysMania::kind(),
6755 Self::SixKeysMania(_) => SixKeysMania::kind(),
6756 Self::SevenKeysMania(_) => SevenKeysMania::kind(),
6757 Self::EightKeysMania(_) => EightKeysMania::kind(),
6758 Self::NineKeysMania(_) => NineKeysMania::kind(),
6759 Self::TenKeysMania(_) => TenKeysMania::kind(),
6760 Self::AutoplayMania(_) => AutoplayMania::kind(),
6761 Self::CinemaMania(_) => CinemaMania::kind(),
6762 Self::WindUpMania(_) => WindUpMania::kind(),
6763 Self::WindDownMania(_) => WindDownMania::kind(),
6764 Self::MutedMania(_) => MutedMania::kind(),
6765 Self::AdaptiveSpeedMania(_) => AdaptiveSpeedMania::kind(),
6766 Self::ScoreV2Mania(_) => ScoreV2Mania::kind(),
6767 _ => UnknownMod::kind(),
6768 }
6769 }
6770 pub const fn bits(&self) -> Option<u32> {
6774 match self {
6775 Self::EasyOsu(_) => Some(EasyOsu::bits()),
6776 Self::NoFailOsu(_) => Some(NoFailOsu::bits()),
6777 Self::HalfTimeOsu(_) => Some(HalfTimeOsu::bits()),
6778 Self::HardRockOsu(_) => Some(HardRockOsu::bits()),
6779 Self::SuddenDeathOsu(_) => Some(SuddenDeathOsu::bits()),
6780 Self::PerfectOsu(_) => Some(PerfectOsu::bits()),
6781 Self::DoubleTimeOsu(_) => Some(DoubleTimeOsu::bits()),
6782 Self::NightcoreOsu(_) => Some(NightcoreOsu::bits()),
6783 Self::HiddenOsu(_) => Some(HiddenOsu::bits()),
6784 Self::FlashlightOsu(_) => Some(FlashlightOsu::bits()),
6785 Self::TargetPracticeOsu(_) => Some(TargetPracticeOsu::bits()),
6786 Self::RandomOsu(_) => Some(RandomOsu::bits()),
6787 Self::MirrorOsu(_) => Some(MirrorOsu::bits()),
6788 Self::AutoplayOsu(_) => Some(AutoplayOsu::bits()),
6789 Self::CinemaOsu(_) => Some(CinemaOsu::bits()),
6790 Self::RelaxOsu(_) => Some(RelaxOsu::bits()),
6791 Self::AutopilotOsu(_) => Some(AutopilotOsu::bits()),
6792 Self::SpunOutOsu(_) => Some(SpunOutOsu::bits()),
6793 Self::TouchDeviceOsu(_) => Some(TouchDeviceOsu::bits()),
6794 Self::ScoreV2Osu(_) => Some(ScoreV2Osu::bits()),
6795 Self::EasyTaiko(_) => Some(EasyTaiko::bits()),
6796 Self::NoFailTaiko(_) => Some(NoFailTaiko::bits()),
6797 Self::HalfTimeTaiko(_) => Some(HalfTimeTaiko::bits()),
6798 Self::HardRockTaiko(_) => Some(HardRockTaiko::bits()),
6799 Self::SuddenDeathTaiko(_) => Some(SuddenDeathTaiko::bits()),
6800 Self::PerfectTaiko(_) => Some(PerfectTaiko::bits()),
6801 Self::DoubleTimeTaiko(_) => Some(DoubleTimeTaiko::bits()),
6802 Self::NightcoreTaiko(_) => Some(NightcoreTaiko::bits()),
6803 Self::HiddenTaiko(_) => Some(HiddenTaiko::bits()),
6804 Self::FlashlightTaiko(_) => Some(FlashlightTaiko::bits()),
6805 Self::RandomTaiko(_) => Some(RandomTaiko::bits()),
6806 Self::AutoplayTaiko(_) => Some(AutoplayTaiko::bits()),
6807 Self::CinemaTaiko(_) => Some(CinemaTaiko::bits()),
6808 Self::RelaxTaiko(_) => Some(RelaxTaiko::bits()),
6809 Self::ScoreV2Taiko(_) => Some(ScoreV2Taiko::bits()),
6810 Self::EasyCatch(_) => Some(EasyCatch::bits()),
6811 Self::NoFailCatch(_) => Some(NoFailCatch::bits()),
6812 Self::HalfTimeCatch(_) => Some(HalfTimeCatch::bits()),
6813 Self::HardRockCatch(_) => Some(HardRockCatch::bits()),
6814 Self::SuddenDeathCatch(_) => Some(SuddenDeathCatch::bits()),
6815 Self::PerfectCatch(_) => Some(PerfectCatch::bits()),
6816 Self::DoubleTimeCatch(_) => Some(DoubleTimeCatch::bits()),
6817 Self::NightcoreCatch(_) => Some(NightcoreCatch::bits()),
6818 Self::HiddenCatch(_) => Some(HiddenCatch::bits()),
6819 Self::FlashlightCatch(_) => Some(FlashlightCatch::bits()),
6820 Self::MirrorCatch(_) => Some(MirrorCatch::bits()),
6821 Self::AutoplayCatch(_) => Some(AutoplayCatch::bits()),
6822 Self::CinemaCatch(_) => Some(CinemaCatch::bits()),
6823 Self::RelaxCatch(_) => Some(RelaxCatch::bits()),
6824 Self::ScoreV2Catch(_) => Some(ScoreV2Catch::bits()),
6825 Self::EasyMania(_) => Some(EasyMania::bits()),
6826 Self::NoFailMania(_) => Some(NoFailMania::bits()),
6827 Self::HalfTimeMania(_) => Some(HalfTimeMania::bits()),
6828 Self::HardRockMania(_) => Some(HardRockMania::bits()),
6829 Self::SuddenDeathMania(_) => Some(SuddenDeathMania::bits()),
6830 Self::PerfectMania(_) => Some(PerfectMania::bits()),
6831 Self::DoubleTimeMania(_) => Some(DoubleTimeMania::bits()),
6832 Self::NightcoreMania(_) => Some(NightcoreMania::bits()),
6833 Self::FadeInMania(_) => Some(FadeInMania::bits()),
6834 Self::HiddenMania(_) => Some(HiddenMania::bits()),
6835 Self::FlashlightMania(_) => Some(FlashlightMania::bits()),
6836 Self::RandomMania(_) => Some(RandomMania::bits()),
6837 Self::DualStagesMania(_) => Some(DualStagesMania::bits()),
6838 Self::MirrorMania(_) => Some(MirrorMania::bits()),
6839 Self::OneKeyMania(_) => Some(OneKeyMania::bits()),
6840 Self::TwoKeysMania(_) => Some(TwoKeysMania::bits()),
6841 Self::ThreeKeysMania(_) => Some(ThreeKeysMania::bits()),
6842 Self::FourKeysMania(_) => Some(FourKeysMania::bits()),
6843 Self::FiveKeysMania(_) => Some(FiveKeysMania::bits()),
6844 Self::SixKeysMania(_) => Some(SixKeysMania::bits()),
6845 Self::SevenKeysMania(_) => Some(SevenKeysMania::bits()),
6846 Self::EightKeysMania(_) => Some(EightKeysMania::bits()),
6847 Self::NineKeysMania(_) => Some(NineKeysMania::bits()),
6848 Self::AutoplayMania(_) => Some(AutoplayMania::bits()),
6849 Self::CinemaMania(_) => Some(CinemaMania::bits()),
6850 Self::ScoreV2Mania(_) => Some(ScoreV2Mania::bits()),
6851 _ => None,
6852 }
6853 }
6854 pub const fn mode(&self) -> GameMode {
6856 match self {
6857 Self::EasyOsu(_)
6858 | Self::NoFailOsu(_)
6859 | Self::HalfTimeOsu(_)
6860 | Self::DaycoreOsu(_)
6861 | Self::HardRockOsu(_)
6862 | Self::SuddenDeathOsu(_)
6863 | Self::PerfectOsu(_)
6864 | Self::DoubleTimeOsu(_)
6865 | Self::NightcoreOsu(_)
6866 | Self::HiddenOsu(_)
6867 | Self::TraceableOsu(_)
6868 | Self::FlashlightOsu(_)
6869 | Self::BlindsOsu(_)
6870 | Self::StrictTrackingOsu(_)
6871 | Self::AccuracyChallengeOsu(_)
6872 | Self::TargetPracticeOsu(_)
6873 | Self::DifficultyAdjustOsu(_)
6874 | Self::ClassicOsu(_)
6875 | Self::RandomOsu(_)
6876 | Self::MirrorOsu(_)
6877 | Self::AlternateOsu(_)
6878 | Self::SingleTapOsu(_)
6879 | Self::AutoplayOsu(_)
6880 | Self::CinemaOsu(_)
6881 | Self::RelaxOsu(_)
6882 | Self::AutopilotOsu(_)
6883 | Self::SpunOutOsu(_)
6884 | Self::TransformOsu(_)
6885 | Self::WiggleOsu(_)
6886 | Self::SpinInOsu(_)
6887 | Self::GrowOsu(_)
6888 | Self::DeflateOsu(_)
6889 | Self::WindUpOsu(_)
6890 | Self::WindDownOsu(_)
6891 | Self::BarrelRollOsu(_)
6892 | Self::ApproachDifferentOsu(_)
6893 | Self::MutedOsu(_)
6894 | Self::NoScopeOsu(_)
6895 | Self::MagnetisedOsu(_)
6896 | Self::RepelOsu(_)
6897 | Self::AdaptiveSpeedOsu(_)
6898 | Self::FreezeFrameOsu(_)
6899 | Self::BubblesOsu(_)
6900 | Self::SynesthesiaOsu(_)
6901 | Self::DepthOsu(_)
6902 | Self::BloomOsu(_)
6903 | Self::TouchDeviceOsu(_)
6904 | Self::ScoreV2Osu(_)
6905 | Self::UnknownOsu(_) => GameMode::Osu,
6906 Self::EasyTaiko(_)
6907 | Self::NoFailTaiko(_)
6908 | Self::HalfTimeTaiko(_)
6909 | Self::DaycoreTaiko(_)
6910 | Self::SimplifiedRhythmTaiko(_)
6911 | Self::HardRockTaiko(_)
6912 | Self::SuddenDeathTaiko(_)
6913 | Self::PerfectTaiko(_)
6914 | Self::DoubleTimeTaiko(_)
6915 | Self::NightcoreTaiko(_)
6916 | Self::HiddenTaiko(_)
6917 | Self::FlashlightTaiko(_)
6918 | Self::AccuracyChallengeTaiko(_)
6919 | Self::RandomTaiko(_)
6920 | Self::DifficultyAdjustTaiko(_)
6921 | Self::ClassicTaiko(_)
6922 | Self::SwapTaiko(_)
6923 | Self::SingleTapTaiko(_)
6924 | Self::ConstantSpeedTaiko(_)
6925 | Self::AutoplayTaiko(_)
6926 | Self::CinemaTaiko(_)
6927 | Self::RelaxTaiko(_)
6928 | Self::WindUpTaiko(_)
6929 | Self::WindDownTaiko(_)
6930 | Self::MutedTaiko(_)
6931 | Self::AdaptiveSpeedTaiko(_)
6932 | Self::ScoreV2Taiko(_)
6933 | Self::UnknownTaiko(_) => GameMode::Taiko,
6934 Self::EasyCatch(_)
6935 | Self::NoFailCatch(_)
6936 | Self::HalfTimeCatch(_)
6937 | Self::DaycoreCatch(_)
6938 | Self::HardRockCatch(_)
6939 | Self::SuddenDeathCatch(_)
6940 | Self::PerfectCatch(_)
6941 | Self::DoubleTimeCatch(_)
6942 | Self::NightcoreCatch(_)
6943 | Self::HiddenCatch(_)
6944 | Self::FlashlightCatch(_)
6945 | Self::AccuracyChallengeCatch(_)
6946 | Self::DifficultyAdjustCatch(_)
6947 | Self::ClassicCatch(_)
6948 | Self::MirrorCatch(_)
6949 | Self::AutoplayCatch(_)
6950 | Self::CinemaCatch(_)
6951 | Self::RelaxCatch(_)
6952 | Self::WindUpCatch(_)
6953 | Self::WindDownCatch(_)
6954 | Self::FloatingFruitsCatch(_)
6955 | Self::MutedCatch(_)
6956 | Self::NoScopeCatch(_)
6957 | Self::MovingFastCatch(_)
6958 | Self::ScoreV2Catch(_)
6959 | Self::UnknownCatch(_) => GameMode::Catch,
6960 Self::EasyMania(_)
6961 | Self::NoFailMania(_)
6962 | Self::HalfTimeMania(_)
6963 | Self::DaycoreMania(_)
6964 | Self::NoReleaseMania(_)
6965 | Self::HardRockMania(_)
6966 | Self::SuddenDeathMania(_)
6967 | Self::PerfectMania(_)
6968 | Self::DoubleTimeMania(_)
6969 | Self::NightcoreMania(_)
6970 | Self::FadeInMania(_)
6971 | Self::HiddenMania(_)
6972 | Self::CoverMania(_)
6973 | Self::FlashlightMania(_)
6974 | Self::AccuracyChallengeMania(_)
6975 | Self::RandomMania(_)
6976 | Self::DualStagesMania(_)
6977 | Self::MirrorMania(_)
6978 | Self::DifficultyAdjustMania(_)
6979 | Self::ClassicMania(_)
6980 | Self::InvertMania(_)
6981 | Self::ConstantSpeedMania(_)
6982 | Self::HoldOffMania(_)
6983 | Self::OneKeyMania(_)
6984 | Self::TwoKeysMania(_)
6985 | Self::ThreeKeysMania(_)
6986 | Self::FourKeysMania(_)
6987 | Self::FiveKeysMania(_)
6988 | Self::SixKeysMania(_)
6989 | Self::SevenKeysMania(_)
6990 | Self::EightKeysMania(_)
6991 | Self::NineKeysMania(_)
6992 | Self::TenKeysMania(_)
6993 | Self::AutoplayMania(_)
6994 | Self::CinemaMania(_)
6995 | Self::WindUpMania(_)
6996 | Self::WindDownMania(_)
6997 | Self::MutedMania(_)
6998 | Self::AdaptiveSpeedMania(_)
6999 | Self::ScoreV2Mania(_)
7000 | Self::UnknownMania(_) => GameMode::Mania,
7001 }
7002 }
7003 pub const fn intermode(&self) -> GameModIntermode {
7005 match self {
7006 Self::EasyOsu(_) => GameModIntermode::Easy,
7007 Self::NoFailOsu(_) => GameModIntermode::NoFail,
7008 Self::HalfTimeOsu(_) => GameModIntermode::HalfTime,
7009 Self::DaycoreOsu(_) => GameModIntermode::Daycore,
7010 Self::HardRockOsu(_) => GameModIntermode::HardRock,
7011 Self::SuddenDeathOsu(_) => GameModIntermode::SuddenDeath,
7012 Self::PerfectOsu(_) => GameModIntermode::Perfect,
7013 Self::DoubleTimeOsu(_) => GameModIntermode::DoubleTime,
7014 Self::NightcoreOsu(_) => GameModIntermode::Nightcore,
7015 Self::HiddenOsu(_) => GameModIntermode::Hidden,
7016 Self::TraceableOsu(_) => GameModIntermode::Traceable,
7017 Self::FlashlightOsu(_) => GameModIntermode::Flashlight,
7018 Self::BlindsOsu(_) => GameModIntermode::Blinds,
7019 Self::StrictTrackingOsu(_) => GameModIntermode::StrictTracking,
7020 Self::AccuracyChallengeOsu(_) => GameModIntermode::AccuracyChallenge,
7021 Self::TargetPracticeOsu(_) => GameModIntermode::TargetPractice,
7022 Self::DifficultyAdjustOsu(_) => GameModIntermode::DifficultyAdjust,
7023 Self::ClassicOsu(_) => GameModIntermode::Classic,
7024 Self::RandomOsu(_) => GameModIntermode::Random,
7025 Self::MirrorOsu(_) => GameModIntermode::Mirror,
7026 Self::AlternateOsu(_) => GameModIntermode::Alternate,
7027 Self::SingleTapOsu(_) => GameModIntermode::SingleTap,
7028 Self::AutoplayOsu(_) => GameModIntermode::Autoplay,
7029 Self::CinemaOsu(_) => GameModIntermode::Cinema,
7030 Self::RelaxOsu(_) => GameModIntermode::Relax,
7031 Self::AutopilotOsu(_) => GameModIntermode::Autopilot,
7032 Self::SpunOutOsu(_) => GameModIntermode::SpunOut,
7033 Self::TransformOsu(_) => GameModIntermode::Transform,
7034 Self::WiggleOsu(_) => GameModIntermode::Wiggle,
7035 Self::SpinInOsu(_) => GameModIntermode::SpinIn,
7036 Self::GrowOsu(_) => GameModIntermode::Grow,
7037 Self::DeflateOsu(_) => GameModIntermode::Deflate,
7038 Self::WindUpOsu(_) => GameModIntermode::WindUp,
7039 Self::WindDownOsu(_) => GameModIntermode::WindDown,
7040 Self::BarrelRollOsu(_) => GameModIntermode::BarrelRoll,
7041 Self::ApproachDifferentOsu(_) => GameModIntermode::ApproachDifferent,
7042 Self::MutedOsu(_) => GameModIntermode::Muted,
7043 Self::NoScopeOsu(_) => GameModIntermode::NoScope,
7044 Self::MagnetisedOsu(_) => GameModIntermode::Magnetised,
7045 Self::RepelOsu(_) => GameModIntermode::Repel,
7046 Self::AdaptiveSpeedOsu(_) => GameModIntermode::AdaptiveSpeed,
7047 Self::FreezeFrameOsu(_) => GameModIntermode::FreezeFrame,
7048 Self::BubblesOsu(_) => GameModIntermode::Bubbles,
7049 Self::SynesthesiaOsu(_) => GameModIntermode::Synesthesia,
7050 Self::DepthOsu(_) => GameModIntermode::Depth,
7051 Self::BloomOsu(_) => GameModIntermode::Bloom,
7052 Self::TouchDeviceOsu(_) => GameModIntermode::TouchDevice,
7053 Self::ScoreV2Osu(_) => GameModIntermode::ScoreV2,
7054 Self::EasyTaiko(_) => GameModIntermode::Easy,
7055 Self::NoFailTaiko(_) => GameModIntermode::NoFail,
7056 Self::HalfTimeTaiko(_) => GameModIntermode::HalfTime,
7057 Self::DaycoreTaiko(_) => GameModIntermode::Daycore,
7058 Self::SimplifiedRhythmTaiko(_) => GameModIntermode::SimplifiedRhythm,
7059 Self::HardRockTaiko(_) => GameModIntermode::HardRock,
7060 Self::SuddenDeathTaiko(_) => GameModIntermode::SuddenDeath,
7061 Self::PerfectTaiko(_) => GameModIntermode::Perfect,
7062 Self::DoubleTimeTaiko(_) => GameModIntermode::DoubleTime,
7063 Self::NightcoreTaiko(_) => GameModIntermode::Nightcore,
7064 Self::HiddenTaiko(_) => GameModIntermode::Hidden,
7065 Self::FlashlightTaiko(_) => GameModIntermode::Flashlight,
7066 Self::AccuracyChallengeTaiko(_) => GameModIntermode::AccuracyChallenge,
7067 Self::RandomTaiko(_) => GameModIntermode::Random,
7068 Self::DifficultyAdjustTaiko(_) => GameModIntermode::DifficultyAdjust,
7069 Self::ClassicTaiko(_) => GameModIntermode::Classic,
7070 Self::SwapTaiko(_) => GameModIntermode::Swap,
7071 Self::SingleTapTaiko(_) => GameModIntermode::SingleTap,
7072 Self::ConstantSpeedTaiko(_) => GameModIntermode::ConstantSpeed,
7073 Self::AutoplayTaiko(_) => GameModIntermode::Autoplay,
7074 Self::CinemaTaiko(_) => GameModIntermode::Cinema,
7075 Self::RelaxTaiko(_) => GameModIntermode::Relax,
7076 Self::WindUpTaiko(_) => GameModIntermode::WindUp,
7077 Self::WindDownTaiko(_) => GameModIntermode::WindDown,
7078 Self::MutedTaiko(_) => GameModIntermode::Muted,
7079 Self::AdaptiveSpeedTaiko(_) => GameModIntermode::AdaptiveSpeed,
7080 Self::ScoreV2Taiko(_) => GameModIntermode::ScoreV2,
7081 Self::EasyCatch(_) => GameModIntermode::Easy,
7082 Self::NoFailCatch(_) => GameModIntermode::NoFail,
7083 Self::HalfTimeCatch(_) => GameModIntermode::HalfTime,
7084 Self::DaycoreCatch(_) => GameModIntermode::Daycore,
7085 Self::HardRockCatch(_) => GameModIntermode::HardRock,
7086 Self::SuddenDeathCatch(_) => GameModIntermode::SuddenDeath,
7087 Self::PerfectCatch(_) => GameModIntermode::Perfect,
7088 Self::DoubleTimeCatch(_) => GameModIntermode::DoubleTime,
7089 Self::NightcoreCatch(_) => GameModIntermode::Nightcore,
7090 Self::HiddenCatch(_) => GameModIntermode::Hidden,
7091 Self::FlashlightCatch(_) => GameModIntermode::Flashlight,
7092 Self::AccuracyChallengeCatch(_) => GameModIntermode::AccuracyChallenge,
7093 Self::DifficultyAdjustCatch(_) => GameModIntermode::DifficultyAdjust,
7094 Self::ClassicCatch(_) => GameModIntermode::Classic,
7095 Self::MirrorCatch(_) => GameModIntermode::Mirror,
7096 Self::AutoplayCatch(_) => GameModIntermode::Autoplay,
7097 Self::CinemaCatch(_) => GameModIntermode::Cinema,
7098 Self::RelaxCatch(_) => GameModIntermode::Relax,
7099 Self::WindUpCatch(_) => GameModIntermode::WindUp,
7100 Self::WindDownCatch(_) => GameModIntermode::WindDown,
7101 Self::FloatingFruitsCatch(_) => GameModIntermode::FloatingFruits,
7102 Self::MutedCatch(_) => GameModIntermode::Muted,
7103 Self::NoScopeCatch(_) => GameModIntermode::NoScope,
7104 Self::MovingFastCatch(_) => GameModIntermode::MovingFast,
7105 Self::ScoreV2Catch(_) => GameModIntermode::ScoreV2,
7106 Self::EasyMania(_) => GameModIntermode::Easy,
7107 Self::NoFailMania(_) => GameModIntermode::NoFail,
7108 Self::HalfTimeMania(_) => GameModIntermode::HalfTime,
7109 Self::DaycoreMania(_) => GameModIntermode::Daycore,
7110 Self::NoReleaseMania(_) => GameModIntermode::NoRelease,
7111 Self::HardRockMania(_) => GameModIntermode::HardRock,
7112 Self::SuddenDeathMania(_) => GameModIntermode::SuddenDeath,
7113 Self::PerfectMania(_) => GameModIntermode::Perfect,
7114 Self::DoubleTimeMania(_) => GameModIntermode::DoubleTime,
7115 Self::NightcoreMania(_) => GameModIntermode::Nightcore,
7116 Self::FadeInMania(_) => GameModIntermode::FadeIn,
7117 Self::HiddenMania(_) => GameModIntermode::Hidden,
7118 Self::CoverMania(_) => GameModIntermode::Cover,
7119 Self::FlashlightMania(_) => GameModIntermode::Flashlight,
7120 Self::AccuracyChallengeMania(_) => GameModIntermode::AccuracyChallenge,
7121 Self::RandomMania(_) => GameModIntermode::Random,
7122 Self::DualStagesMania(_) => GameModIntermode::DualStages,
7123 Self::MirrorMania(_) => GameModIntermode::Mirror,
7124 Self::DifficultyAdjustMania(_) => GameModIntermode::DifficultyAdjust,
7125 Self::ClassicMania(_) => GameModIntermode::Classic,
7126 Self::InvertMania(_) => GameModIntermode::Invert,
7127 Self::ConstantSpeedMania(_) => GameModIntermode::ConstantSpeed,
7128 Self::HoldOffMania(_) => GameModIntermode::HoldOff,
7129 Self::OneKeyMania(_) => GameModIntermode::OneKey,
7130 Self::TwoKeysMania(_) => GameModIntermode::TwoKeys,
7131 Self::ThreeKeysMania(_) => GameModIntermode::ThreeKeys,
7132 Self::FourKeysMania(_) => GameModIntermode::FourKeys,
7133 Self::FiveKeysMania(_) => GameModIntermode::FiveKeys,
7134 Self::SixKeysMania(_) => GameModIntermode::SixKeys,
7135 Self::SevenKeysMania(_) => GameModIntermode::SevenKeys,
7136 Self::EightKeysMania(_) => GameModIntermode::EightKeys,
7137 Self::NineKeysMania(_) => GameModIntermode::NineKeys,
7138 Self::TenKeysMania(_) => GameModIntermode::TenKeys,
7139 Self::AutoplayMania(_) => GameModIntermode::Autoplay,
7140 Self::CinemaMania(_) => GameModIntermode::Cinema,
7141 Self::WindUpMania(_) => GameModIntermode::WindUp,
7142 Self::WindDownMania(_) => GameModIntermode::WindDown,
7143 Self::MutedMania(_) => GameModIntermode::Muted,
7144 Self::AdaptiveSpeedMania(_) => GameModIntermode::AdaptiveSpeed,
7145 Self::ScoreV2Mania(_) => GameModIntermode::ScoreV2,
7146 Self::UnknownOsu(m)
7147 | Self::UnknownTaiko(m)
7148 | Self::UnknownCatch(m)
7149 | Self::UnknownMania(m) => GameModIntermode::Unknown(*m),
7150 }
7151 }
7152 pub fn into_simple(self) -> GameModSimple {
7154 let mut settings = HashMap::new();
7155 let acronym = match self {
7156 Self::EasyOsu(m) => {
7157 if let Some(value) = m.retries {
7158 settings.insert(Box::from("retries"), SettingSimple::Number(value));
7159 }
7160 EasyOsu::acronym()
7161 }
7162 Self::NoFailOsu(_) => NoFailOsu::acronym(),
7163 Self::HalfTimeOsu(m) => {
7164 if let Some(value) = m.speed_change {
7165 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7166 }
7167 if let Some(value) = m.adjust_pitch {
7168 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7169 }
7170 HalfTimeOsu::acronym()
7171 }
7172 Self::DaycoreOsu(m) => {
7173 if let Some(value) = m.speed_change {
7174 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7175 }
7176 DaycoreOsu::acronym()
7177 }
7178 Self::HardRockOsu(_) => HardRockOsu::acronym(),
7179 Self::SuddenDeathOsu(m) => {
7180 if let Some(value) = m.fail_on_slider_tail {
7181 settings.insert(Box::from("fail_on_slider_tail"), SettingSimple::Bool(value));
7182 }
7183 if let Some(value) = m.restart {
7184 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7185 }
7186 SuddenDeathOsu::acronym()
7187 }
7188 Self::PerfectOsu(m) => {
7189 if let Some(value) = m.restart {
7190 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7191 }
7192 PerfectOsu::acronym()
7193 }
7194 Self::DoubleTimeOsu(m) => {
7195 if let Some(value) = m.speed_change {
7196 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7197 }
7198 if let Some(value) = m.adjust_pitch {
7199 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7200 }
7201 DoubleTimeOsu::acronym()
7202 }
7203 Self::NightcoreOsu(m) => {
7204 if let Some(value) = m.speed_change {
7205 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7206 }
7207 NightcoreOsu::acronym()
7208 }
7209 Self::HiddenOsu(m) => {
7210 if let Some(value) = m.only_fade_approach_circles {
7211 settings.insert(
7212 Box::from("only_fade_approach_circles"),
7213 SettingSimple::Bool(value),
7214 );
7215 }
7216 HiddenOsu::acronym()
7217 }
7218 Self::TraceableOsu(_) => TraceableOsu::acronym(),
7219 Self::FlashlightOsu(m) => {
7220 if let Some(value) = m.follow_delay {
7221 settings.insert(Box::from("follow_delay"), SettingSimple::Number(value));
7222 }
7223 if let Some(value) = m.size_multiplier {
7224 settings.insert(Box::from("size_multiplier"), SettingSimple::Number(value));
7225 }
7226 if let Some(value) = m.combo_based_size {
7227 settings.insert(Box::from("combo_based_size"), SettingSimple::Bool(value));
7228 }
7229 FlashlightOsu::acronym()
7230 }
7231 Self::BlindsOsu(_) => BlindsOsu::acronym(),
7232 Self::StrictTrackingOsu(_) => StrictTrackingOsu::acronym(),
7233 Self::AccuracyChallengeOsu(m) => {
7234 if let Some(value) = m.minimum_accuracy {
7235 settings.insert(Box::from("minimum_accuracy"), SettingSimple::Number(value));
7236 }
7237 if let Some(value) = m.accuracy_judge_mode {
7238 settings.insert(
7239 Box::from("accuracy_judge_mode"),
7240 SettingSimple::String(value),
7241 );
7242 }
7243 if let Some(value) = m.restart {
7244 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7245 }
7246 AccuracyChallengeOsu::acronym()
7247 }
7248 Self::TargetPracticeOsu(m) => {
7249 if let Some(value) = m.seed {
7250 settings.insert(Box::from("seed"), SettingSimple::Number(value));
7251 }
7252 if let Some(value) = m.metronome {
7253 settings.insert(Box::from("metronome"), SettingSimple::Bool(value));
7254 }
7255 TargetPracticeOsu::acronym()
7256 }
7257 Self::DifficultyAdjustOsu(m) => {
7258 if let Some(value) = m.circle_size {
7259 settings.insert(Box::from("circle_size"), SettingSimple::Number(value));
7260 }
7261 if let Some(value) = m.approach_rate {
7262 settings.insert(Box::from("approach_rate"), SettingSimple::Number(value));
7263 }
7264 if let Some(value) = m.drain_rate {
7265 settings.insert(Box::from("drain_rate"), SettingSimple::Number(value));
7266 }
7267 if let Some(value) = m.overall_difficulty {
7268 settings.insert(
7269 Box::from("overall_difficulty"),
7270 SettingSimple::Number(value),
7271 );
7272 }
7273 if let Some(value) = m.extended_limits {
7274 settings.insert(Box::from("extended_limits"), SettingSimple::Bool(value));
7275 }
7276 DifficultyAdjustOsu::acronym()
7277 }
7278 Self::ClassicOsu(m) => {
7279 if let Some(value) = m.no_slider_head_accuracy {
7280 settings.insert(
7281 Box::from("no_slider_head_accuracy"),
7282 SettingSimple::Bool(value),
7283 );
7284 }
7285 if let Some(value) = m.classic_note_lock {
7286 settings.insert(Box::from("classic_note_lock"), SettingSimple::Bool(value));
7287 }
7288 if let Some(value) = m.always_play_tail_sample {
7289 settings.insert(
7290 Box::from("always_play_tail_sample"),
7291 SettingSimple::Bool(value),
7292 );
7293 }
7294 if let Some(value) = m.fade_hit_circle_early {
7295 settings.insert(
7296 Box::from("fade_hit_circle_early"),
7297 SettingSimple::Bool(value),
7298 );
7299 }
7300 if let Some(value) = m.classic_health {
7301 settings.insert(Box::from("classic_health"), SettingSimple::Bool(value));
7302 }
7303 ClassicOsu::acronym()
7304 }
7305 Self::RandomOsu(m) => {
7306 if let Some(value) = m.angle_sharpness {
7307 settings.insert(Box::from("angle_sharpness"), SettingSimple::Number(value));
7308 }
7309 if let Some(value) = m.seed {
7310 settings.insert(Box::from("seed"), SettingSimple::Number(value));
7311 }
7312 RandomOsu::acronym()
7313 }
7314 Self::MirrorOsu(m) => {
7315 if let Some(value) = m.reflection {
7316 settings.insert(Box::from("reflection"), SettingSimple::String(value));
7317 }
7318 MirrorOsu::acronym()
7319 }
7320 Self::AlternateOsu(_) => AlternateOsu::acronym(),
7321 Self::SingleTapOsu(_) => SingleTapOsu::acronym(),
7322 Self::AutoplayOsu(_) => AutoplayOsu::acronym(),
7323 Self::CinemaOsu(_) => CinemaOsu::acronym(),
7324 Self::RelaxOsu(_) => RelaxOsu::acronym(),
7325 Self::AutopilotOsu(_) => AutopilotOsu::acronym(),
7326 Self::SpunOutOsu(_) => SpunOutOsu::acronym(),
7327 Self::TransformOsu(_) => TransformOsu::acronym(),
7328 Self::WiggleOsu(m) => {
7329 if let Some(value) = m.strength {
7330 settings.insert(Box::from("strength"), SettingSimple::Number(value));
7331 }
7332 WiggleOsu::acronym()
7333 }
7334 Self::SpinInOsu(_) => SpinInOsu::acronym(),
7335 Self::GrowOsu(m) => {
7336 if let Some(value) = m.start_scale {
7337 settings.insert(Box::from("start_scale"), SettingSimple::Number(value));
7338 }
7339 GrowOsu::acronym()
7340 }
7341 Self::DeflateOsu(m) => {
7342 if let Some(value) = m.start_scale {
7343 settings.insert(Box::from("start_scale"), SettingSimple::Number(value));
7344 }
7345 DeflateOsu::acronym()
7346 }
7347 Self::WindUpOsu(m) => {
7348 if let Some(value) = m.initial_rate {
7349 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7350 }
7351 if let Some(value) = m.final_rate {
7352 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7353 }
7354 if let Some(value) = m.adjust_pitch {
7355 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7356 }
7357 WindUpOsu::acronym()
7358 }
7359 Self::WindDownOsu(m) => {
7360 if let Some(value) = m.initial_rate {
7361 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7362 }
7363 if let Some(value) = m.final_rate {
7364 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7365 }
7366 if let Some(value) = m.adjust_pitch {
7367 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7368 }
7369 WindDownOsu::acronym()
7370 }
7371 Self::BarrelRollOsu(m) => {
7372 if let Some(value) = m.spin_speed {
7373 settings.insert(Box::from("spin_speed"), SettingSimple::Number(value));
7374 }
7375 if let Some(value) = m.direction {
7376 settings.insert(Box::from("direction"), SettingSimple::String(value));
7377 }
7378 BarrelRollOsu::acronym()
7379 }
7380 Self::ApproachDifferentOsu(m) => {
7381 if let Some(value) = m.scale {
7382 settings.insert(Box::from("scale"), SettingSimple::Number(value));
7383 }
7384 if let Some(value) = m.style {
7385 settings.insert(Box::from("style"), SettingSimple::String(value));
7386 }
7387 ApproachDifferentOsu::acronym()
7388 }
7389 Self::MutedOsu(m) => {
7390 if let Some(value) = m.inverse_muting {
7391 settings.insert(Box::from("inverse_muting"), SettingSimple::Bool(value));
7392 }
7393 if let Some(value) = m.enable_metronome {
7394 settings.insert(Box::from("enable_metronome"), SettingSimple::Bool(value));
7395 }
7396 if let Some(value) = m.mute_combo_count {
7397 settings.insert(Box::from("mute_combo_count"), SettingSimple::Number(value));
7398 }
7399 if let Some(value) = m.affects_hit_sounds {
7400 settings.insert(Box::from("affects_hit_sounds"), SettingSimple::Bool(value));
7401 }
7402 MutedOsu::acronym()
7403 }
7404 Self::NoScopeOsu(m) => {
7405 if let Some(value) = m.hidden_combo_count {
7406 settings.insert(
7407 Box::from("hidden_combo_count"),
7408 SettingSimple::Number(value),
7409 );
7410 }
7411 NoScopeOsu::acronym()
7412 }
7413 Self::MagnetisedOsu(m) => {
7414 if let Some(value) = m.attraction_strength {
7415 settings.insert(
7416 Box::from("attraction_strength"),
7417 SettingSimple::Number(value),
7418 );
7419 }
7420 MagnetisedOsu::acronym()
7421 }
7422 Self::RepelOsu(m) => {
7423 if let Some(value) = m.repulsion_strength {
7424 settings.insert(
7425 Box::from("repulsion_strength"),
7426 SettingSimple::Number(value),
7427 );
7428 }
7429 RepelOsu::acronym()
7430 }
7431 Self::AdaptiveSpeedOsu(m) => {
7432 if let Some(value) = m.initial_rate {
7433 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7434 }
7435 if let Some(value) = m.adjust_pitch {
7436 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7437 }
7438 AdaptiveSpeedOsu::acronym()
7439 }
7440 Self::FreezeFrameOsu(_) => FreezeFrameOsu::acronym(),
7441 Self::BubblesOsu(_) => BubblesOsu::acronym(),
7442 Self::SynesthesiaOsu(_) => SynesthesiaOsu::acronym(),
7443 Self::DepthOsu(m) => {
7444 if let Some(value) = m.max_depth {
7445 settings.insert(Box::from("max_depth"), SettingSimple::Number(value));
7446 }
7447 if let Some(value) = m.show_approach_circles {
7448 settings.insert(
7449 Box::from("show_approach_circles"),
7450 SettingSimple::Bool(value),
7451 );
7452 }
7453 DepthOsu::acronym()
7454 }
7455 Self::BloomOsu(m) => {
7456 if let Some(value) = m.max_size_combo_count {
7457 settings.insert(
7458 Box::from("max_size_combo_count"),
7459 SettingSimple::Number(value),
7460 );
7461 }
7462 if let Some(value) = m.max_cursor_size {
7463 settings.insert(Box::from("max_cursor_size"), SettingSimple::Number(value));
7464 }
7465 BloomOsu::acronym()
7466 }
7467 Self::TouchDeviceOsu(_) => TouchDeviceOsu::acronym(),
7468 Self::ScoreV2Osu(_) => ScoreV2Osu::acronym(),
7469 Self::EasyTaiko(_) => EasyTaiko::acronym(),
7470 Self::NoFailTaiko(_) => NoFailTaiko::acronym(),
7471 Self::HalfTimeTaiko(m) => {
7472 if let Some(value) = m.speed_change {
7473 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7474 }
7475 if let Some(value) = m.adjust_pitch {
7476 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7477 }
7478 HalfTimeTaiko::acronym()
7479 }
7480 Self::DaycoreTaiko(m) => {
7481 if let Some(value) = m.speed_change {
7482 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7483 }
7484 DaycoreTaiko::acronym()
7485 }
7486 Self::SimplifiedRhythmTaiko(m) => {
7487 if let Some(value) = m.one_third_conversion {
7488 settings.insert(
7489 Box::from("one_third_conversion"),
7490 SettingSimple::Bool(value),
7491 );
7492 }
7493 if let Some(value) = m.one_sixth_conversion {
7494 settings.insert(
7495 Box::from("one_sixth_conversion"),
7496 SettingSimple::Bool(value),
7497 );
7498 }
7499 if let Some(value) = m.one_eighth_conversion {
7500 settings.insert(
7501 Box::from("one_eighth_conversion"),
7502 SettingSimple::Bool(value),
7503 );
7504 }
7505 SimplifiedRhythmTaiko::acronym()
7506 }
7507 Self::HardRockTaiko(_) => HardRockTaiko::acronym(),
7508 Self::SuddenDeathTaiko(m) => {
7509 if let Some(value) = m.restart {
7510 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7511 }
7512 SuddenDeathTaiko::acronym()
7513 }
7514 Self::PerfectTaiko(m) => {
7515 if let Some(value) = m.restart {
7516 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7517 }
7518 PerfectTaiko::acronym()
7519 }
7520 Self::DoubleTimeTaiko(m) => {
7521 if let Some(value) = m.speed_change {
7522 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7523 }
7524 if let Some(value) = m.adjust_pitch {
7525 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7526 }
7527 DoubleTimeTaiko::acronym()
7528 }
7529 Self::NightcoreTaiko(m) => {
7530 if let Some(value) = m.speed_change {
7531 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7532 }
7533 NightcoreTaiko::acronym()
7534 }
7535 Self::HiddenTaiko(_) => HiddenTaiko::acronym(),
7536 Self::FlashlightTaiko(m) => {
7537 if let Some(value) = m.size_multiplier {
7538 settings.insert(Box::from("size_multiplier"), SettingSimple::Number(value));
7539 }
7540 if let Some(value) = m.combo_based_size {
7541 settings.insert(Box::from("combo_based_size"), SettingSimple::Bool(value));
7542 }
7543 FlashlightTaiko::acronym()
7544 }
7545 Self::AccuracyChallengeTaiko(m) => {
7546 if let Some(value) = m.minimum_accuracy {
7547 settings.insert(Box::from("minimum_accuracy"), SettingSimple::Number(value));
7548 }
7549 if let Some(value) = m.accuracy_judge_mode {
7550 settings.insert(
7551 Box::from("accuracy_judge_mode"),
7552 SettingSimple::String(value),
7553 );
7554 }
7555 if let Some(value) = m.restart {
7556 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7557 }
7558 AccuracyChallengeTaiko::acronym()
7559 }
7560 Self::RandomTaiko(m) => {
7561 if let Some(value) = m.seed {
7562 settings.insert(Box::from("seed"), SettingSimple::Number(value));
7563 }
7564 RandomTaiko::acronym()
7565 }
7566 Self::DifficultyAdjustTaiko(m) => {
7567 if let Some(value) = m.scroll_speed {
7568 settings.insert(Box::from("scroll_speed"), SettingSimple::Number(value));
7569 }
7570 if let Some(value) = m.drain_rate {
7571 settings.insert(Box::from("drain_rate"), SettingSimple::Number(value));
7572 }
7573 if let Some(value) = m.overall_difficulty {
7574 settings.insert(
7575 Box::from("overall_difficulty"),
7576 SettingSimple::Number(value),
7577 );
7578 }
7579 if let Some(value) = m.extended_limits {
7580 settings.insert(Box::from("extended_limits"), SettingSimple::Bool(value));
7581 }
7582 DifficultyAdjustTaiko::acronym()
7583 }
7584 Self::ClassicTaiko(_) => ClassicTaiko::acronym(),
7585 Self::SwapTaiko(_) => SwapTaiko::acronym(),
7586 Self::SingleTapTaiko(_) => SingleTapTaiko::acronym(),
7587 Self::ConstantSpeedTaiko(_) => ConstantSpeedTaiko::acronym(),
7588 Self::AutoplayTaiko(_) => AutoplayTaiko::acronym(),
7589 Self::CinemaTaiko(_) => CinemaTaiko::acronym(),
7590 Self::RelaxTaiko(_) => RelaxTaiko::acronym(),
7591 Self::WindUpTaiko(m) => {
7592 if let Some(value) = m.initial_rate {
7593 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7594 }
7595 if let Some(value) = m.final_rate {
7596 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7597 }
7598 if let Some(value) = m.adjust_pitch {
7599 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7600 }
7601 WindUpTaiko::acronym()
7602 }
7603 Self::WindDownTaiko(m) => {
7604 if let Some(value) = m.initial_rate {
7605 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7606 }
7607 if let Some(value) = m.final_rate {
7608 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7609 }
7610 if let Some(value) = m.adjust_pitch {
7611 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7612 }
7613 WindDownTaiko::acronym()
7614 }
7615 Self::MutedTaiko(m) => {
7616 if let Some(value) = m.inverse_muting {
7617 settings.insert(Box::from("inverse_muting"), SettingSimple::Bool(value));
7618 }
7619 if let Some(value) = m.enable_metronome {
7620 settings.insert(Box::from("enable_metronome"), SettingSimple::Bool(value));
7621 }
7622 if let Some(value) = m.mute_combo_count {
7623 settings.insert(Box::from("mute_combo_count"), SettingSimple::Number(value));
7624 }
7625 if let Some(value) = m.affects_hit_sounds {
7626 settings.insert(Box::from("affects_hit_sounds"), SettingSimple::Bool(value));
7627 }
7628 MutedTaiko::acronym()
7629 }
7630 Self::AdaptiveSpeedTaiko(m) => {
7631 if let Some(value) = m.initial_rate {
7632 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7633 }
7634 if let Some(value) = m.adjust_pitch {
7635 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7636 }
7637 AdaptiveSpeedTaiko::acronym()
7638 }
7639 Self::ScoreV2Taiko(_) => ScoreV2Taiko::acronym(),
7640 Self::EasyCatch(m) => {
7641 if let Some(value) = m.retries {
7642 settings.insert(Box::from("retries"), SettingSimple::Number(value));
7643 }
7644 EasyCatch::acronym()
7645 }
7646 Self::NoFailCatch(_) => NoFailCatch::acronym(),
7647 Self::HalfTimeCatch(m) => {
7648 if let Some(value) = m.speed_change {
7649 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7650 }
7651 if let Some(value) = m.adjust_pitch {
7652 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7653 }
7654 HalfTimeCatch::acronym()
7655 }
7656 Self::DaycoreCatch(m) => {
7657 if let Some(value) = m.speed_change {
7658 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7659 }
7660 DaycoreCatch::acronym()
7661 }
7662 Self::HardRockCatch(_) => HardRockCatch::acronym(),
7663 Self::SuddenDeathCatch(m) => {
7664 if let Some(value) = m.restart {
7665 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7666 }
7667 SuddenDeathCatch::acronym()
7668 }
7669 Self::PerfectCatch(m) => {
7670 if let Some(value) = m.restart {
7671 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7672 }
7673 PerfectCatch::acronym()
7674 }
7675 Self::DoubleTimeCatch(m) => {
7676 if let Some(value) = m.speed_change {
7677 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7678 }
7679 if let Some(value) = m.adjust_pitch {
7680 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7681 }
7682 DoubleTimeCatch::acronym()
7683 }
7684 Self::NightcoreCatch(m) => {
7685 if let Some(value) = m.speed_change {
7686 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7687 }
7688 NightcoreCatch::acronym()
7689 }
7690 Self::HiddenCatch(_) => HiddenCatch::acronym(),
7691 Self::FlashlightCatch(m) => {
7692 if let Some(value) = m.size_multiplier {
7693 settings.insert(Box::from("size_multiplier"), SettingSimple::Number(value));
7694 }
7695 if let Some(value) = m.combo_based_size {
7696 settings.insert(Box::from("combo_based_size"), SettingSimple::Bool(value));
7697 }
7698 FlashlightCatch::acronym()
7699 }
7700 Self::AccuracyChallengeCatch(m) => {
7701 if let Some(value) = m.minimum_accuracy {
7702 settings.insert(Box::from("minimum_accuracy"), SettingSimple::Number(value));
7703 }
7704 if let Some(value) = m.accuracy_judge_mode {
7705 settings.insert(
7706 Box::from("accuracy_judge_mode"),
7707 SettingSimple::String(value),
7708 );
7709 }
7710 if let Some(value) = m.restart {
7711 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7712 }
7713 AccuracyChallengeCatch::acronym()
7714 }
7715 Self::DifficultyAdjustCatch(m) => {
7716 if let Some(value) = m.circle_size {
7717 settings.insert(Box::from("circle_size"), SettingSimple::Number(value));
7718 }
7719 if let Some(value) = m.approach_rate {
7720 settings.insert(Box::from("approach_rate"), SettingSimple::Number(value));
7721 }
7722 if let Some(value) = m.hard_rock_offsets {
7723 settings.insert(Box::from("hard_rock_offsets"), SettingSimple::Bool(value));
7724 }
7725 if let Some(value) = m.drain_rate {
7726 settings.insert(Box::from("drain_rate"), SettingSimple::Number(value));
7727 }
7728 if let Some(value) = m.overall_difficulty {
7729 settings.insert(
7730 Box::from("overall_difficulty"),
7731 SettingSimple::Number(value),
7732 );
7733 }
7734 if let Some(value) = m.extended_limits {
7735 settings.insert(Box::from("extended_limits"), SettingSimple::Bool(value));
7736 }
7737 DifficultyAdjustCatch::acronym()
7738 }
7739 Self::ClassicCatch(_) => ClassicCatch::acronym(),
7740 Self::MirrorCatch(_) => MirrorCatch::acronym(),
7741 Self::AutoplayCatch(_) => AutoplayCatch::acronym(),
7742 Self::CinemaCatch(_) => CinemaCatch::acronym(),
7743 Self::RelaxCatch(_) => RelaxCatch::acronym(),
7744 Self::WindUpCatch(m) => {
7745 if let Some(value) = m.initial_rate {
7746 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7747 }
7748 if let Some(value) = m.final_rate {
7749 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7750 }
7751 if let Some(value) = m.adjust_pitch {
7752 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7753 }
7754 WindUpCatch::acronym()
7755 }
7756 Self::WindDownCatch(m) => {
7757 if let Some(value) = m.initial_rate {
7758 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7759 }
7760 if let Some(value) = m.final_rate {
7761 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7762 }
7763 if let Some(value) = m.adjust_pitch {
7764 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7765 }
7766 WindDownCatch::acronym()
7767 }
7768 Self::FloatingFruitsCatch(_) => FloatingFruitsCatch::acronym(),
7769 Self::MutedCatch(m) => {
7770 if let Some(value) = m.inverse_muting {
7771 settings.insert(Box::from("inverse_muting"), SettingSimple::Bool(value));
7772 }
7773 if let Some(value) = m.enable_metronome {
7774 settings.insert(Box::from("enable_metronome"), SettingSimple::Bool(value));
7775 }
7776 if let Some(value) = m.mute_combo_count {
7777 settings.insert(Box::from("mute_combo_count"), SettingSimple::Number(value));
7778 }
7779 if let Some(value) = m.affects_hit_sounds {
7780 settings.insert(Box::from("affects_hit_sounds"), SettingSimple::Bool(value));
7781 }
7782 MutedCatch::acronym()
7783 }
7784 Self::NoScopeCatch(m) => {
7785 if let Some(value) = m.hidden_combo_count {
7786 settings.insert(
7787 Box::from("hidden_combo_count"),
7788 SettingSimple::Number(value),
7789 );
7790 }
7791 NoScopeCatch::acronym()
7792 }
7793 Self::MovingFastCatch(_) => MovingFastCatch::acronym(),
7794 Self::ScoreV2Catch(_) => ScoreV2Catch::acronym(),
7795 Self::EasyMania(m) => {
7796 if let Some(value) = m.retries {
7797 settings.insert(Box::from("retries"), SettingSimple::Number(value));
7798 }
7799 EasyMania::acronym()
7800 }
7801 Self::NoFailMania(_) => NoFailMania::acronym(),
7802 Self::HalfTimeMania(m) => {
7803 if let Some(value) = m.speed_change {
7804 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7805 }
7806 if let Some(value) = m.adjust_pitch {
7807 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7808 }
7809 HalfTimeMania::acronym()
7810 }
7811 Self::DaycoreMania(m) => {
7812 if let Some(value) = m.speed_change {
7813 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7814 }
7815 DaycoreMania::acronym()
7816 }
7817 Self::NoReleaseMania(_) => NoReleaseMania::acronym(),
7818 Self::HardRockMania(_) => HardRockMania::acronym(),
7819 Self::SuddenDeathMania(m) => {
7820 if let Some(value) = m.restart {
7821 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7822 }
7823 SuddenDeathMania::acronym()
7824 }
7825 Self::PerfectMania(m) => {
7826 if let Some(value) = m.require_perfect_hits {
7827 settings.insert(
7828 Box::from("require_perfect_hits"),
7829 SettingSimple::Bool(value),
7830 );
7831 }
7832 if let Some(value) = m.restart {
7833 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7834 }
7835 PerfectMania::acronym()
7836 }
7837 Self::DoubleTimeMania(m) => {
7838 if let Some(value) = m.speed_change {
7839 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7840 }
7841 if let Some(value) = m.adjust_pitch {
7842 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7843 }
7844 DoubleTimeMania::acronym()
7845 }
7846 Self::NightcoreMania(m) => {
7847 if let Some(value) = m.speed_change {
7848 settings.insert(Box::from("speed_change"), SettingSimple::Number(value));
7849 }
7850 NightcoreMania::acronym()
7851 }
7852 Self::FadeInMania(_) => FadeInMania::acronym(),
7853 Self::HiddenMania(_) => HiddenMania::acronym(),
7854 Self::CoverMania(m) => {
7855 if let Some(value) = m.coverage {
7856 settings.insert(Box::from("coverage"), SettingSimple::Number(value));
7857 }
7858 if let Some(value) = m.direction {
7859 settings.insert(Box::from("direction"), SettingSimple::String(value));
7860 }
7861 CoverMania::acronym()
7862 }
7863 Self::FlashlightMania(m) => {
7864 if let Some(value) = m.size_multiplier {
7865 settings.insert(Box::from("size_multiplier"), SettingSimple::Number(value));
7866 }
7867 if let Some(value) = m.combo_based_size {
7868 settings.insert(Box::from("combo_based_size"), SettingSimple::Bool(value));
7869 }
7870 FlashlightMania::acronym()
7871 }
7872 Self::AccuracyChallengeMania(m) => {
7873 if let Some(value) = m.minimum_accuracy {
7874 settings.insert(Box::from("minimum_accuracy"), SettingSimple::Number(value));
7875 }
7876 if let Some(value) = m.accuracy_judge_mode {
7877 settings.insert(
7878 Box::from("accuracy_judge_mode"),
7879 SettingSimple::String(value),
7880 );
7881 }
7882 if let Some(value) = m.restart {
7883 settings.insert(Box::from("restart"), SettingSimple::Bool(value));
7884 }
7885 AccuracyChallengeMania::acronym()
7886 }
7887 Self::RandomMania(m) => {
7888 if let Some(value) = m.seed {
7889 settings.insert(Box::from("seed"), SettingSimple::Number(value));
7890 }
7891 RandomMania::acronym()
7892 }
7893 Self::DualStagesMania(_) => DualStagesMania::acronym(),
7894 Self::MirrorMania(_) => MirrorMania::acronym(),
7895 Self::DifficultyAdjustMania(m) => {
7896 if let Some(value) = m.overall_difficulty {
7897 settings.insert(
7898 Box::from("overall_difficulty"),
7899 SettingSimple::Number(value),
7900 );
7901 }
7902 if let Some(value) = m.drain_rate {
7903 settings.insert(Box::from("drain_rate"), SettingSimple::Number(value));
7904 }
7905 if let Some(value) = m.extended_limits {
7906 settings.insert(Box::from("extended_limits"), SettingSimple::Bool(value));
7907 }
7908 DifficultyAdjustMania::acronym()
7909 }
7910 Self::ClassicMania(_) => ClassicMania::acronym(),
7911 Self::InvertMania(_) => InvertMania::acronym(),
7912 Self::ConstantSpeedMania(_) => ConstantSpeedMania::acronym(),
7913 Self::HoldOffMania(_) => HoldOffMania::acronym(),
7914 Self::OneKeyMania(_) => OneKeyMania::acronym(),
7915 Self::TwoKeysMania(_) => TwoKeysMania::acronym(),
7916 Self::ThreeKeysMania(_) => ThreeKeysMania::acronym(),
7917 Self::FourKeysMania(_) => FourKeysMania::acronym(),
7918 Self::FiveKeysMania(_) => FiveKeysMania::acronym(),
7919 Self::SixKeysMania(_) => SixKeysMania::acronym(),
7920 Self::SevenKeysMania(_) => SevenKeysMania::acronym(),
7921 Self::EightKeysMania(_) => EightKeysMania::acronym(),
7922 Self::NineKeysMania(_) => NineKeysMania::acronym(),
7923 Self::TenKeysMania(_) => TenKeysMania::acronym(),
7924 Self::AutoplayMania(_) => AutoplayMania::acronym(),
7925 Self::CinemaMania(_) => CinemaMania::acronym(),
7926 Self::WindUpMania(m) => {
7927 if let Some(value) = m.initial_rate {
7928 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7929 }
7930 if let Some(value) = m.final_rate {
7931 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7932 }
7933 if let Some(value) = m.adjust_pitch {
7934 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7935 }
7936 WindUpMania::acronym()
7937 }
7938 Self::WindDownMania(m) => {
7939 if let Some(value) = m.initial_rate {
7940 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7941 }
7942 if let Some(value) = m.final_rate {
7943 settings.insert(Box::from("final_rate"), SettingSimple::Number(value));
7944 }
7945 if let Some(value) = m.adjust_pitch {
7946 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7947 }
7948 WindDownMania::acronym()
7949 }
7950 Self::MutedMania(m) => {
7951 if let Some(value) = m.inverse_muting {
7952 settings.insert(Box::from("inverse_muting"), SettingSimple::Bool(value));
7953 }
7954 if let Some(value) = m.enable_metronome {
7955 settings.insert(Box::from("enable_metronome"), SettingSimple::Bool(value));
7956 }
7957 if let Some(value) = m.mute_combo_count {
7958 settings.insert(Box::from("mute_combo_count"), SettingSimple::Number(value));
7959 }
7960 if let Some(value) = m.affects_hit_sounds {
7961 settings.insert(Box::from("affects_hit_sounds"), SettingSimple::Bool(value));
7962 }
7963 MutedMania::acronym()
7964 }
7965 Self::AdaptiveSpeedMania(m) => {
7966 if let Some(value) = m.initial_rate {
7967 settings.insert(Box::from("initial_rate"), SettingSimple::Number(value));
7968 }
7969 if let Some(value) = m.adjust_pitch {
7970 settings.insert(Box::from("adjust_pitch"), SettingSimple::Bool(value));
7971 }
7972 AdaptiveSpeedMania::acronym()
7973 }
7974 Self::ScoreV2Mania(_) => ScoreV2Mania::acronym(),
7975 Self::UnknownOsu(m) => m.acronym(),
7976 Self::UnknownTaiko(m) => m.acronym(),
7977 Self::UnknownCatch(m) => m.acronym(),
7978 Self::UnknownMania(m) => m.acronym(),
7979 };
7980 GameModSimple { acronym, settings }
7981 }
7982}
7983impl From<GameMod> for GameModSimple {
7984 fn from(gamemod: GameMod) -> Self {
7985 gamemod.into_simple()
7986 }
7987}
7988impl PartialOrd for GameMod {
7989 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
7990 self.bits()
7991 .zip(other.bits())
7992 .map(|(self_bits, other_bits)| self_bits.cmp(&other_bits))
7993 }
7994}
7995#[cfg(feature = "serde")]
7996#[cfg_attr(all(docsrs, not(doctest)), doc(cfg(feature = "serde")))]
7997const _: () = {
7998 use serde::{
7999 de::{
8000 value::MapAccessDeserializer, DeserializeSeed, Deserializer, Error as DeError,
8001 IgnoredAny, MapAccess, Visitor,
8002 },
8003 ser::{Serialize, SerializeMap, Serializer},
8004 Deserialize,
8005 };
8006
8007 use crate::serde::{
8008 DeserializedGameMod, GameModRaw, GameModRawSeed, GameModSettings, GameModSettingsSeed,
8009 GameModVisitor, MaybeOwnedStr,
8010 };
8011
8012 impl<'de> Visitor<'de> for GameModVisitor<EasyOsu> {
8013 type Value = DeserializedGameMod<'de, EasyOsu>;
8014 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8015 f.write_str("EasyOsu")
8016 }
8017 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8018 const FIELDS: &'static [&'static str] = &["retries"];
8019 let mut unknown_key__ = None;
8020 let mut retries = None;
8021 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8022 match key.as_str() {
8023 "retries" => retries = Some(map.next_value()?),
8024 _ => {
8025 unknown_key__ = Some(key);
8026 let _: IgnoredAny = map.next_value()?;
8027 }
8028 }
8029 }
8030 let gamemod = EasyOsu {
8031 retries: retries.unwrap_or_default(),
8032 };
8033 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8034 }
8035 }
8036 impl Serialize for EasyOsu {
8037 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8038 let field_count = self.retries.is_some() as usize;
8039 let mut map = s.serialize_map(Some(field_count))?;
8040 if let Some(ref x) = self.retries {
8041 map.serialize_entry("retries", x)?;
8042 }
8043 map.end()
8044 }
8045 }
8046 impl<'de> Visitor<'de> for GameModVisitor<NoFailOsu> {
8047 type Value = DeserializedGameMod<'de, NoFailOsu>;
8048 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8049 f.write_str("NoFailOsu")
8050 }
8051 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8052 const FIELDS: &'static [&'static str] = &[];
8053 let mut unknown_key__ = None;
8054 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8055 match key.as_str() {
8056 _ => {
8057 unknown_key__ = Some(key);
8058 let _: IgnoredAny = map.next_value()?;
8059 }
8060 }
8061 }
8062 let gamemod = NoFailOsu {};
8063 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8064 }
8065 }
8066 impl Serialize for NoFailOsu {
8067 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8068 let field_count = 0;
8069 let map = s.serialize_map(Some(field_count))?;
8070 map.end()
8071 }
8072 }
8073 impl<'de> Visitor<'de> for GameModVisitor<HalfTimeOsu> {
8074 type Value = DeserializedGameMod<'de, HalfTimeOsu>;
8075 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8076 f.write_str("HalfTimeOsu")
8077 }
8078 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8079 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
8080 let mut unknown_key__ = None;
8081 let mut speed_change = None;
8082 let mut adjust_pitch = None;
8083 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8084 match key.as_str() {
8085 "speed_change" => speed_change = Some(map.next_value()?),
8086 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
8087 _ => {
8088 unknown_key__ = Some(key);
8089 let _: IgnoredAny = map.next_value()?;
8090 }
8091 }
8092 }
8093 let gamemod = HalfTimeOsu {
8094 speed_change: speed_change.unwrap_or_default(),
8095 adjust_pitch: adjust_pitch.unwrap_or_default(),
8096 };
8097 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8098 }
8099 }
8100 impl Serialize for HalfTimeOsu {
8101 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8102 let field_count =
8103 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
8104 let mut map = s.serialize_map(Some(field_count))?;
8105 if let Some(ref x) = self.speed_change {
8106 map.serialize_entry("speed_change", x)?;
8107 }
8108 if let Some(ref x) = self.adjust_pitch {
8109 map.serialize_entry("adjust_pitch", x)?;
8110 }
8111 map.end()
8112 }
8113 }
8114 impl<'de> Visitor<'de> for GameModVisitor<DaycoreOsu> {
8115 type Value = DeserializedGameMod<'de, DaycoreOsu>;
8116 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8117 f.write_str("DaycoreOsu")
8118 }
8119 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8120 const FIELDS: &'static [&'static str] = &["speed_change"];
8121 let mut unknown_key__ = None;
8122 let mut speed_change = None;
8123 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8124 match key.as_str() {
8125 "speed_change" => speed_change = Some(map.next_value()?),
8126 _ => {
8127 unknown_key__ = Some(key);
8128 let _: IgnoredAny = map.next_value()?;
8129 }
8130 }
8131 }
8132 let gamemod = DaycoreOsu {
8133 speed_change: speed_change.unwrap_or_default(),
8134 };
8135 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8136 }
8137 }
8138 impl Serialize for DaycoreOsu {
8139 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8140 let field_count = self.speed_change.is_some() as usize;
8141 let mut map = s.serialize_map(Some(field_count))?;
8142 if let Some(ref x) = self.speed_change {
8143 map.serialize_entry("speed_change", x)?;
8144 }
8145 map.end()
8146 }
8147 }
8148 impl<'de> Visitor<'de> for GameModVisitor<HardRockOsu> {
8149 type Value = DeserializedGameMod<'de, HardRockOsu>;
8150 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8151 f.write_str("HardRockOsu")
8152 }
8153 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8154 const FIELDS: &'static [&'static str] = &[];
8155 let mut unknown_key__ = None;
8156 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8157 match key.as_str() {
8158 _ => {
8159 unknown_key__ = Some(key);
8160 let _: IgnoredAny = map.next_value()?;
8161 }
8162 }
8163 }
8164 let gamemod = HardRockOsu {};
8165 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8166 }
8167 }
8168 impl Serialize for HardRockOsu {
8169 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8170 let field_count = 0;
8171 let map = s.serialize_map(Some(field_count))?;
8172 map.end()
8173 }
8174 }
8175 impl<'de> Visitor<'de> for GameModVisitor<SuddenDeathOsu> {
8176 type Value = DeserializedGameMod<'de, SuddenDeathOsu>;
8177 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8178 f.write_str("SuddenDeathOsu")
8179 }
8180 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8181 const FIELDS: &'static [&'static str] = &["fail_on_slider_tail", "restart"];
8182 let mut unknown_key__ = None;
8183 let mut fail_on_slider_tail = None;
8184 let mut restart = None;
8185 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8186 match key.as_str() {
8187 "fail_on_slider_tail" => fail_on_slider_tail = Some(map.next_value()?),
8188 "restart" => restart = Some(map.next_value()?),
8189 _ => {
8190 unknown_key__ = Some(key);
8191 let _: IgnoredAny = map.next_value()?;
8192 }
8193 }
8194 }
8195 let gamemod = SuddenDeathOsu {
8196 fail_on_slider_tail: fail_on_slider_tail.unwrap_or_default(),
8197 restart: restart.unwrap_or_default(),
8198 };
8199 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8200 }
8201 }
8202 impl Serialize for SuddenDeathOsu {
8203 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8204 let field_count =
8205 self.fail_on_slider_tail.is_some() as usize + self.restart.is_some() as usize;
8206 let mut map = s.serialize_map(Some(field_count))?;
8207 if let Some(ref x) = self.fail_on_slider_tail {
8208 map.serialize_entry("fail_on_slider_tail", x)?;
8209 }
8210 if let Some(ref x) = self.restart {
8211 map.serialize_entry("restart", x)?;
8212 }
8213 map.end()
8214 }
8215 }
8216 impl<'de> Visitor<'de> for GameModVisitor<PerfectOsu> {
8217 type Value = DeserializedGameMod<'de, PerfectOsu>;
8218 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8219 f.write_str("PerfectOsu")
8220 }
8221 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8222 const FIELDS: &'static [&'static str] = &["restart"];
8223 let mut unknown_key__ = None;
8224 let mut restart = None;
8225 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8226 match key.as_str() {
8227 "restart" => restart = Some(map.next_value()?),
8228 _ => {
8229 unknown_key__ = Some(key);
8230 let _: IgnoredAny = map.next_value()?;
8231 }
8232 }
8233 }
8234 let gamemod = PerfectOsu {
8235 restart: restart.unwrap_or_default(),
8236 };
8237 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8238 }
8239 }
8240 impl Serialize for PerfectOsu {
8241 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8242 let field_count = self.restart.is_some() as usize;
8243 let mut map = s.serialize_map(Some(field_count))?;
8244 if let Some(ref x) = self.restart {
8245 map.serialize_entry("restart", x)?;
8246 }
8247 map.end()
8248 }
8249 }
8250 impl<'de> Visitor<'de> for GameModVisitor<DoubleTimeOsu> {
8251 type Value = DeserializedGameMod<'de, DoubleTimeOsu>;
8252 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8253 f.write_str("DoubleTimeOsu")
8254 }
8255 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8256 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
8257 let mut unknown_key__ = None;
8258 let mut speed_change = None;
8259 let mut adjust_pitch = None;
8260 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8261 match key.as_str() {
8262 "speed_change" => speed_change = Some(map.next_value()?),
8263 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
8264 _ => {
8265 unknown_key__ = Some(key);
8266 let _: IgnoredAny = map.next_value()?;
8267 }
8268 }
8269 }
8270 let gamemod = DoubleTimeOsu {
8271 speed_change: speed_change.unwrap_or_default(),
8272 adjust_pitch: adjust_pitch.unwrap_or_default(),
8273 };
8274 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8275 }
8276 }
8277 impl Serialize for DoubleTimeOsu {
8278 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8279 let field_count =
8280 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
8281 let mut map = s.serialize_map(Some(field_count))?;
8282 if let Some(ref x) = self.speed_change {
8283 map.serialize_entry("speed_change", x)?;
8284 }
8285 if let Some(ref x) = self.adjust_pitch {
8286 map.serialize_entry("adjust_pitch", x)?;
8287 }
8288 map.end()
8289 }
8290 }
8291 impl<'de> Visitor<'de> for GameModVisitor<NightcoreOsu> {
8292 type Value = DeserializedGameMod<'de, NightcoreOsu>;
8293 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8294 f.write_str("NightcoreOsu")
8295 }
8296 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8297 const FIELDS: &'static [&'static str] = &["speed_change"];
8298 let mut unknown_key__ = None;
8299 let mut speed_change = None;
8300 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8301 match key.as_str() {
8302 "speed_change" => speed_change = Some(map.next_value()?),
8303 _ => {
8304 unknown_key__ = Some(key);
8305 let _: IgnoredAny = map.next_value()?;
8306 }
8307 }
8308 }
8309 let gamemod = NightcoreOsu {
8310 speed_change: speed_change.unwrap_or_default(),
8311 };
8312 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8313 }
8314 }
8315 impl Serialize for NightcoreOsu {
8316 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8317 let field_count = self.speed_change.is_some() as usize;
8318 let mut map = s.serialize_map(Some(field_count))?;
8319 if let Some(ref x) = self.speed_change {
8320 map.serialize_entry("speed_change", x)?;
8321 }
8322 map.end()
8323 }
8324 }
8325 impl<'de> Visitor<'de> for GameModVisitor<HiddenOsu> {
8326 type Value = DeserializedGameMod<'de, HiddenOsu>;
8327 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8328 f.write_str("HiddenOsu")
8329 }
8330 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8331 const FIELDS: &'static [&'static str] = &["only_fade_approach_circles"];
8332 let mut unknown_key__ = None;
8333 let mut only_fade_approach_circles = None;
8334 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8335 match key.as_str() {
8336 "only_fade_approach_circles" => {
8337 only_fade_approach_circles = Some(map.next_value()?)
8338 }
8339 _ => {
8340 unknown_key__ = Some(key);
8341 let _: IgnoredAny = map.next_value()?;
8342 }
8343 }
8344 }
8345 let gamemod = HiddenOsu {
8346 only_fade_approach_circles: only_fade_approach_circles.unwrap_or_default(),
8347 };
8348 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8349 }
8350 }
8351 impl Serialize for HiddenOsu {
8352 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8353 let field_count = self.only_fade_approach_circles.is_some() as usize;
8354 let mut map = s.serialize_map(Some(field_count))?;
8355 if let Some(ref x) = self.only_fade_approach_circles {
8356 map.serialize_entry("only_fade_approach_circles", x)?;
8357 }
8358 map.end()
8359 }
8360 }
8361 impl<'de> Visitor<'de> for GameModVisitor<TraceableOsu> {
8362 type Value = DeserializedGameMod<'de, TraceableOsu>;
8363 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8364 f.write_str("TraceableOsu")
8365 }
8366 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8367 const FIELDS: &'static [&'static str] = &[];
8368 let mut unknown_key__ = None;
8369 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8370 match key.as_str() {
8371 _ => {
8372 unknown_key__ = Some(key);
8373 let _: IgnoredAny = map.next_value()?;
8374 }
8375 }
8376 }
8377 let gamemod = TraceableOsu {};
8378 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8379 }
8380 }
8381 impl Serialize for TraceableOsu {
8382 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8383 let field_count = 0;
8384 let map = s.serialize_map(Some(field_count))?;
8385 map.end()
8386 }
8387 }
8388 impl<'de> Visitor<'de> for GameModVisitor<FlashlightOsu> {
8389 type Value = DeserializedGameMod<'de, FlashlightOsu>;
8390 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8391 f.write_str("FlashlightOsu")
8392 }
8393 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8394 const FIELDS: &'static [&'static str] =
8395 &["follow_delay", "size_multiplier", "combo_based_size"];
8396 let mut unknown_key__ = None;
8397 let mut follow_delay = None;
8398 let mut size_multiplier = None;
8399 let mut combo_based_size = None;
8400 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8401 match key.as_str() {
8402 "follow_delay" => follow_delay = Some(map.next_value()?),
8403 "size_multiplier" => size_multiplier = Some(map.next_value()?),
8404 "combo_based_size" => combo_based_size = Some(map.next_value()?),
8405 _ => {
8406 unknown_key__ = Some(key);
8407 let _: IgnoredAny = map.next_value()?;
8408 }
8409 }
8410 }
8411 let gamemod = FlashlightOsu {
8412 follow_delay: follow_delay.unwrap_or_default(),
8413 size_multiplier: size_multiplier.unwrap_or_default(),
8414 combo_based_size: combo_based_size.unwrap_or_default(),
8415 };
8416 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8417 }
8418 }
8419 impl Serialize for FlashlightOsu {
8420 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8421 let field_count = self.follow_delay.is_some() as usize
8422 + self.size_multiplier.is_some() as usize
8423 + self.combo_based_size.is_some() as usize;
8424 let mut map = s.serialize_map(Some(field_count))?;
8425 if let Some(ref x) = self.follow_delay {
8426 map.serialize_entry("follow_delay", x)?;
8427 }
8428 if let Some(ref x) = self.size_multiplier {
8429 map.serialize_entry("size_multiplier", x)?;
8430 }
8431 if let Some(ref x) = self.combo_based_size {
8432 map.serialize_entry("combo_based_size", x)?;
8433 }
8434 map.end()
8435 }
8436 }
8437 impl<'de> Visitor<'de> for GameModVisitor<BlindsOsu> {
8438 type Value = DeserializedGameMod<'de, BlindsOsu>;
8439 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8440 f.write_str("BlindsOsu")
8441 }
8442 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8443 const FIELDS: &'static [&'static str] = &[];
8444 let mut unknown_key__ = None;
8445 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8446 match key.as_str() {
8447 _ => {
8448 unknown_key__ = Some(key);
8449 let _: IgnoredAny = map.next_value()?;
8450 }
8451 }
8452 }
8453 let gamemod = BlindsOsu {};
8454 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8455 }
8456 }
8457 impl Serialize for BlindsOsu {
8458 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8459 let field_count = 0;
8460 let map = s.serialize_map(Some(field_count))?;
8461 map.end()
8462 }
8463 }
8464 impl<'de> Visitor<'de> for GameModVisitor<StrictTrackingOsu> {
8465 type Value = DeserializedGameMod<'de, StrictTrackingOsu>;
8466 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8467 f.write_str("StrictTrackingOsu")
8468 }
8469 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8470 const FIELDS: &'static [&'static str] = &[];
8471 let mut unknown_key__ = None;
8472 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8473 match key.as_str() {
8474 _ => {
8475 unknown_key__ = Some(key);
8476 let _: IgnoredAny = map.next_value()?;
8477 }
8478 }
8479 }
8480 let gamemod = StrictTrackingOsu {};
8481 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8482 }
8483 }
8484 impl Serialize for StrictTrackingOsu {
8485 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8486 let field_count = 0;
8487 let map = s.serialize_map(Some(field_count))?;
8488 map.end()
8489 }
8490 }
8491 impl<'de> Visitor<'de> for GameModVisitor<AccuracyChallengeOsu> {
8492 type Value = DeserializedGameMod<'de, AccuracyChallengeOsu>;
8493 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8494 f.write_str("AccuracyChallengeOsu")
8495 }
8496 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8497 const FIELDS: &'static [&'static str] =
8498 &["minimum_accuracy", "accuracy_judge_mode", "restart"];
8499 let mut unknown_key__ = None;
8500 let mut minimum_accuracy = None;
8501 let mut accuracy_judge_mode = None;
8502 let mut restart = None;
8503 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8504 match key.as_str() {
8505 "minimum_accuracy" => minimum_accuracy = Some(map.next_value()?),
8506 "accuracy_judge_mode" => accuracy_judge_mode = Some(map.next_value()?),
8507 "restart" => restart = Some(map.next_value()?),
8508 _ => {
8509 unknown_key__ = Some(key);
8510 let _: IgnoredAny = map.next_value()?;
8511 }
8512 }
8513 }
8514 let gamemod = AccuracyChallengeOsu {
8515 minimum_accuracy: minimum_accuracy.unwrap_or_default(),
8516 accuracy_judge_mode: accuracy_judge_mode.unwrap_or_default(),
8517 restart: restart.unwrap_or_default(),
8518 };
8519 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8520 }
8521 }
8522 impl Serialize for AccuracyChallengeOsu {
8523 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8524 let field_count = self.minimum_accuracy.is_some() as usize
8525 + self.accuracy_judge_mode.is_some() as usize
8526 + self.restart.is_some() as usize;
8527 let mut map = s.serialize_map(Some(field_count))?;
8528 if let Some(ref x) = self.minimum_accuracy {
8529 map.serialize_entry("minimum_accuracy", x)?;
8530 }
8531 if let Some(ref x) = self.accuracy_judge_mode {
8532 map.serialize_entry("accuracy_judge_mode", x)?;
8533 }
8534 if let Some(ref x) = self.restart {
8535 map.serialize_entry("restart", x)?;
8536 }
8537 map.end()
8538 }
8539 }
8540 impl<'de> Visitor<'de> for GameModVisitor<TargetPracticeOsu> {
8541 type Value = DeserializedGameMod<'de, TargetPracticeOsu>;
8542 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8543 f.write_str("TargetPracticeOsu")
8544 }
8545 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8546 const FIELDS: &'static [&'static str] = &["seed", "metronome"];
8547 let mut unknown_key__ = None;
8548 let mut seed = None;
8549 let mut metronome = None;
8550 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8551 match key.as_str() {
8552 "seed" => seed = Some(map.next_value()?),
8553 "metronome" => metronome = Some(map.next_value()?),
8554 _ => {
8555 unknown_key__ = Some(key);
8556 let _: IgnoredAny = map.next_value()?;
8557 }
8558 }
8559 }
8560 let gamemod = TargetPracticeOsu {
8561 seed: seed.unwrap_or_default(),
8562 metronome: metronome.unwrap_or_default(),
8563 };
8564 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8565 }
8566 }
8567 impl Serialize for TargetPracticeOsu {
8568 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8569 let field_count = self.seed.is_some() as usize + self.metronome.is_some() as usize;
8570 let mut map = s.serialize_map(Some(field_count))?;
8571 if let Some(ref x) = self.seed {
8572 map.serialize_entry("seed", x)?;
8573 }
8574 if let Some(ref x) = self.metronome {
8575 map.serialize_entry("metronome", x)?;
8576 }
8577 map.end()
8578 }
8579 }
8580 impl<'de> Visitor<'de> for GameModVisitor<DifficultyAdjustOsu> {
8581 type Value = DeserializedGameMod<'de, DifficultyAdjustOsu>;
8582 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8583 f.write_str("DifficultyAdjustOsu")
8584 }
8585 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8586 const FIELDS: &'static [&'static str] = &[
8587 "circle_size",
8588 "approach_rate",
8589 "drain_rate",
8590 "overall_difficulty",
8591 "extended_limits",
8592 ];
8593 let mut unknown_key__ = None;
8594 let mut circle_size = None;
8595 let mut approach_rate = None;
8596 let mut drain_rate = None;
8597 let mut overall_difficulty = None;
8598 let mut extended_limits = None;
8599 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8600 match key.as_str() {
8601 "circle_size" => circle_size = Some(map.next_value()?),
8602 "approach_rate" => approach_rate = Some(map.next_value()?),
8603 "drain_rate" => drain_rate = Some(map.next_value()?),
8604 "overall_difficulty" => overall_difficulty = Some(map.next_value()?),
8605 "extended_limits" => extended_limits = Some(map.next_value()?),
8606 _ => {
8607 unknown_key__ = Some(key);
8608 let _: IgnoredAny = map.next_value()?;
8609 }
8610 }
8611 }
8612 let gamemod = DifficultyAdjustOsu {
8613 circle_size: circle_size.unwrap_or_default(),
8614 approach_rate: approach_rate.unwrap_or_default(),
8615 drain_rate: drain_rate.unwrap_or_default(),
8616 overall_difficulty: overall_difficulty.unwrap_or_default(),
8617 extended_limits: extended_limits.unwrap_or_default(),
8618 };
8619 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8620 }
8621 }
8622 impl Serialize for DifficultyAdjustOsu {
8623 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8624 let field_count = self.circle_size.is_some() as usize
8625 + self.approach_rate.is_some() as usize
8626 + self.drain_rate.is_some() as usize
8627 + self.overall_difficulty.is_some() as usize
8628 + self.extended_limits.is_some() as usize;
8629 let mut map = s.serialize_map(Some(field_count))?;
8630 if let Some(ref x) = self.circle_size {
8631 map.serialize_entry("circle_size", x)?;
8632 }
8633 if let Some(ref x) = self.approach_rate {
8634 map.serialize_entry("approach_rate", x)?;
8635 }
8636 if let Some(ref x) = self.drain_rate {
8637 map.serialize_entry("drain_rate", x)?;
8638 }
8639 if let Some(ref x) = self.overall_difficulty {
8640 map.serialize_entry("overall_difficulty", x)?;
8641 }
8642 if let Some(ref x) = self.extended_limits {
8643 map.serialize_entry("extended_limits", x)?;
8644 }
8645 map.end()
8646 }
8647 }
8648 impl<'de> Visitor<'de> for GameModVisitor<ClassicOsu> {
8649 type Value = DeserializedGameMod<'de, ClassicOsu>;
8650 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8651 f.write_str("ClassicOsu")
8652 }
8653 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8654 const FIELDS: &'static [&'static str] = &[
8655 "no_slider_head_accuracy",
8656 "classic_note_lock",
8657 "always_play_tail_sample",
8658 "fade_hit_circle_early",
8659 "classic_health",
8660 ];
8661 let mut unknown_key__ = None;
8662 let mut no_slider_head_accuracy = None;
8663 let mut classic_note_lock = None;
8664 let mut always_play_tail_sample = None;
8665 let mut fade_hit_circle_early = None;
8666 let mut classic_health = None;
8667 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8668 match key.as_str() {
8669 "no_slider_head_accuracy" => no_slider_head_accuracy = Some(map.next_value()?),
8670 "classic_note_lock" => classic_note_lock = Some(map.next_value()?),
8671 "always_play_tail_sample" => always_play_tail_sample = Some(map.next_value()?),
8672 "fade_hit_circle_early" => fade_hit_circle_early = Some(map.next_value()?),
8673 "classic_health" => classic_health = Some(map.next_value()?),
8674 _ => {
8675 unknown_key__ = Some(key);
8676 let _: IgnoredAny = map.next_value()?;
8677 }
8678 }
8679 }
8680 let gamemod = ClassicOsu {
8681 no_slider_head_accuracy: no_slider_head_accuracy.unwrap_or_default(),
8682 classic_note_lock: classic_note_lock.unwrap_or_default(),
8683 always_play_tail_sample: always_play_tail_sample.unwrap_or_default(),
8684 fade_hit_circle_early: fade_hit_circle_early.unwrap_or_default(),
8685 classic_health: classic_health.unwrap_or_default(),
8686 };
8687 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8688 }
8689 }
8690 impl Serialize for ClassicOsu {
8691 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8692 let field_count = self.no_slider_head_accuracy.is_some() as usize
8693 + self.classic_note_lock.is_some() as usize
8694 + self.always_play_tail_sample.is_some() as usize
8695 + self.fade_hit_circle_early.is_some() as usize
8696 + self.classic_health.is_some() as usize;
8697 let mut map = s.serialize_map(Some(field_count))?;
8698 if let Some(ref x) = self.no_slider_head_accuracy {
8699 map.serialize_entry("no_slider_head_accuracy", x)?;
8700 }
8701 if let Some(ref x) = self.classic_note_lock {
8702 map.serialize_entry("classic_note_lock", x)?;
8703 }
8704 if let Some(ref x) = self.always_play_tail_sample {
8705 map.serialize_entry("always_play_tail_sample", x)?;
8706 }
8707 if let Some(ref x) = self.fade_hit_circle_early {
8708 map.serialize_entry("fade_hit_circle_early", x)?;
8709 }
8710 if let Some(ref x) = self.classic_health {
8711 map.serialize_entry("classic_health", x)?;
8712 }
8713 map.end()
8714 }
8715 }
8716 impl<'de> Visitor<'de> for GameModVisitor<RandomOsu> {
8717 type Value = DeserializedGameMod<'de, RandomOsu>;
8718 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8719 f.write_str("RandomOsu")
8720 }
8721 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8722 const FIELDS: &'static [&'static str] = &["angle_sharpness", "seed"];
8723 let mut unknown_key__ = None;
8724 let mut angle_sharpness = None;
8725 let mut seed = None;
8726 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8727 match key.as_str() {
8728 "angle_sharpness" => angle_sharpness = Some(map.next_value()?),
8729 "seed" => seed = Some(map.next_value()?),
8730 _ => {
8731 unknown_key__ = Some(key);
8732 let _: IgnoredAny = map.next_value()?;
8733 }
8734 }
8735 }
8736 let gamemod = RandomOsu {
8737 angle_sharpness: angle_sharpness.unwrap_or_default(),
8738 seed: seed.unwrap_or_default(),
8739 };
8740 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8741 }
8742 }
8743 impl Serialize for RandomOsu {
8744 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8745 let field_count =
8746 self.angle_sharpness.is_some() as usize + self.seed.is_some() as usize;
8747 let mut map = s.serialize_map(Some(field_count))?;
8748 if let Some(ref x) = self.angle_sharpness {
8749 map.serialize_entry("angle_sharpness", x)?;
8750 }
8751 if let Some(ref x) = self.seed {
8752 map.serialize_entry("seed", x)?;
8753 }
8754 map.end()
8755 }
8756 }
8757 impl<'de> Visitor<'de> for GameModVisitor<MirrorOsu> {
8758 type Value = DeserializedGameMod<'de, MirrorOsu>;
8759 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8760 f.write_str("MirrorOsu")
8761 }
8762 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8763 const FIELDS: &'static [&'static str] = &["reflection"];
8764 let mut unknown_key__ = None;
8765 let mut reflection = None;
8766 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8767 match key.as_str() {
8768 "reflection" => reflection = Some(map.next_value()?),
8769 _ => {
8770 unknown_key__ = Some(key);
8771 let _: IgnoredAny = map.next_value()?;
8772 }
8773 }
8774 }
8775 let gamemod = MirrorOsu {
8776 reflection: reflection.unwrap_or_default(),
8777 };
8778 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8779 }
8780 }
8781 impl Serialize for MirrorOsu {
8782 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8783 let field_count = self.reflection.is_some() as usize;
8784 let mut map = s.serialize_map(Some(field_count))?;
8785 if let Some(ref x) = self.reflection {
8786 map.serialize_entry("reflection", x)?;
8787 }
8788 map.end()
8789 }
8790 }
8791 impl<'de> Visitor<'de> for GameModVisitor<AlternateOsu> {
8792 type Value = DeserializedGameMod<'de, AlternateOsu>;
8793 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8794 f.write_str("AlternateOsu")
8795 }
8796 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8797 const FIELDS: &'static [&'static str] = &[];
8798 let mut unknown_key__ = None;
8799 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8800 match key.as_str() {
8801 _ => {
8802 unknown_key__ = Some(key);
8803 let _: IgnoredAny = map.next_value()?;
8804 }
8805 }
8806 }
8807 let gamemod = AlternateOsu {};
8808 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8809 }
8810 }
8811 impl Serialize for AlternateOsu {
8812 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8813 let field_count = 0;
8814 let map = s.serialize_map(Some(field_count))?;
8815 map.end()
8816 }
8817 }
8818 impl<'de> Visitor<'de> for GameModVisitor<SingleTapOsu> {
8819 type Value = DeserializedGameMod<'de, SingleTapOsu>;
8820 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8821 f.write_str("SingleTapOsu")
8822 }
8823 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8824 const FIELDS: &'static [&'static str] = &[];
8825 let mut unknown_key__ = None;
8826 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8827 match key.as_str() {
8828 _ => {
8829 unknown_key__ = Some(key);
8830 let _: IgnoredAny = map.next_value()?;
8831 }
8832 }
8833 }
8834 let gamemod = SingleTapOsu {};
8835 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8836 }
8837 }
8838 impl Serialize for SingleTapOsu {
8839 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8840 let field_count = 0;
8841 let map = s.serialize_map(Some(field_count))?;
8842 map.end()
8843 }
8844 }
8845 impl<'de> Visitor<'de> for GameModVisitor<AutoplayOsu> {
8846 type Value = DeserializedGameMod<'de, AutoplayOsu>;
8847 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8848 f.write_str("AutoplayOsu")
8849 }
8850 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8851 const FIELDS: &'static [&'static str] = &[];
8852 let mut unknown_key__ = None;
8853 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8854 match key.as_str() {
8855 _ => {
8856 unknown_key__ = Some(key);
8857 let _: IgnoredAny = map.next_value()?;
8858 }
8859 }
8860 }
8861 let gamemod = AutoplayOsu {};
8862 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8863 }
8864 }
8865 impl Serialize for AutoplayOsu {
8866 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8867 let field_count = 0;
8868 let map = s.serialize_map(Some(field_count))?;
8869 map.end()
8870 }
8871 }
8872 impl<'de> Visitor<'de> for GameModVisitor<CinemaOsu> {
8873 type Value = DeserializedGameMod<'de, CinemaOsu>;
8874 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8875 f.write_str("CinemaOsu")
8876 }
8877 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8878 const FIELDS: &'static [&'static str] = &[];
8879 let mut unknown_key__ = None;
8880 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8881 match key.as_str() {
8882 _ => {
8883 unknown_key__ = Some(key);
8884 let _: IgnoredAny = map.next_value()?;
8885 }
8886 }
8887 }
8888 let gamemod = CinemaOsu {};
8889 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8890 }
8891 }
8892 impl Serialize for CinemaOsu {
8893 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8894 let field_count = 0;
8895 let map = s.serialize_map(Some(field_count))?;
8896 map.end()
8897 }
8898 }
8899 impl<'de> Visitor<'de> for GameModVisitor<RelaxOsu> {
8900 type Value = DeserializedGameMod<'de, RelaxOsu>;
8901 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8902 f.write_str("RelaxOsu")
8903 }
8904 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8905 const FIELDS: &'static [&'static str] = &[];
8906 let mut unknown_key__ = None;
8907 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8908 match key.as_str() {
8909 _ => {
8910 unknown_key__ = Some(key);
8911 let _: IgnoredAny = map.next_value()?;
8912 }
8913 }
8914 }
8915 let gamemod = RelaxOsu {};
8916 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8917 }
8918 }
8919 impl Serialize for RelaxOsu {
8920 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8921 let field_count = 0;
8922 let map = s.serialize_map(Some(field_count))?;
8923 map.end()
8924 }
8925 }
8926 impl<'de> Visitor<'de> for GameModVisitor<AutopilotOsu> {
8927 type Value = DeserializedGameMod<'de, AutopilotOsu>;
8928 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8929 f.write_str("AutopilotOsu")
8930 }
8931 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8932 const FIELDS: &'static [&'static str] = &[];
8933 let mut unknown_key__ = None;
8934 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8935 match key.as_str() {
8936 _ => {
8937 unknown_key__ = Some(key);
8938 let _: IgnoredAny = map.next_value()?;
8939 }
8940 }
8941 }
8942 let gamemod = AutopilotOsu {};
8943 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8944 }
8945 }
8946 impl Serialize for AutopilotOsu {
8947 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8948 let field_count = 0;
8949 let map = s.serialize_map(Some(field_count))?;
8950 map.end()
8951 }
8952 }
8953 impl<'de> Visitor<'de> for GameModVisitor<SpunOutOsu> {
8954 type Value = DeserializedGameMod<'de, SpunOutOsu>;
8955 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8956 f.write_str("SpunOutOsu")
8957 }
8958 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8959 const FIELDS: &'static [&'static str] = &[];
8960 let mut unknown_key__ = None;
8961 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8962 match key.as_str() {
8963 _ => {
8964 unknown_key__ = Some(key);
8965 let _: IgnoredAny = map.next_value()?;
8966 }
8967 }
8968 }
8969 let gamemod = SpunOutOsu {};
8970 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8971 }
8972 }
8973 impl Serialize for SpunOutOsu {
8974 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
8975 let field_count = 0;
8976 let map = s.serialize_map(Some(field_count))?;
8977 map.end()
8978 }
8979 }
8980 impl<'de> Visitor<'de> for GameModVisitor<TransformOsu> {
8981 type Value = DeserializedGameMod<'de, TransformOsu>;
8982 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
8983 f.write_str("TransformOsu")
8984 }
8985 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
8986 const FIELDS: &'static [&'static str] = &[];
8987 let mut unknown_key__ = None;
8988 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
8989 match key.as_str() {
8990 _ => {
8991 unknown_key__ = Some(key);
8992 let _: IgnoredAny = map.next_value()?;
8993 }
8994 }
8995 }
8996 let gamemod = TransformOsu {};
8997 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
8998 }
8999 }
9000 impl Serialize for TransformOsu {
9001 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9002 let field_count = 0;
9003 let map = s.serialize_map(Some(field_count))?;
9004 map.end()
9005 }
9006 }
9007 impl<'de> Visitor<'de> for GameModVisitor<WiggleOsu> {
9008 type Value = DeserializedGameMod<'de, WiggleOsu>;
9009 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9010 f.write_str("WiggleOsu")
9011 }
9012 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9013 const FIELDS: &'static [&'static str] = &["strength"];
9014 let mut unknown_key__ = None;
9015 let mut strength = None;
9016 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9017 match key.as_str() {
9018 "strength" => strength = Some(map.next_value()?),
9019 _ => {
9020 unknown_key__ = Some(key);
9021 let _: IgnoredAny = map.next_value()?;
9022 }
9023 }
9024 }
9025 let gamemod = WiggleOsu {
9026 strength: strength.unwrap_or_default(),
9027 };
9028 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9029 }
9030 }
9031 impl Serialize for WiggleOsu {
9032 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9033 let field_count = self.strength.is_some() as usize;
9034 let mut map = s.serialize_map(Some(field_count))?;
9035 if let Some(ref x) = self.strength {
9036 map.serialize_entry("strength", x)?;
9037 }
9038 map.end()
9039 }
9040 }
9041 impl<'de> Visitor<'de> for GameModVisitor<SpinInOsu> {
9042 type Value = DeserializedGameMod<'de, SpinInOsu>;
9043 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9044 f.write_str("SpinInOsu")
9045 }
9046 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9047 const FIELDS: &'static [&'static str] = &[];
9048 let mut unknown_key__ = None;
9049 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9050 match key.as_str() {
9051 _ => {
9052 unknown_key__ = Some(key);
9053 let _: IgnoredAny = map.next_value()?;
9054 }
9055 }
9056 }
9057 let gamemod = SpinInOsu {};
9058 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9059 }
9060 }
9061 impl Serialize for SpinInOsu {
9062 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9063 let field_count = 0;
9064 let map = s.serialize_map(Some(field_count))?;
9065 map.end()
9066 }
9067 }
9068 impl<'de> Visitor<'de> for GameModVisitor<GrowOsu> {
9069 type Value = DeserializedGameMod<'de, GrowOsu>;
9070 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9071 f.write_str("GrowOsu")
9072 }
9073 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9074 const FIELDS: &'static [&'static str] = &["start_scale"];
9075 let mut unknown_key__ = None;
9076 let mut start_scale = None;
9077 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9078 match key.as_str() {
9079 "start_scale" => start_scale = Some(map.next_value()?),
9080 _ => {
9081 unknown_key__ = Some(key);
9082 let _: IgnoredAny = map.next_value()?;
9083 }
9084 }
9085 }
9086 let gamemod = GrowOsu {
9087 start_scale: start_scale.unwrap_or_default(),
9088 };
9089 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9090 }
9091 }
9092 impl Serialize for GrowOsu {
9093 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9094 let field_count = self.start_scale.is_some() as usize;
9095 let mut map = s.serialize_map(Some(field_count))?;
9096 if let Some(ref x) = self.start_scale {
9097 map.serialize_entry("start_scale", x)?;
9098 }
9099 map.end()
9100 }
9101 }
9102 impl<'de> Visitor<'de> for GameModVisitor<DeflateOsu> {
9103 type Value = DeserializedGameMod<'de, DeflateOsu>;
9104 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9105 f.write_str("DeflateOsu")
9106 }
9107 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9108 const FIELDS: &'static [&'static str] = &["start_scale"];
9109 let mut unknown_key__ = None;
9110 let mut start_scale = None;
9111 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9112 match key.as_str() {
9113 "start_scale" => start_scale = Some(map.next_value()?),
9114 _ => {
9115 unknown_key__ = Some(key);
9116 let _: IgnoredAny = map.next_value()?;
9117 }
9118 }
9119 }
9120 let gamemod = DeflateOsu {
9121 start_scale: start_scale.unwrap_or_default(),
9122 };
9123 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9124 }
9125 }
9126 impl Serialize for DeflateOsu {
9127 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9128 let field_count = self.start_scale.is_some() as usize;
9129 let mut map = s.serialize_map(Some(field_count))?;
9130 if let Some(ref x) = self.start_scale {
9131 map.serialize_entry("start_scale", x)?;
9132 }
9133 map.end()
9134 }
9135 }
9136 impl<'de> Visitor<'de> for GameModVisitor<WindUpOsu> {
9137 type Value = DeserializedGameMod<'de, WindUpOsu>;
9138 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9139 f.write_str("WindUpOsu")
9140 }
9141 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9142 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
9143 let mut unknown_key__ = None;
9144 let mut initial_rate = None;
9145 let mut final_rate = None;
9146 let mut adjust_pitch = None;
9147 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9148 match key.as_str() {
9149 "initial_rate" => initial_rate = Some(map.next_value()?),
9150 "final_rate" => final_rate = Some(map.next_value()?),
9151 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
9152 _ => {
9153 unknown_key__ = Some(key);
9154 let _: IgnoredAny = map.next_value()?;
9155 }
9156 }
9157 }
9158 let gamemod = WindUpOsu {
9159 initial_rate: initial_rate.unwrap_or_default(),
9160 final_rate: final_rate.unwrap_or_default(),
9161 adjust_pitch: adjust_pitch.unwrap_or_default(),
9162 };
9163 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9164 }
9165 }
9166 impl Serialize for WindUpOsu {
9167 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9168 let field_count = self.initial_rate.is_some() as usize
9169 + self.final_rate.is_some() as usize
9170 + self.adjust_pitch.is_some() as usize;
9171 let mut map = s.serialize_map(Some(field_count))?;
9172 if let Some(ref x) = self.initial_rate {
9173 map.serialize_entry("initial_rate", x)?;
9174 }
9175 if let Some(ref x) = self.final_rate {
9176 map.serialize_entry("final_rate", x)?;
9177 }
9178 if let Some(ref x) = self.adjust_pitch {
9179 map.serialize_entry("adjust_pitch", x)?;
9180 }
9181 map.end()
9182 }
9183 }
9184 impl<'de> Visitor<'de> for GameModVisitor<WindDownOsu> {
9185 type Value = DeserializedGameMod<'de, WindDownOsu>;
9186 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9187 f.write_str("WindDownOsu")
9188 }
9189 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9190 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
9191 let mut unknown_key__ = None;
9192 let mut initial_rate = None;
9193 let mut final_rate = None;
9194 let mut adjust_pitch = None;
9195 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9196 match key.as_str() {
9197 "initial_rate" => initial_rate = Some(map.next_value()?),
9198 "final_rate" => final_rate = Some(map.next_value()?),
9199 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
9200 _ => {
9201 unknown_key__ = Some(key);
9202 let _: IgnoredAny = map.next_value()?;
9203 }
9204 }
9205 }
9206 let gamemod = WindDownOsu {
9207 initial_rate: initial_rate.unwrap_or_default(),
9208 final_rate: final_rate.unwrap_or_default(),
9209 adjust_pitch: adjust_pitch.unwrap_or_default(),
9210 };
9211 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9212 }
9213 }
9214 impl Serialize for WindDownOsu {
9215 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9216 let field_count = self.initial_rate.is_some() as usize
9217 + self.final_rate.is_some() as usize
9218 + self.adjust_pitch.is_some() as usize;
9219 let mut map = s.serialize_map(Some(field_count))?;
9220 if let Some(ref x) = self.initial_rate {
9221 map.serialize_entry("initial_rate", x)?;
9222 }
9223 if let Some(ref x) = self.final_rate {
9224 map.serialize_entry("final_rate", x)?;
9225 }
9226 if let Some(ref x) = self.adjust_pitch {
9227 map.serialize_entry("adjust_pitch", x)?;
9228 }
9229 map.end()
9230 }
9231 }
9232 impl<'de> Visitor<'de> for GameModVisitor<BarrelRollOsu> {
9233 type Value = DeserializedGameMod<'de, BarrelRollOsu>;
9234 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9235 f.write_str("BarrelRollOsu")
9236 }
9237 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9238 const FIELDS: &'static [&'static str] = &["spin_speed", "direction"];
9239 let mut unknown_key__ = None;
9240 let mut spin_speed = None;
9241 let mut direction = None;
9242 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9243 match key.as_str() {
9244 "spin_speed" => spin_speed = Some(map.next_value()?),
9245 "direction" => direction = Some(map.next_value()?),
9246 _ => {
9247 unknown_key__ = Some(key);
9248 let _: IgnoredAny = map.next_value()?;
9249 }
9250 }
9251 }
9252 let gamemod = BarrelRollOsu {
9253 spin_speed: spin_speed.unwrap_or_default(),
9254 direction: direction.unwrap_or_default(),
9255 };
9256 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9257 }
9258 }
9259 impl Serialize for BarrelRollOsu {
9260 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9261 let field_count =
9262 self.spin_speed.is_some() as usize + self.direction.is_some() as usize;
9263 let mut map = s.serialize_map(Some(field_count))?;
9264 if let Some(ref x) = self.spin_speed {
9265 map.serialize_entry("spin_speed", x)?;
9266 }
9267 if let Some(ref x) = self.direction {
9268 map.serialize_entry("direction", x)?;
9269 }
9270 map.end()
9271 }
9272 }
9273 impl<'de> Visitor<'de> for GameModVisitor<ApproachDifferentOsu> {
9274 type Value = DeserializedGameMod<'de, ApproachDifferentOsu>;
9275 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9276 f.write_str("ApproachDifferentOsu")
9277 }
9278 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9279 const FIELDS: &'static [&'static str] = &["scale", "style"];
9280 let mut unknown_key__ = None;
9281 let mut scale = None;
9282 let mut style = None;
9283 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9284 match key.as_str() {
9285 "scale" => scale = Some(map.next_value()?),
9286 "style" => style = Some(map.next_value()?),
9287 _ => {
9288 unknown_key__ = Some(key);
9289 let _: IgnoredAny = map.next_value()?;
9290 }
9291 }
9292 }
9293 let gamemod = ApproachDifferentOsu {
9294 scale: scale.unwrap_or_default(),
9295 style: style.unwrap_or_default(),
9296 };
9297 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9298 }
9299 }
9300 impl Serialize for ApproachDifferentOsu {
9301 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9302 let field_count = self.scale.is_some() as usize + self.style.is_some() as usize;
9303 let mut map = s.serialize_map(Some(field_count))?;
9304 if let Some(ref x) = self.scale {
9305 map.serialize_entry("scale", x)?;
9306 }
9307 if let Some(ref x) = self.style {
9308 map.serialize_entry("style", x)?;
9309 }
9310 map.end()
9311 }
9312 }
9313 impl<'de> Visitor<'de> for GameModVisitor<MutedOsu> {
9314 type Value = DeserializedGameMod<'de, MutedOsu>;
9315 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9316 f.write_str("MutedOsu")
9317 }
9318 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9319 const FIELDS: &'static [&'static str] = &[
9320 "inverse_muting",
9321 "enable_metronome",
9322 "mute_combo_count",
9323 "affects_hit_sounds",
9324 ];
9325 let mut unknown_key__ = None;
9326 let mut inverse_muting = None;
9327 let mut enable_metronome = None;
9328 let mut mute_combo_count = None;
9329 let mut affects_hit_sounds = None;
9330 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9331 match key.as_str() {
9332 "inverse_muting" => inverse_muting = Some(map.next_value()?),
9333 "enable_metronome" => enable_metronome = Some(map.next_value()?),
9334 "mute_combo_count" => mute_combo_count = Some(map.next_value()?),
9335 "affects_hit_sounds" => affects_hit_sounds = Some(map.next_value()?),
9336 _ => {
9337 unknown_key__ = Some(key);
9338 let _: IgnoredAny = map.next_value()?;
9339 }
9340 }
9341 }
9342 let gamemod = MutedOsu {
9343 inverse_muting: inverse_muting.unwrap_or_default(),
9344 enable_metronome: enable_metronome.unwrap_or_default(),
9345 mute_combo_count: mute_combo_count.unwrap_or_default(),
9346 affects_hit_sounds: affects_hit_sounds.unwrap_or_default(),
9347 };
9348 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9349 }
9350 }
9351 impl Serialize for MutedOsu {
9352 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9353 let field_count = self.inverse_muting.is_some() as usize
9354 + self.enable_metronome.is_some() as usize
9355 + self.mute_combo_count.is_some() as usize
9356 + self.affects_hit_sounds.is_some() as usize;
9357 let mut map = s.serialize_map(Some(field_count))?;
9358 if let Some(ref x) = self.inverse_muting {
9359 map.serialize_entry("inverse_muting", x)?;
9360 }
9361 if let Some(ref x) = self.enable_metronome {
9362 map.serialize_entry("enable_metronome", x)?;
9363 }
9364 if let Some(ref x) = self.mute_combo_count {
9365 map.serialize_entry("mute_combo_count", x)?;
9366 }
9367 if let Some(ref x) = self.affects_hit_sounds {
9368 map.serialize_entry("affects_hit_sounds", x)?;
9369 }
9370 map.end()
9371 }
9372 }
9373 impl<'de> Visitor<'de> for GameModVisitor<NoScopeOsu> {
9374 type Value = DeserializedGameMod<'de, NoScopeOsu>;
9375 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9376 f.write_str("NoScopeOsu")
9377 }
9378 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9379 const FIELDS: &'static [&'static str] = &["hidden_combo_count"];
9380 let mut unknown_key__ = None;
9381 let mut hidden_combo_count = None;
9382 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9383 match key.as_str() {
9384 "hidden_combo_count" => hidden_combo_count = Some(map.next_value()?),
9385 _ => {
9386 unknown_key__ = Some(key);
9387 let _: IgnoredAny = map.next_value()?;
9388 }
9389 }
9390 }
9391 let gamemod = NoScopeOsu {
9392 hidden_combo_count: hidden_combo_count.unwrap_or_default(),
9393 };
9394 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9395 }
9396 }
9397 impl Serialize for NoScopeOsu {
9398 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9399 let field_count = self.hidden_combo_count.is_some() as usize;
9400 let mut map = s.serialize_map(Some(field_count))?;
9401 if let Some(ref x) = self.hidden_combo_count {
9402 map.serialize_entry("hidden_combo_count", x)?;
9403 }
9404 map.end()
9405 }
9406 }
9407 impl<'de> Visitor<'de> for GameModVisitor<MagnetisedOsu> {
9408 type Value = DeserializedGameMod<'de, MagnetisedOsu>;
9409 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9410 f.write_str("MagnetisedOsu")
9411 }
9412 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9413 const FIELDS: &'static [&'static str] = &["attraction_strength"];
9414 let mut unknown_key__ = None;
9415 let mut attraction_strength = None;
9416 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9417 match key.as_str() {
9418 "attraction_strength" => attraction_strength = Some(map.next_value()?),
9419 _ => {
9420 unknown_key__ = Some(key);
9421 let _: IgnoredAny = map.next_value()?;
9422 }
9423 }
9424 }
9425 let gamemod = MagnetisedOsu {
9426 attraction_strength: attraction_strength.unwrap_or_default(),
9427 };
9428 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9429 }
9430 }
9431 impl Serialize for MagnetisedOsu {
9432 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9433 let field_count = self.attraction_strength.is_some() as usize;
9434 let mut map = s.serialize_map(Some(field_count))?;
9435 if let Some(ref x) = self.attraction_strength {
9436 map.serialize_entry("attraction_strength", x)?;
9437 }
9438 map.end()
9439 }
9440 }
9441 impl<'de> Visitor<'de> for GameModVisitor<RepelOsu> {
9442 type Value = DeserializedGameMod<'de, RepelOsu>;
9443 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9444 f.write_str("RepelOsu")
9445 }
9446 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9447 const FIELDS: &'static [&'static str] = &["repulsion_strength"];
9448 let mut unknown_key__ = None;
9449 let mut repulsion_strength = None;
9450 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9451 match key.as_str() {
9452 "repulsion_strength" => repulsion_strength = Some(map.next_value()?),
9453 _ => {
9454 unknown_key__ = Some(key);
9455 let _: IgnoredAny = map.next_value()?;
9456 }
9457 }
9458 }
9459 let gamemod = RepelOsu {
9460 repulsion_strength: repulsion_strength.unwrap_or_default(),
9461 };
9462 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9463 }
9464 }
9465 impl Serialize for RepelOsu {
9466 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9467 let field_count = self.repulsion_strength.is_some() as usize;
9468 let mut map = s.serialize_map(Some(field_count))?;
9469 if let Some(ref x) = self.repulsion_strength {
9470 map.serialize_entry("repulsion_strength", x)?;
9471 }
9472 map.end()
9473 }
9474 }
9475 impl<'de> Visitor<'de> for GameModVisitor<AdaptiveSpeedOsu> {
9476 type Value = DeserializedGameMod<'de, AdaptiveSpeedOsu>;
9477 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9478 f.write_str("AdaptiveSpeedOsu")
9479 }
9480 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9481 const FIELDS: &'static [&'static str] = &["initial_rate", "adjust_pitch"];
9482 let mut unknown_key__ = None;
9483 let mut initial_rate = None;
9484 let mut adjust_pitch = None;
9485 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9486 match key.as_str() {
9487 "initial_rate" => initial_rate = Some(map.next_value()?),
9488 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
9489 _ => {
9490 unknown_key__ = Some(key);
9491 let _: IgnoredAny = map.next_value()?;
9492 }
9493 }
9494 }
9495 let gamemod = AdaptiveSpeedOsu {
9496 initial_rate: initial_rate.unwrap_or_default(),
9497 adjust_pitch: adjust_pitch.unwrap_or_default(),
9498 };
9499 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9500 }
9501 }
9502 impl Serialize for AdaptiveSpeedOsu {
9503 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9504 let field_count =
9505 self.initial_rate.is_some() as usize + self.adjust_pitch.is_some() as usize;
9506 let mut map = s.serialize_map(Some(field_count))?;
9507 if let Some(ref x) = self.initial_rate {
9508 map.serialize_entry("initial_rate", x)?;
9509 }
9510 if let Some(ref x) = self.adjust_pitch {
9511 map.serialize_entry("adjust_pitch", x)?;
9512 }
9513 map.end()
9514 }
9515 }
9516 impl<'de> Visitor<'de> for GameModVisitor<FreezeFrameOsu> {
9517 type Value = DeserializedGameMod<'de, FreezeFrameOsu>;
9518 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9519 f.write_str("FreezeFrameOsu")
9520 }
9521 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9522 const FIELDS: &'static [&'static str] = &[];
9523 let mut unknown_key__ = None;
9524 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9525 match key.as_str() {
9526 _ => {
9527 unknown_key__ = Some(key);
9528 let _: IgnoredAny = map.next_value()?;
9529 }
9530 }
9531 }
9532 let gamemod = FreezeFrameOsu {};
9533 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9534 }
9535 }
9536 impl Serialize for FreezeFrameOsu {
9537 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9538 let field_count = 0;
9539 let map = s.serialize_map(Some(field_count))?;
9540 map.end()
9541 }
9542 }
9543 impl<'de> Visitor<'de> for GameModVisitor<BubblesOsu> {
9544 type Value = DeserializedGameMod<'de, BubblesOsu>;
9545 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9546 f.write_str("BubblesOsu")
9547 }
9548 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9549 const FIELDS: &'static [&'static str] = &[];
9550 let mut unknown_key__ = None;
9551 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9552 match key.as_str() {
9553 _ => {
9554 unknown_key__ = Some(key);
9555 let _: IgnoredAny = map.next_value()?;
9556 }
9557 }
9558 }
9559 let gamemod = BubblesOsu {};
9560 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9561 }
9562 }
9563 impl Serialize for BubblesOsu {
9564 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9565 let field_count = 0;
9566 let map = s.serialize_map(Some(field_count))?;
9567 map.end()
9568 }
9569 }
9570 impl<'de> Visitor<'de> for GameModVisitor<SynesthesiaOsu> {
9571 type Value = DeserializedGameMod<'de, SynesthesiaOsu>;
9572 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9573 f.write_str("SynesthesiaOsu")
9574 }
9575 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9576 const FIELDS: &'static [&'static str] = &[];
9577 let mut unknown_key__ = None;
9578 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9579 match key.as_str() {
9580 _ => {
9581 unknown_key__ = Some(key);
9582 let _: IgnoredAny = map.next_value()?;
9583 }
9584 }
9585 }
9586 let gamemod = SynesthesiaOsu {};
9587 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9588 }
9589 }
9590 impl Serialize for SynesthesiaOsu {
9591 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9592 let field_count = 0;
9593 let map = s.serialize_map(Some(field_count))?;
9594 map.end()
9595 }
9596 }
9597 impl<'de> Visitor<'de> for GameModVisitor<DepthOsu> {
9598 type Value = DeserializedGameMod<'de, DepthOsu>;
9599 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9600 f.write_str("DepthOsu")
9601 }
9602 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9603 const FIELDS: &'static [&'static str] = &["max_depth", "show_approach_circles"];
9604 let mut unknown_key__ = None;
9605 let mut max_depth = None;
9606 let mut show_approach_circles = None;
9607 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9608 match key.as_str() {
9609 "max_depth" => max_depth = Some(map.next_value()?),
9610 "show_approach_circles" => show_approach_circles = Some(map.next_value()?),
9611 _ => {
9612 unknown_key__ = Some(key);
9613 let _: IgnoredAny = map.next_value()?;
9614 }
9615 }
9616 }
9617 let gamemod = DepthOsu {
9618 max_depth: max_depth.unwrap_or_default(),
9619 show_approach_circles: show_approach_circles.unwrap_or_default(),
9620 };
9621 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9622 }
9623 }
9624 impl Serialize for DepthOsu {
9625 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9626 let field_count =
9627 self.max_depth.is_some() as usize + self.show_approach_circles.is_some() as usize;
9628 let mut map = s.serialize_map(Some(field_count))?;
9629 if let Some(ref x) = self.max_depth {
9630 map.serialize_entry("max_depth", x)?;
9631 }
9632 if let Some(ref x) = self.show_approach_circles {
9633 map.serialize_entry("show_approach_circles", x)?;
9634 }
9635 map.end()
9636 }
9637 }
9638 impl<'de> Visitor<'de> for GameModVisitor<BloomOsu> {
9639 type Value = DeserializedGameMod<'de, BloomOsu>;
9640 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9641 f.write_str("BloomOsu")
9642 }
9643 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9644 const FIELDS: &'static [&'static str] = &["max_size_combo_count", "max_cursor_size"];
9645 let mut unknown_key__ = None;
9646 let mut max_size_combo_count = None;
9647 let mut max_cursor_size = None;
9648 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9649 match key.as_str() {
9650 "max_size_combo_count" => max_size_combo_count = Some(map.next_value()?),
9651 "max_cursor_size" => max_cursor_size = Some(map.next_value()?),
9652 _ => {
9653 unknown_key__ = Some(key);
9654 let _: IgnoredAny = map.next_value()?;
9655 }
9656 }
9657 }
9658 let gamemod = BloomOsu {
9659 max_size_combo_count: max_size_combo_count.unwrap_or_default(),
9660 max_cursor_size: max_cursor_size.unwrap_or_default(),
9661 };
9662 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9663 }
9664 }
9665 impl Serialize for BloomOsu {
9666 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9667 let field_count = self.max_size_combo_count.is_some() as usize
9668 + self.max_cursor_size.is_some() as usize;
9669 let mut map = s.serialize_map(Some(field_count))?;
9670 if let Some(ref x) = self.max_size_combo_count {
9671 map.serialize_entry("max_size_combo_count", x)?;
9672 }
9673 if let Some(ref x) = self.max_cursor_size {
9674 map.serialize_entry("max_cursor_size", x)?;
9675 }
9676 map.end()
9677 }
9678 }
9679 impl<'de> Visitor<'de> for GameModVisitor<TouchDeviceOsu> {
9680 type Value = DeserializedGameMod<'de, TouchDeviceOsu>;
9681 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9682 f.write_str("TouchDeviceOsu")
9683 }
9684 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9685 const FIELDS: &'static [&'static str] = &[];
9686 let mut unknown_key__ = None;
9687 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9688 match key.as_str() {
9689 _ => {
9690 unknown_key__ = Some(key);
9691 let _: IgnoredAny = map.next_value()?;
9692 }
9693 }
9694 }
9695 let gamemod = TouchDeviceOsu {};
9696 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9697 }
9698 }
9699 impl Serialize for TouchDeviceOsu {
9700 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9701 let field_count = 0;
9702 let map = s.serialize_map(Some(field_count))?;
9703 map.end()
9704 }
9705 }
9706 impl<'de> Visitor<'de> for GameModVisitor<ScoreV2Osu> {
9707 type Value = DeserializedGameMod<'de, ScoreV2Osu>;
9708 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9709 f.write_str("ScoreV2Osu")
9710 }
9711 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9712 const FIELDS: &'static [&'static str] = &[];
9713 let mut unknown_key__ = None;
9714 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9715 match key.as_str() {
9716 _ => {
9717 unknown_key__ = Some(key);
9718 let _: IgnoredAny = map.next_value()?;
9719 }
9720 }
9721 }
9722 let gamemod = ScoreV2Osu {};
9723 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9724 }
9725 }
9726 impl Serialize for ScoreV2Osu {
9727 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9728 let field_count = 0;
9729 let map = s.serialize_map(Some(field_count))?;
9730 map.end()
9731 }
9732 }
9733 impl<'de> Visitor<'de> for GameModVisitor<EasyTaiko> {
9734 type Value = DeserializedGameMod<'de, EasyTaiko>;
9735 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9736 f.write_str("EasyTaiko")
9737 }
9738 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9739 const FIELDS: &'static [&'static str] = &[];
9740 let mut unknown_key__ = None;
9741 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9742 match key.as_str() {
9743 _ => {
9744 unknown_key__ = Some(key);
9745 let _: IgnoredAny = map.next_value()?;
9746 }
9747 }
9748 }
9749 let gamemod = EasyTaiko {};
9750 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9751 }
9752 }
9753 impl Serialize for EasyTaiko {
9754 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9755 let field_count = 0;
9756 let map = s.serialize_map(Some(field_count))?;
9757 map.end()
9758 }
9759 }
9760 impl<'de> Visitor<'de> for GameModVisitor<NoFailTaiko> {
9761 type Value = DeserializedGameMod<'de, NoFailTaiko>;
9762 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9763 f.write_str("NoFailTaiko")
9764 }
9765 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9766 const FIELDS: &'static [&'static str] = &[];
9767 let mut unknown_key__ = None;
9768 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9769 match key.as_str() {
9770 _ => {
9771 unknown_key__ = Some(key);
9772 let _: IgnoredAny = map.next_value()?;
9773 }
9774 }
9775 }
9776 let gamemod = NoFailTaiko {};
9777 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9778 }
9779 }
9780 impl Serialize for NoFailTaiko {
9781 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9782 let field_count = 0;
9783 let map = s.serialize_map(Some(field_count))?;
9784 map.end()
9785 }
9786 }
9787 impl<'de> Visitor<'de> for GameModVisitor<HalfTimeTaiko> {
9788 type Value = DeserializedGameMod<'de, HalfTimeTaiko>;
9789 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9790 f.write_str("HalfTimeTaiko")
9791 }
9792 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9793 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
9794 let mut unknown_key__ = None;
9795 let mut speed_change = None;
9796 let mut adjust_pitch = None;
9797 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9798 match key.as_str() {
9799 "speed_change" => speed_change = Some(map.next_value()?),
9800 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
9801 _ => {
9802 unknown_key__ = Some(key);
9803 let _: IgnoredAny = map.next_value()?;
9804 }
9805 }
9806 }
9807 let gamemod = HalfTimeTaiko {
9808 speed_change: speed_change.unwrap_or_default(),
9809 adjust_pitch: adjust_pitch.unwrap_or_default(),
9810 };
9811 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9812 }
9813 }
9814 impl Serialize for HalfTimeTaiko {
9815 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9816 let field_count =
9817 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
9818 let mut map = s.serialize_map(Some(field_count))?;
9819 if let Some(ref x) = self.speed_change {
9820 map.serialize_entry("speed_change", x)?;
9821 }
9822 if let Some(ref x) = self.adjust_pitch {
9823 map.serialize_entry("adjust_pitch", x)?;
9824 }
9825 map.end()
9826 }
9827 }
9828 impl<'de> Visitor<'de> for GameModVisitor<DaycoreTaiko> {
9829 type Value = DeserializedGameMod<'de, DaycoreTaiko>;
9830 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9831 f.write_str("DaycoreTaiko")
9832 }
9833 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9834 const FIELDS: &'static [&'static str] = &["speed_change"];
9835 let mut unknown_key__ = None;
9836 let mut speed_change = None;
9837 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9838 match key.as_str() {
9839 "speed_change" => speed_change = Some(map.next_value()?),
9840 _ => {
9841 unknown_key__ = Some(key);
9842 let _: IgnoredAny = map.next_value()?;
9843 }
9844 }
9845 }
9846 let gamemod = DaycoreTaiko {
9847 speed_change: speed_change.unwrap_or_default(),
9848 };
9849 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9850 }
9851 }
9852 impl Serialize for DaycoreTaiko {
9853 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9854 let field_count = self.speed_change.is_some() as usize;
9855 let mut map = s.serialize_map(Some(field_count))?;
9856 if let Some(ref x) = self.speed_change {
9857 map.serialize_entry("speed_change", x)?;
9858 }
9859 map.end()
9860 }
9861 }
9862 impl<'de> Visitor<'de> for GameModVisitor<SimplifiedRhythmTaiko> {
9863 type Value = DeserializedGameMod<'de, SimplifiedRhythmTaiko>;
9864 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9865 f.write_str("SimplifiedRhythmTaiko")
9866 }
9867 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9868 const FIELDS: &'static [&'static str] = &[
9869 "one_third_conversion",
9870 "one_sixth_conversion",
9871 "one_eighth_conversion",
9872 ];
9873 let mut unknown_key__ = None;
9874 let mut one_third_conversion = None;
9875 let mut one_sixth_conversion = None;
9876 let mut one_eighth_conversion = None;
9877 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9878 match key.as_str() {
9879 "one_third_conversion" => one_third_conversion = Some(map.next_value()?),
9880 "one_sixth_conversion" => one_sixth_conversion = Some(map.next_value()?),
9881 "one_eighth_conversion" => one_eighth_conversion = Some(map.next_value()?),
9882 _ => {
9883 unknown_key__ = Some(key);
9884 let _: IgnoredAny = map.next_value()?;
9885 }
9886 }
9887 }
9888 let gamemod = SimplifiedRhythmTaiko {
9889 one_third_conversion: one_third_conversion.unwrap_or_default(),
9890 one_sixth_conversion: one_sixth_conversion.unwrap_or_default(),
9891 one_eighth_conversion: one_eighth_conversion.unwrap_or_default(),
9892 };
9893 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9894 }
9895 }
9896 impl Serialize for SimplifiedRhythmTaiko {
9897 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9898 let field_count = self.one_third_conversion.is_some() as usize
9899 + self.one_sixth_conversion.is_some() as usize
9900 + self.one_eighth_conversion.is_some() as usize;
9901 let mut map = s.serialize_map(Some(field_count))?;
9902 if let Some(ref x) = self.one_third_conversion {
9903 map.serialize_entry("one_third_conversion", x)?;
9904 }
9905 if let Some(ref x) = self.one_sixth_conversion {
9906 map.serialize_entry("one_sixth_conversion", x)?;
9907 }
9908 if let Some(ref x) = self.one_eighth_conversion {
9909 map.serialize_entry("one_eighth_conversion", x)?;
9910 }
9911 map.end()
9912 }
9913 }
9914 impl<'de> Visitor<'de> for GameModVisitor<HardRockTaiko> {
9915 type Value = DeserializedGameMod<'de, HardRockTaiko>;
9916 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9917 f.write_str("HardRockTaiko")
9918 }
9919 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9920 const FIELDS: &'static [&'static str] = &[];
9921 let mut unknown_key__ = None;
9922 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9923 match key.as_str() {
9924 _ => {
9925 unknown_key__ = Some(key);
9926 let _: IgnoredAny = map.next_value()?;
9927 }
9928 }
9929 }
9930 let gamemod = HardRockTaiko {};
9931 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9932 }
9933 }
9934 impl Serialize for HardRockTaiko {
9935 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9936 let field_count = 0;
9937 let map = s.serialize_map(Some(field_count))?;
9938 map.end()
9939 }
9940 }
9941 impl<'de> Visitor<'de> for GameModVisitor<SuddenDeathTaiko> {
9942 type Value = DeserializedGameMod<'de, SuddenDeathTaiko>;
9943 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9944 f.write_str("SuddenDeathTaiko")
9945 }
9946 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9947 const FIELDS: &'static [&'static str] = &["restart"];
9948 let mut unknown_key__ = None;
9949 let mut restart = None;
9950 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9951 match key.as_str() {
9952 "restart" => restart = Some(map.next_value()?),
9953 _ => {
9954 unknown_key__ = Some(key);
9955 let _: IgnoredAny = map.next_value()?;
9956 }
9957 }
9958 }
9959 let gamemod = SuddenDeathTaiko {
9960 restart: restart.unwrap_or_default(),
9961 };
9962 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9963 }
9964 }
9965 impl Serialize for SuddenDeathTaiko {
9966 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
9967 let field_count = self.restart.is_some() as usize;
9968 let mut map = s.serialize_map(Some(field_count))?;
9969 if let Some(ref x) = self.restart {
9970 map.serialize_entry("restart", x)?;
9971 }
9972 map.end()
9973 }
9974 }
9975 impl<'de> Visitor<'de> for GameModVisitor<PerfectTaiko> {
9976 type Value = DeserializedGameMod<'de, PerfectTaiko>;
9977 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
9978 f.write_str("PerfectTaiko")
9979 }
9980 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
9981 const FIELDS: &'static [&'static str] = &["restart"];
9982 let mut unknown_key__ = None;
9983 let mut restart = None;
9984 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
9985 match key.as_str() {
9986 "restart" => restart = Some(map.next_value()?),
9987 _ => {
9988 unknown_key__ = Some(key);
9989 let _: IgnoredAny = map.next_value()?;
9990 }
9991 }
9992 }
9993 let gamemod = PerfectTaiko {
9994 restart: restart.unwrap_or_default(),
9995 };
9996 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
9997 }
9998 }
9999 impl Serialize for PerfectTaiko {
10000 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10001 let field_count = self.restart.is_some() as usize;
10002 let mut map = s.serialize_map(Some(field_count))?;
10003 if let Some(ref x) = self.restart {
10004 map.serialize_entry("restart", x)?;
10005 }
10006 map.end()
10007 }
10008 }
10009 impl<'de> Visitor<'de> for GameModVisitor<DoubleTimeTaiko> {
10010 type Value = DeserializedGameMod<'de, DoubleTimeTaiko>;
10011 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10012 f.write_str("DoubleTimeTaiko")
10013 }
10014 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10015 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
10016 let mut unknown_key__ = None;
10017 let mut speed_change = None;
10018 let mut adjust_pitch = None;
10019 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10020 match key.as_str() {
10021 "speed_change" => speed_change = Some(map.next_value()?),
10022 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10023 _ => {
10024 unknown_key__ = Some(key);
10025 let _: IgnoredAny = map.next_value()?;
10026 }
10027 }
10028 }
10029 let gamemod = DoubleTimeTaiko {
10030 speed_change: speed_change.unwrap_or_default(),
10031 adjust_pitch: adjust_pitch.unwrap_or_default(),
10032 };
10033 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10034 }
10035 }
10036 impl Serialize for DoubleTimeTaiko {
10037 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10038 let field_count =
10039 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
10040 let mut map = s.serialize_map(Some(field_count))?;
10041 if let Some(ref x) = self.speed_change {
10042 map.serialize_entry("speed_change", x)?;
10043 }
10044 if let Some(ref x) = self.adjust_pitch {
10045 map.serialize_entry("adjust_pitch", x)?;
10046 }
10047 map.end()
10048 }
10049 }
10050 impl<'de> Visitor<'de> for GameModVisitor<NightcoreTaiko> {
10051 type Value = DeserializedGameMod<'de, NightcoreTaiko>;
10052 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10053 f.write_str("NightcoreTaiko")
10054 }
10055 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10056 const FIELDS: &'static [&'static str] = &["speed_change"];
10057 let mut unknown_key__ = None;
10058 let mut speed_change = None;
10059 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10060 match key.as_str() {
10061 "speed_change" => speed_change = Some(map.next_value()?),
10062 _ => {
10063 unknown_key__ = Some(key);
10064 let _: IgnoredAny = map.next_value()?;
10065 }
10066 }
10067 }
10068 let gamemod = NightcoreTaiko {
10069 speed_change: speed_change.unwrap_or_default(),
10070 };
10071 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10072 }
10073 }
10074 impl Serialize for NightcoreTaiko {
10075 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10076 let field_count = self.speed_change.is_some() as usize;
10077 let mut map = s.serialize_map(Some(field_count))?;
10078 if let Some(ref x) = self.speed_change {
10079 map.serialize_entry("speed_change", x)?;
10080 }
10081 map.end()
10082 }
10083 }
10084 impl<'de> Visitor<'de> for GameModVisitor<HiddenTaiko> {
10085 type Value = DeserializedGameMod<'de, HiddenTaiko>;
10086 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10087 f.write_str("HiddenTaiko")
10088 }
10089 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10090 const FIELDS: &'static [&'static str] = &[];
10091 let mut unknown_key__ = None;
10092 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10093 match key.as_str() {
10094 _ => {
10095 unknown_key__ = Some(key);
10096 let _: IgnoredAny = map.next_value()?;
10097 }
10098 }
10099 }
10100 let gamemod = HiddenTaiko {};
10101 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10102 }
10103 }
10104 impl Serialize for HiddenTaiko {
10105 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10106 let field_count = 0;
10107 let map = s.serialize_map(Some(field_count))?;
10108 map.end()
10109 }
10110 }
10111 impl<'de> Visitor<'de> for GameModVisitor<FlashlightTaiko> {
10112 type Value = DeserializedGameMod<'de, FlashlightTaiko>;
10113 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10114 f.write_str("FlashlightTaiko")
10115 }
10116 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10117 const FIELDS: &'static [&'static str] = &["size_multiplier", "combo_based_size"];
10118 let mut unknown_key__ = None;
10119 let mut size_multiplier = None;
10120 let mut combo_based_size = None;
10121 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10122 match key.as_str() {
10123 "size_multiplier" => size_multiplier = Some(map.next_value()?),
10124 "combo_based_size" => combo_based_size = Some(map.next_value()?),
10125 _ => {
10126 unknown_key__ = Some(key);
10127 let _: IgnoredAny = map.next_value()?;
10128 }
10129 }
10130 }
10131 let gamemod = FlashlightTaiko {
10132 size_multiplier: size_multiplier.unwrap_or_default(),
10133 combo_based_size: combo_based_size.unwrap_or_default(),
10134 };
10135 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10136 }
10137 }
10138 impl Serialize for FlashlightTaiko {
10139 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10140 let field_count =
10141 self.size_multiplier.is_some() as usize + self.combo_based_size.is_some() as usize;
10142 let mut map = s.serialize_map(Some(field_count))?;
10143 if let Some(ref x) = self.size_multiplier {
10144 map.serialize_entry("size_multiplier", x)?;
10145 }
10146 if let Some(ref x) = self.combo_based_size {
10147 map.serialize_entry("combo_based_size", x)?;
10148 }
10149 map.end()
10150 }
10151 }
10152 impl<'de> Visitor<'de> for GameModVisitor<AccuracyChallengeTaiko> {
10153 type Value = DeserializedGameMod<'de, AccuracyChallengeTaiko>;
10154 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10155 f.write_str("AccuracyChallengeTaiko")
10156 }
10157 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10158 const FIELDS: &'static [&'static str] =
10159 &["minimum_accuracy", "accuracy_judge_mode", "restart"];
10160 let mut unknown_key__ = None;
10161 let mut minimum_accuracy = None;
10162 let mut accuracy_judge_mode = None;
10163 let mut restart = None;
10164 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10165 match key.as_str() {
10166 "minimum_accuracy" => minimum_accuracy = Some(map.next_value()?),
10167 "accuracy_judge_mode" => accuracy_judge_mode = Some(map.next_value()?),
10168 "restart" => restart = Some(map.next_value()?),
10169 _ => {
10170 unknown_key__ = Some(key);
10171 let _: IgnoredAny = map.next_value()?;
10172 }
10173 }
10174 }
10175 let gamemod = AccuracyChallengeTaiko {
10176 minimum_accuracy: minimum_accuracy.unwrap_or_default(),
10177 accuracy_judge_mode: accuracy_judge_mode.unwrap_or_default(),
10178 restart: restart.unwrap_or_default(),
10179 };
10180 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10181 }
10182 }
10183 impl Serialize for AccuracyChallengeTaiko {
10184 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10185 let field_count = self.minimum_accuracy.is_some() as usize
10186 + self.accuracy_judge_mode.is_some() as usize
10187 + self.restart.is_some() as usize;
10188 let mut map = s.serialize_map(Some(field_count))?;
10189 if let Some(ref x) = self.minimum_accuracy {
10190 map.serialize_entry("minimum_accuracy", x)?;
10191 }
10192 if let Some(ref x) = self.accuracy_judge_mode {
10193 map.serialize_entry("accuracy_judge_mode", x)?;
10194 }
10195 if let Some(ref x) = self.restart {
10196 map.serialize_entry("restart", x)?;
10197 }
10198 map.end()
10199 }
10200 }
10201 impl<'de> Visitor<'de> for GameModVisitor<RandomTaiko> {
10202 type Value = DeserializedGameMod<'de, RandomTaiko>;
10203 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10204 f.write_str("RandomTaiko")
10205 }
10206 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10207 const FIELDS: &'static [&'static str] = &["seed"];
10208 let mut unknown_key__ = None;
10209 let mut seed = None;
10210 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10211 match key.as_str() {
10212 "seed" => seed = Some(map.next_value()?),
10213 _ => {
10214 unknown_key__ = Some(key);
10215 let _: IgnoredAny = map.next_value()?;
10216 }
10217 }
10218 }
10219 let gamemod = RandomTaiko {
10220 seed: seed.unwrap_or_default(),
10221 };
10222 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10223 }
10224 }
10225 impl Serialize for RandomTaiko {
10226 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10227 let field_count = self.seed.is_some() as usize;
10228 let mut map = s.serialize_map(Some(field_count))?;
10229 if let Some(ref x) = self.seed {
10230 map.serialize_entry("seed", x)?;
10231 }
10232 map.end()
10233 }
10234 }
10235 impl<'de> Visitor<'de> for GameModVisitor<DifficultyAdjustTaiko> {
10236 type Value = DeserializedGameMod<'de, DifficultyAdjustTaiko>;
10237 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10238 f.write_str("DifficultyAdjustTaiko")
10239 }
10240 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10241 const FIELDS: &'static [&'static str] = &[
10242 "scroll_speed",
10243 "drain_rate",
10244 "overall_difficulty",
10245 "extended_limits",
10246 ];
10247 let mut unknown_key__ = None;
10248 let mut scroll_speed = None;
10249 let mut drain_rate = None;
10250 let mut overall_difficulty = None;
10251 let mut extended_limits = None;
10252 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10253 match key.as_str() {
10254 "scroll_speed" => scroll_speed = Some(map.next_value()?),
10255 "drain_rate" => drain_rate = Some(map.next_value()?),
10256 "overall_difficulty" => overall_difficulty = Some(map.next_value()?),
10257 "extended_limits" => extended_limits = Some(map.next_value()?),
10258 _ => {
10259 unknown_key__ = Some(key);
10260 let _: IgnoredAny = map.next_value()?;
10261 }
10262 }
10263 }
10264 let gamemod = DifficultyAdjustTaiko {
10265 scroll_speed: scroll_speed.unwrap_or_default(),
10266 drain_rate: drain_rate.unwrap_or_default(),
10267 overall_difficulty: overall_difficulty.unwrap_or_default(),
10268 extended_limits: extended_limits.unwrap_or_default(),
10269 };
10270 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10271 }
10272 }
10273 impl Serialize for DifficultyAdjustTaiko {
10274 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10275 let field_count = self.scroll_speed.is_some() as usize
10276 + self.drain_rate.is_some() as usize
10277 + self.overall_difficulty.is_some() as usize
10278 + self.extended_limits.is_some() as usize;
10279 let mut map = s.serialize_map(Some(field_count))?;
10280 if let Some(ref x) = self.scroll_speed {
10281 map.serialize_entry("scroll_speed", x)?;
10282 }
10283 if let Some(ref x) = self.drain_rate {
10284 map.serialize_entry("drain_rate", x)?;
10285 }
10286 if let Some(ref x) = self.overall_difficulty {
10287 map.serialize_entry("overall_difficulty", x)?;
10288 }
10289 if let Some(ref x) = self.extended_limits {
10290 map.serialize_entry("extended_limits", x)?;
10291 }
10292 map.end()
10293 }
10294 }
10295 impl<'de> Visitor<'de> for GameModVisitor<ClassicTaiko> {
10296 type Value = DeserializedGameMod<'de, ClassicTaiko>;
10297 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10298 f.write_str("ClassicTaiko")
10299 }
10300 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10301 const FIELDS: &'static [&'static str] = &[];
10302 let mut unknown_key__ = None;
10303 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10304 match key.as_str() {
10305 _ => {
10306 unknown_key__ = Some(key);
10307 let _: IgnoredAny = map.next_value()?;
10308 }
10309 }
10310 }
10311 let gamemod = ClassicTaiko {};
10312 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10313 }
10314 }
10315 impl Serialize for ClassicTaiko {
10316 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10317 let field_count = 0;
10318 let map = s.serialize_map(Some(field_count))?;
10319 map.end()
10320 }
10321 }
10322 impl<'de> Visitor<'de> for GameModVisitor<SwapTaiko> {
10323 type Value = DeserializedGameMod<'de, SwapTaiko>;
10324 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10325 f.write_str("SwapTaiko")
10326 }
10327 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10328 const FIELDS: &'static [&'static str] = &[];
10329 let mut unknown_key__ = None;
10330 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10331 match key.as_str() {
10332 _ => {
10333 unknown_key__ = Some(key);
10334 let _: IgnoredAny = map.next_value()?;
10335 }
10336 }
10337 }
10338 let gamemod = SwapTaiko {};
10339 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10340 }
10341 }
10342 impl Serialize for SwapTaiko {
10343 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10344 let field_count = 0;
10345 let map = s.serialize_map(Some(field_count))?;
10346 map.end()
10347 }
10348 }
10349 impl<'de> Visitor<'de> for GameModVisitor<SingleTapTaiko> {
10350 type Value = DeserializedGameMod<'de, SingleTapTaiko>;
10351 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10352 f.write_str("SingleTapTaiko")
10353 }
10354 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10355 const FIELDS: &'static [&'static str] = &[];
10356 let mut unknown_key__ = None;
10357 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10358 match key.as_str() {
10359 _ => {
10360 unknown_key__ = Some(key);
10361 let _: IgnoredAny = map.next_value()?;
10362 }
10363 }
10364 }
10365 let gamemod = SingleTapTaiko {};
10366 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10367 }
10368 }
10369 impl Serialize for SingleTapTaiko {
10370 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10371 let field_count = 0;
10372 let map = s.serialize_map(Some(field_count))?;
10373 map.end()
10374 }
10375 }
10376 impl<'de> Visitor<'de> for GameModVisitor<ConstantSpeedTaiko> {
10377 type Value = DeserializedGameMod<'de, ConstantSpeedTaiko>;
10378 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10379 f.write_str("ConstantSpeedTaiko")
10380 }
10381 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10382 const FIELDS: &'static [&'static str] = &[];
10383 let mut unknown_key__ = None;
10384 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10385 match key.as_str() {
10386 _ => {
10387 unknown_key__ = Some(key);
10388 let _: IgnoredAny = map.next_value()?;
10389 }
10390 }
10391 }
10392 let gamemod = ConstantSpeedTaiko {};
10393 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10394 }
10395 }
10396 impl Serialize for ConstantSpeedTaiko {
10397 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10398 let field_count = 0;
10399 let map = s.serialize_map(Some(field_count))?;
10400 map.end()
10401 }
10402 }
10403 impl<'de> Visitor<'de> for GameModVisitor<AutoplayTaiko> {
10404 type Value = DeserializedGameMod<'de, AutoplayTaiko>;
10405 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10406 f.write_str("AutoplayTaiko")
10407 }
10408 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10409 const FIELDS: &'static [&'static str] = &[];
10410 let mut unknown_key__ = None;
10411 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10412 match key.as_str() {
10413 _ => {
10414 unknown_key__ = Some(key);
10415 let _: IgnoredAny = map.next_value()?;
10416 }
10417 }
10418 }
10419 let gamemod = AutoplayTaiko {};
10420 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10421 }
10422 }
10423 impl Serialize for AutoplayTaiko {
10424 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10425 let field_count = 0;
10426 let map = s.serialize_map(Some(field_count))?;
10427 map.end()
10428 }
10429 }
10430 impl<'de> Visitor<'de> for GameModVisitor<CinemaTaiko> {
10431 type Value = DeserializedGameMod<'de, CinemaTaiko>;
10432 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10433 f.write_str("CinemaTaiko")
10434 }
10435 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10436 const FIELDS: &'static [&'static str] = &[];
10437 let mut unknown_key__ = None;
10438 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10439 match key.as_str() {
10440 _ => {
10441 unknown_key__ = Some(key);
10442 let _: IgnoredAny = map.next_value()?;
10443 }
10444 }
10445 }
10446 let gamemod = CinemaTaiko {};
10447 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10448 }
10449 }
10450 impl Serialize for CinemaTaiko {
10451 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10452 let field_count = 0;
10453 let map = s.serialize_map(Some(field_count))?;
10454 map.end()
10455 }
10456 }
10457 impl<'de> Visitor<'de> for GameModVisitor<RelaxTaiko> {
10458 type Value = DeserializedGameMod<'de, RelaxTaiko>;
10459 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10460 f.write_str("RelaxTaiko")
10461 }
10462 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10463 const FIELDS: &'static [&'static str] = &[];
10464 let mut unknown_key__ = None;
10465 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10466 match key.as_str() {
10467 _ => {
10468 unknown_key__ = Some(key);
10469 let _: IgnoredAny = map.next_value()?;
10470 }
10471 }
10472 }
10473 let gamemod = RelaxTaiko {};
10474 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10475 }
10476 }
10477 impl Serialize for RelaxTaiko {
10478 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10479 let field_count = 0;
10480 let map = s.serialize_map(Some(field_count))?;
10481 map.end()
10482 }
10483 }
10484 impl<'de> Visitor<'de> for GameModVisitor<WindUpTaiko> {
10485 type Value = DeserializedGameMod<'de, WindUpTaiko>;
10486 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10487 f.write_str("WindUpTaiko")
10488 }
10489 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10490 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
10491 let mut unknown_key__ = None;
10492 let mut initial_rate = None;
10493 let mut final_rate = None;
10494 let mut adjust_pitch = None;
10495 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10496 match key.as_str() {
10497 "initial_rate" => initial_rate = Some(map.next_value()?),
10498 "final_rate" => final_rate = Some(map.next_value()?),
10499 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10500 _ => {
10501 unknown_key__ = Some(key);
10502 let _: IgnoredAny = map.next_value()?;
10503 }
10504 }
10505 }
10506 let gamemod = WindUpTaiko {
10507 initial_rate: initial_rate.unwrap_or_default(),
10508 final_rate: final_rate.unwrap_or_default(),
10509 adjust_pitch: adjust_pitch.unwrap_or_default(),
10510 };
10511 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10512 }
10513 }
10514 impl Serialize for WindUpTaiko {
10515 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10516 let field_count = self.initial_rate.is_some() as usize
10517 + self.final_rate.is_some() as usize
10518 + self.adjust_pitch.is_some() as usize;
10519 let mut map = s.serialize_map(Some(field_count))?;
10520 if let Some(ref x) = self.initial_rate {
10521 map.serialize_entry("initial_rate", x)?;
10522 }
10523 if let Some(ref x) = self.final_rate {
10524 map.serialize_entry("final_rate", x)?;
10525 }
10526 if let Some(ref x) = self.adjust_pitch {
10527 map.serialize_entry("adjust_pitch", x)?;
10528 }
10529 map.end()
10530 }
10531 }
10532 impl<'de> Visitor<'de> for GameModVisitor<WindDownTaiko> {
10533 type Value = DeserializedGameMod<'de, WindDownTaiko>;
10534 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10535 f.write_str("WindDownTaiko")
10536 }
10537 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10538 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
10539 let mut unknown_key__ = None;
10540 let mut initial_rate = None;
10541 let mut final_rate = None;
10542 let mut adjust_pitch = None;
10543 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10544 match key.as_str() {
10545 "initial_rate" => initial_rate = Some(map.next_value()?),
10546 "final_rate" => final_rate = Some(map.next_value()?),
10547 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10548 _ => {
10549 unknown_key__ = Some(key);
10550 let _: IgnoredAny = map.next_value()?;
10551 }
10552 }
10553 }
10554 let gamemod = WindDownTaiko {
10555 initial_rate: initial_rate.unwrap_or_default(),
10556 final_rate: final_rate.unwrap_or_default(),
10557 adjust_pitch: adjust_pitch.unwrap_or_default(),
10558 };
10559 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10560 }
10561 }
10562 impl Serialize for WindDownTaiko {
10563 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10564 let field_count = self.initial_rate.is_some() as usize
10565 + self.final_rate.is_some() as usize
10566 + self.adjust_pitch.is_some() as usize;
10567 let mut map = s.serialize_map(Some(field_count))?;
10568 if let Some(ref x) = self.initial_rate {
10569 map.serialize_entry("initial_rate", x)?;
10570 }
10571 if let Some(ref x) = self.final_rate {
10572 map.serialize_entry("final_rate", x)?;
10573 }
10574 if let Some(ref x) = self.adjust_pitch {
10575 map.serialize_entry("adjust_pitch", x)?;
10576 }
10577 map.end()
10578 }
10579 }
10580 impl<'de> Visitor<'de> for GameModVisitor<MutedTaiko> {
10581 type Value = DeserializedGameMod<'de, MutedTaiko>;
10582 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10583 f.write_str("MutedTaiko")
10584 }
10585 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10586 const FIELDS: &'static [&'static str] = &[
10587 "inverse_muting",
10588 "enable_metronome",
10589 "mute_combo_count",
10590 "affects_hit_sounds",
10591 ];
10592 let mut unknown_key__ = None;
10593 let mut inverse_muting = None;
10594 let mut enable_metronome = None;
10595 let mut mute_combo_count = None;
10596 let mut affects_hit_sounds = None;
10597 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10598 match key.as_str() {
10599 "inverse_muting" => inverse_muting = Some(map.next_value()?),
10600 "enable_metronome" => enable_metronome = Some(map.next_value()?),
10601 "mute_combo_count" => mute_combo_count = Some(map.next_value()?),
10602 "affects_hit_sounds" => affects_hit_sounds = Some(map.next_value()?),
10603 _ => {
10604 unknown_key__ = Some(key);
10605 let _: IgnoredAny = map.next_value()?;
10606 }
10607 }
10608 }
10609 let gamemod = MutedTaiko {
10610 inverse_muting: inverse_muting.unwrap_or_default(),
10611 enable_metronome: enable_metronome.unwrap_or_default(),
10612 mute_combo_count: mute_combo_count.unwrap_or_default(),
10613 affects_hit_sounds: affects_hit_sounds.unwrap_or_default(),
10614 };
10615 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10616 }
10617 }
10618 impl Serialize for MutedTaiko {
10619 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10620 let field_count = self.inverse_muting.is_some() as usize
10621 + self.enable_metronome.is_some() as usize
10622 + self.mute_combo_count.is_some() as usize
10623 + self.affects_hit_sounds.is_some() as usize;
10624 let mut map = s.serialize_map(Some(field_count))?;
10625 if let Some(ref x) = self.inverse_muting {
10626 map.serialize_entry("inverse_muting", x)?;
10627 }
10628 if let Some(ref x) = self.enable_metronome {
10629 map.serialize_entry("enable_metronome", x)?;
10630 }
10631 if let Some(ref x) = self.mute_combo_count {
10632 map.serialize_entry("mute_combo_count", x)?;
10633 }
10634 if let Some(ref x) = self.affects_hit_sounds {
10635 map.serialize_entry("affects_hit_sounds", x)?;
10636 }
10637 map.end()
10638 }
10639 }
10640 impl<'de> Visitor<'de> for GameModVisitor<AdaptiveSpeedTaiko> {
10641 type Value = DeserializedGameMod<'de, AdaptiveSpeedTaiko>;
10642 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10643 f.write_str("AdaptiveSpeedTaiko")
10644 }
10645 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10646 const FIELDS: &'static [&'static str] = &["initial_rate", "adjust_pitch"];
10647 let mut unknown_key__ = None;
10648 let mut initial_rate = None;
10649 let mut adjust_pitch = None;
10650 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10651 match key.as_str() {
10652 "initial_rate" => initial_rate = Some(map.next_value()?),
10653 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10654 _ => {
10655 unknown_key__ = Some(key);
10656 let _: IgnoredAny = map.next_value()?;
10657 }
10658 }
10659 }
10660 let gamemod = AdaptiveSpeedTaiko {
10661 initial_rate: initial_rate.unwrap_or_default(),
10662 adjust_pitch: adjust_pitch.unwrap_or_default(),
10663 };
10664 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10665 }
10666 }
10667 impl Serialize for AdaptiveSpeedTaiko {
10668 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10669 let field_count =
10670 self.initial_rate.is_some() as usize + self.adjust_pitch.is_some() as usize;
10671 let mut map = s.serialize_map(Some(field_count))?;
10672 if let Some(ref x) = self.initial_rate {
10673 map.serialize_entry("initial_rate", x)?;
10674 }
10675 if let Some(ref x) = self.adjust_pitch {
10676 map.serialize_entry("adjust_pitch", x)?;
10677 }
10678 map.end()
10679 }
10680 }
10681 impl<'de> Visitor<'de> for GameModVisitor<ScoreV2Taiko> {
10682 type Value = DeserializedGameMod<'de, ScoreV2Taiko>;
10683 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10684 f.write_str("ScoreV2Taiko")
10685 }
10686 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10687 const FIELDS: &'static [&'static str] = &[];
10688 let mut unknown_key__ = None;
10689 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10690 match key.as_str() {
10691 _ => {
10692 unknown_key__ = Some(key);
10693 let _: IgnoredAny = map.next_value()?;
10694 }
10695 }
10696 }
10697 let gamemod = ScoreV2Taiko {};
10698 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10699 }
10700 }
10701 impl Serialize for ScoreV2Taiko {
10702 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10703 let field_count = 0;
10704 let map = s.serialize_map(Some(field_count))?;
10705 map.end()
10706 }
10707 }
10708 impl<'de> Visitor<'de> for GameModVisitor<EasyCatch> {
10709 type Value = DeserializedGameMod<'de, EasyCatch>;
10710 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10711 f.write_str("EasyCatch")
10712 }
10713 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10714 const FIELDS: &'static [&'static str] = &["retries"];
10715 let mut unknown_key__ = None;
10716 let mut retries = None;
10717 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10718 match key.as_str() {
10719 "retries" => retries = Some(map.next_value()?),
10720 _ => {
10721 unknown_key__ = Some(key);
10722 let _: IgnoredAny = map.next_value()?;
10723 }
10724 }
10725 }
10726 let gamemod = EasyCatch {
10727 retries: retries.unwrap_or_default(),
10728 };
10729 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10730 }
10731 }
10732 impl Serialize for EasyCatch {
10733 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10734 let field_count = self.retries.is_some() as usize;
10735 let mut map = s.serialize_map(Some(field_count))?;
10736 if let Some(ref x) = self.retries {
10737 map.serialize_entry("retries", x)?;
10738 }
10739 map.end()
10740 }
10741 }
10742 impl<'de> Visitor<'de> for GameModVisitor<NoFailCatch> {
10743 type Value = DeserializedGameMod<'de, NoFailCatch>;
10744 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10745 f.write_str("NoFailCatch")
10746 }
10747 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10748 const FIELDS: &'static [&'static str] = &[];
10749 let mut unknown_key__ = None;
10750 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10751 match key.as_str() {
10752 _ => {
10753 unknown_key__ = Some(key);
10754 let _: IgnoredAny = map.next_value()?;
10755 }
10756 }
10757 }
10758 let gamemod = NoFailCatch {};
10759 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10760 }
10761 }
10762 impl Serialize for NoFailCatch {
10763 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10764 let field_count = 0;
10765 let map = s.serialize_map(Some(field_count))?;
10766 map.end()
10767 }
10768 }
10769 impl<'de> Visitor<'de> for GameModVisitor<HalfTimeCatch> {
10770 type Value = DeserializedGameMod<'de, HalfTimeCatch>;
10771 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10772 f.write_str("HalfTimeCatch")
10773 }
10774 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10775 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
10776 let mut unknown_key__ = None;
10777 let mut speed_change = None;
10778 let mut adjust_pitch = None;
10779 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10780 match key.as_str() {
10781 "speed_change" => speed_change = Some(map.next_value()?),
10782 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10783 _ => {
10784 unknown_key__ = Some(key);
10785 let _: IgnoredAny = map.next_value()?;
10786 }
10787 }
10788 }
10789 let gamemod = HalfTimeCatch {
10790 speed_change: speed_change.unwrap_or_default(),
10791 adjust_pitch: adjust_pitch.unwrap_or_default(),
10792 };
10793 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10794 }
10795 }
10796 impl Serialize for HalfTimeCatch {
10797 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10798 let field_count =
10799 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
10800 let mut map = s.serialize_map(Some(field_count))?;
10801 if let Some(ref x) = self.speed_change {
10802 map.serialize_entry("speed_change", x)?;
10803 }
10804 if let Some(ref x) = self.adjust_pitch {
10805 map.serialize_entry("adjust_pitch", x)?;
10806 }
10807 map.end()
10808 }
10809 }
10810 impl<'de> Visitor<'de> for GameModVisitor<DaycoreCatch> {
10811 type Value = DeserializedGameMod<'de, DaycoreCatch>;
10812 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10813 f.write_str("DaycoreCatch")
10814 }
10815 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10816 const FIELDS: &'static [&'static str] = &["speed_change"];
10817 let mut unknown_key__ = None;
10818 let mut speed_change = None;
10819 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10820 match key.as_str() {
10821 "speed_change" => speed_change = Some(map.next_value()?),
10822 _ => {
10823 unknown_key__ = Some(key);
10824 let _: IgnoredAny = map.next_value()?;
10825 }
10826 }
10827 }
10828 let gamemod = DaycoreCatch {
10829 speed_change: speed_change.unwrap_or_default(),
10830 };
10831 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10832 }
10833 }
10834 impl Serialize for DaycoreCatch {
10835 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10836 let field_count = self.speed_change.is_some() as usize;
10837 let mut map = s.serialize_map(Some(field_count))?;
10838 if let Some(ref x) = self.speed_change {
10839 map.serialize_entry("speed_change", x)?;
10840 }
10841 map.end()
10842 }
10843 }
10844 impl<'de> Visitor<'de> for GameModVisitor<HardRockCatch> {
10845 type Value = DeserializedGameMod<'de, HardRockCatch>;
10846 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10847 f.write_str("HardRockCatch")
10848 }
10849 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10850 const FIELDS: &'static [&'static str] = &[];
10851 let mut unknown_key__ = None;
10852 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10853 match key.as_str() {
10854 _ => {
10855 unknown_key__ = Some(key);
10856 let _: IgnoredAny = map.next_value()?;
10857 }
10858 }
10859 }
10860 let gamemod = HardRockCatch {};
10861 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10862 }
10863 }
10864 impl Serialize for HardRockCatch {
10865 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10866 let field_count = 0;
10867 let map = s.serialize_map(Some(field_count))?;
10868 map.end()
10869 }
10870 }
10871 impl<'de> Visitor<'de> for GameModVisitor<SuddenDeathCatch> {
10872 type Value = DeserializedGameMod<'de, SuddenDeathCatch>;
10873 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10874 f.write_str("SuddenDeathCatch")
10875 }
10876 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10877 const FIELDS: &'static [&'static str] = &["restart"];
10878 let mut unknown_key__ = None;
10879 let mut restart = None;
10880 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10881 match key.as_str() {
10882 "restart" => restart = Some(map.next_value()?),
10883 _ => {
10884 unknown_key__ = Some(key);
10885 let _: IgnoredAny = map.next_value()?;
10886 }
10887 }
10888 }
10889 let gamemod = SuddenDeathCatch {
10890 restart: restart.unwrap_or_default(),
10891 };
10892 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10893 }
10894 }
10895 impl Serialize for SuddenDeathCatch {
10896 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10897 let field_count = self.restart.is_some() as usize;
10898 let mut map = s.serialize_map(Some(field_count))?;
10899 if let Some(ref x) = self.restart {
10900 map.serialize_entry("restart", x)?;
10901 }
10902 map.end()
10903 }
10904 }
10905 impl<'de> Visitor<'de> for GameModVisitor<PerfectCatch> {
10906 type Value = DeserializedGameMod<'de, PerfectCatch>;
10907 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10908 f.write_str("PerfectCatch")
10909 }
10910 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10911 const FIELDS: &'static [&'static str] = &["restart"];
10912 let mut unknown_key__ = None;
10913 let mut restart = None;
10914 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10915 match key.as_str() {
10916 "restart" => restart = Some(map.next_value()?),
10917 _ => {
10918 unknown_key__ = Some(key);
10919 let _: IgnoredAny = map.next_value()?;
10920 }
10921 }
10922 }
10923 let gamemod = PerfectCatch {
10924 restart: restart.unwrap_or_default(),
10925 };
10926 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10927 }
10928 }
10929 impl Serialize for PerfectCatch {
10930 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10931 let field_count = self.restart.is_some() as usize;
10932 let mut map = s.serialize_map(Some(field_count))?;
10933 if let Some(ref x) = self.restart {
10934 map.serialize_entry("restart", x)?;
10935 }
10936 map.end()
10937 }
10938 }
10939 impl<'de> Visitor<'de> for GameModVisitor<DoubleTimeCatch> {
10940 type Value = DeserializedGameMod<'de, DoubleTimeCatch>;
10941 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10942 f.write_str("DoubleTimeCatch")
10943 }
10944 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10945 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
10946 let mut unknown_key__ = None;
10947 let mut speed_change = None;
10948 let mut adjust_pitch = None;
10949 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10950 match key.as_str() {
10951 "speed_change" => speed_change = Some(map.next_value()?),
10952 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
10953 _ => {
10954 unknown_key__ = Some(key);
10955 let _: IgnoredAny = map.next_value()?;
10956 }
10957 }
10958 }
10959 let gamemod = DoubleTimeCatch {
10960 speed_change: speed_change.unwrap_or_default(),
10961 adjust_pitch: adjust_pitch.unwrap_or_default(),
10962 };
10963 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
10964 }
10965 }
10966 impl Serialize for DoubleTimeCatch {
10967 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10968 let field_count =
10969 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
10970 let mut map = s.serialize_map(Some(field_count))?;
10971 if let Some(ref x) = self.speed_change {
10972 map.serialize_entry("speed_change", x)?;
10973 }
10974 if let Some(ref x) = self.adjust_pitch {
10975 map.serialize_entry("adjust_pitch", x)?;
10976 }
10977 map.end()
10978 }
10979 }
10980 impl<'de> Visitor<'de> for GameModVisitor<NightcoreCatch> {
10981 type Value = DeserializedGameMod<'de, NightcoreCatch>;
10982 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
10983 f.write_str("NightcoreCatch")
10984 }
10985 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
10986 const FIELDS: &'static [&'static str] = &["speed_change"];
10987 let mut unknown_key__ = None;
10988 let mut speed_change = None;
10989 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
10990 match key.as_str() {
10991 "speed_change" => speed_change = Some(map.next_value()?),
10992 _ => {
10993 unknown_key__ = Some(key);
10994 let _: IgnoredAny = map.next_value()?;
10995 }
10996 }
10997 }
10998 let gamemod = NightcoreCatch {
10999 speed_change: speed_change.unwrap_or_default(),
11000 };
11001 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11002 }
11003 }
11004 impl Serialize for NightcoreCatch {
11005 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11006 let field_count = self.speed_change.is_some() as usize;
11007 let mut map = s.serialize_map(Some(field_count))?;
11008 if let Some(ref x) = self.speed_change {
11009 map.serialize_entry("speed_change", x)?;
11010 }
11011 map.end()
11012 }
11013 }
11014 impl<'de> Visitor<'de> for GameModVisitor<HiddenCatch> {
11015 type Value = DeserializedGameMod<'de, HiddenCatch>;
11016 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11017 f.write_str("HiddenCatch")
11018 }
11019 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11020 const FIELDS: &'static [&'static str] = &[];
11021 let mut unknown_key__ = None;
11022 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11023 match key.as_str() {
11024 _ => {
11025 unknown_key__ = Some(key);
11026 let _: IgnoredAny = map.next_value()?;
11027 }
11028 }
11029 }
11030 let gamemod = HiddenCatch {};
11031 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11032 }
11033 }
11034 impl Serialize for HiddenCatch {
11035 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11036 let field_count = 0;
11037 let map = s.serialize_map(Some(field_count))?;
11038 map.end()
11039 }
11040 }
11041 impl<'de> Visitor<'de> for GameModVisitor<FlashlightCatch> {
11042 type Value = DeserializedGameMod<'de, FlashlightCatch>;
11043 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11044 f.write_str("FlashlightCatch")
11045 }
11046 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11047 const FIELDS: &'static [&'static str] = &["size_multiplier", "combo_based_size"];
11048 let mut unknown_key__ = None;
11049 let mut size_multiplier = None;
11050 let mut combo_based_size = None;
11051 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11052 match key.as_str() {
11053 "size_multiplier" => size_multiplier = Some(map.next_value()?),
11054 "combo_based_size" => combo_based_size = Some(map.next_value()?),
11055 _ => {
11056 unknown_key__ = Some(key);
11057 let _: IgnoredAny = map.next_value()?;
11058 }
11059 }
11060 }
11061 let gamemod = FlashlightCatch {
11062 size_multiplier: size_multiplier.unwrap_or_default(),
11063 combo_based_size: combo_based_size.unwrap_or_default(),
11064 };
11065 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11066 }
11067 }
11068 impl Serialize for FlashlightCatch {
11069 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11070 let field_count =
11071 self.size_multiplier.is_some() as usize + self.combo_based_size.is_some() as usize;
11072 let mut map = s.serialize_map(Some(field_count))?;
11073 if let Some(ref x) = self.size_multiplier {
11074 map.serialize_entry("size_multiplier", x)?;
11075 }
11076 if let Some(ref x) = self.combo_based_size {
11077 map.serialize_entry("combo_based_size", x)?;
11078 }
11079 map.end()
11080 }
11081 }
11082 impl<'de> Visitor<'de> for GameModVisitor<AccuracyChallengeCatch> {
11083 type Value = DeserializedGameMod<'de, AccuracyChallengeCatch>;
11084 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11085 f.write_str("AccuracyChallengeCatch")
11086 }
11087 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11088 const FIELDS: &'static [&'static str] =
11089 &["minimum_accuracy", "accuracy_judge_mode", "restart"];
11090 let mut unknown_key__ = None;
11091 let mut minimum_accuracy = None;
11092 let mut accuracy_judge_mode = None;
11093 let mut restart = None;
11094 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11095 match key.as_str() {
11096 "minimum_accuracy" => minimum_accuracy = Some(map.next_value()?),
11097 "accuracy_judge_mode" => accuracy_judge_mode = Some(map.next_value()?),
11098 "restart" => restart = Some(map.next_value()?),
11099 _ => {
11100 unknown_key__ = Some(key);
11101 let _: IgnoredAny = map.next_value()?;
11102 }
11103 }
11104 }
11105 let gamemod = AccuracyChallengeCatch {
11106 minimum_accuracy: minimum_accuracy.unwrap_or_default(),
11107 accuracy_judge_mode: accuracy_judge_mode.unwrap_or_default(),
11108 restart: restart.unwrap_or_default(),
11109 };
11110 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11111 }
11112 }
11113 impl Serialize for AccuracyChallengeCatch {
11114 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11115 let field_count = self.minimum_accuracy.is_some() as usize
11116 + self.accuracy_judge_mode.is_some() as usize
11117 + self.restart.is_some() as usize;
11118 let mut map = s.serialize_map(Some(field_count))?;
11119 if let Some(ref x) = self.minimum_accuracy {
11120 map.serialize_entry("minimum_accuracy", x)?;
11121 }
11122 if let Some(ref x) = self.accuracy_judge_mode {
11123 map.serialize_entry("accuracy_judge_mode", x)?;
11124 }
11125 if let Some(ref x) = self.restart {
11126 map.serialize_entry("restart", x)?;
11127 }
11128 map.end()
11129 }
11130 }
11131 impl<'de> Visitor<'de> for GameModVisitor<DifficultyAdjustCatch> {
11132 type Value = DeserializedGameMod<'de, DifficultyAdjustCatch>;
11133 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11134 f.write_str("DifficultyAdjustCatch")
11135 }
11136 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11137 const FIELDS: &'static [&'static str] = &[
11138 "circle_size",
11139 "approach_rate",
11140 "hard_rock_offsets",
11141 "drain_rate",
11142 "overall_difficulty",
11143 "extended_limits",
11144 ];
11145 let mut unknown_key__ = None;
11146 let mut circle_size = None;
11147 let mut approach_rate = None;
11148 let mut hard_rock_offsets = None;
11149 let mut drain_rate = None;
11150 let mut overall_difficulty = None;
11151 let mut extended_limits = None;
11152 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11153 match key.as_str() {
11154 "circle_size" => circle_size = Some(map.next_value()?),
11155 "approach_rate" => approach_rate = Some(map.next_value()?),
11156 "hard_rock_offsets" => hard_rock_offsets = Some(map.next_value()?),
11157 "drain_rate" => drain_rate = Some(map.next_value()?),
11158 "overall_difficulty" => overall_difficulty = Some(map.next_value()?),
11159 "extended_limits" => extended_limits = Some(map.next_value()?),
11160 _ => {
11161 unknown_key__ = Some(key);
11162 let _: IgnoredAny = map.next_value()?;
11163 }
11164 }
11165 }
11166 let gamemod = DifficultyAdjustCatch {
11167 circle_size: circle_size.unwrap_or_default(),
11168 approach_rate: approach_rate.unwrap_or_default(),
11169 hard_rock_offsets: hard_rock_offsets.unwrap_or_default(),
11170 drain_rate: drain_rate.unwrap_or_default(),
11171 overall_difficulty: overall_difficulty.unwrap_or_default(),
11172 extended_limits: extended_limits.unwrap_or_default(),
11173 };
11174 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11175 }
11176 }
11177 impl Serialize for DifficultyAdjustCatch {
11178 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11179 let field_count = self.circle_size.is_some() as usize
11180 + self.approach_rate.is_some() as usize
11181 + self.hard_rock_offsets.is_some() as usize
11182 + self.drain_rate.is_some() as usize
11183 + self.overall_difficulty.is_some() as usize
11184 + self.extended_limits.is_some() as usize;
11185 let mut map = s.serialize_map(Some(field_count))?;
11186 if let Some(ref x) = self.circle_size {
11187 map.serialize_entry("circle_size", x)?;
11188 }
11189 if let Some(ref x) = self.approach_rate {
11190 map.serialize_entry("approach_rate", x)?;
11191 }
11192 if let Some(ref x) = self.hard_rock_offsets {
11193 map.serialize_entry("hard_rock_offsets", x)?;
11194 }
11195 if let Some(ref x) = self.drain_rate {
11196 map.serialize_entry("drain_rate", x)?;
11197 }
11198 if let Some(ref x) = self.overall_difficulty {
11199 map.serialize_entry("overall_difficulty", x)?;
11200 }
11201 if let Some(ref x) = self.extended_limits {
11202 map.serialize_entry("extended_limits", x)?;
11203 }
11204 map.end()
11205 }
11206 }
11207 impl<'de> Visitor<'de> for GameModVisitor<ClassicCatch> {
11208 type Value = DeserializedGameMod<'de, ClassicCatch>;
11209 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11210 f.write_str("ClassicCatch")
11211 }
11212 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11213 const FIELDS: &'static [&'static str] = &[];
11214 let mut unknown_key__ = None;
11215 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11216 match key.as_str() {
11217 _ => {
11218 unknown_key__ = Some(key);
11219 let _: IgnoredAny = map.next_value()?;
11220 }
11221 }
11222 }
11223 let gamemod = ClassicCatch {};
11224 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11225 }
11226 }
11227 impl Serialize for ClassicCatch {
11228 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11229 let field_count = 0;
11230 let map = s.serialize_map(Some(field_count))?;
11231 map.end()
11232 }
11233 }
11234 impl<'de> Visitor<'de> for GameModVisitor<MirrorCatch> {
11235 type Value = DeserializedGameMod<'de, MirrorCatch>;
11236 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11237 f.write_str("MirrorCatch")
11238 }
11239 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11240 const FIELDS: &'static [&'static str] = &[];
11241 let mut unknown_key__ = None;
11242 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11243 match key.as_str() {
11244 _ => {
11245 unknown_key__ = Some(key);
11246 let _: IgnoredAny = map.next_value()?;
11247 }
11248 }
11249 }
11250 let gamemod = MirrorCatch {};
11251 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11252 }
11253 }
11254 impl Serialize for MirrorCatch {
11255 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11256 let field_count = 0;
11257 let map = s.serialize_map(Some(field_count))?;
11258 map.end()
11259 }
11260 }
11261 impl<'de> Visitor<'de> for GameModVisitor<AutoplayCatch> {
11262 type Value = DeserializedGameMod<'de, AutoplayCatch>;
11263 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11264 f.write_str("AutoplayCatch")
11265 }
11266 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11267 const FIELDS: &'static [&'static str] = &[];
11268 let mut unknown_key__ = None;
11269 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11270 match key.as_str() {
11271 _ => {
11272 unknown_key__ = Some(key);
11273 let _: IgnoredAny = map.next_value()?;
11274 }
11275 }
11276 }
11277 let gamemod = AutoplayCatch {};
11278 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11279 }
11280 }
11281 impl Serialize for AutoplayCatch {
11282 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11283 let field_count = 0;
11284 let map = s.serialize_map(Some(field_count))?;
11285 map.end()
11286 }
11287 }
11288 impl<'de> Visitor<'de> for GameModVisitor<CinemaCatch> {
11289 type Value = DeserializedGameMod<'de, CinemaCatch>;
11290 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11291 f.write_str("CinemaCatch")
11292 }
11293 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11294 const FIELDS: &'static [&'static str] = &[];
11295 let mut unknown_key__ = None;
11296 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11297 match key.as_str() {
11298 _ => {
11299 unknown_key__ = Some(key);
11300 let _: IgnoredAny = map.next_value()?;
11301 }
11302 }
11303 }
11304 let gamemod = CinemaCatch {};
11305 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11306 }
11307 }
11308 impl Serialize for CinemaCatch {
11309 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11310 let field_count = 0;
11311 let map = s.serialize_map(Some(field_count))?;
11312 map.end()
11313 }
11314 }
11315 impl<'de> Visitor<'de> for GameModVisitor<RelaxCatch> {
11316 type Value = DeserializedGameMod<'de, RelaxCatch>;
11317 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11318 f.write_str("RelaxCatch")
11319 }
11320 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11321 const FIELDS: &'static [&'static str] = &[];
11322 let mut unknown_key__ = None;
11323 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11324 match key.as_str() {
11325 _ => {
11326 unknown_key__ = Some(key);
11327 let _: IgnoredAny = map.next_value()?;
11328 }
11329 }
11330 }
11331 let gamemod = RelaxCatch {};
11332 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11333 }
11334 }
11335 impl Serialize for RelaxCatch {
11336 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11337 let field_count = 0;
11338 let map = s.serialize_map(Some(field_count))?;
11339 map.end()
11340 }
11341 }
11342 impl<'de> Visitor<'de> for GameModVisitor<WindUpCatch> {
11343 type Value = DeserializedGameMod<'de, WindUpCatch>;
11344 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11345 f.write_str("WindUpCatch")
11346 }
11347 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11348 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
11349 let mut unknown_key__ = None;
11350 let mut initial_rate = None;
11351 let mut final_rate = None;
11352 let mut adjust_pitch = None;
11353 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11354 match key.as_str() {
11355 "initial_rate" => initial_rate = Some(map.next_value()?),
11356 "final_rate" => final_rate = Some(map.next_value()?),
11357 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
11358 _ => {
11359 unknown_key__ = Some(key);
11360 let _: IgnoredAny = map.next_value()?;
11361 }
11362 }
11363 }
11364 let gamemod = WindUpCatch {
11365 initial_rate: initial_rate.unwrap_or_default(),
11366 final_rate: final_rate.unwrap_or_default(),
11367 adjust_pitch: adjust_pitch.unwrap_or_default(),
11368 };
11369 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11370 }
11371 }
11372 impl Serialize for WindUpCatch {
11373 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11374 let field_count = self.initial_rate.is_some() as usize
11375 + self.final_rate.is_some() as usize
11376 + self.adjust_pitch.is_some() as usize;
11377 let mut map = s.serialize_map(Some(field_count))?;
11378 if let Some(ref x) = self.initial_rate {
11379 map.serialize_entry("initial_rate", x)?;
11380 }
11381 if let Some(ref x) = self.final_rate {
11382 map.serialize_entry("final_rate", x)?;
11383 }
11384 if let Some(ref x) = self.adjust_pitch {
11385 map.serialize_entry("adjust_pitch", x)?;
11386 }
11387 map.end()
11388 }
11389 }
11390 impl<'de> Visitor<'de> for GameModVisitor<WindDownCatch> {
11391 type Value = DeserializedGameMod<'de, WindDownCatch>;
11392 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11393 f.write_str("WindDownCatch")
11394 }
11395 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11396 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
11397 let mut unknown_key__ = None;
11398 let mut initial_rate = None;
11399 let mut final_rate = None;
11400 let mut adjust_pitch = None;
11401 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11402 match key.as_str() {
11403 "initial_rate" => initial_rate = Some(map.next_value()?),
11404 "final_rate" => final_rate = Some(map.next_value()?),
11405 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
11406 _ => {
11407 unknown_key__ = Some(key);
11408 let _: IgnoredAny = map.next_value()?;
11409 }
11410 }
11411 }
11412 let gamemod = WindDownCatch {
11413 initial_rate: initial_rate.unwrap_or_default(),
11414 final_rate: final_rate.unwrap_or_default(),
11415 adjust_pitch: adjust_pitch.unwrap_or_default(),
11416 };
11417 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11418 }
11419 }
11420 impl Serialize for WindDownCatch {
11421 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11422 let field_count = self.initial_rate.is_some() as usize
11423 + self.final_rate.is_some() as usize
11424 + self.adjust_pitch.is_some() as usize;
11425 let mut map = s.serialize_map(Some(field_count))?;
11426 if let Some(ref x) = self.initial_rate {
11427 map.serialize_entry("initial_rate", x)?;
11428 }
11429 if let Some(ref x) = self.final_rate {
11430 map.serialize_entry("final_rate", x)?;
11431 }
11432 if let Some(ref x) = self.adjust_pitch {
11433 map.serialize_entry("adjust_pitch", x)?;
11434 }
11435 map.end()
11436 }
11437 }
11438 impl<'de> Visitor<'de> for GameModVisitor<FloatingFruitsCatch> {
11439 type Value = DeserializedGameMod<'de, FloatingFruitsCatch>;
11440 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11441 f.write_str("FloatingFruitsCatch")
11442 }
11443 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11444 const FIELDS: &'static [&'static str] = &[];
11445 let mut unknown_key__ = None;
11446 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11447 match key.as_str() {
11448 _ => {
11449 unknown_key__ = Some(key);
11450 let _: IgnoredAny = map.next_value()?;
11451 }
11452 }
11453 }
11454 let gamemod = FloatingFruitsCatch {};
11455 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11456 }
11457 }
11458 impl Serialize for FloatingFruitsCatch {
11459 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11460 let field_count = 0;
11461 let map = s.serialize_map(Some(field_count))?;
11462 map.end()
11463 }
11464 }
11465 impl<'de> Visitor<'de> for GameModVisitor<MutedCatch> {
11466 type Value = DeserializedGameMod<'de, MutedCatch>;
11467 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11468 f.write_str("MutedCatch")
11469 }
11470 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11471 const FIELDS: &'static [&'static str] = &[
11472 "inverse_muting",
11473 "enable_metronome",
11474 "mute_combo_count",
11475 "affects_hit_sounds",
11476 ];
11477 let mut unknown_key__ = None;
11478 let mut inverse_muting = None;
11479 let mut enable_metronome = None;
11480 let mut mute_combo_count = None;
11481 let mut affects_hit_sounds = None;
11482 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11483 match key.as_str() {
11484 "inverse_muting" => inverse_muting = Some(map.next_value()?),
11485 "enable_metronome" => enable_metronome = Some(map.next_value()?),
11486 "mute_combo_count" => mute_combo_count = Some(map.next_value()?),
11487 "affects_hit_sounds" => affects_hit_sounds = Some(map.next_value()?),
11488 _ => {
11489 unknown_key__ = Some(key);
11490 let _: IgnoredAny = map.next_value()?;
11491 }
11492 }
11493 }
11494 let gamemod = MutedCatch {
11495 inverse_muting: inverse_muting.unwrap_or_default(),
11496 enable_metronome: enable_metronome.unwrap_or_default(),
11497 mute_combo_count: mute_combo_count.unwrap_or_default(),
11498 affects_hit_sounds: affects_hit_sounds.unwrap_or_default(),
11499 };
11500 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11501 }
11502 }
11503 impl Serialize for MutedCatch {
11504 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11505 let field_count = self.inverse_muting.is_some() as usize
11506 + self.enable_metronome.is_some() as usize
11507 + self.mute_combo_count.is_some() as usize
11508 + self.affects_hit_sounds.is_some() as usize;
11509 let mut map = s.serialize_map(Some(field_count))?;
11510 if let Some(ref x) = self.inverse_muting {
11511 map.serialize_entry("inverse_muting", x)?;
11512 }
11513 if let Some(ref x) = self.enable_metronome {
11514 map.serialize_entry("enable_metronome", x)?;
11515 }
11516 if let Some(ref x) = self.mute_combo_count {
11517 map.serialize_entry("mute_combo_count", x)?;
11518 }
11519 if let Some(ref x) = self.affects_hit_sounds {
11520 map.serialize_entry("affects_hit_sounds", x)?;
11521 }
11522 map.end()
11523 }
11524 }
11525 impl<'de> Visitor<'de> for GameModVisitor<NoScopeCatch> {
11526 type Value = DeserializedGameMod<'de, NoScopeCatch>;
11527 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11528 f.write_str("NoScopeCatch")
11529 }
11530 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11531 const FIELDS: &'static [&'static str] = &["hidden_combo_count"];
11532 let mut unknown_key__ = None;
11533 let mut hidden_combo_count = None;
11534 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11535 match key.as_str() {
11536 "hidden_combo_count" => hidden_combo_count = Some(map.next_value()?),
11537 _ => {
11538 unknown_key__ = Some(key);
11539 let _: IgnoredAny = map.next_value()?;
11540 }
11541 }
11542 }
11543 let gamemod = NoScopeCatch {
11544 hidden_combo_count: hidden_combo_count.unwrap_or_default(),
11545 };
11546 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11547 }
11548 }
11549 impl Serialize for NoScopeCatch {
11550 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11551 let field_count = self.hidden_combo_count.is_some() as usize;
11552 let mut map = s.serialize_map(Some(field_count))?;
11553 if let Some(ref x) = self.hidden_combo_count {
11554 map.serialize_entry("hidden_combo_count", x)?;
11555 }
11556 map.end()
11557 }
11558 }
11559 impl<'de> Visitor<'de> for GameModVisitor<MovingFastCatch> {
11560 type Value = DeserializedGameMod<'de, MovingFastCatch>;
11561 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11562 f.write_str("MovingFastCatch")
11563 }
11564 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11565 const FIELDS: &'static [&'static str] = &[];
11566 let mut unknown_key__ = None;
11567 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11568 match key.as_str() {
11569 _ => {
11570 unknown_key__ = Some(key);
11571 let _: IgnoredAny = map.next_value()?;
11572 }
11573 }
11574 }
11575 let gamemod = MovingFastCatch {};
11576 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11577 }
11578 }
11579 impl Serialize for MovingFastCatch {
11580 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11581 let field_count = 0;
11582 let map = s.serialize_map(Some(field_count))?;
11583 map.end()
11584 }
11585 }
11586 impl<'de> Visitor<'de> for GameModVisitor<ScoreV2Catch> {
11587 type Value = DeserializedGameMod<'de, ScoreV2Catch>;
11588 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11589 f.write_str("ScoreV2Catch")
11590 }
11591 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11592 const FIELDS: &'static [&'static str] = &[];
11593 let mut unknown_key__ = None;
11594 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11595 match key.as_str() {
11596 _ => {
11597 unknown_key__ = Some(key);
11598 let _: IgnoredAny = map.next_value()?;
11599 }
11600 }
11601 }
11602 let gamemod = ScoreV2Catch {};
11603 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11604 }
11605 }
11606 impl Serialize for ScoreV2Catch {
11607 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11608 let field_count = 0;
11609 let map = s.serialize_map(Some(field_count))?;
11610 map.end()
11611 }
11612 }
11613 impl<'de> Visitor<'de> for GameModVisitor<EasyMania> {
11614 type Value = DeserializedGameMod<'de, EasyMania>;
11615 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11616 f.write_str("EasyMania")
11617 }
11618 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11619 const FIELDS: &'static [&'static str] = &["retries"];
11620 let mut unknown_key__ = None;
11621 let mut retries = None;
11622 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11623 match key.as_str() {
11624 "retries" => retries = Some(map.next_value()?),
11625 _ => {
11626 unknown_key__ = Some(key);
11627 let _: IgnoredAny = map.next_value()?;
11628 }
11629 }
11630 }
11631 let gamemod = EasyMania {
11632 retries: retries.unwrap_or_default(),
11633 };
11634 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11635 }
11636 }
11637 impl Serialize for EasyMania {
11638 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11639 let field_count = self.retries.is_some() as usize;
11640 let mut map = s.serialize_map(Some(field_count))?;
11641 if let Some(ref x) = self.retries {
11642 map.serialize_entry("retries", x)?;
11643 }
11644 map.end()
11645 }
11646 }
11647 impl<'de> Visitor<'de> for GameModVisitor<NoFailMania> {
11648 type Value = DeserializedGameMod<'de, NoFailMania>;
11649 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11650 f.write_str("NoFailMania")
11651 }
11652 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11653 const FIELDS: &'static [&'static str] = &[];
11654 let mut unknown_key__ = None;
11655 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11656 match key.as_str() {
11657 _ => {
11658 unknown_key__ = Some(key);
11659 let _: IgnoredAny = map.next_value()?;
11660 }
11661 }
11662 }
11663 let gamemod = NoFailMania {};
11664 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11665 }
11666 }
11667 impl Serialize for NoFailMania {
11668 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11669 let field_count = 0;
11670 let map = s.serialize_map(Some(field_count))?;
11671 map.end()
11672 }
11673 }
11674 impl<'de> Visitor<'de> for GameModVisitor<HalfTimeMania> {
11675 type Value = DeserializedGameMod<'de, HalfTimeMania>;
11676 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11677 f.write_str("HalfTimeMania")
11678 }
11679 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11680 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
11681 let mut unknown_key__ = None;
11682 let mut speed_change = None;
11683 let mut adjust_pitch = None;
11684 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11685 match key.as_str() {
11686 "speed_change" => speed_change = Some(map.next_value()?),
11687 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
11688 _ => {
11689 unknown_key__ = Some(key);
11690 let _: IgnoredAny = map.next_value()?;
11691 }
11692 }
11693 }
11694 let gamemod = HalfTimeMania {
11695 speed_change: speed_change.unwrap_or_default(),
11696 adjust_pitch: adjust_pitch.unwrap_or_default(),
11697 };
11698 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11699 }
11700 }
11701 impl Serialize for HalfTimeMania {
11702 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11703 let field_count =
11704 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
11705 let mut map = s.serialize_map(Some(field_count))?;
11706 if let Some(ref x) = self.speed_change {
11707 map.serialize_entry("speed_change", x)?;
11708 }
11709 if let Some(ref x) = self.adjust_pitch {
11710 map.serialize_entry("adjust_pitch", x)?;
11711 }
11712 map.end()
11713 }
11714 }
11715 impl<'de> Visitor<'de> for GameModVisitor<DaycoreMania> {
11716 type Value = DeserializedGameMod<'de, DaycoreMania>;
11717 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11718 f.write_str("DaycoreMania")
11719 }
11720 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11721 const FIELDS: &'static [&'static str] = &["speed_change"];
11722 let mut unknown_key__ = None;
11723 let mut speed_change = None;
11724 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11725 match key.as_str() {
11726 "speed_change" => speed_change = Some(map.next_value()?),
11727 _ => {
11728 unknown_key__ = Some(key);
11729 let _: IgnoredAny = map.next_value()?;
11730 }
11731 }
11732 }
11733 let gamemod = DaycoreMania {
11734 speed_change: speed_change.unwrap_or_default(),
11735 };
11736 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11737 }
11738 }
11739 impl Serialize for DaycoreMania {
11740 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11741 let field_count = self.speed_change.is_some() as usize;
11742 let mut map = s.serialize_map(Some(field_count))?;
11743 if let Some(ref x) = self.speed_change {
11744 map.serialize_entry("speed_change", x)?;
11745 }
11746 map.end()
11747 }
11748 }
11749 impl<'de> Visitor<'de> for GameModVisitor<NoReleaseMania> {
11750 type Value = DeserializedGameMod<'de, NoReleaseMania>;
11751 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11752 f.write_str("NoReleaseMania")
11753 }
11754 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11755 const FIELDS: &'static [&'static str] = &[];
11756 let mut unknown_key__ = None;
11757 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11758 match key.as_str() {
11759 _ => {
11760 unknown_key__ = Some(key);
11761 let _: IgnoredAny = map.next_value()?;
11762 }
11763 }
11764 }
11765 let gamemod = NoReleaseMania {};
11766 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11767 }
11768 }
11769 impl Serialize for NoReleaseMania {
11770 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11771 let field_count = 0;
11772 let map = s.serialize_map(Some(field_count))?;
11773 map.end()
11774 }
11775 }
11776 impl<'de> Visitor<'de> for GameModVisitor<HardRockMania> {
11777 type Value = DeserializedGameMod<'de, HardRockMania>;
11778 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11779 f.write_str("HardRockMania")
11780 }
11781 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11782 const FIELDS: &'static [&'static str] = &[];
11783 let mut unknown_key__ = None;
11784 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11785 match key.as_str() {
11786 _ => {
11787 unknown_key__ = Some(key);
11788 let _: IgnoredAny = map.next_value()?;
11789 }
11790 }
11791 }
11792 let gamemod = HardRockMania {};
11793 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11794 }
11795 }
11796 impl Serialize for HardRockMania {
11797 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11798 let field_count = 0;
11799 let map = s.serialize_map(Some(field_count))?;
11800 map.end()
11801 }
11802 }
11803 impl<'de> Visitor<'de> for GameModVisitor<SuddenDeathMania> {
11804 type Value = DeserializedGameMod<'de, SuddenDeathMania>;
11805 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11806 f.write_str("SuddenDeathMania")
11807 }
11808 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11809 const FIELDS: &'static [&'static str] = &["restart"];
11810 let mut unknown_key__ = None;
11811 let mut restart = None;
11812 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11813 match key.as_str() {
11814 "restart" => restart = Some(map.next_value()?),
11815 _ => {
11816 unknown_key__ = Some(key);
11817 let _: IgnoredAny = map.next_value()?;
11818 }
11819 }
11820 }
11821 let gamemod = SuddenDeathMania {
11822 restart: restart.unwrap_or_default(),
11823 };
11824 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11825 }
11826 }
11827 impl Serialize for SuddenDeathMania {
11828 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11829 let field_count = self.restart.is_some() as usize;
11830 let mut map = s.serialize_map(Some(field_count))?;
11831 if let Some(ref x) = self.restart {
11832 map.serialize_entry("restart", x)?;
11833 }
11834 map.end()
11835 }
11836 }
11837 impl<'de> Visitor<'de> for GameModVisitor<PerfectMania> {
11838 type Value = DeserializedGameMod<'de, PerfectMania>;
11839 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11840 f.write_str("PerfectMania")
11841 }
11842 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11843 const FIELDS: &'static [&'static str] = &["require_perfect_hits", "restart"];
11844 let mut unknown_key__ = None;
11845 let mut require_perfect_hits = None;
11846 let mut restart = None;
11847 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11848 match key.as_str() {
11849 "require_perfect_hits" => require_perfect_hits = Some(map.next_value()?),
11850 "restart" => restart = Some(map.next_value()?),
11851 _ => {
11852 unknown_key__ = Some(key);
11853 let _: IgnoredAny = map.next_value()?;
11854 }
11855 }
11856 }
11857 let gamemod = PerfectMania {
11858 require_perfect_hits: require_perfect_hits.unwrap_or_default(),
11859 restart: restart.unwrap_or_default(),
11860 };
11861 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11862 }
11863 }
11864 impl Serialize for PerfectMania {
11865 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11866 let field_count =
11867 self.require_perfect_hits.is_some() as usize + self.restart.is_some() as usize;
11868 let mut map = s.serialize_map(Some(field_count))?;
11869 if let Some(ref x) = self.require_perfect_hits {
11870 map.serialize_entry("require_perfect_hits", x)?;
11871 }
11872 if let Some(ref x) = self.restart {
11873 map.serialize_entry("restart", x)?;
11874 }
11875 map.end()
11876 }
11877 }
11878 impl<'de> Visitor<'de> for GameModVisitor<DoubleTimeMania> {
11879 type Value = DeserializedGameMod<'de, DoubleTimeMania>;
11880 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11881 f.write_str("DoubleTimeMania")
11882 }
11883 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11884 const FIELDS: &'static [&'static str] = &["speed_change", "adjust_pitch"];
11885 let mut unknown_key__ = None;
11886 let mut speed_change = None;
11887 let mut adjust_pitch = None;
11888 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11889 match key.as_str() {
11890 "speed_change" => speed_change = Some(map.next_value()?),
11891 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
11892 _ => {
11893 unknown_key__ = Some(key);
11894 let _: IgnoredAny = map.next_value()?;
11895 }
11896 }
11897 }
11898 let gamemod = DoubleTimeMania {
11899 speed_change: speed_change.unwrap_or_default(),
11900 adjust_pitch: adjust_pitch.unwrap_or_default(),
11901 };
11902 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11903 }
11904 }
11905 impl Serialize for DoubleTimeMania {
11906 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11907 let field_count =
11908 self.speed_change.is_some() as usize + self.adjust_pitch.is_some() as usize;
11909 let mut map = s.serialize_map(Some(field_count))?;
11910 if let Some(ref x) = self.speed_change {
11911 map.serialize_entry("speed_change", x)?;
11912 }
11913 if let Some(ref x) = self.adjust_pitch {
11914 map.serialize_entry("adjust_pitch", x)?;
11915 }
11916 map.end()
11917 }
11918 }
11919 impl<'de> Visitor<'de> for GameModVisitor<NightcoreMania> {
11920 type Value = DeserializedGameMod<'de, NightcoreMania>;
11921 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11922 f.write_str("NightcoreMania")
11923 }
11924 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11925 const FIELDS: &'static [&'static str] = &["speed_change"];
11926 let mut unknown_key__ = None;
11927 let mut speed_change = None;
11928 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11929 match key.as_str() {
11930 "speed_change" => speed_change = Some(map.next_value()?),
11931 _ => {
11932 unknown_key__ = Some(key);
11933 let _: IgnoredAny = map.next_value()?;
11934 }
11935 }
11936 }
11937 let gamemod = NightcoreMania {
11938 speed_change: speed_change.unwrap_or_default(),
11939 };
11940 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11941 }
11942 }
11943 impl Serialize for NightcoreMania {
11944 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11945 let field_count = self.speed_change.is_some() as usize;
11946 let mut map = s.serialize_map(Some(field_count))?;
11947 if let Some(ref x) = self.speed_change {
11948 map.serialize_entry("speed_change", x)?;
11949 }
11950 map.end()
11951 }
11952 }
11953 impl<'de> Visitor<'de> for GameModVisitor<FadeInMania> {
11954 type Value = DeserializedGameMod<'de, FadeInMania>;
11955 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11956 f.write_str("FadeInMania")
11957 }
11958 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11959 const FIELDS: &'static [&'static str] = &[];
11960 let mut unknown_key__ = None;
11961 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11962 match key.as_str() {
11963 _ => {
11964 unknown_key__ = Some(key);
11965 let _: IgnoredAny = map.next_value()?;
11966 }
11967 }
11968 }
11969 let gamemod = FadeInMania {};
11970 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11971 }
11972 }
11973 impl Serialize for FadeInMania {
11974 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
11975 let field_count = 0;
11976 let map = s.serialize_map(Some(field_count))?;
11977 map.end()
11978 }
11979 }
11980 impl<'de> Visitor<'de> for GameModVisitor<HiddenMania> {
11981 type Value = DeserializedGameMod<'de, HiddenMania>;
11982 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
11983 f.write_str("HiddenMania")
11984 }
11985 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
11986 const FIELDS: &'static [&'static str] = &[];
11987 let mut unknown_key__ = None;
11988 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
11989 match key.as_str() {
11990 _ => {
11991 unknown_key__ = Some(key);
11992 let _: IgnoredAny = map.next_value()?;
11993 }
11994 }
11995 }
11996 let gamemod = HiddenMania {};
11997 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
11998 }
11999 }
12000 impl Serialize for HiddenMania {
12001 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12002 let field_count = 0;
12003 let map = s.serialize_map(Some(field_count))?;
12004 map.end()
12005 }
12006 }
12007 impl<'de> Visitor<'de> for GameModVisitor<CoverMania> {
12008 type Value = DeserializedGameMod<'de, CoverMania>;
12009 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12010 f.write_str("CoverMania")
12011 }
12012 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12013 const FIELDS: &'static [&'static str] = &["coverage", "direction"];
12014 let mut unknown_key__ = None;
12015 let mut coverage = None;
12016 let mut direction = None;
12017 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12018 match key.as_str() {
12019 "coverage" => coverage = Some(map.next_value()?),
12020 "direction" => direction = Some(map.next_value()?),
12021 _ => {
12022 unknown_key__ = Some(key);
12023 let _: IgnoredAny = map.next_value()?;
12024 }
12025 }
12026 }
12027 let gamemod = CoverMania {
12028 coverage: coverage.unwrap_or_default(),
12029 direction: direction.unwrap_or_default(),
12030 };
12031 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12032 }
12033 }
12034 impl Serialize for CoverMania {
12035 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12036 let field_count = self.coverage.is_some() as usize + self.direction.is_some() as usize;
12037 let mut map = s.serialize_map(Some(field_count))?;
12038 if let Some(ref x) = self.coverage {
12039 map.serialize_entry("coverage", x)?;
12040 }
12041 if let Some(ref x) = self.direction {
12042 map.serialize_entry("direction", x)?;
12043 }
12044 map.end()
12045 }
12046 }
12047 impl<'de> Visitor<'de> for GameModVisitor<FlashlightMania> {
12048 type Value = DeserializedGameMod<'de, FlashlightMania>;
12049 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12050 f.write_str("FlashlightMania")
12051 }
12052 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12053 const FIELDS: &'static [&'static str] = &["size_multiplier", "combo_based_size"];
12054 let mut unknown_key__ = None;
12055 let mut size_multiplier = None;
12056 let mut combo_based_size = None;
12057 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12058 match key.as_str() {
12059 "size_multiplier" => size_multiplier = Some(map.next_value()?),
12060 "combo_based_size" => combo_based_size = Some(map.next_value()?),
12061 _ => {
12062 unknown_key__ = Some(key);
12063 let _: IgnoredAny = map.next_value()?;
12064 }
12065 }
12066 }
12067 let gamemod = FlashlightMania {
12068 size_multiplier: size_multiplier.unwrap_or_default(),
12069 combo_based_size: combo_based_size.unwrap_or_default(),
12070 };
12071 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12072 }
12073 }
12074 impl Serialize for FlashlightMania {
12075 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12076 let field_count =
12077 self.size_multiplier.is_some() as usize + self.combo_based_size.is_some() as usize;
12078 let mut map = s.serialize_map(Some(field_count))?;
12079 if let Some(ref x) = self.size_multiplier {
12080 map.serialize_entry("size_multiplier", x)?;
12081 }
12082 if let Some(ref x) = self.combo_based_size {
12083 map.serialize_entry("combo_based_size", x)?;
12084 }
12085 map.end()
12086 }
12087 }
12088 impl<'de> Visitor<'de> for GameModVisitor<AccuracyChallengeMania> {
12089 type Value = DeserializedGameMod<'de, AccuracyChallengeMania>;
12090 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12091 f.write_str("AccuracyChallengeMania")
12092 }
12093 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12094 const FIELDS: &'static [&'static str] =
12095 &["minimum_accuracy", "accuracy_judge_mode", "restart"];
12096 let mut unknown_key__ = None;
12097 let mut minimum_accuracy = None;
12098 let mut accuracy_judge_mode = None;
12099 let mut restart = None;
12100 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12101 match key.as_str() {
12102 "minimum_accuracy" => minimum_accuracy = Some(map.next_value()?),
12103 "accuracy_judge_mode" => accuracy_judge_mode = Some(map.next_value()?),
12104 "restart" => restart = Some(map.next_value()?),
12105 _ => {
12106 unknown_key__ = Some(key);
12107 let _: IgnoredAny = map.next_value()?;
12108 }
12109 }
12110 }
12111 let gamemod = AccuracyChallengeMania {
12112 minimum_accuracy: minimum_accuracy.unwrap_or_default(),
12113 accuracy_judge_mode: accuracy_judge_mode.unwrap_or_default(),
12114 restart: restart.unwrap_or_default(),
12115 };
12116 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12117 }
12118 }
12119 impl Serialize for AccuracyChallengeMania {
12120 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12121 let field_count = self.minimum_accuracy.is_some() as usize
12122 + self.accuracy_judge_mode.is_some() as usize
12123 + self.restart.is_some() as usize;
12124 let mut map = s.serialize_map(Some(field_count))?;
12125 if let Some(ref x) = self.minimum_accuracy {
12126 map.serialize_entry("minimum_accuracy", x)?;
12127 }
12128 if let Some(ref x) = self.accuracy_judge_mode {
12129 map.serialize_entry("accuracy_judge_mode", x)?;
12130 }
12131 if let Some(ref x) = self.restart {
12132 map.serialize_entry("restart", x)?;
12133 }
12134 map.end()
12135 }
12136 }
12137 impl<'de> Visitor<'de> for GameModVisitor<RandomMania> {
12138 type Value = DeserializedGameMod<'de, RandomMania>;
12139 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12140 f.write_str("RandomMania")
12141 }
12142 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12143 const FIELDS: &'static [&'static str] = &["seed"];
12144 let mut unknown_key__ = None;
12145 let mut seed = None;
12146 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12147 match key.as_str() {
12148 "seed" => seed = Some(map.next_value()?),
12149 _ => {
12150 unknown_key__ = Some(key);
12151 let _: IgnoredAny = map.next_value()?;
12152 }
12153 }
12154 }
12155 let gamemod = RandomMania {
12156 seed: seed.unwrap_or_default(),
12157 };
12158 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12159 }
12160 }
12161 impl Serialize for RandomMania {
12162 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12163 let field_count = self.seed.is_some() as usize;
12164 let mut map = s.serialize_map(Some(field_count))?;
12165 if let Some(ref x) = self.seed {
12166 map.serialize_entry("seed", x)?;
12167 }
12168 map.end()
12169 }
12170 }
12171 impl<'de> Visitor<'de> for GameModVisitor<DualStagesMania> {
12172 type Value = DeserializedGameMod<'de, DualStagesMania>;
12173 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12174 f.write_str("DualStagesMania")
12175 }
12176 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12177 const FIELDS: &'static [&'static str] = &[];
12178 let mut unknown_key__ = None;
12179 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12180 match key.as_str() {
12181 _ => {
12182 unknown_key__ = Some(key);
12183 let _: IgnoredAny = map.next_value()?;
12184 }
12185 }
12186 }
12187 let gamemod = DualStagesMania {};
12188 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12189 }
12190 }
12191 impl Serialize for DualStagesMania {
12192 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12193 let field_count = 0;
12194 let map = s.serialize_map(Some(field_count))?;
12195 map.end()
12196 }
12197 }
12198 impl<'de> Visitor<'de> for GameModVisitor<MirrorMania> {
12199 type Value = DeserializedGameMod<'de, MirrorMania>;
12200 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12201 f.write_str("MirrorMania")
12202 }
12203 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12204 const FIELDS: &'static [&'static str] = &[];
12205 let mut unknown_key__ = None;
12206 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12207 match key.as_str() {
12208 _ => {
12209 unknown_key__ = Some(key);
12210 let _: IgnoredAny = map.next_value()?;
12211 }
12212 }
12213 }
12214 let gamemod = MirrorMania {};
12215 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12216 }
12217 }
12218 impl Serialize for MirrorMania {
12219 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12220 let field_count = 0;
12221 let map = s.serialize_map(Some(field_count))?;
12222 map.end()
12223 }
12224 }
12225 impl<'de> Visitor<'de> for GameModVisitor<DifficultyAdjustMania> {
12226 type Value = DeserializedGameMod<'de, DifficultyAdjustMania>;
12227 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12228 f.write_str("DifficultyAdjustMania")
12229 }
12230 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12231 const FIELDS: &'static [&'static str] =
12232 &["overall_difficulty", "drain_rate", "extended_limits"];
12233 let mut unknown_key__ = None;
12234 let mut overall_difficulty = None;
12235 let mut drain_rate = None;
12236 let mut extended_limits = None;
12237 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12238 match key.as_str() {
12239 "overall_difficulty" => overall_difficulty = Some(map.next_value()?),
12240 "drain_rate" => drain_rate = Some(map.next_value()?),
12241 "extended_limits" => extended_limits = Some(map.next_value()?),
12242 _ => {
12243 unknown_key__ = Some(key);
12244 let _: IgnoredAny = map.next_value()?;
12245 }
12246 }
12247 }
12248 let gamemod = DifficultyAdjustMania {
12249 overall_difficulty: overall_difficulty.unwrap_or_default(),
12250 drain_rate: drain_rate.unwrap_or_default(),
12251 extended_limits: extended_limits.unwrap_or_default(),
12252 };
12253 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12254 }
12255 }
12256 impl Serialize for DifficultyAdjustMania {
12257 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12258 let field_count = self.overall_difficulty.is_some() as usize
12259 + self.drain_rate.is_some() as usize
12260 + self.extended_limits.is_some() as usize;
12261 let mut map = s.serialize_map(Some(field_count))?;
12262 if let Some(ref x) = self.overall_difficulty {
12263 map.serialize_entry("overall_difficulty", x)?;
12264 }
12265 if let Some(ref x) = self.drain_rate {
12266 map.serialize_entry("drain_rate", x)?;
12267 }
12268 if let Some(ref x) = self.extended_limits {
12269 map.serialize_entry("extended_limits", x)?;
12270 }
12271 map.end()
12272 }
12273 }
12274 impl<'de> Visitor<'de> for GameModVisitor<ClassicMania> {
12275 type Value = DeserializedGameMod<'de, ClassicMania>;
12276 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12277 f.write_str("ClassicMania")
12278 }
12279 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12280 const FIELDS: &'static [&'static str] = &[];
12281 let mut unknown_key__ = None;
12282 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12283 match key.as_str() {
12284 _ => {
12285 unknown_key__ = Some(key);
12286 let _: IgnoredAny = map.next_value()?;
12287 }
12288 }
12289 }
12290 let gamemod = ClassicMania {};
12291 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12292 }
12293 }
12294 impl Serialize for ClassicMania {
12295 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12296 let field_count = 0;
12297 let map = s.serialize_map(Some(field_count))?;
12298 map.end()
12299 }
12300 }
12301 impl<'de> Visitor<'de> for GameModVisitor<InvertMania> {
12302 type Value = DeserializedGameMod<'de, InvertMania>;
12303 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12304 f.write_str("InvertMania")
12305 }
12306 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12307 const FIELDS: &'static [&'static str] = &[];
12308 let mut unknown_key__ = None;
12309 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12310 match key.as_str() {
12311 _ => {
12312 unknown_key__ = Some(key);
12313 let _: IgnoredAny = map.next_value()?;
12314 }
12315 }
12316 }
12317 let gamemod = InvertMania {};
12318 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12319 }
12320 }
12321 impl Serialize for InvertMania {
12322 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12323 let field_count = 0;
12324 let map = s.serialize_map(Some(field_count))?;
12325 map.end()
12326 }
12327 }
12328 impl<'de> Visitor<'de> for GameModVisitor<ConstantSpeedMania> {
12329 type Value = DeserializedGameMod<'de, ConstantSpeedMania>;
12330 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12331 f.write_str("ConstantSpeedMania")
12332 }
12333 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12334 const FIELDS: &'static [&'static str] = &[];
12335 let mut unknown_key__ = None;
12336 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12337 match key.as_str() {
12338 _ => {
12339 unknown_key__ = Some(key);
12340 let _: IgnoredAny = map.next_value()?;
12341 }
12342 }
12343 }
12344 let gamemod = ConstantSpeedMania {};
12345 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12346 }
12347 }
12348 impl Serialize for ConstantSpeedMania {
12349 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12350 let field_count = 0;
12351 let map = s.serialize_map(Some(field_count))?;
12352 map.end()
12353 }
12354 }
12355 impl<'de> Visitor<'de> for GameModVisitor<HoldOffMania> {
12356 type Value = DeserializedGameMod<'de, HoldOffMania>;
12357 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12358 f.write_str("HoldOffMania")
12359 }
12360 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12361 const FIELDS: &'static [&'static str] = &[];
12362 let mut unknown_key__ = None;
12363 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12364 match key.as_str() {
12365 _ => {
12366 unknown_key__ = Some(key);
12367 let _: IgnoredAny = map.next_value()?;
12368 }
12369 }
12370 }
12371 let gamemod = HoldOffMania {};
12372 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12373 }
12374 }
12375 impl Serialize for HoldOffMania {
12376 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12377 let field_count = 0;
12378 let map = s.serialize_map(Some(field_count))?;
12379 map.end()
12380 }
12381 }
12382 impl<'de> Visitor<'de> for GameModVisitor<OneKeyMania> {
12383 type Value = DeserializedGameMod<'de, OneKeyMania>;
12384 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12385 f.write_str("OneKeyMania")
12386 }
12387 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12388 const FIELDS: &'static [&'static str] = &[];
12389 let mut unknown_key__ = None;
12390 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12391 match key.as_str() {
12392 _ => {
12393 unknown_key__ = Some(key);
12394 let _: IgnoredAny = map.next_value()?;
12395 }
12396 }
12397 }
12398 let gamemod = OneKeyMania {};
12399 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12400 }
12401 }
12402 impl Serialize for OneKeyMania {
12403 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12404 let field_count = 0;
12405 let map = s.serialize_map(Some(field_count))?;
12406 map.end()
12407 }
12408 }
12409 impl<'de> Visitor<'de> for GameModVisitor<TwoKeysMania> {
12410 type Value = DeserializedGameMod<'de, TwoKeysMania>;
12411 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12412 f.write_str("TwoKeysMania")
12413 }
12414 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12415 const FIELDS: &'static [&'static str] = &[];
12416 let mut unknown_key__ = None;
12417 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12418 match key.as_str() {
12419 _ => {
12420 unknown_key__ = Some(key);
12421 let _: IgnoredAny = map.next_value()?;
12422 }
12423 }
12424 }
12425 let gamemod = TwoKeysMania {};
12426 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12427 }
12428 }
12429 impl Serialize for TwoKeysMania {
12430 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12431 let field_count = 0;
12432 let map = s.serialize_map(Some(field_count))?;
12433 map.end()
12434 }
12435 }
12436 impl<'de> Visitor<'de> for GameModVisitor<ThreeKeysMania> {
12437 type Value = DeserializedGameMod<'de, ThreeKeysMania>;
12438 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12439 f.write_str("ThreeKeysMania")
12440 }
12441 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12442 const FIELDS: &'static [&'static str] = &[];
12443 let mut unknown_key__ = None;
12444 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12445 match key.as_str() {
12446 _ => {
12447 unknown_key__ = Some(key);
12448 let _: IgnoredAny = map.next_value()?;
12449 }
12450 }
12451 }
12452 let gamemod = ThreeKeysMania {};
12453 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12454 }
12455 }
12456 impl Serialize for ThreeKeysMania {
12457 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12458 let field_count = 0;
12459 let map = s.serialize_map(Some(field_count))?;
12460 map.end()
12461 }
12462 }
12463 impl<'de> Visitor<'de> for GameModVisitor<FourKeysMania> {
12464 type Value = DeserializedGameMod<'de, FourKeysMania>;
12465 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12466 f.write_str("FourKeysMania")
12467 }
12468 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12469 const FIELDS: &'static [&'static str] = &[];
12470 let mut unknown_key__ = None;
12471 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12472 match key.as_str() {
12473 _ => {
12474 unknown_key__ = Some(key);
12475 let _: IgnoredAny = map.next_value()?;
12476 }
12477 }
12478 }
12479 let gamemod = FourKeysMania {};
12480 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12481 }
12482 }
12483 impl Serialize for FourKeysMania {
12484 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12485 let field_count = 0;
12486 let map = s.serialize_map(Some(field_count))?;
12487 map.end()
12488 }
12489 }
12490 impl<'de> Visitor<'de> for GameModVisitor<FiveKeysMania> {
12491 type Value = DeserializedGameMod<'de, FiveKeysMania>;
12492 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12493 f.write_str("FiveKeysMania")
12494 }
12495 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12496 const FIELDS: &'static [&'static str] = &[];
12497 let mut unknown_key__ = None;
12498 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12499 match key.as_str() {
12500 _ => {
12501 unknown_key__ = Some(key);
12502 let _: IgnoredAny = map.next_value()?;
12503 }
12504 }
12505 }
12506 let gamemod = FiveKeysMania {};
12507 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12508 }
12509 }
12510 impl Serialize for FiveKeysMania {
12511 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12512 let field_count = 0;
12513 let map = s.serialize_map(Some(field_count))?;
12514 map.end()
12515 }
12516 }
12517 impl<'de> Visitor<'de> for GameModVisitor<SixKeysMania> {
12518 type Value = DeserializedGameMod<'de, SixKeysMania>;
12519 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12520 f.write_str("SixKeysMania")
12521 }
12522 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12523 const FIELDS: &'static [&'static str] = &[];
12524 let mut unknown_key__ = None;
12525 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12526 match key.as_str() {
12527 _ => {
12528 unknown_key__ = Some(key);
12529 let _: IgnoredAny = map.next_value()?;
12530 }
12531 }
12532 }
12533 let gamemod = SixKeysMania {};
12534 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12535 }
12536 }
12537 impl Serialize for SixKeysMania {
12538 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12539 let field_count = 0;
12540 let map = s.serialize_map(Some(field_count))?;
12541 map.end()
12542 }
12543 }
12544 impl<'de> Visitor<'de> for GameModVisitor<SevenKeysMania> {
12545 type Value = DeserializedGameMod<'de, SevenKeysMania>;
12546 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12547 f.write_str("SevenKeysMania")
12548 }
12549 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12550 const FIELDS: &'static [&'static str] = &[];
12551 let mut unknown_key__ = None;
12552 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12553 match key.as_str() {
12554 _ => {
12555 unknown_key__ = Some(key);
12556 let _: IgnoredAny = map.next_value()?;
12557 }
12558 }
12559 }
12560 let gamemod = SevenKeysMania {};
12561 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12562 }
12563 }
12564 impl Serialize for SevenKeysMania {
12565 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12566 let field_count = 0;
12567 let map = s.serialize_map(Some(field_count))?;
12568 map.end()
12569 }
12570 }
12571 impl<'de> Visitor<'de> for GameModVisitor<EightKeysMania> {
12572 type Value = DeserializedGameMod<'de, EightKeysMania>;
12573 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12574 f.write_str("EightKeysMania")
12575 }
12576 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12577 const FIELDS: &'static [&'static str] = &[];
12578 let mut unknown_key__ = None;
12579 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12580 match key.as_str() {
12581 _ => {
12582 unknown_key__ = Some(key);
12583 let _: IgnoredAny = map.next_value()?;
12584 }
12585 }
12586 }
12587 let gamemod = EightKeysMania {};
12588 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12589 }
12590 }
12591 impl Serialize for EightKeysMania {
12592 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12593 let field_count = 0;
12594 let map = s.serialize_map(Some(field_count))?;
12595 map.end()
12596 }
12597 }
12598 impl<'de> Visitor<'de> for GameModVisitor<NineKeysMania> {
12599 type Value = DeserializedGameMod<'de, NineKeysMania>;
12600 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12601 f.write_str("NineKeysMania")
12602 }
12603 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12604 const FIELDS: &'static [&'static str] = &[];
12605 let mut unknown_key__ = None;
12606 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12607 match key.as_str() {
12608 _ => {
12609 unknown_key__ = Some(key);
12610 let _: IgnoredAny = map.next_value()?;
12611 }
12612 }
12613 }
12614 let gamemod = NineKeysMania {};
12615 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12616 }
12617 }
12618 impl Serialize for NineKeysMania {
12619 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12620 let field_count = 0;
12621 let map = s.serialize_map(Some(field_count))?;
12622 map.end()
12623 }
12624 }
12625 impl<'de> Visitor<'de> for GameModVisitor<TenKeysMania> {
12626 type Value = DeserializedGameMod<'de, TenKeysMania>;
12627 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12628 f.write_str("TenKeysMania")
12629 }
12630 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12631 const FIELDS: &'static [&'static str] = &[];
12632 let mut unknown_key__ = None;
12633 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12634 match key.as_str() {
12635 _ => {
12636 unknown_key__ = Some(key);
12637 let _: IgnoredAny = map.next_value()?;
12638 }
12639 }
12640 }
12641 let gamemod = TenKeysMania {};
12642 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12643 }
12644 }
12645 impl Serialize for TenKeysMania {
12646 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12647 let field_count = 0;
12648 let map = s.serialize_map(Some(field_count))?;
12649 map.end()
12650 }
12651 }
12652 impl<'de> Visitor<'de> for GameModVisitor<AutoplayMania> {
12653 type Value = DeserializedGameMod<'de, AutoplayMania>;
12654 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12655 f.write_str("AutoplayMania")
12656 }
12657 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12658 const FIELDS: &'static [&'static str] = &[];
12659 let mut unknown_key__ = None;
12660 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12661 match key.as_str() {
12662 _ => {
12663 unknown_key__ = Some(key);
12664 let _: IgnoredAny = map.next_value()?;
12665 }
12666 }
12667 }
12668 let gamemod = AutoplayMania {};
12669 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12670 }
12671 }
12672 impl Serialize for AutoplayMania {
12673 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12674 let field_count = 0;
12675 let map = s.serialize_map(Some(field_count))?;
12676 map.end()
12677 }
12678 }
12679 impl<'de> Visitor<'de> for GameModVisitor<CinemaMania> {
12680 type Value = DeserializedGameMod<'de, CinemaMania>;
12681 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12682 f.write_str("CinemaMania")
12683 }
12684 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12685 const FIELDS: &'static [&'static str] = &[];
12686 let mut unknown_key__ = None;
12687 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12688 match key.as_str() {
12689 _ => {
12690 unknown_key__ = Some(key);
12691 let _: IgnoredAny = map.next_value()?;
12692 }
12693 }
12694 }
12695 let gamemod = CinemaMania {};
12696 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12697 }
12698 }
12699 impl Serialize for CinemaMania {
12700 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12701 let field_count = 0;
12702 let map = s.serialize_map(Some(field_count))?;
12703 map.end()
12704 }
12705 }
12706 impl<'de> Visitor<'de> for GameModVisitor<WindUpMania> {
12707 type Value = DeserializedGameMod<'de, WindUpMania>;
12708 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12709 f.write_str("WindUpMania")
12710 }
12711 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12712 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
12713 let mut unknown_key__ = None;
12714 let mut initial_rate = None;
12715 let mut final_rate = None;
12716 let mut adjust_pitch = None;
12717 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12718 match key.as_str() {
12719 "initial_rate" => initial_rate = Some(map.next_value()?),
12720 "final_rate" => final_rate = Some(map.next_value()?),
12721 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
12722 _ => {
12723 unknown_key__ = Some(key);
12724 let _: IgnoredAny = map.next_value()?;
12725 }
12726 }
12727 }
12728 let gamemod = WindUpMania {
12729 initial_rate: initial_rate.unwrap_or_default(),
12730 final_rate: final_rate.unwrap_or_default(),
12731 adjust_pitch: adjust_pitch.unwrap_or_default(),
12732 };
12733 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12734 }
12735 }
12736 impl Serialize for WindUpMania {
12737 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12738 let field_count = self.initial_rate.is_some() as usize
12739 + self.final_rate.is_some() as usize
12740 + self.adjust_pitch.is_some() as usize;
12741 let mut map = s.serialize_map(Some(field_count))?;
12742 if let Some(ref x) = self.initial_rate {
12743 map.serialize_entry("initial_rate", x)?;
12744 }
12745 if let Some(ref x) = self.final_rate {
12746 map.serialize_entry("final_rate", x)?;
12747 }
12748 if let Some(ref x) = self.adjust_pitch {
12749 map.serialize_entry("adjust_pitch", x)?;
12750 }
12751 map.end()
12752 }
12753 }
12754 impl<'de> Visitor<'de> for GameModVisitor<WindDownMania> {
12755 type Value = DeserializedGameMod<'de, WindDownMania>;
12756 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12757 f.write_str("WindDownMania")
12758 }
12759 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12760 const FIELDS: &'static [&'static str] = &["initial_rate", "final_rate", "adjust_pitch"];
12761 let mut unknown_key__ = None;
12762 let mut initial_rate = None;
12763 let mut final_rate = None;
12764 let mut adjust_pitch = None;
12765 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12766 match key.as_str() {
12767 "initial_rate" => initial_rate = Some(map.next_value()?),
12768 "final_rate" => final_rate = Some(map.next_value()?),
12769 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
12770 _ => {
12771 unknown_key__ = Some(key);
12772 let _: IgnoredAny = map.next_value()?;
12773 }
12774 }
12775 }
12776 let gamemod = WindDownMania {
12777 initial_rate: initial_rate.unwrap_or_default(),
12778 final_rate: final_rate.unwrap_or_default(),
12779 adjust_pitch: adjust_pitch.unwrap_or_default(),
12780 };
12781 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12782 }
12783 }
12784 impl Serialize for WindDownMania {
12785 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12786 let field_count = self.initial_rate.is_some() as usize
12787 + self.final_rate.is_some() as usize
12788 + self.adjust_pitch.is_some() as usize;
12789 let mut map = s.serialize_map(Some(field_count))?;
12790 if let Some(ref x) = self.initial_rate {
12791 map.serialize_entry("initial_rate", x)?;
12792 }
12793 if let Some(ref x) = self.final_rate {
12794 map.serialize_entry("final_rate", x)?;
12795 }
12796 if let Some(ref x) = self.adjust_pitch {
12797 map.serialize_entry("adjust_pitch", x)?;
12798 }
12799 map.end()
12800 }
12801 }
12802 impl<'de> Visitor<'de> for GameModVisitor<MutedMania> {
12803 type Value = DeserializedGameMod<'de, MutedMania>;
12804 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12805 f.write_str("MutedMania")
12806 }
12807 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12808 const FIELDS: &'static [&'static str] = &[
12809 "inverse_muting",
12810 "enable_metronome",
12811 "mute_combo_count",
12812 "affects_hit_sounds",
12813 ];
12814 let mut unknown_key__ = None;
12815 let mut inverse_muting = None;
12816 let mut enable_metronome = None;
12817 let mut mute_combo_count = None;
12818 let mut affects_hit_sounds = None;
12819 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12820 match key.as_str() {
12821 "inverse_muting" => inverse_muting = Some(map.next_value()?),
12822 "enable_metronome" => enable_metronome = Some(map.next_value()?),
12823 "mute_combo_count" => mute_combo_count = Some(map.next_value()?),
12824 "affects_hit_sounds" => affects_hit_sounds = Some(map.next_value()?),
12825 _ => {
12826 unknown_key__ = Some(key);
12827 let _: IgnoredAny = map.next_value()?;
12828 }
12829 }
12830 }
12831 let gamemod = MutedMania {
12832 inverse_muting: inverse_muting.unwrap_or_default(),
12833 enable_metronome: enable_metronome.unwrap_or_default(),
12834 mute_combo_count: mute_combo_count.unwrap_or_default(),
12835 affects_hit_sounds: affects_hit_sounds.unwrap_or_default(),
12836 };
12837 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12838 }
12839 }
12840 impl Serialize for MutedMania {
12841 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12842 let field_count = self.inverse_muting.is_some() as usize
12843 + self.enable_metronome.is_some() as usize
12844 + self.mute_combo_count.is_some() as usize
12845 + self.affects_hit_sounds.is_some() as usize;
12846 let mut map = s.serialize_map(Some(field_count))?;
12847 if let Some(ref x) = self.inverse_muting {
12848 map.serialize_entry("inverse_muting", x)?;
12849 }
12850 if let Some(ref x) = self.enable_metronome {
12851 map.serialize_entry("enable_metronome", x)?;
12852 }
12853 if let Some(ref x) = self.mute_combo_count {
12854 map.serialize_entry("mute_combo_count", x)?;
12855 }
12856 if let Some(ref x) = self.affects_hit_sounds {
12857 map.serialize_entry("affects_hit_sounds", x)?;
12858 }
12859 map.end()
12860 }
12861 }
12862 impl<'de> Visitor<'de> for GameModVisitor<AdaptiveSpeedMania> {
12863 type Value = DeserializedGameMod<'de, AdaptiveSpeedMania>;
12864 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12865 f.write_str("AdaptiveSpeedMania")
12866 }
12867 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12868 const FIELDS: &'static [&'static str] = &["initial_rate", "adjust_pitch"];
12869 let mut unknown_key__ = None;
12870 let mut initial_rate = None;
12871 let mut adjust_pitch = None;
12872 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12873 match key.as_str() {
12874 "initial_rate" => initial_rate = Some(map.next_value()?),
12875 "adjust_pitch" => adjust_pitch = Some(map.next_value()?),
12876 _ => {
12877 unknown_key__ = Some(key);
12878 let _: IgnoredAny = map.next_value()?;
12879 }
12880 }
12881 }
12882 let gamemod = AdaptiveSpeedMania {
12883 initial_rate: initial_rate.unwrap_or_default(),
12884 adjust_pitch: adjust_pitch.unwrap_or_default(),
12885 };
12886 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12887 }
12888 }
12889 impl Serialize for AdaptiveSpeedMania {
12890 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12891 let field_count =
12892 self.initial_rate.is_some() as usize + self.adjust_pitch.is_some() as usize;
12893 let mut map = s.serialize_map(Some(field_count))?;
12894 if let Some(ref x) = self.initial_rate {
12895 map.serialize_entry("initial_rate", x)?;
12896 }
12897 if let Some(ref x) = self.adjust_pitch {
12898 map.serialize_entry("adjust_pitch", x)?;
12899 }
12900 map.end()
12901 }
12902 }
12903 impl<'de> Visitor<'de> for GameModVisitor<ScoreV2Mania> {
12904 type Value = DeserializedGameMod<'de, ScoreV2Mania>;
12905 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12906 f.write_str("ScoreV2Mania")
12907 }
12908 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12909 const FIELDS: &'static [&'static str] = &[];
12910 let mut unknown_key__ = None;
12911 while let Some(key) = map.next_key::<MaybeOwnedStr<'de>>()? {
12912 match key.as_str() {
12913 _ => {
12914 unknown_key__ = Some(key);
12915 let _: IgnoredAny = map.next_value()?;
12916 }
12917 }
12918 }
12919 let gamemod = ScoreV2Mania {};
12920 Ok(DeserializedGameMod::new(gamemod, unknown_key__, FIELDS))
12921 }
12922 }
12923 impl Serialize for ScoreV2Mania {
12924 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12925 let field_count = 0;
12926 let map = s.serialize_map(Some(field_count))?;
12927 map.end()
12928 }
12929 }
12930 impl<'de> Deserialize<'de> for UnknownMod {
12931 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
12932 struct UnknownModVisitor;
12933 impl<'de> Visitor<'de> for UnknownModVisitor {
12934 type Value = UnknownMod;
12935 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12936 f.write_str("any unknown mod")
12937 }
12938 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
12939 while map.next_entry::<IgnoredAny, IgnoredAny>()?.is_some() {}
12940 Ok(UnknownMod {
12941 acronym: UnknownMod::UNKNOWN_ACRONYM,
12942 })
12943 }
12944 }
12945 d.deserialize_map(UnknownModVisitor)
12946 }
12947 }
12948 impl Serialize for UnknownMod {
12949 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
12950 s.serialize_map(Some(0)).and_then(SerializeMap::end)
12951 }
12952 }
12953 impl<'a, 'de> Visitor<'de> for GameModSettingsSeed<'a> {
12954 type Value = GameMod;
12955 fn expecting(&self, f: &mut Formatter<'_>) -> FmtResult {
12956 f.write_str("GameMod settings")
12957 }
12958 fn visit_map<A: MapAccess<'de>>(self, map: A) -> Result<Self::Value, A::Error> {
12959 let d = MapAccessDeserializer::new(map);
12960 let res = match (self.acronym, self.mode) {
12961 ("EZ", GameMode::Osu) => GameMod::EasyOsu(
12962 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12963 ),
12964 ("NF", GameMode::Osu) => GameMod::NoFailOsu(
12965 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12966 ),
12967 ("HT", GameMode::Osu) => GameMod::HalfTimeOsu(
12968 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12969 ),
12970 ("DC", GameMode::Osu) => GameMod::DaycoreOsu(
12971 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12972 ),
12973 ("HR", GameMode::Osu) => GameMod::HardRockOsu(
12974 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12975 ),
12976 ("SD", GameMode::Osu) => GameMod::SuddenDeathOsu(
12977 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12978 ),
12979 ("PF", GameMode::Osu) => GameMod::PerfectOsu(
12980 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12981 ),
12982 ("DT", GameMode::Osu) => GameMod::DoubleTimeOsu(
12983 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12984 ),
12985 ("NC", GameMode::Osu) => GameMod::NightcoreOsu(
12986 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12987 ),
12988 ("HD", GameMode::Osu) => GameMod::HiddenOsu(
12989 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12990 ),
12991 ("TC", GameMode::Osu) => GameMod::TraceableOsu(
12992 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12993 ),
12994 ("FL", GameMode::Osu) => GameMod::FlashlightOsu(
12995 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12996 ),
12997 ("BL", GameMode::Osu) => GameMod::BlindsOsu(
12998 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
12999 ),
13000 ("ST", GameMode::Osu) => GameMod::StrictTrackingOsu(
13001 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13002 ),
13003 ("AC", GameMode::Osu) => GameMod::AccuracyChallengeOsu(
13004 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13005 ),
13006 ("TP", GameMode::Osu) => GameMod::TargetPracticeOsu(
13007 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13008 ),
13009 ("DA", GameMode::Osu) => GameMod::DifficultyAdjustOsu(
13010 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13011 ),
13012 ("CL", GameMode::Osu) => GameMod::ClassicOsu(
13013 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13014 ),
13015 ("RD", GameMode::Osu) => GameMod::RandomOsu(
13016 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13017 ),
13018 ("MR", GameMode::Osu) => GameMod::MirrorOsu(
13019 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13020 ),
13021 ("AL", GameMode::Osu) => GameMod::AlternateOsu(
13022 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13023 ),
13024 ("SG", GameMode::Osu) => GameMod::SingleTapOsu(
13025 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13026 ),
13027 ("AT", GameMode::Osu) => GameMod::AutoplayOsu(
13028 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13029 ),
13030 ("CN", GameMode::Osu) => GameMod::CinemaOsu(
13031 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13032 ),
13033 ("RX", GameMode::Osu) => GameMod::RelaxOsu(
13034 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13035 ),
13036 ("AP", GameMode::Osu) => GameMod::AutopilotOsu(
13037 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13038 ),
13039 ("SO", GameMode::Osu) => GameMod::SpunOutOsu(
13040 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13041 ),
13042 ("TR", GameMode::Osu) => GameMod::TransformOsu(
13043 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13044 ),
13045 ("WG", GameMode::Osu) => GameMod::WiggleOsu(
13046 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13047 ),
13048 ("SI", GameMode::Osu) => GameMod::SpinInOsu(
13049 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13050 ),
13051 ("GR", GameMode::Osu) => GameMod::GrowOsu(
13052 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13053 ),
13054 ("DF", GameMode::Osu) => GameMod::DeflateOsu(
13055 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13056 ),
13057 ("WU", GameMode::Osu) => GameMod::WindUpOsu(
13058 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13059 ),
13060 ("WD", GameMode::Osu) => GameMod::WindDownOsu(
13061 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13062 ),
13063 ("BR", GameMode::Osu) => GameMod::BarrelRollOsu(
13064 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13065 ),
13066 ("AD", GameMode::Osu) => GameMod::ApproachDifferentOsu(
13067 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13068 ),
13069 ("MU", GameMode::Osu) => GameMod::MutedOsu(
13070 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13071 ),
13072 ("NS", GameMode::Osu) => GameMod::NoScopeOsu(
13073 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13074 ),
13075 ("MG", GameMode::Osu) => GameMod::MagnetisedOsu(
13076 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13077 ),
13078 ("RP", GameMode::Osu) => GameMod::RepelOsu(
13079 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13080 ),
13081 ("AS", GameMode::Osu) => GameMod::AdaptiveSpeedOsu(
13082 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13083 ),
13084 ("FR", GameMode::Osu) => GameMod::FreezeFrameOsu(
13085 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13086 ),
13087 ("BU", GameMode::Osu) => GameMod::BubblesOsu(
13088 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13089 ),
13090 ("SY", GameMode::Osu) => GameMod::SynesthesiaOsu(
13091 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13092 ),
13093 ("DP", GameMode::Osu) => GameMod::DepthOsu(
13094 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13095 ),
13096 ("BM", GameMode::Osu) => GameMod::BloomOsu(
13097 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13098 ),
13099 ("TD", GameMode::Osu) => GameMod::TouchDeviceOsu(
13100 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13101 ),
13102 ("SV2", GameMode::Osu) => GameMod::ScoreV2Osu(
13103 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13104 ),
13105 ("EZ", GameMode::Taiko) => GameMod::EasyTaiko(
13106 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13107 ),
13108 ("NF", GameMode::Taiko) => GameMod::NoFailTaiko(
13109 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13110 ),
13111 ("HT", GameMode::Taiko) => GameMod::HalfTimeTaiko(
13112 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13113 ),
13114 ("DC", GameMode::Taiko) => GameMod::DaycoreTaiko(
13115 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13116 ),
13117 ("SR", GameMode::Taiko) => GameMod::SimplifiedRhythmTaiko(
13118 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13119 ),
13120 ("HR", GameMode::Taiko) => GameMod::HardRockTaiko(
13121 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13122 ),
13123 ("SD", GameMode::Taiko) => GameMod::SuddenDeathTaiko(
13124 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13125 ),
13126 ("PF", GameMode::Taiko) => GameMod::PerfectTaiko(
13127 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13128 ),
13129 ("DT", GameMode::Taiko) => GameMod::DoubleTimeTaiko(
13130 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13131 ),
13132 ("NC", GameMode::Taiko) => GameMod::NightcoreTaiko(
13133 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13134 ),
13135 ("HD", GameMode::Taiko) => GameMod::HiddenTaiko(
13136 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13137 ),
13138 ("FL", GameMode::Taiko) => GameMod::FlashlightTaiko(
13139 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13140 ),
13141 ("AC", GameMode::Taiko) => GameMod::AccuracyChallengeTaiko(
13142 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13143 ),
13144 ("RD", GameMode::Taiko) => GameMod::RandomTaiko(
13145 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13146 ),
13147 ("DA", GameMode::Taiko) => GameMod::DifficultyAdjustTaiko(
13148 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13149 ),
13150 ("CL", GameMode::Taiko) => GameMod::ClassicTaiko(
13151 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13152 ),
13153 ("SW", GameMode::Taiko) => GameMod::SwapTaiko(
13154 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13155 ),
13156 ("SG", GameMode::Taiko) => GameMod::SingleTapTaiko(
13157 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13158 ),
13159 ("CS", GameMode::Taiko) => GameMod::ConstantSpeedTaiko(
13160 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13161 ),
13162 ("AT", GameMode::Taiko) => GameMod::AutoplayTaiko(
13163 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13164 ),
13165 ("CN", GameMode::Taiko) => GameMod::CinemaTaiko(
13166 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13167 ),
13168 ("RX", GameMode::Taiko) => GameMod::RelaxTaiko(
13169 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13170 ),
13171 ("WU", GameMode::Taiko) => GameMod::WindUpTaiko(
13172 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13173 ),
13174 ("WD", GameMode::Taiko) => GameMod::WindDownTaiko(
13175 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13176 ),
13177 ("MU", GameMode::Taiko) => GameMod::MutedTaiko(
13178 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13179 ),
13180 ("AS", GameMode::Taiko) => GameMod::AdaptiveSpeedTaiko(
13181 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13182 ),
13183 ("SV2", GameMode::Taiko) => GameMod::ScoreV2Taiko(
13184 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13185 ),
13186 ("EZ", GameMode::Catch) => GameMod::EasyCatch(
13187 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13188 ),
13189 ("NF", GameMode::Catch) => GameMod::NoFailCatch(
13190 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13191 ),
13192 ("HT", GameMode::Catch) => GameMod::HalfTimeCatch(
13193 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13194 ),
13195 ("DC", GameMode::Catch) => GameMod::DaycoreCatch(
13196 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13197 ),
13198 ("HR", GameMode::Catch) => GameMod::HardRockCatch(
13199 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13200 ),
13201 ("SD", GameMode::Catch) => GameMod::SuddenDeathCatch(
13202 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13203 ),
13204 ("PF", GameMode::Catch) => GameMod::PerfectCatch(
13205 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13206 ),
13207 ("DT", GameMode::Catch) => GameMod::DoubleTimeCatch(
13208 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13209 ),
13210 ("NC", GameMode::Catch) => GameMod::NightcoreCatch(
13211 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13212 ),
13213 ("HD", GameMode::Catch) => GameMod::HiddenCatch(
13214 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13215 ),
13216 ("FL", GameMode::Catch) => GameMod::FlashlightCatch(
13217 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13218 ),
13219 ("AC", GameMode::Catch) => GameMod::AccuracyChallengeCatch(
13220 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13221 ),
13222 ("DA", GameMode::Catch) => GameMod::DifficultyAdjustCatch(
13223 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13224 ),
13225 ("CL", GameMode::Catch) => GameMod::ClassicCatch(
13226 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13227 ),
13228 ("MR", GameMode::Catch) => GameMod::MirrorCatch(
13229 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13230 ),
13231 ("AT", GameMode::Catch) => GameMod::AutoplayCatch(
13232 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13233 ),
13234 ("CN", GameMode::Catch) => GameMod::CinemaCatch(
13235 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13236 ),
13237 ("RX", GameMode::Catch) => GameMod::RelaxCatch(
13238 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13239 ),
13240 ("WU", GameMode::Catch) => GameMod::WindUpCatch(
13241 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13242 ),
13243 ("WD", GameMode::Catch) => GameMod::WindDownCatch(
13244 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13245 ),
13246 ("FF", GameMode::Catch) => GameMod::FloatingFruitsCatch(
13247 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13248 ),
13249 ("MU", GameMode::Catch) => GameMod::MutedCatch(
13250 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13251 ),
13252 ("NS", GameMode::Catch) => GameMod::NoScopeCatch(
13253 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13254 ),
13255 ("MF", GameMode::Catch) => GameMod::MovingFastCatch(
13256 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13257 ),
13258 ("SV2", GameMode::Catch) => GameMod::ScoreV2Catch(
13259 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13260 ),
13261 ("EZ", GameMode::Mania) => GameMod::EasyMania(
13262 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13263 ),
13264 ("NF", GameMode::Mania) => GameMod::NoFailMania(
13265 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13266 ),
13267 ("HT", GameMode::Mania) => GameMod::HalfTimeMania(
13268 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13269 ),
13270 ("DC", GameMode::Mania) => GameMod::DaycoreMania(
13271 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13272 ),
13273 ("NR", GameMode::Mania) => GameMod::NoReleaseMania(
13274 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13275 ),
13276 ("HR", GameMode::Mania) => GameMod::HardRockMania(
13277 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13278 ),
13279 ("SD", GameMode::Mania) => GameMod::SuddenDeathMania(
13280 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13281 ),
13282 ("PF", GameMode::Mania) => GameMod::PerfectMania(
13283 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13284 ),
13285 ("DT", GameMode::Mania) => GameMod::DoubleTimeMania(
13286 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13287 ),
13288 ("NC", GameMode::Mania) => GameMod::NightcoreMania(
13289 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13290 ),
13291 ("FI", GameMode::Mania) => GameMod::FadeInMania(
13292 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13293 ),
13294 ("HD", GameMode::Mania) => GameMod::HiddenMania(
13295 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13296 ),
13297 ("CO", GameMode::Mania) => GameMod::CoverMania(
13298 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13299 ),
13300 ("FL", GameMode::Mania) => GameMod::FlashlightMania(
13301 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13302 ),
13303 ("AC", GameMode::Mania) => GameMod::AccuracyChallengeMania(
13304 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13305 ),
13306 ("RD", GameMode::Mania) => GameMod::RandomMania(
13307 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13308 ),
13309 ("DS", GameMode::Mania) => GameMod::DualStagesMania(
13310 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13311 ),
13312 ("MR", GameMode::Mania) => GameMod::MirrorMania(
13313 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13314 ),
13315 ("DA", GameMode::Mania) => GameMod::DifficultyAdjustMania(
13316 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13317 ),
13318 ("CL", GameMode::Mania) => GameMod::ClassicMania(
13319 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13320 ),
13321 ("IN", GameMode::Mania) => GameMod::InvertMania(
13322 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13323 ),
13324 ("CS", GameMode::Mania) => GameMod::ConstantSpeedMania(
13325 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13326 ),
13327 ("HO", GameMode::Mania) => GameMod::HoldOffMania(
13328 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13329 ),
13330 ("1K", GameMode::Mania) => GameMod::OneKeyMania(
13331 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13332 ),
13333 ("2K", GameMode::Mania) => GameMod::TwoKeysMania(
13334 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13335 ),
13336 ("3K", GameMode::Mania) => GameMod::ThreeKeysMania(
13337 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13338 ),
13339 ("4K", GameMode::Mania) => GameMod::FourKeysMania(
13340 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13341 ),
13342 ("5K", GameMode::Mania) => GameMod::FiveKeysMania(
13343 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13344 ),
13345 ("6K", GameMode::Mania) => GameMod::SixKeysMania(
13346 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13347 ),
13348 ("7K", GameMode::Mania) => GameMod::SevenKeysMania(
13349 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13350 ),
13351 ("8K", GameMode::Mania) => GameMod::EightKeysMania(
13352 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13353 ),
13354 ("9K", GameMode::Mania) => GameMod::NineKeysMania(
13355 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13356 ),
13357 ("10K", GameMode::Mania) => GameMod::TenKeysMania(
13358 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13359 ),
13360 ("AT", GameMode::Mania) => GameMod::AutoplayMania(
13361 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13362 ),
13363 ("CN", GameMode::Mania) => GameMod::CinemaMania(
13364 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13365 ),
13366 ("WU", GameMode::Mania) => GameMod::WindUpMania(
13367 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13368 ),
13369 ("WD", GameMode::Mania) => GameMod::WindDownMania(
13370 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13371 ),
13372 ("MU", GameMode::Mania) => GameMod::MutedMania(
13373 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13374 ),
13375 ("AS", GameMode::Mania) => GameMod::AdaptiveSpeedMania(
13376 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13377 ),
13378 ("SV2", GameMode::Mania) => GameMod::ScoreV2Mania(
13379 DeserializedGameMod::try_deserialize_mod(d, self.deny_unknown_fields)?,
13380 ),
13381 _ => {
13382 let acronym = <Acronym as std::str::FromStr>::from_str(self.acronym)
13383 .map_err(DeError::custom)?;
13384 #[allow(clippy::needless_update)]
13387 let unknown = UnknownMod {
13388 acronym,
13389 ..Deserialize::deserialize(d)?
13390 };
13391 match self.mode {
13392 GameMode::Osu => GameMod::UnknownOsu(unknown),
13393 GameMode::Taiko => GameMod::UnknownTaiko(unknown),
13394 GameMode::Catch => GameMod::UnknownCatch(unknown),
13395 GameMode::Mania => GameMod::UnknownMania(unknown),
13396 }
13397 }
13398 };
13399 Ok(res)
13400 }
13401 }
13402 impl Serialize for GameMod {
13403 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
13404 let mut s = s.serialize_map(None)?;
13405 s.serialize_entry("acronym", self.acronym().as_str())?;
13406 match self {
13407 Self::EasyOsu(m) => {
13408 let has_some = m.retries.is_some();
13409 if has_some {
13410 s.serialize_entry("settings", m)?;
13411 }
13412 }
13413 Self::HalfTimeOsu(m) => {
13414 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13415 if has_some {
13416 s.serialize_entry("settings", m)?;
13417 }
13418 }
13419 Self::DaycoreOsu(m) => {
13420 let has_some = m.speed_change.is_some();
13421 if has_some {
13422 s.serialize_entry("settings", m)?;
13423 }
13424 }
13425 Self::SuddenDeathOsu(m) => {
13426 let has_some = m.fail_on_slider_tail.is_some() || m.restart.is_some();
13427 if has_some {
13428 s.serialize_entry("settings", m)?;
13429 }
13430 }
13431 Self::PerfectOsu(m) => {
13432 let has_some = m.restart.is_some();
13433 if has_some {
13434 s.serialize_entry("settings", m)?;
13435 }
13436 }
13437 Self::DoubleTimeOsu(m) => {
13438 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13439 if has_some {
13440 s.serialize_entry("settings", m)?;
13441 }
13442 }
13443 Self::NightcoreOsu(m) => {
13444 let has_some = m.speed_change.is_some();
13445 if has_some {
13446 s.serialize_entry("settings", m)?;
13447 }
13448 }
13449 Self::HiddenOsu(m) => {
13450 let has_some = m.only_fade_approach_circles.is_some();
13451 if has_some {
13452 s.serialize_entry("settings", m)?;
13453 }
13454 }
13455 Self::FlashlightOsu(m) => {
13456 let has_some = m.follow_delay.is_some()
13457 || m.size_multiplier.is_some()
13458 || m.combo_based_size.is_some();
13459 if has_some {
13460 s.serialize_entry("settings", m)?;
13461 }
13462 }
13463 Self::AccuracyChallengeOsu(m) => {
13464 let has_some = m.minimum_accuracy.is_some()
13465 || m.accuracy_judge_mode.is_some()
13466 || m.restart.is_some();
13467 if has_some {
13468 s.serialize_entry("settings", m)?;
13469 }
13470 }
13471 Self::TargetPracticeOsu(m) => {
13472 let has_some = m.seed.is_some() || m.metronome.is_some();
13473 if has_some {
13474 s.serialize_entry("settings", m)?;
13475 }
13476 }
13477 Self::DifficultyAdjustOsu(m) => {
13478 let has_some = m.circle_size.is_some()
13479 || m.approach_rate.is_some()
13480 || m.drain_rate.is_some()
13481 || m.overall_difficulty.is_some()
13482 || m.extended_limits.is_some();
13483 if has_some {
13484 s.serialize_entry("settings", m)?;
13485 }
13486 }
13487 Self::ClassicOsu(m) => {
13488 let has_some = m.no_slider_head_accuracy.is_some()
13489 || m.classic_note_lock.is_some()
13490 || m.always_play_tail_sample.is_some()
13491 || m.fade_hit_circle_early.is_some()
13492 || m.classic_health.is_some();
13493 if has_some {
13494 s.serialize_entry("settings", m)?;
13495 }
13496 }
13497 Self::RandomOsu(m) => {
13498 let has_some = m.angle_sharpness.is_some() || m.seed.is_some();
13499 if has_some {
13500 s.serialize_entry("settings", m)?;
13501 }
13502 }
13503 Self::MirrorOsu(m) => {
13504 let has_some = m.reflection.is_some();
13505 if has_some {
13506 s.serialize_entry("settings", m)?;
13507 }
13508 }
13509 Self::WiggleOsu(m) => {
13510 let has_some = m.strength.is_some();
13511 if has_some {
13512 s.serialize_entry("settings", m)?;
13513 }
13514 }
13515 Self::GrowOsu(m) => {
13516 let has_some = m.start_scale.is_some();
13517 if has_some {
13518 s.serialize_entry("settings", m)?;
13519 }
13520 }
13521 Self::DeflateOsu(m) => {
13522 let has_some = m.start_scale.is_some();
13523 if has_some {
13524 s.serialize_entry("settings", m)?;
13525 }
13526 }
13527 Self::WindUpOsu(m) => {
13528 let has_some = m.initial_rate.is_some()
13529 || m.final_rate.is_some()
13530 || m.adjust_pitch.is_some();
13531 if has_some {
13532 s.serialize_entry("settings", m)?;
13533 }
13534 }
13535 Self::WindDownOsu(m) => {
13536 let has_some = m.initial_rate.is_some()
13537 || m.final_rate.is_some()
13538 || m.adjust_pitch.is_some();
13539 if has_some {
13540 s.serialize_entry("settings", m)?;
13541 }
13542 }
13543 Self::BarrelRollOsu(m) => {
13544 let has_some = m.spin_speed.is_some() || m.direction.is_some();
13545 if has_some {
13546 s.serialize_entry("settings", m)?;
13547 }
13548 }
13549 Self::ApproachDifferentOsu(m) => {
13550 let has_some = m.scale.is_some() || m.style.is_some();
13551 if has_some {
13552 s.serialize_entry("settings", m)?;
13553 }
13554 }
13555 Self::MutedOsu(m) => {
13556 let has_some = m.inverse_muting.is_some()
13557 || m.enable_metronome.is_some()
13558 || m.mute_combo_count.is_some()
13559 || m.affects_hit_sounds.is_some();
13560 if has_some {
13561 s.serialize_entry("settings", m)?;
13562 }
13563 }
13564 Self::NoScopeOsu(m) => {
13565 let has_some = m.hidden_combo_count.is_some();
13566 if has_some {
13567 s.serialize_entry("settings", m)?;
13568 }
13569 }
13570 Self::MagnetisedOsu(m) => {
13571 let has_some = m.attraction_strength.is_some();
13572 if has_some {
13573 s.serialize_entry("settings", m)?;
13574 }
13575 }
13576 Self::RepelOsu(m) => {
13577 let has_some = m.repulsion_strength.is_some();
13578 if has_some {
13579 s.serialize_entry("settings", m)?;
13580 }
13581 }
13582 Self::AdaptiveSpeedOsu(m) => {
13583 let has_some = m.initial_rate.is_some() || m.adjust_pitch.is_some();
13584 if has_some {
13585 s.serialize_entry("settings", m)?;
13586 }
13587 }
13588 Self::DepthOsu(m) => {
13589 let has_some = m.max_depth.is_some() || m.show_approach_circles.is_some();
13590 if has_some {
13591 s.serialize_entry("settings", m)?;
13592 }
13593 }
13594 Self::BloomOsu(m) => {
13595 let has_some = m.max_size_combo_count.is_some() || m.max_cursor_size.is_some();
13596 if has_some {
13597 s.serialize_entry("settings", m)?;
13598 }
13599 }
13600 Self::HalfTimeTaiko(m) => {
13601 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13602 if has_some {
13603 s.serialize_entry("settings", m)?;
13604 }
13605 }
13606 Self::DaycoreTaiko(m) => {
13607 let has_some = m.speed_change.is_some();
13608 if has_some {
13609 s.serialize_entry("settings", m)?;
13610 }
13611 }
13612 Self::SimplifiedRhythmTaiko(m) => {
13613 let has_some = m.one_third_conversion.is_some()
13614 || m.one_sixth_conversion.is_some()
13615 || m.one_eighth_conversion.is_some();
13616 if has_some {
13617 s.serialize_entry("settings", m)?;
13618 }
13619 }
13620 Self::SuddenDeathTaiko(m) => {
13621 let has_some = m.restart.is_some();
13622 if has_some {
13623 s.serialize_entry("settings", m)?;
13624 }
13625 }
13626 Self::PerfectTaiko(m) => {
13627 let has_some = m.restart.is_some();
13628 if has_some {
13629 s.serialize_entry("settings", m)?;
13630 }
13631 }
13632 Self::DoubleTimeTaiko(m) => {
13633 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13634 if has_some {
13635 s.serialize_entry("settings", m)?;
13636 }
13637 }
13638 Self::NightcoreTaiko(m) => {
13639 let has_some = m.speed_change.is_some();
13640 if has_some {
13641 s.serialize_entry("settings", m)?;
13642 }
13643 }
13644 Self::FlashlightTaiko(m) => {
13645 let has_some = m.size_multiplier.is_some() || m.combo_based_size.is_some();
13646 if has_some {
13647 s.serialize_entry("settings", m)?;
13648 }
13649 }
13650 Self::AccuracyChallengeTaiko(m) => {
13651 let has_some = m.minimum_accuracy.is_some()
13652 || m.accuracy_judge_mode.is_some()
13653 || m.restart.is_some();
13654 if has_some {
13655 s.serialize_entry("settings", m)?;
13656 }
13657 }
13658 Self::RandomTaiko(m) => {
13659 let has_some = m.seed.is_some();
13660 if has_some {
13661 s.serialize_entry("settings", m)?;
13662 }
13663 }
13664 Self::DifficultyAdjustTaiko(m) => {
13665 let has_some = m.scroll_speed.is_some()
13666 || m.drain_rate.is_some()
13667 || m.overall_difficulty.is_some()
13668 || m.extended_limits.is_some();
13669 if has_some {
13670 s.serialize_entry("settings", m)?;
13671 }
13672 }
13673 Self::WindUpTaiko(m) => {
13674 let has_some = m.initial_rate.is_some()
13675 || m.final_rate.is_some()
13676 || m.adjust_pitch.is_some();
13677 if has_some {
13678 s.serialize_entry("settings", m)?;
13679 }
13680 }
13681 Self::WindDownTaiko(m) => {
13682 let has_some = m.initial_rate.is_some()
13683 || m.final_rate.is_some()
13684 || m.adjust_pitch.is_some();
13685 if has_some {
13686 s.serialize_entry("settings", m)?;
13687 }
13688 }
13689 Self::MutedTaiko(m) => {
13690 let has_some = m.inverse_muting.is_some()
13691 || m.enable_metronome.is_some()
13692 || m.mute_combo_count.is_some()
13693 || m.affects_hit_sounds.is_some();
13694 if has_some {
13695 s.serialize_entry("settings", m)?;
13696 }
13697 }
13698 Self::AdaptiveSpeedTaiko(m) => {
13699 let has_some = m.initial_rate.is_some() || m.adjust_pitch.is_some();
13700 if has_some {
13701 s.serialize_entry("settings", m)?;
13702 }
13703 }
13704 Self::EasyCatch(m) => {
13705 let has_some = m.retries.is_some();
13706 if has_some {
13707 s.serialize_entry("settings", m)?;
13708 }
13709 }
13710 Self::HalfTimeCatch(m) => {
13711 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13712 if has_some {
13713 s.serialize_entry("settings", m)?;
13714 }
13715 }
13716 Self::DaycoreCatch(m) => {
13717 let has_some = m.speed_change.is_some();
13718 if has_some {
13719 s.serialize_entry("settings", m)?;
13720 }
13721 }
13722 Self::SuddenDeathCatch(m) => {
13723 let has_some = m.restart.is_some();
13724 if has_some {
13725 s.serialize_entry("settings", m)?;
13726 }
13727 }
13728 Self::PerfectCatch(m) => {
13729 let has_some = m.restart.is_some();
13730 if has_some {
13731 s.serialize_entry("settings", m)?;
13732 }
13733 }
13734 Self::DoubleTimeCatch(m) => {
13735 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13736 if has_some {
13737 s.serialize_entry("settings", m)?;
13738 }
13739 }
13740 Self::NightcoreCatch(m) => {
13741 let has_some = m.speed_change.is_some();
13742 if has_some {
13743 s.serialize_entry("settings", m)?;
13744 }
13745 }
13746 Self::FlashlightCatch(m) => {
13747 let has_some = m.size_multiplier.is_some() || m.combo_based_size.is_some();
13748 if has_some {
13749 s.serialize_entry("settings", m)?;
13750 }
13751 }
13752 Self::AccuracyChallengeCatch(m) => {
13753 let has_some = m.minimum_accuracy.is_some()
13754 || m.accuracy_judge_mode.is_some()
13755 || m.restart.is_some();
13756 if has_some {
13757 s.serialize_entry("settings", m)?;
13758 }
13759 }
13760 Self::DifficultyAdjustCatch(m) => {
13761 let has_some = m.circle_size.is_some()
13762 || m.approach_rate.is_some()
13763 || m.hard_rock_offsets.is_some()
13764 || m.drain_rate.is_some()
13765 || m.overall_difficulty.is_some()
13766 || m.extended_limits.is_some();
13767 if has_some {
13768 s.serialize_entry("settings", m)?;
13769 }
13770 }
13771 Self::WindUpCatch(m) => {
13772 let has_some = m.initial_rate.is_some()
13773 || m.final_rate.is_some()
13774 || m.adjust_pitch.is_some();
13775 if has_some {
13776 s.serialize_entry("settings", m)?;
13777 }
13778 }
13779 Self::WindDownCatch(m) => {
13780 let has_some = m.initial_rate.is_some()
13781 || m.final_rate.is_some()
13782 || m.adjust_pitch.is_some();
13783 if has_some {
13784 s.serialize_entry("settings", m)?;
13785 }
13786 }
13787 Self::MutedCatch(m) => {
13788 let has_some = m.inverse_muting.is_some()
13789 || m.enable_metronome.is_some()
13790 || m.mute_combo_count.is_some()
13791 || m.affects_hit_sounds.is_some();
13792 if has_some {
13793 s.serialize_entry("settings", m)?;
13794 }
13795 }
13796 Self::NoScopeCatch(m) => {
13797 let has_some = m.hidden_combo_count.is_some();
13798 if has_some {
13799 s.serialize_entry("settings", m)?;
13800 }
13801 }
13802 Self::EasyMania(m) => {
13803 let has_some = m.retries.is_some();
13804 if has_some {
13805 s.serialize_entry("settings", m)?;
13806 }
13807 }
13808 Self::HalfTimeMania(m) => {
13809 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13810 if has_some {
13811 s.serialize_entry("settings", m)?;
13812 }
13813 }
13814 Self::DaycoreMania(m) => {
13815 let has_some = m.speed_change.is_some();
13816 if has_some {
13817 s.serialize_entry("settings", m)?;
13818 }
13819 }
13820 Self::SuddenDeathMania(m) => {
13821 let has_some = m.restart.is_some();
13822 if has_some {
13823 s.serialize_entry("settings", m)?;
13824 }
13825 }
13826 Self::PerfectMania(m) => {
13827 let has_some = m.require_perfect_hits.is_some() || m.restart.is_some();
13828 if has_some {
13829 s.serialize_entry("settings", m)?;
13830 }
13831 }
13832 Self::DoubleTimeMania(m) => {
13833 let has_some = m.speed_change.is_some() || m.adjust_pitch.is_some();
13834 if has_some {
13835 s.serialize_entry("settings", m)?;
13836 }
13837 }
13838 Self::NightcoreMania(m) => {
13839 let has_some = m.speed_change.is_some();
13840 if has_some {
13841 s.serialize_entry("settings", m)?;
13842 }
13843 }
13844 Self::CoverMania(m) => {
13845 let has_some = m.coverage.is_some() || m.direction.is_some();
13846 if has_some {
13847 s.serialize_entry("settings", m)?;
13848 }
13849 }
13850 Self::FlashlightMania(m) => {
13851 let has_some = m.size_multiplier.is_some() || m.combo_based_size.is_some();
13852 if has_some {
13853 s.serialize_entry("settings", m)?;
13854 }
13855 }
13856 Self::AccuracyChallengeMania(m) => {
13857 let has_some = m.minimum_accuracy.is_some()
13858 || m.accuracy_judge_mode.is_some()
13859 || m.restart.is_some();
13860 if has_some {
13861 s.serialize_entry("settings", m)?;
13862 }
13863 }
13864 Self::RandomMania(m) => {
13865 let has_some = m.seed.is_some();
13866 if has_some {
13867 s.serialize_entry("settings", m)?;
13868 }
13869 }
13870 Self::DifficultyAdjustMania(m) => {
13871 let has_some = m.overall_difficulty.is_some()
13872 || m.drain_rate.is_some()
13873 || m.extended_limits.is_some();
13874 if has_some {
13875 s.serialize_entry("settings", m)?;
13876 }
13877 }
13878 Self::WindUpMania(m) => {
13879 let has_some = m.initial_rate.is_some()
13880 || m.final_rate.is_some()
13881 || m.adjust_pitch.is_some();
13882 if has_some {
13883 s.serialize_entry("settings", m)?;
13884 }
13885 }
13886 Self::WindDownMania(m) => {
13887 let has_some = m.initial_rate.is_some()
13888 || m.final_rate.is_some()
13889 || m.adjust_pitch.is_some();
13890 if has_some {
13891 s.serialize_entry("settings", m)?;
13892 }
13893 }
13894 Self::MutedMania(m) => {
13895 let has_some = m.inverse_muting.is_some()
13896 || m.enable_metronome.is_some()
13897 || m.mute_combo_count.is_some()
13898 || m.affects_hit_sounds.is_some();
13899 if has_some {
13900 s.serialize_entry("settings", m)?;
13901 }
13902 }
13903 Self::AdaptiveSpeedMania(m) => {
13904 let has_some = m.initial_rate.is_some() || m.adjust_pitch.is_some();
13905 if has_some {
13906 s.serialize_entry("settings", m)?;
13907 }
13908 }
13909 _ => {}
13910 }
13911 s.end()
13912 }
13913 }
13914 impl<'de> Deserialize<'de> for GameModIntermode {
13915 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
13916 fn try_acronym_to_gamemod<E: DeError>(
13917 acronym: &MaybeOwnedStr<'_>,
13918 ) -> Result<GameModIntermode, E> {
13919 acronym
13920 .as_str()
13921 .parse()
13922 .map(GameModIntermode::from_acronym)
13923 .map_err(DeError::custom)
13924 }
13925 let raw_seed = GameModRawSeed {
13926 deny_unknown_fields: true,
13927 };
13928 match raw_seed.deserialize(d)? {
13929 GameModRaw::Bits(bits) => GameModIntermode::try_from_bits(bits)
13930 .ok_or_else(|| DeError::custom("invalid bitflags")),
13931 GameModRaw::Acronym(acronym) => try_acronym_to_gamemod(&acronym),
13932 GameModRaw::Full { acronym, .. } => try_acronym_to_gamemod(&acronym),
13933 }
13934 }
13935 }
13936 impl serde::Serialize for GameModIntermode {
13937 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
13938 s.serialize_str(self.acronym().as_str())
13939 }
13940 }
13941 impl GameModSettings<'_> {
13942 pub(crate) fn try_deserialize(
13943 &self,
13944 acronym: &str,
13945 deny_unknown_fields: bool,
13946 ) -> Option<GameMod> {
13947 macro_rules! try_deser {
13948 ( $osu_mod:ident, $taiko_mod:ident, $catch_mod:ident, $mania_mod:ident, ) => {{
13949 try_deser!(@ $osu_mod Osu);
13950 try_deser!(@ $taiko_mod Taiko);
13951 try_deser!(@ $catch_mod Catch);
13952 try_deser!(@ $mania_mod Mania);
13953 }};
13954 ( @ Skip_ $mode:ident ) => {};
13955 ( @ $name:ident $mode:ident ) => {
13956 if let Ok(m) = DeserializedGameMod::try_deserialize_mod(self, deny_unknown_fields) {
13957 return Some(GameMod::$name(m));
13958 }
13959 };
13960 }
13961 match acronym {
13962 "10K" => try_deser!(Skip_, Skip_, Skip_, TenKeysMania,),
13963 "1K" => try_deser!(Skip_, Skip_, Skip_, OneKeyMania,),
13964 "2K" => try_deser!(Skip_, Skip_, Skip_, TwoKeysMania,),
13965 "3K" => try_deser!(Skip_, Skip_, Skip_, ThreeKeysMania,),
13966 "4K" => try_deser!(Skip_, Skip_, Skip_, FourKeysMania,),
13967 "5K" => try_deser!(Skip_, Skip_, Skip_, FiveKeysMania,),
13968 "6K" => try_deser!(Skip_, Skip_, Skip_, SixKeysMania,),
13969 "7K" => try_deser!(Skip_, Skip_, Skip_, SevenKeysMania,),
13970 "8K" => try_deser!(Skip_, Skip_, Skip_, EightKeysMania,),
13971 "9K" => try_deser!(Skip_, Skip_, Skip_, NineKeysMania,),
13972 "AC" => try_deser!(
13973 AccuracyChallengeOsu,
13974 AccuracyChallengeTaiko,
13975 AccuracyChallengeCatch,
13976 AccuracyChallengeMania,
13977 ),
13978 "AD" => try_deser!(ApproachDifferentOsu, Skip_, Skip_, Skip_,),
13979 "AL" => try_deser!(AlternateOsu, Skip_, Skip_, Skip_,),
13980 "AP" => try_deser!(AutopilotOsu, Skip_, Skip_, Skip_,),
13981 "AS" => try_deser!(
13982 AdaptiveSpeedOsu,
13983 AdaptiveSpeedTaiko,
13984 Skip_,
13985 AdaptiveSpeedMania,
13986 ),
13987 "AT" => try_deser!(AutoplayOsu, AutoplayTaiko, AutoplayCatch, AutoplayMania,),
13988 "BL" => try_deser!(BlindsOsu, Skip_, Skip_, Skip_,),
13989 "BM" => try_deser!(BloomOsu, Skip_, Skip_, Skip_,),
13990 "BR" => try_deser!(BarrelRollOsu, Skip_, Skip_, Skip_,),
13991 "BU" => try_deser!(BubblesOsu, Skip_, Skip_, Skip_,),
13992 "CL" => try_deser!(ClassicOsu, ClassicTaiko, ClassicCatch, ClassicMania,),
13993 "CN" => try_deser!(CinemaOsu, CinemaTaiko, CinemaCatch, CinemaMania,),
13994 "CO" => try_deser!(Skip_, Skip_, Skip_, CoverMania,),
13995 "CS" => try_deser!(Skip_, ConstantSpeedTaiko, Skip_, ConstantSpeedMania,),
13996 "DA" => try_deser!(
13997 DifficultyAdjustOsu,
13998 DifficultyAdjustTaiko,
13999 DifficultyAdjustCatch,
14000 DifficultyAdjustMania,
14001 ),
14002 "DC" => try_deser!(DaycoreOsu, DaycoreTaiko, DaycoreCatch, DaycoreMania,),
14003 "DF" => try_deser!(DeflateOsu, Skip_, Skip_, Skip_,),
14004 "DP" => try_deser!(DepthOsu, Skip_, Skip_, Skip_,),
14005 "DS" => try_deser!(Skip_, Skip_, Skip_, DualStagesMania,),
14006 "DT" => try_deser!(
14007 DoubleTimeOsu,
14008 DoubleTimeTaiko,
14009 DoubleTimeCatch,
14010 DoubleTimeMania,
14011 ),
14012 "EZ" => try_deser!(EasyOsu, EasyTaiko, EasyCatch, EasyMania,),
14013 "FF" => try_deser!(Skip_, Skip_, FloatingFruitsCatch, Skip_,),
14014 "FI" => try_deser!(Skip_, Skip_, Skip_, FadeInMania,),
14015 "FL" => try_deser!(
14016 FlashlightOsu,
14017 FlashlightTaiko,
14018 FlashlightCatch,
14019 FlashlightMania,
14020 ),
14021 "FR" => try_deser!(FreezeFrameOsu, Skip_, Skip_, Skip_,),
14022 "GR" => try_deser!(GrowOsu, Skip_, Skip_, Skip_,),
14023 "HD" => try_deser!(HiddenOsu, HiddenTaiko, HiddenCatch, HiddenMania,),
14024 "HO" => try_deser!(Skip_, Skip_, Skip_, HoldOffMania,),
14025 "HR" => try_deser!(HardRockOsu, HardRockTaiko, HardRockCatch, HardRockMania,),
14026 "HT" => try_deser!(HalfTimeOsu, HalfTimeTaiko, HalfTimeCatch, HalfTimeMania,),
14027 "IN" => try_deser!(Skip_, Skip_, Skip_, InvertMania,),
14028 "MF" => try_deser!(Skip_, Skip_, MovingFastCatch, Skip_,),
14029 "MG" => try_deser!(MagnetisedOsu, Skip_, Skip_, Skip_,),
14030 "MR" => try_deser!(MirrorOsu, Skip_, MirrorCatch, MirrorMania,),
14031 "MU" => try_deser!(MutedOsu, MutedTaiko, MutedCatch, MutedMania,),
14032 "NC" => try_deser!(NightcoreOsu, NightcoreTaiko, NightcoreCatch, NightcoreMania,),
14033 "NF" => try_deser!(NoFailOsu, NoFailTaiko, NoFailCatch, NoFailMania,),
14034 "NR" => try_deser!(Skip_, Skip_, Skip_, NoReleaseMania,),
14035 "NS" => try_deser!(NoScopeOsu, Skip_, NoScopeCatch, Skip_,),
14036 "PF" => try_deser!(PerfectOsu, PerfectTaiko, PerfectCatch, PerfectMania,),
14037 "RD" => try_deser!(RandomOsu, RandomTaiko, Skip_, RandomMania,),
14038 "RP" => try_deser!(RepelOsu, Skip_, Skip_, Skip_,),
14039 "RX" => try_deser!(RelaxOsu, RelaxTaiko, RelaxCatch, Skip_,),
14040 "SD" => try_deser!(
14041 SuddenDeathOsu,
14042 SuddenDeathTaiko,
14043 SuddenDeathCatch,
14044 SuddenDeathMania,
14045 ),
14046 "SG" => try_deser!(SingleTapOsu, SingleTapTaiko, Skip_, Skip_,),
14047 "SI" => try_deser!(SpinInOsu, Skip_, Skip_, Skip_,),
14048 "SO" => try_deser!(SpunOutOsu, Skip_, Skip_, Skip_,),
14049 "SR" => try_deser!(Skip_, SimplifiedRhythmTaiko, Skip_, Skip_,),
14050 "ST" => try_deser!(StrictTrackingOsu, Skip_, Skip_, Skip_,),
14051 "SV2" => try_deser!(ScoreV2Osu, ScoreV2Taiko, ScoreV2Catch, ScoreV2Mania,),
14052 "SW" => try_deser!(Skip_, SwapTaiko, Skip_, Skip_,),
14053 "SY" => try_deser!(SynesthesiaOsu, Skip_, Skip_, Skip_,),
14054 "TC" => try_deser!(TraceableOsu, Skip_, Skip_, Skip_,),
14055 "TD" => try_deser!(TouchDeviceOsu, Skip_, Skip_, Skip_,),
14056 "TP" => try_deser!(TargetPracticeOsu, Skip_, Skip_, Skip_,),
14057 "TR" => try_deser!(TransformOsu, Skip_, Skip_, Skip_,),
14058 "WD" => try_deser!(WindDownOsu, WindDownTaiko, WindDownCatch, WindDownMania,),
14059 "WG" => try_deser!(WiggleOsu, Skip_, Skip_, Skip_,),
14060 "WU" => try_deser!(WindUpOsu, WindUpTaiko, WindUpCatch, WindUpMania,),
14061 _ => {}
14062 }
14063 None
14064 }
14065 }
14066};
14067#[macro_export(local_inner_macros)]
14068#[cfg(feature = "macros")]
14069#[doc(hidden)]
14070macro_rules! mods_inner {
14071 ( @ $mode:ident: $( $acronym:tt )* ) => {{
14072 let _ = $crate::GameMode::$mode;
14074
14075 #[allow(unused_mut)]
14076 let mut mods = $crate::GameMods::new();
14077 $( mods.insert(mods_inner!(< ! $mode $acronym)(Default::default())); )*
14078 mods
14079 }};
14080 ( @ $( $acronym:tt )* ) => {{
14081 #[allow(unused_mut)]
14082 let mut mods = $crate::GameModsIntermode::new();
14083 $( mods.insert(mods_inner!(< $acronym)); )*
14084 mods
14085 }};
14086
14087 ( < $( ! $mode:ident )? 10K ) => { mods_inner!(> $( $mode )? TenKeys ) };
14089 ( < $( ! $mode:ident )? 1K ) => { mods_inner!(> $( $mode )? OneKey ) };
14090 ( < $( ! $mode:ident )? 2K ) => { mods_inner!(> $( $mode )? TwoKeys ) };
14091 ( < $( ! $mode:ident )? 3K ) => { mods_inner!(> $( $mode )? ThreeKeys ) };
14092 ( < $( ! $mode:ident )? 4K ) => { mods_inner!(> $( $mode )? FourKeys ) };
14093 ( < $( ! $mode:ident )? 5K ) => { mods_inner!(> $( $mode )? FiveKeys ) };
14094 ( < $( ! $mode:ident )? 6K ) => { mods_inner!(> $( $mode )? SixKeys ) };
14095 ( < $( ! $mode:ident )? 7K ) => { mods_inner!(> $( $mode )? SevenKeys ) };
14096 ( < $( ! $mode:ident )? 8K ) => { mods_inner!(> $( $mode )? EightKeys ) };
14097 ( < $( ! $mode:ident )? 9K ) => { mods_inner!(> $( $mode )? NineKeys ) };
14098 ( < $( ! $mode:ident )? AC ) => { mods_inner!(> $( $mode )? AccuracyChallenge ) };
14099 ( < $( ! $mode:ident )? AD ) => { mods_inner!(> $( $mode )? ApproachDifferent ) };
14100 ( < $( ! $mode:ident )? AL ) => { mods_inner!(> $( $mode )? Alternate ) };
14101 ( < $( ! $mode:ident )? AP ) => { mods_inner!(> $( $mode )? Autopilot ) };
14102 ( < $( ! $mode:ident )? AS ) => { mods_inner!(> $( $mode )? AdaptiveSpeed ) };
14103 ( < $( ! $mode:ident )? AT ) => { mods_inner!(> $( $mode )? Autoplay ) };
14104 ( < $( ! $mode:ident )? BL ) => { mods_inner!(> $( $mode )? Blinds ) };
14105 ( < $( ! $mode:ident )? BM ) => { mods_inner!(> $( $mode )? Bloom ) };
14106 ( < $( ! $mode:ident )? BR ) => { mods_inner!(> $( $mode )? BarrelRoll ) };
14107 ( < $( ! $mode:ident )? BU ) => { mods_inner!(> $( $mode )? Bubbles ) };
14108 ( < $( ! $mode:ident )? CL ) => { mods_inner!(> $( $mode )? Classic ) };
14109 ( < $( ! $mode:ident )? CN ) => { mods_inner!(> $( $mode )? Cinema ) };
14110 ( < $( ! $mode:ident )? CO ) => { mods_inner!(> $( $mode )? Cover ) };
14111 ( < $( ! $mode:ident )? CS ) => { mods_inner!(> $( $mode )? ConstantSpeed ) };
14112 ( < $( ! $mode:ident )? DA ) => { mods_inner!(> $( $mode )? DifficultyAdjust ) };
14113 ( < $( ! $mode:ident )? DC ) => { mods_inner!(> $( $mode )? Daycore ) };
14114 ( < $( ! $mode:ident )? DF ) => { mods_inner!(> $( $mode )? Deflate ) };
14115 ( < $( ! $mode:ident )? DP ) => { mods_inner!(> $( $mode )? Depth ) };
14116 ( < $( ! $mode:ident )? DS ) => { mods_inner!(> $( $mode )? DualStages ) };
14117 ( < $( ! $mode:ident )? DT ) => { mods_inner!(> $( $mode )? DoubleTime ) };
14118 ( < $( ! $mode:ident )? EZ ) => { mods_inner!(> $( $mode )? Easy ) };
14119 ( < $( ! $mode:ident )? FF ) => { mods_inner!(> $( $mode )? FloatingFruits ) };
14120 ( < $( ! $mode:ident )? FI ) => { mods_inner!(> $( $mode )? FadeIn ) };
14121 ( < $( ! $mode:ident )? FL ) => { mods_inner!(> $( $mode )? Flashlight ) };
14122 ( < $( ! $mode:ident )? FR ) => { mods_inner!(> $( $mode )? FreezeFrame ) };
14123 ( < $( ! $mode:ident )? GR ) => { mods_inner!(> $( $mode )? Grow ) };
14124 ( < $( ! $mode:ident )? HD ) => { mods_inner!(> $( $mode )? Hidden ) };
14125 ( < $( ! $mode:ident )? HO ) => { mods_inner!(> $( $mode )? HoldOff ) };
14126 ( < $( ! $mode:ident )? HR ) => { mods_inner!(> $( $mode )? HardRock ) };
14127 ( < $( ! $mode:ident )? HT ) => { mods_inner!(> $( $mode )? HalfTime ) };
14128 ( < $( ! $mode:ident )? IN ) => { mods_inner!(> $( $mode )? Invert ) };
14129 ( < $( ! $mode:ident )? MF ) => { mods_inner!(> $( $mode )? MovingFast ) };
14130 ( < $( ! $mode:ident )? MG ) => { mods_inner!(> $( $mode )? Magnetised ) };
14131 ( < $( ! $mode:ident )? MR ) => { mods_inner!(> $( $mode )? Mirror ) };
14132 ( < $( ! $mode:ident )? MU ) => { mods_inner!(> $( $mode )? Muted ) };
14133 ( < $( ! $mode:ident )? NC ) => { mods_inner!(> $( $mode )? Nightcore ) };
14134 ( < $( ! $mode:ident )? NF ) => { mods_inner!(> $( $mode )? NoFail ) };
14135 ( < $( ! $mode:ident )? NR ) => { mods_inner!(> $( $mode )? NoRelease ) };
14136 ( < $( ! $mode:ident )? NS ) => { mods_inner!(> $( $mode )? NoScope ) };
14137 ( < $( ! $mode:ident )? PF ) => { mods_inner!(> $( $mode )? Perfect ) };
14138 ( < $( ! $mode:ident )? RD ) => { mods_inner!(> $( $mode )? Random ) };
14139 ( < $( ! $mode:ident )? RP ) => { mods_inner!(> $( $mode )? Repel ) };
14140 ( < $( ! $mode:ident )? RX ) => { mods_inner!(> $( $mode )? Relax ) };
14141 ( < $( ! $mode:ident )? SD ) => { mods_inner!(> $( $mode )? SuddenDeath ) };
14142 ( < $( ! $mode:ident )? SG ) => { mods_inner!(> $( $mode )? SingleTap ) };
14143 ( < $( ! $mode:ident )? SI ) => { mods_inner!(> $( $mode )? SpinIn ) };
14144 ( < $( ! $mode:ident )? SO ) => { mods_inner!(> $( $mode )? SpunOut ) };
14145 ( < $( ! $mode:ident )? SR ) => { mods_inner!(> $( $mode )? SimplifiedRhythm ) };
14146 ( < $( ! $mode:ident )? ST ) => { mods_inner!(> $( $mode )? StrictTracking ) };
14147 ( < $( ! $mode:ident )? SV2 ) => { mods_inner!(> $( $mode )? ScoreV2 ) };
14148 ( < $( ! $mode:ident )? SW ) => { mods_inner!(> $( $mode )? Swap ) };
14149 ( < $( ! $mode:ident )? SY ) => { mods_inner!(> $( $mode )? Synesthesia ) };
14150 ( < $( ! $mode:ident )? TC ) => { mods_inner!(> $( $mode )? Traceable ) };
14151 ( < $( ! $mode:ident )? TD ) => { mods_inner!(> $( $mode )? TouchDevice ) };
14152 ( < $( ! $mode:ident )? TP ) => { mods_inner!(> $( $mode )? TargetPractice ) };
14153 ( < $( ! $mode:ident )? TR ) => { mods_inner!(> $( $mode )? Transform ) };
14154 ( < $( ! $mode:ident )? WD ) => { mods_inner!(> $( $mode )? WindDown ) };
14155 ( < $( ! $mode:ident )? WG ) => { mods_inner!(> $( $mode )? Wiggle ) };
14156 ( < $( ! $mode:ident )? WU ) => { mods_inner!(> $( $mode )? WindUp ) };
14157
14158 ( < ! $mode:ident $other:tt $( $rest:tt )* ) => { mods_inner!(<< $other) };
14160 ( < $other:tt $( $rest:tt )* ) => { mods_inner!(<< $other) };
14161 ( << $other:tt ) => {
14162 std::compile_error!(std::concat!("unknown mod acronym `", std::stringify!($other), "`"))
14163 };
14164
14165 ( > $mode:ident $name:ident ) => {
14167 $crate::macros::paste! { $crate::generated_mods::GameMod::[<$name $mode>] }
14168 };
14169 ( > $name:ident ) => {
14170 $crate::generated_mods::GameModIntermode::$name
14171 };
14172}