@rian8337/osu-base 2.2.0 → 3.0.0-beta.0

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.
package/dist/index.js CHANGED
@@ -311,7 +311,9 @@ class APIRequestBuilder {
311
311
  })
312
312
  .on("complete", async (response) => {
313
313
  ++this.fetchAttempts;
314
- if (response.statusCode !== 200 && this.fetchAttempts < 5) {
314
+ const { statusCode } = response;
315
+ if ((statusCode === 500 || statusCode === 503) &&
316
+ this.fetchAttempts < 5) {
315
317
  console.error(`Request to ${url} failed; ${this.fetchAttempts} attempts so far; retrying`);
316
318
  await Utils.sleep(0.2);
317
319
  return resolve(this.sendRequest());
@@ -390,7 +392,7 @@ exports.objectTypes = void 0;
390
392
  })(exports.objectTypes || (exports.objectTypes = {}));
391
393
 
392
394
  /**
393
- * Based on `Vector2` class in C#.
395
+ * Represents a two-dimensional vector.
394
396
  */
395
397
  class Vector2 {
396
398
  /**
@@ -1305,11 +1307,10 @@ class DifficultyControlPoint extends ControlPoint {
1305
1307
  * This exists for backwards compatibility with maps that abuse NaN slider velocity behavior on osu!stable (e.g. /b/2628991).
1306
1308
  */
1307
1309
  generateTicks;
1308
- // Generate ticks can be made required in 3.0.
1309
1310
  constructor(values) {
1310
1311
  super(values);
1311
1312
  this.speedMultiplier = values.speedMultiplier;
1312
- this.generateTicks = values.generateTicks ?? true;
1313
+ this.generateTicks = values.generateTicks;
1313
1314
  }
1314
1315
  isRedundant(existing) {
1315
1316
  return (this.speedMultiplier === existing.speedMultiplier &&
@@ -1332,6 +1333,7 @@ class DifficultyControlPointManager extends ControlPointManager {
1332
1333
  defaultControlPoint = new DifficultyControlPoint({
1333
1334
  time: 0,
1334
1335
  speedMultiplier: 1,
1336
+ generateTicks: true,
1335
1337
  });
1336
1338
  controlPointAt(time) {
1337
1339
  return this.binarySearchWithFallback(time);
@@ -1725,7 +1727,12 @@ class Beatmap {
1725
1727
  * @param stats The statistics used for calculation.
1726
1728
  */
1727
1729
  maxDroidScore(stats) {
1728
- let scoreMultiplier = stats.mods.reduce((a, v) => a * v.droidScoreMultiplier, 1);
1730
+ let scoreMultiplier = 1;
1731
+ for (const mod of stats.mods) {
1732
+ if (mod.isApplicableToDroid()) {
1733
+ scoreMultiplier *= mod.droidScoreMultiplier;
1734
+ }
1735
+ }
1729
1736
  const { speedMultiplier } = stats;
1730
1737
  if (speedMultiplier >= 1) {
1731
1738
  scoreMultiplier *= 1 + (speedMultiplier - 1) * 0.24;
@@ -1770,7 +1777,12 @@ class Beatmap {
1770
1777
  maxOsuScore(mods = []) {
1771
1778
  const accumulatedDiffPoints = this.difficulty.cs + this.difficulty.hp + this.difficulty.od;
1772
1779
  let difficultyMultiplier = 2;
1773
- const scoreMultiplier = mods.reduce((a, v) => a * v.pcScoreMultiplier, 1);
1780
+ let scoreMultiplier = 1;
1781
+ for (const mod of mods) {
1782
+ if (mod.isApplicableToOsu()) {
1783
+ scoreMultiplier *= mod.pcScoreMultiplier;
1784
+ }
1785
+ }
1774
1786
  switch (true) {
1775
1787
  case accumulatedDiffPoints <= 5:
1776
1788
  difficultyMultiplier = 2;
@@ -2018,18 +2030,28 @@ class OsuHitWindow extends HitWindow {
2018
2030
  }
2019
2031
  }
2020
2032
 
2021
- // TODO: separate droid/PC mod implementations
2022
2033
  /**
2023
2034
  * Represents a mod.
2024
2035
  */
2025
2036
  class Mod {
2037
+ /**
2038
+ * Whether this mod can be applied to osu!droid.
2039
+ */
2040
+ isApplicableToDroid() {
2041
+ return "droidRanked" in this;
2042
+ }
2043
+ /**
2044
+ * Whether this mod can be applied to osu!standard.
2045
+ */
2046
+ isApplicableToOsu() {
2047
+ return "pcRanked" in this;
2048
+ }
2026
2049
  }
2027
2050
 
2028
2051
  /**
2029
2052
  * Represents the DoubleTime mod.
2030
2053
  */
2031
2054
  class ModDoubleTime extends Mod {
2032
- scoreMultiplier = 1.12;
2033
2055
  acronym = "DT";
2034
2056
  name = "DoubleTime";
2035
2057
  droidRanked = true;
@@ -2038,14 +2060,12 @@ class ModDoubleTime extends Mod {
2038
2060
  pcScoreMultiplier = 1.12;
2039
2061
  bitwise = 1 << 6;
2040
2062
  droidString = "d";
2041
- droidOnly = false;
2042
2063
  }
2043
2064
 
2044
2065
  /**
2045
2066
  * Represents the HalfTime mod.
2046
2067
  */
2047
2068
  class ModHalfTime extends Mod {
2048
- scoreMultiplier = 0.3;
2049
2069
  acronym = "HT";
2050
2070
  name = "HalfTime";
2051
2071
  droidRanked = true;
@@ -2054,14 +2074,12 @@ class ModHalfTime extends Mod {
2054
2074
  pcScoreMultiplier = 0.3;
2055
2075
  bitwise = 1 << 8;
2056
2076
  droidString = "t";
2057
- droidOnly = false;
2058
2077
  }
2059
2078
 
2060
2079
  /**
2061
2080
  * Represents the NightCore mod.
2062
2081
  */
2063
2082
  class ModNightCore extends Mod {
2064
- scoreMultiplier = 1.12;
2065
2083
  acronym = "NC";
2066
2084
  name = "NightCore";
2067
2085
  droidRanked = true;
@@ -2070,14 +2088,12 @@ class ModNightCore extends Mod {
2070
2088
  pcScoreMultiplier = 1.12;
2071
2089
  bitwise = 1 << 9;
2072
2090
  droidString = "c";
2073
- droidOnly = false;
2074
2091
  }
2075
2092
 
2076
2093
  /**
2077
2094
  * Represents the HardRock mod.
2078
2095
  */
2079
2096
  class ModHardRock extends Mod {
2080
- scoreMultiplier = 1.06;
2081
2097
  acronym = "HR";
2082
2098
  name = "HardRock";
2083
2099
  bitwise = 1 << 4;
@@ -2086,14 +2102,12 @@ class ModHardRock extends Mod {
2086
2102
  droidScoreMultiplier = 1.06;
2087
2103
  pcScoreMultiplier = 1.06;
2088
2104
  droidString = "r";
2089
- droidOnly = false;
2090
2105
  }
2091
2106
 
2092
2107
  /**
2093
2108
  * Represents the Easy mod.
2094
2109
  */
2095
2110
  class ModEasy extends Mod {
2096
- scoreMultiplier = 0.5;
2097
2111
  acronym = "EZ";
2098
2112
  name = "Easy";
2099
2113
  droidRanked = true;
@@ -2102,62 +2116,45 @@ class ModEasy extends Mod {
2102
2116
  pcScoreMultiplier = 0.5;
2103
2117
  bitwise = 1 << 1;
2104
2118
  droidString = "e";
2105
- droidOnly = false;
2106
2119
  }
2107
2120
 
2108
2121
  /**
2109
2122
  * Represents the Precise mod.
2110
2123
  */
2111
2124
  class ModPrecise extends Mod {
2112
- scoreMultiplier = 1.06;
2113
2125
  acronym = "PR";
2114
2126
  name = "Precise";
2115
2127
  droidRanked = true;
2116
- pcRanked = false;
2117
2128
  droidScoreMultiplier = 1.06;
2118
- pcScoreMultiplier = 1.06;
2119
- bitwise = Number.NaN;
2120
2129
  droidString = "s";
2121
- droidOnly = true;
2122
2130
  }
2123
2131
 
2124
2132
  /**
2125
2133
  * Represents the SmallCircle mod.
2126
2134
  */
2127
2135
  class ModSmallCircle extends Mod {
2128
- scoreMultiplier = 1.06;
2129
2136
  acronym = "SC";
2130
2137
  name = "SmallCircle";
2131
2138
  droidRanked = false;
2132
- pcRanked = false;
2133
2139
  droidScoreMultiplier = 1.06;
2134
- pcScoreMultiplier = 1;
2135
- bitwise = Number.NaN;
2136
2140
  droidString = "m";
2137
- droidOnly = true;
2138
2141
  }
2139
2142
 
2140
2143
  /**
2141
2144
  * Represents the ReallyEasy mod.
2142
2145
  */
2143
2146
  class ModReallyEasy extends Mod {
2144
- scoreMultiplier = 0.4;
2145
2147
  acronym = "RE";
2146
2148
  name = "ReallyEasy";
2147
2149
  droidRanked = false;
2148
- pcRanked = false;
2149
2150
  droidScoreMultiplier = 0.4;
2150
- pcScoreMultiplier = 0.4;
2151
- bitwise = Number.NaN;
2152
2151
  droidString = "l";
2153
- droidOnly = true;
2154
2152
  }
2155
2153
 
2156
2154
  /**
2157
2155
  * Represents the Auto mod.
2158
2156
  */
2159
2157
  class ModAuto extends Mod {
2160
- scoreMultiplier = 0;
2161
2158
  acronym = "AT";
2162
2159
  name = "Autoplay";
2163
2160
  droidRanked = false;
@@ -2166,14 +2163,12 @@ class ModAuto extends Mod {
2166
2163
  pcScoreMultiplier = 1;
2167
2164
  bitwise = 1 << 11;
2168
2165
  droidString = "a";
2169
- droidOnly = false;
2170
2166
  }
2171
2167
 
2172
2168
  /**
2173
2169
  * Represents the Autopilot mod.
2174
2170
  */
2175
2171
  class ModAutopilot extends Mod {
2176
- scoreMultiplier = 0;
2177
2172
  acronym = "AP";
2178
2173
  name = "Autopilot";
2179
2174
  droidRanked = false;
@@ -2182,14 +2177,12 @@ class ModAutopilot extends Mod {
2182
2177
  pcScoreMultiplier = 0;
2183
2178
  bitwise = 1 << 13;
2184
2179
  droidString = "p";
2185
- droidOnly = false;
2186
2180
  }
2187
2181
 
2188
2182
  /**
2189
2183
  * Represents the Flashlight mod.
2190
2184
  */
2191
2185
  class ModFlashlight extends Mod {
2192
- scoreMultiplier = 1.12;
2193
2186
  acronym = "FL";
2194
2187
  name = "Flashlight";
2195
2188
  droidRanked = false;
@@ -2198,7 +2191,6 @@ class ModFlashlight extends Mod {
2198
2191
  pcScoreMultiplier = 1.12;
2199
2192
  bitwise = 1 << 10;
2200
2193
  droidString = "i";
2201
- droidOnly = false;
2202
2194
  }
2203
2195
 
2204
2196
  /**
@@ -2207,7 +2199,6 @@ class ModFlashlight extends Mod {
2207
2199
  class ModHidden extends Mod {
2208
2200
  static fadeInDurationMultiplier = 0.4;
2209
2201
  static fadeOutDurationMultiplier = 0.3;
2210
- scoreMultiplier = 1.06;
2211
2202
  acronym = "HD";
2212
2203
  name = "Hidden";
2213
2204
  bitwise = 1 << 3;
@@ -2216,14 +2207,12 @@ class ModHidden extends Mod {
2216
2207
  droidScoreMultiplier = 1.06;
2217
2208
  pcScoreMultiplier = 1.06;
2218
2209
  droidString = "h";
2219
- droidOnly = false;
2220
2210
  }
2221
2211
 
2222
2212
  /**
2223
2213
  * Represents the NoFail mod.
2224
2214
  */
2225
2215
  class ModNoFail extends Mod {
2226
- scoreMultiplier = 0.5;
2227
2216
  acronym = "NF";
2228
2217
  name = "NoFail";
2229
2218
  droidRanked = true;
@@ -2232,14 +2221,12 @@ class ModNoFail extends Mod {
2232
2221
  pcScoreMultiplier = 0.5;
2233
2222
  bitwise = 1 << 0;
2234
2223
  droidString = "n";
2235
- droidOnly = false;
2236
2224
  }
2237
2225
 
2238
2226
  /**
2239
2227
  * Represents the Perfect mod.
2240
2228
  */
2241
2229
  class ModPerfect extends Mod {
2242
- scoreMultiplier = 1;
2243
2230
  acronym = "PF";
2244
2231
  name = "Perfect";
2245
2232
  droidRanked = false;
@@ -2248,14 +2235,12 @@ class ModPerfect extends Mod {
2248
2235
  pcScoreMultiplier = 1;
2249
2236
  bitwise = 1 << 14;
2250
2237
  droidString = "f";
2251
- droidOnly = false;
2252
2238
  }
2253
2239
 
2254
2240
  /**
2255
2241
  * Represents the Relax mod.
2256
2242
  */
2257
2243
  class ModRelax extends Mod {
2258
- scoreMultiplier = 0;
2259
2244
  acronym = "RX";
2260
2245
  name = "Relax";
2261
2246
  droidRanked = false;
@@ -2264,14 +2249,12 @@ class ModRelax extends Mod {
2264
2249
  pcScoreMultiplier = 0;
2265
2250
  bitwise = 1 << 7;
2266
2251
  droidString = "x";
2267
- droidOnly = false;
2268
2252
  }
2269
2253
 
2270
2254
  /**
2271
2255
  * Represents the ScoreV2 mod.
2272
2256
  */
2273
2257
  class ModScoreV2 extends Mod {
2274
- scoreMultiplier = 1;
2275
2258
  acronym = "V2";
2276
2259
  name = "ScoreV2";
2277
2260
  droidRanked = false;
@@ -2280,30 +2263,23 @@ class ModScoreV2 extends Mod {
2280
2263
  pcScoreMultiplier = 1;
2281
2264
  bitwise = 1 << 29;
2282
2265
  droidString = "v";
2283
- droidOnly = false;
2284
2266
  }
2285
2267
 
2286
2268
  /**
2287
2269
  * Represents the SpunOut mod.
2288
2270
  */
2289
2271
  class ModSpunOut extends Mod {
2290
- scoreMultiplier = 0.9;
2291
2272
  acronym = "SO";
2292
2273
  name = "SpunOut";
2293
- droidRanked = false;
2294
2274
  pcRanked = true;
2295
- droidScoreMultiplier = 0.9;
2296
2275
  pcScoreMultiplier = 0.9;
2297
2276
  bitwise = 1 << 12;
2298
- droidString = "";
2299
- droidOnly = false;
2300
2277
  }
2301
2278
 
2302
2279
  /**
2303
2280
  * Represents the SuddenDeath mod.
2304
2281
  */
2305
2282
  class ModSuddenDeath extends Mod {
2306
- scoreMultiplier = 1;
2307
2283
  acronym = "SD";
2308
2284
  name = "Sudden Death";
2309
2285
  droidRanked = false;
@@ -2312,23 +2288,17 @@ class ModSuddenDeath extends Mod {
2312
2288
  pcScoreMultiplier = 1;
2313
2289
  bitwise = 1 << 5;
2314
2290
  droidString = "u";
2315
- droidOnly = false;
2316
2291
  }
2317
2292
 
2318
2293
  /**
2319
2294
  * Represents the TouchDevice mod.
2320
2295
  */
2321
2296
  class ModTouchDevice extends Mod {
2322
- scoreMultiplier = 1;
2323
2297
  acronym = "TD";
2324
2298
  name = "TouchDevice";
2325
- droidRanked = true;
2326
2299
  pcRanked = true;
2327
- droidScoreMultiplier = 1;
2328
2300
  pcScoreMultiplier = 1;
2329
2301
  bitwise = 1 << 2;
2330
- droidString = "";
2331
- droidOnly = false;
2332
2302
  }
2333
2303
 
2334
2304
  /**
@@ -2393,7 +2363,8 @@ class ModUtil {
2393
2363
  * @param options Options for parsing behavior.
2394
2364
  */
2395
2365
  static droidStringToMods(str, options) {
2396
- return this.processParsingOptions(this.allMods.filter((m) => m.droidString && str.toLowerCase().includes(m.droidString)), options);
2366
+ return this.processParsingOptions(this.allMods.filter((m) => m.isApplicableToDroid() &&
2367
+ str.toLowerCase().includes(m.droidString)), options);
2397
2368
  }
2398
2369
  /**
2399
2370
  * Gets a list of mods from a PC modbits.
@@ -2402,7 +2373,7 @@ class ModUtil {
2402
2373
  * @param options Options for parsing behavior.
2403
2374
  */
2404
2375
  static pcModbitsToMods(modbits, options) {
2405
- return this.processParsingOptions(this.allMods.filter((m) => m.bitwise & modbits), options);
2376
+ return this.processParsingOptions(this.allMods.filter((m) => m.isApplicableToOsu() && m.bitwise & modbits), options);
2406
2377
  }
2407
2378
  /**
2408
2379
  * Gets a list of mods from a PC mod string, such as "HDHR".