@rian8337/osu-difficulty-calculator 4.0.0-beta.14 → 4.0.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Mod, MapStats, PlaceableHitObject, Beatmap, Modes, HitObject, Accuracy } from '@rian8337/osu-base';
1
+ import { Mod, PlaceableHitObject, Modes, Beatmap, DifficultyStatisticsCalculatorResult, Accuracy } from '@rian8337/osu-base';
2
2
 
3
3
  /**
4
4
  * An evaluator for calculating aim skill.
@@ -98,24 +98,18 @@ type CacheableDifficultyAttributes<T extends DifficultyAttributes> = Omit<T, "mo
98
98
  mods: string;
99
99
  };
100
100
 
101
- /**
102
- * The base of calculation options.
103
- */
104
- interface CalculationOptions {
105
- /**
106
- * Custom map statistics to apply custom speed multiplier as well as old statistics.
107
- */
108
- stats?: MapStats;
109
- }
110
-
111
101
  /**
112
102
  * Represents options for difficulty calculation.
113
103
  */
114
- interface DifficultyCalculationOptions extends CalculationOptions {
104
+ interface DifficultyCalculationOptions {
115
105
  /**
116
106
  * The modifications to apply.
117
107
  */
118
- mods?: Mod[];
108
+ readonly mods?: Mod[];
109
+ /**
110
+ * The custom speed multiplier to apply. Defaults to 1.
111
+ */
112
+ readonly customSpeedMultiplier?: number;
119
113
  }
120
114
 
121
115
  /**
@@ -131,19 +125,7 @@ declare abstract class DifficultyHitObject {
131
125
  *
132
126
  * This is one less than the actual index of the hitobject in the beatmap.
133
127
  */
134
- index: number;
135
- /**
136
- * The preempt time of the hitobject.
137
- */
138
- baseTimePreempt: number;
139
- /**
140
- * Adjusted preempt time of the hitobject, taking speed multiplier into account.
141
- */
142
- timePreempt: number;
143
- /**
144
- * The fade in time of the hitobject.
145
- */
146
- timeFadeIn: number;
128
+ readonly index: number;
147
129
  /**
148
130
  * The aim strain generated by the hitobject if sliders are considered.
149
131
  */
@@ -196,28 +178,51 @@ declare abstract class DifficultyHitObject {
196
178
  /**
197
179
  * The amount of milliseconds elapsed between this hitobject and the last hitobject.
198
180
  */
199
- deltaTime: number;
181
+ readonly deltaTime: number;
200
182
  /**
201
183
  * The amount of milliseconds elapsed since the start time of the previous hitobject, with a minimum of 25ms.
202
184
  */
203
- strainTime: number;
185
+ readonly strainTime: number;
204
186
  /**
205
187
  * Adjusted start time of the hitobject, taking speed multiplier into account.
206
188
  */
207
- startTime: number;
189
+ readonly startTime: number;
208
190
  /**
209
191
  * Adjusted end time of the hitobject, taking speed multiplier into account.
210
192
  */
211
- endTime: number;
193
+ readonly endTime: number;
212
194
  /**
213
195
  * Other hitobjects in the beatmap, including this hitobject.
214
196
  */
215
- protected readonly hitObjects: DifficultyHitObject[];
197
+ protected readonly hitObjects: readonly DifficultyHitObject[];
198
+ protected abstract readonly mode: Modes;
199
+ protected readonly normalizedRadius = 50;
200
+ protected readonly maximumSliderRadius: number;
201
+ protected readonly assumedSliderRadius: number;
202
+ protected readonly minDeltaTime = 25;
203
+ private readonly lastObject;
204
+ private readonly lastLastObject;
216
205
  /**
206
+ * Note: You **must** call `computeProperties` at some point due to how TypeScript handles
207
+ * overridden properties (see [this](https://github.com/microsoft/TypeScript/issues/1617) GitHub issue.).
208
+ *
217
209
  * @param object The underlying hitobject.
218
- * @param hitObjects All difficulty hitobjects in the processed beatmap.
210
+ * @param lastObject The hitobject before this hitobject.
211
+ * @param lastLastObject The hitobject before the last hitobject.
212
+ * @param difficultyHitObjects All difficulty hitobjects in the processed beatmap.
213
+ * @param clockRate The clock rate of the beatmap.
214
+ * @param timePreempt The time preempt with clock rate.
215
+ * @param isForceAR Whether force AR is enabled.
216
+ * @param mode The gamemode to compute properties for.
217
+ */
218
+ protected constructor(object: PlaceableHitObject, lastObject: PlaceableHitObject | null, lastLastObject: PlaceableHitObject | null, difficultyHitObjects: readonly DifficultyHitObject[], clockRate: number);
219
+ /**
220
+ * Computes the properties of this hitobject.
221
+ *
222
+ * @param clockRate The clock rate of the beatmap.
223
+ * @param hitObjects The hitobjects in the beatmap.
219
224
  */
220
- protected constructor(object: PlaceableHitObject, hitObjects: DifficultyHitObject[]);
225
+ computeProperties(clockRate: number, hitObjects: readonly PlaceableHitObject[]): void;
221
226
  /**
222
227
  * Gets the difficulty hitobject at a specific index with respect to the current
223
228
  * difficulty hitobject's index.
@@ -248,16 +253,10 @@ declare abstract class DifficultyHitObject {
248
253
  * @returns The opacity of the hitobject at the given time.
249
254
  */
250
255
  opacityAt(time: number, isHidden: boolean): number;
251
- /**
252
- * Determines whether this hitobject is considered overlapping with the hitobject before it.
253
- *
254
- * Keep in mind that "overlapping" in this case is overlapping to the point where both hitobjects
255
- * can be hit with just a single tap in osu!droid.
256
- *
257
- * @param considerDistance Whether to consider the distance between both hitobjects.
258
- * @returns Whether the hitobject is considered overlapping.
259
- */
260
- isOverlapping(considerDistance: boolean): boolean;
256
+ protected abstract get scalingFactor(): number;
257
+ protected setDistances(clockRate: number): void;
258
+ private calculateSliderCursorPosition;
259
+ private getEndCursorPosition;
261
260
  }
262
261
 
263
262
  /**
@@ -324,11 +323,11 @@ declare abstract class DifficultyCalculator<THitObject extends DifficultyHitObje
324
323
  /**
325
324
  * The total star rating of the beatmap.
326
325
  */
327
- total: number;
326
+ get total(): number;
328
327
  /**
329
- * The map statistics of the beatmap after modifications are applied.
328
+ * The difficulty statistics of the beatmap after modifications are applied.
330
329
  */
331
- stats: MapStats;
330
+ difficultyStatistics: DifficultyStatisticsCalculatorResult<number, number, number, number>;
332
331
  /**
333
332
  * The strain peaks of various calculated difficulties.
334
333
  */
@@ -367,12 +366,17 @@ declare abstract class DifficultyCalculator<THitObject extends DifficultyHitObje
367
366
  calculate(options?: DifficultyCalculationOptions): this;
368
367
  /**
369
368
  * Generates difficulty hitobjects for this calculator.
369
+ *
370
+ * @param beatmap The beatmap to generate difficulty hitobjects from.
370
371
  */
371
- generateDifficultyHitObjects(): void;
372
+ protected abstract generateDifficultyHitObjects(beatmap: Beatmap): THitObject[];
372
373
  /**
373
- * Performs some pre-processing before proceeding with difficulty calculation.
374
+ * Computes the difficulty statistics of the original beatmap with respect to the used options.
375
+ *
376
+ * @param options The options to use for the difficulty statistics calculation.
377
+ * @returns The computed difficulty statistics.
374
378
  */
375
- protected preProcess(): void;
379
+ protected abstract computeDifficultyStatistics(options?: DifficultyCalculationOptions): DifficultyStatisticsCalculatorResult<number, number, number, number>;
376
380
  /**
377
381
  * Calculates the skills provided.
378
382
  *
@@ -413,148 +417,6 @@ declare abstract class DifficultyCalculator<THitObject extends DifficultyHitObje
413
417
  protected basePerformanceValue(rating: number): number;
414
418
  }
415
419
 
416
- /**
417
- * Represents an osu!droid hit object with difficulty calculation values.
418
- */
419
- declare class DroidDifficultyHitObject extends DifficultyHitObject {
420
- /**
421
- * The tap strain generated by the hitobject.
422
- */
423
- tapStrain: number;
424
- /**
425
- * The tap strain generated by the hitobject if `strainTime` isn't modified by
426
- * OD. This is used in three-finger detection.
427
- */
428
- originalTapStrain: number;
429
- /**
430
- * The rhythm strain generated by the hitobject.
431
- */
432
- rhythmStrain: number;
433
- /**
434
- * The flashlight strain generated by the hitobject if sliders are considered.
435
- */
436
- flashlightStrainWithSliders: number;
437
- /**
438
- * The flashlight strain generated by the hitobject if sliders are not considered.
439
- */
440
- flashlightStrainWithoutSliders: number;
441
- /**
442
- * The visual strain generated by the hitobject if sliders are considered.
443
- */
444
- visualStrainWithSliders: number;
445
- /**
446
- * The visual strain generated by the hitobject if sliders are not considered.
447
- */
448
- visualStrainWithoutSliders: number;
449
- /**
450
- * The note density of the hitobject.
451
- */
452
- noteDensity: number;
453
- /**
454
- * The overlapping factor of the hitobject.
455
- *
456
- * This is used to scale visual skill.
457
- */
458
- overlappingFactor: number;
459
- /**
460
- * @param object The underlying hitobject.
461
- * @param hitObjects All difficulty hitobjects in the processed beatmap.
462
- */
463
- constructor(object: PlaceableHitObject, hitObjects: DroidDifficultyHitObject[]);
464
- }
465
-
466
- /**
467
- * Represents an osu!standard hit object with difficulty calculation values.
468
- */
469
- declare class OsuDifficultyHitObject extends DifficultyHitObject {
470
- /**
471
- * The speed strain generated by the hitobject.
472
- */
473
- speedStrain: number;
474
- /**
475
- * The flashlight strain generated by this hitobject.
476
- */
477
- flashlightStrain: number;
478
- /**
479
- * @param object The underlying hitobject.
480
- * @param hitObjects All difficulty hitobjects in the processed beatmap.
481
- */
482
- constructor(object: PlaceableHitObject, hitObjects: OsuDifficultyHitObject[]);
483
- }
484
-
485
- /**
486
- * A converter used to convert normal hitobjects into difficulty hitobjects.
487
- */
488
- declare class DifficultyHitObjectCreator {
489
- /**
490
- * The threshold for small circle buff for osu!droid.
491
- */
492
- private readonly DROID_CIRCLESIZE_BUFF_THRESHOLD;
493
- /**
494
- * The threshold for small circle buff for osu!standard.
495
- */
496
- private readonly PC_CIRCLESIZE_BUFF_THRESHOLD;
497
- /**
498
- * The gamemode this creator is creating for.
499
- */
500
- private mode;
501
- /**
502
- * The base normalized radius of hitobjects.
503
- */
504
- private readonly normalizedRadius;
505
- private maximumSliderRadius;
506
- private readonly assumedSliderRadius;
507
- private readonly minDeltaTime;
508
- /**
509
- * Generates difficulty hitobjects for difficulty calculation.
510
- */
511
- generateDifficultyObjects(params: {
512
- objects: readonly HitObject[];
513
- circleSize: number;
514
- mods: Mod[];
515
- speedMultiplier: number;
516
- mode: Modes.droid;
517
- preempt?: number;
518
- }): DroidDifficultyHitObject[];
519
- /**
520
- * Generates difficulty hitobjects for difficulty calculation.
521
- */
522
- generateDifficultyObjects(params: {
523
- objects: readonly HitObject[];
524
- circleSize: number;
525
- mods: Mod[];
526
- speedMultiplier: number;
527
- mode: Modes.osu;
528
- preempt?: number;
529
- }): OsuDifficultyHitObject[];
530
- /**
531
- * Generates difficulty hitobjects for difficulty calculation.
532
- */
533
- generateDifficultyObjects(params: {
534
- objects: readonly HitObject[];
535
- circleSize: number;
536
- mods: Mod[];
537
- speedMultiplier: number;
538
- mode: Modes;
539
- preempt?: number;
540
- }): DifficultyHitObject[];
541
- /**
542
- * Calculates a slider's cursor position.
543
- */
544
- private calculateSliderCursorPosition;
545
- /**
546
- * Gets the scaling factor of a radius.
547
- *
548
- * @param radius The radius to get the scaling factor from.
549
- */
550
- private getScalingFactor;
551
- /**
552
- * Returns the end cursor position of a hitobject.
553
- */
554
- private getEndCursorPosition;
555
- private applyToOverlappingFactor;
556
- }
557
-
558
420
  /**
559
421
  * Represents a slider that is considered difficult.
560
422
  *
@@ -653,6 +515,84 @@ declare abstract class DroidSkill extends StrainSkill {
653
515
  difficultyValue(): number;
654
516
  }
655
517
 
518
+ /**
519
+ * Represents an osu!droid hit object with difficulty calculation values.
520
+ */
521
+ declare class DroidDifficultyHitObject extends DifficultyHitObject {
522
+ /**
523
+ * The tap strain generated by the hitobject.
524
+ */
525
+ tapStrain: number;
526
+ /**
527
+ * The tap strain generated by the hitobject if `strainTime` isn't modified by
528
+ * OD. This is used in three-finger detection.
529
+ */
530
+ originalTapStrain: number;
531
+ /**
532
+ * The rhythm strain generated by the hitobject.
533
+ */
534
+ rhythmStrain: number;
535
+ /**
536
+ * The flashlight strain generated by the hitobject if sliders are considered.
537
+ */
538
+ flashlightStrainWithSliders: number;
539
+ /**
540
+ * The flashlight strain generated by the hitobject if sliders are not considered.
541
+ */
542
+ flashlightStrainWithoutSliders: number;
543
+ /**
544
+ * The visual strain generated by the hitobject if sliders are considered.
545
+ */
546
+ visualStrainWithSliders: number;
547
+ /**
548
+ * The visual strain generated by the hitobject if sliders are not considered.
549
+ */
550
+ visualStrainWithoutSliders: number;
551
+ /**
552
+ * The note density of the hitobject.
553
+ */
554
+ noteDensity: number;
555
+ /**
556
+ * The overlapping factor of the hitobject.
557
+ *
558
+ * This is used to scale visual skill.
559
+ */
560
+ overlappingFactor: number;
561
+ /**
562
+ * Adjusted preempt time of the hitobject, taking speed multiplier into account.
563
+ */
564
+ readonly timePreempt: number;
565
+ private readonly radiusBuffThreshold;
566
+ protected readonly mode = Modes.droid;
567
+ protected readonly maximumSliderRadius: number;
568
+ protected get scalingFactor(): number;
569
+ /**
570
+ * Note: You **must** call `computeProperties` at some point due to how TypeScript handles
571
+ * overridden properties (see [this](https://github.com/microsoft/TypeScript/issues/1617) GitHub issue.).
572
+ *
573
+ * @param object The underlying hitobject.
574
+ * @param lastObject The hitobject before this hitobject.
575
+ * @param lastLastObject The hitobject before the last hitobject.
576
+ * @param difficultyHitObjects All difficulty hitobjects in the processed beatmap.
577
+ * @param clockRate The clock rate of the beatmap.
578
+ * @param isForceAR Whether force AR is enabled.
579
+ */
580
+ constructor(object: PlaceableHitObject, lastObject: PlaceableHitObject | null, lastLastObject: PlaceableHitObject | null, difficultyHitObjects: readonly DifficultyHitObject[], clockRate: number, isForceAR: boolean);
581
+ computeProperties(clockRate: number, hitObjects: readonly PlaceableHitObject[]): void;
582
+ /**
583
+ * Determines whether this hitobject is considered overlapping with the hitobject before it.
584
+ *
585
+ * Keep in mind that "overlapping" in this case is overlapping to the point where both hitobjects
586
+ * can be hit with just a single tap in osu!droid.
587
+ *
588
+ * @param considerDistance Whether to consider the distance between both hitobjects.
589
+ * @returns Whether the hitobject is considered overlapping.
590
+ */
591
+ isOverlapping(considerDistance: boolean): boolean;
592
+ private setVisuals;
593
+ private applyToOverlappingFactor;
594
+ }
595
+
656
596
  /**
657
597
  * Represents the skill required to correctly aim at every object in the map with a uniform CircleSize and normalized distances.
658
598
  */
@@ -742,6 +682,16 @@ interface DroidDifficultyAttributes extends DifficultyAttributes {
742
682
  averageSpeedDeltaTime: number;
743
683
  }
744
684
 
685
+ /**
686
+ * Represents options for osu!droid difficulty calculation.
687
+ */
688
+ interface DroidDifficultyCalculationOptions extends DifficultyCalculationOptions {
689
+ /**
690
+ * Whether to calculate for old statistics (1.6.7 and older). Defaults to `false`.
691
+ */
692
+ readonly oldStatistics?: boolean;
693
+ }
694
+
745
695
  /**
746
696
  * Represents a beatmap section at which the strains of objects are considerably high.
747
697
  */
@@ -765,6 +715,10 @@ interface HighStrainSection {
765
715
  * as doing some analysis using the replay of a score.
766
716
  */
767
717
  interface ExtendedDroidDifficultyAttributes extends DroidDifficultyAttributes {
718
+ /**
719
+ * The mode of the difficulty calculation.
720
+ */
721
+ mode: "live";
768
722
  /**
769
723
  * Possible sections at which the player can use three fingers on.
770
724
  */
@@ -804,33 +758,34 @@ declare class DroidDifficultyCalculator extends DifficultyCalculator<DroidDiffic
804
758
  /**
805
759
  * The aim star rating of the beatmap.
806
760
  */
807
- aim: number;
761
+ get aim(): number;
808
762
  /**
809
763
  * The tap star rating of the beatmap.
810
764
  */
811
- tap: number;
765
+ get tap(): number;
812
766
  /**
813
767
  * The rhythm star rating of the beatmap.
814
768
  */
815
- rhythm: number;
769
+ get rhythm(): number;
816
770
  /**
817
771
  * The flashlight star rating of the beatmap.
818
772
  */
819
- flashlight: number;
773
+ get flashlight(): number;
820
774
  /**
821
775
  * The visual star rating of the beatmap.
822
776
  */
823
- visual: number;
777
+ get visual(): number;
824
778
  /**
825
779
  * The strain threshold to start detecting for possible three-fingered section.
826
780
  *
827
781
  * Increasing this number will result in less sections being flagged.
828
782
  */
829
- static readonly threeFingerStrainThreshold: number;
783
+ static readonly threeFingerStrainThreshold = 175;
830
784
  readonly attributes: ExtendedDroidDifficultyAttributes;
831
785
  get cacheableAttributes(): CacheableDifficultyAttributes<DroidDifficultyAttributes>;
832
- protected readonly difficultyMultiplier: number;
833
- protected readonly mode: Modes;
786
+ protected readonly difficultyMultiplier = 0.18;
787
+ protected readonly mode = Modes.droid;
788
+ calculate(options?: DroidDifficultyCalculationOptions): this;
834
789
  /**
835
790
  * Calculates the aim star rating of the beatmap and stores it in this instance.
836
791
  */
@@ -854,7 +809,8 @@ declare class DroidDifficultyCalculator extends DifficultyCalculator<DroidDiffic
854
809
  calculateTotal(): void;
855
810
  calculateAll(): void;
856
811
  toString(): string;
857
- protected preProcess(): void;
812
+ protected generateDifficultyHitObjects(beatmap: Beatmap): DroidDifficultyHitObject[];
813
+ protected computeDifficultyStatistics(options?: DroidDifficultyCalculationOptions): DifficultyStatisticsCalculatorResult<number, number, number, number>;
858
814
  protected createSkills(): DroidSkill[];
859
815
  /**
860
816
  * Called after aim skill calculation.
@@ -1404,6 +1360,72 @@ declare abstract class OsuSkill extends StrainSkill {
1404
1360
  difficultyValue(): number;
1405
1361
  }
1406
1362
 
1363
+ /**
1364
+ * Represents an osu!standard hit object with difficulty calculation values.
1365
+ */
1366
+ declare class OsuDifficultyHitObject extends DifficultyHitObject {
1367
+ /**
1368
+ * The speed strain generated by the hitobject.
1369
+ */
1370
+ speedStrain: number;
1371
+ /**
1372
+ * The flashlight strain generated by this hitobject.
1373
+ */
1374
+ flashlightStrain: number;
1375
+ private readonly radiusBuffThreshold;
1376
+ protected readonly mode = Modes.osu;
1377
+ protected get scalingFactor(): number;
1378
+ /**
1379
+ * Note: You **must** call `computeProperties` at some point due to how TypeScript handles
1380
+ * overridden properties (see [this](https://github.com/microsoft/TypeScript/issues/1617) GitHub issue.).
1381
+ *
1382
+ * @param object The underlying hitobject.
1383
+ * @param lastObject The hitobject before this hitobject.
1384
+ * @param lastLastObject The hitobject before the last hitobject.
1385
+ * @param difficultyHitObjects All difficulty hitobjects in the processed beatmap.
1386
+ * @param clockRate The clock rate of the beatmap.
1387
+ */
1388
+ constructor(object: PlaceableHitObject, lastObject: PlaceableHitObject | null, lastLastObject: PlaceableHitObject | null, difficultyHitObjects: readonly DifficultyHitObject[], clockRate: number);
1389
+ }
1390
+
1391
+ /**
1392
+ * Represents the skill required to correctly aim at every object in the map with a uniform CircleSize and normalized distances.
1393
+ */
1394
+ declare class OsuAim extends OsuSkill {
1395
+ protected readonly strainDecayBase: number;
1396
+ protected readonly reducedSectionCount: number;
1397
+ protected readonly reducedSectionBaseline: number;
1398
+ protected readonly decayWeight: number;
1399
+ private currentAimStrain;
1400
+ private readonly skillMultiplier;
1401
+ private readonly withSliders;
1402
+ constructor(mods: Mod[], withSliders: boolean);
1403
+ protected strainValueAt(current: OsuDifficultyHitObject): number;
1404
+ protected calculateInitialStrain(time: number, current: OsuDifficultyHitObject): number;
1405
+ /**
1406
+ * @param current The hitobject to save to.
1407
+ */
1408
+ protected saveToHitObject(current: OsuDifficultyHitObject): void;
1409
+ }
1410
+
1411
+ /**
1412
+ * An evaluator for calculating osu!standard Aim skill.
1413
+ */
1414
+ declare abstract class OsuAimEvaluator extends AimEvaluator {
1415
+ /**
1416
+ * Evaluates the difficulty of aiming the current object, based on:
1417
+ *
1418
+ * - cursor velocity to the current object,
1419
+ * - angle difficulty,
1420
+ * - sharp velocity increases,
1421
+ * - and slider difficulty.
1422
+ *
1423
+ * @param current The current object.
1424
+ * @param withSliders Whether to take slider difficulty into account.
1425
+ */
1426
+ static evaluateDifficultyOf(current: OsuDifficultyHitObject, withSliders: boolean): number;
1427
+ }
1428
+
1407
1429
  /**
1408
1430
  * Holds data that can be used to calculate osu!standard performance points.
1409
1431
  */
@@ -1421,19 +1443,19 @@ declare class OsuDifficultyCalculator extends DifficultyCalculator<OsuDifficulty
1421
1443
  /**
1422
1444
  * The aim star rating of the beatmap.
1423
1445
  */
1424
- aim: number;
1446
+ get aim(): number;
1425
1447
  /**
1426
1448
  * The speed star rating of the beatmap.
1427
1449
  */
1428
- speed: number;
1450
+ get speed(): number;
1429
1451
  /**
1430
1452
  * The flashlight star rating of the beatmap.
1431
1453
  */
1432
- flashlight: number;
1454
+ get flashlight(): number;
1433
1455
  readonly attributes: OsuDifficultyAttributes;
1434
1456
  get cacheableAttributes(): CacheableDifficultyAttributes<OsuDifficultyAttributes>;
1435
- protected readonly difficultyMultiplier: number;
1436
- protected readonly mode: Modes;
1457
+ protected readonly difficultyMultiplier = 0.0675;
1458
+ protected readonly mode = Modes.osu;
1437
1459
  /**
1438
1460
  * Calculates the aim star rating of the beatmap and stores it in this instance.
1439
1461
  */
@@ -1449,7 +1471,8 @@ declare class OsuDifficultyCalculator extends DifficultyCalculator<OsuDifficulty
1449
1471
  calculateTotal(): void;
1450
1472
  calculateAll(): void;
1451
1473
  toString(): string;
1452
- protected preProcess(): void;
1474
+ protected generateDifficultyHitObjects(): OsuDifficultyHitObject[];
1475
+ protected computeDifficultyStatistics(options?: DifficultyCalculationOptions): DifficultyStatisticsCalculatorResult<number, number, number, number>;
1453
1476
  protected createSkills(): OsuSkill[];
1454
1477
  /**
1455
1478
  * Called after aim skill calculation.
@@ -1476,69 +1499,6 @@ declare class OsuDifficultyCalculator extends DifficultyCalculator<OsuDifficulty
1476
1499
  private postCalculateFlashlight;
1477
1500
  }
1478
1501
 
1479
- /**
1480
- * A difficulty calculator that calculates for both osu!droid and osu!standard gamemode.
1481
- */
1482
- declare class MapStars {
1483
- /**
1484
- * The osu!droid difficulty calculator of the beatmap.
1485
- */
1486
- readonly droid: DroidDifficultyCalculator;
1487
- /**
1488
- * The osu!standard difficulty calculator of the beatmap.
1489
- */
1490
- readonly osu: OsuDifficultyCalculator;
1491
- /**
1492
- * Constructs this instance and calculates the given beatmap's osu!droid and osu!standard difficulty.
1493
- *
1494
- * @param beatmap The beatmap to calculate.
1495
- * @param options Options for the difficulty calculation.
1496
- */
1497
- constructor(beatmap: Beatmap, options?: DifficultyCalculationOptions);
1498
- /**
1499
- * Returns a string representative of the class.
1500
- */
1501
- toString(): string;
1502
- }
1503
-
1504
- /**
1505
- * Represents the skill required to correctly aim at every object in the map with a uniform CircleSize and normalized distances.
1506
- */
1507
- declare class OsuAim extends OsuSkill {
1508
- protected readonly strainDecayBase: number;
1509
- protected readonly reducedSectionCount: number;
1510
- protected readonly reducedSectionBaseline: number;
1511
- protected readonly decayWeight: number;
1512
- private currentAimStrain;
1513
- private readonly skillMultiplier;
1514
- private readonly withSliders;
1515
- constructor(mods: Mod[], withSliders: boolean);
1516
- protected strainValueAt(current: OsuDifficultyHitObject): number;
1517
- protected calculateInitialStrain(time: number, current: OsuDifficultyHitObject): number;
1518
- /**
1519
- * @param current The hitobject to save to.
1520
- */
1521
- protected saveToHitObject(current: OsuDifficultyHitObject): void;
1522
- }
1523
-
1524
- /**
1525
- * An evaluator for calculating osu!standard Aim skill.
1526
- */
1527
- declare abstract class OsuAimEvaluator extends AimEvaluator {
1528
- /**
1529
- * Evaluates the difficulty of aiming the current object, based on:
1530
- *
1531
- * - cursor velocity to the current object,
1532
- * - angle difficulty,
1533
- * - sharp velocity increases,
1534
- * - and slider difficulty.
1535
- *
1536
- * @param current The current object.
1537
- * @param withSliders Whether to take slider difficulty into account.
1538
- */
1539
- static evaluateDifficultyOf(current: OsuDifficultyHitObject, withSliders: boolean): number;
1540
- }
1541
-
1542
1502
  /**
1543
1503
  * Represents the skill required to memorize and hit every object in a beatmap with the Flashlight mod enabled.
1544
1504
  */
@@ -1636,16 +1596,16 @@ declare abstract class OsuRhythmEvaluator extends RhythmEvaluator {
1636
1596
  * Represents the skill required to press keys or tap with regards to keeping up with the speed at which objects need to be hit.
1637
1597
  */
1638
1598
  declare class OsuSpeed extends OsuSkill {
1639
- protected readonly strainDecayBase: number;
1640
- protected readonly reducedSectionCount: number;
1641
- protected readonly reducedSectionBaseline: number;
1642
- protected readonly difficultyMultiplier: number;
1643
- protected readonly decayWeight: number;
1599
+ protected readonly strainDecayBase = 0.3;
1600
+ protected readonly reducedSectionCount = 5;
1601
+ protected readonly reducedSectionBaseline = 0.75;
1602
+ protected readonly difficultyMultiplier = 1.04;
1603
+ protected readonly decayWeight = 0.9;
1644
1604
  private currentSpeedStrain;
1645
1605
  private currentRhythm;
1646
1606
  private readonly skillMultiplier;
1647
1607
  private readonly greatWindow;
1648
- constructor(mods: Mod[], greatWindow: number);
1608
+ constructor(mods: Mod[], overallDifficulty: number);
1649
1609
  /**
1650
1610
  * @param current The hitobject to calculate.
1651
1611
  */
@@ -1678,4 +1638,4 @@ declare abstract class OsuSpeedEvaluator extends SpeedEvaluator {
1678
1638
  static evaluateDifficultyOf(current: OsuDifficultyHitObject, greatWindow: number): number;
1679
1639
  }
1680
1640
 
1681
- export { AimEvaluator, type CacheableDifficultyAttributes, type CalculationOptions, type DifficultSlider, type DifficultyAttributes, type DifficultyCalculationOptions, DifficultyCalculator, DifficultyHitObject, DifficultyHitObjectCreator, DroidAim, DroidAimEvaluator, type DroidDifficultyAttributes, DroidDifficultyCalculator, DroidDifficultyHitObject, DroidFlashlight, DroidFlashlightEvaluator, DroidPerformanceCalculator, DroidRhythm, DroidRhythmEvaluator, DroidTap, DroidTapEvaluator, DroidVisual, DroidVisualEvaluator, type ExtendedDroidDifficultyAttributes, FlashlightEvaluator, type HighStrainSection, MapStars, OsuAim, OsuAimEvaluator, type OsuDifficultyAttributes, OsuDifficultyCalculator, OsuDifficultyHitObject, OsuFlashlight, OsuFlashlightEvaluator, OsuPerformanceCalculator, OsuRhythmEvaluator, OsuSpeed, OsuSpeedEvaluator, type PerformanceCalculationOptions, PerformanceCalculator, RhythmEvaluator, SpeedEvaluator, type StrainPeaks };
1641
+ export { AimEvaluator, type CacheableDifficultyAttributes, type DifficultSlider, type DifficultyAttributes, type DifficultyCalculationOptions, DifficultyCalculator, DifficultyHitObject, DroidAim, DroidAimEvaluator, type DroidDifficultyAttributes, type DroidDifficultyCalculationOptions, DroidDifficultyCalculator, DroidDifficultyHitObject, DroidFlashlight, DroidFlashlightEvaluator, DroidPerformanceCalculator, DroidRhythm, DroidRhythmEvaluator, DroidTap, DroidTapEvaluator, DroidVisual, DroidVisualEvaluator, type ExtendedDroidDifficultyAttributes, FlashlightEvaluator, type HighStrainSection, OsuAim, OsuAimEvaluator, type OsuDifficultyAttributes, OsuDifficultyCalculator, OsuDifficultyHitObject, OsuFlashlight, OsuFlashlightEvaluator, OsuPerformanceCalculator, OsuRhythmEvaluator, OsuSpeed, OsuSpeedEvaluator, type PerformanceCalculationOptions, PerformanceCalculator, RhythmEvaluator, SpeedEvaluator, type StrainPeaks };