isaacscript-common 81.0.5 → 82.0.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.
@@ -1,5 +1,5 @@
1
- import { BossID, LevelStage, StageType } from "isaac-typescript-definitions";
2
- import { BOSS_IDS } from "../arrays/cachedEnumValues";
1
+ import { BossID, LevelStage, StageID } from "isaac-typescript-definitions";
2
+ import { BOSS_ID_VALUES } from "../arrays/cachedEnumValues";
3
3
  import { combineSets } from "../functions/set";
4
4
  import { isStoryBossID } from "../functions/storyBosses";
5
5
  import { ReadonlyMap } from "../types/ReadonlyMap";
@@ -11,7 +11,7 @@ import { ReadonlySet } from "../types/ReadonlySet";
11
11
  // We use sets of strings instead of tuples for these data structures because TypeScript/Lua does
12
12
  // not have real tuples. If we store bosses as tuples, then we cannot do a set lookup in O(1).
13
13
 
14
- /** Contains just the bosses in Basement (not e.g. Burning Basement). */
14
+ /** For `StageID.BASEMENT` (1). */
15
15
  const BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
16
16
  BossID.MONSTRO, // 1
17
17
  BossID.LARRY_JR, // 2
@@ -30,7 +30,7 @@ const BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
30
30
  BossID.BABY_PLUM, // 84 (added in Repentance)
31
31
  ]);
32
32
 
33
- /** Contains just the bosses in Cellar (not e.g. Burning Basement). */
33
+ /** For `StageID.CELLAR` (2). */
34
34
  const CELLAR_BOSSES_SET = new ReadonlySet<BossID>([
35
35
  BossID.FAMINE, // 9
36
36
  BossID.DUKE_OF_FLIES, // 13
@@ -46,7 +46,7 @@ const CELLAR_BOSSES_SET = new ReadonlySet<BossID>([
46
46
  BossID.BABY_PLUM, // 84 (added in Repentance)
47
47
  ]);
48
48
 
49
- /** Contains just the bosses in Burning Basement (not e.g. Cellar). */
49
+ /** For `StageID.BURNING_BASEMENT` (3). */
50
50
  const BURNING_BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
51
51
  BossID.MONSTRO, // 1
52
52
  BossID.LARRY_JR, // 2
@@ -66,7 +66,7 @@ const BURNING_BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
66
66
  BossID.BABY_PLUM, // 84 (added in Repentance)
67
67
  ]);
68
68
 
69
- /** Contains just the bosses in Downpour (not e.g. Burning Basement). */
69
+ /** For `StageID.DOWNPOUR` (27). */
70
70
  const DOWNPOUR_BOSSES_SET = new ReadonlySet<BossID>([
71
71
  BossID.LIL_BLUB, // 75
72
72
  BossID.WORMWOOD, // 76
@@ -74,7 +74,7 @@ const DOWNPOUR_BOSSES_SET = new ReadonlySet<BossID>([
74
74
  BossID.MIN_MIN, // 91
75
75
  ]);
76
76
 
77
- /** Contains just the bosses in Dross (not e.g. Burning Basement). */
77
+ /** For `StageID.DROSS` (28). */
78
78
  const DROSS_BOSSES_SET = new ReadonlySet<BossID>([
79
79
  BossID.LIL_BLUB, // 75
80
80
  BossID.WORMWOOD, // 76
@@ -83,7 +83,7 @@ const DROSS_BOSSES_SET = new ReadonlySet<BossID>([
83
83
  BossID.TURDLET, // 97
84
84
  ]);
85
85
 
86
- /** The set of unique bosses for Basement, Cellar, and so on. */
86
+ /** The set of unique bosses for Basement, Cellar, Burning Basement, Downpour, and Dross. */
87
87
  const ALL_BASEMENT_BOSSES_SET: ReadonlySet<BossID> = combineSets(
88
88
  BASEMENT_BOSSES_SET,
89
89
  CELLAR_BOSSES_SET,
@@ -92,18 +92,7 @@ const ALL_BASEMENT_BOSSES_SET: ReadonlySet<BossID> = combineSets(
92
92
  DROSS_BOSSES_SET,
93
93
  );
94
94
 
95
- const BASEMENT_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
96
- StageType,
97
- ReadonlySet<BossID>
98
- >([
99
- [StageType.ORIGINAL, BASEMENT_BOSSES_SET],
100
- [StageType.WRATH_OF_THE_LAMB, CELLAR_BOSSES_SET],
101
- [StageType.AFTERBIRTH, BURNING_BASEMENT_BOSSES_SET],
102
- [StageType.REPENTANCE, DOWNPOUR_BOSSES_SET],
103
- [StageType.REPENTANCE_B, DROSS_BOSSES_SET],
104
- ]);
105
-
106
- /** Contains just the bosses in Caves (not e.g. Flooded Caves). */
95
+ /** For `StageID.CAVES` (4). */
107
96
  const CAVES_BOSSES_SET = new ReadonlySet<BossID>([
108
97
  BossID.CHUB, // 3
109
98
  BossID.GURDY, // 4
@@ -125,7 +114,7 @@ const CAVES_BOSSES_SET = new ReadonlySet<BossID>([
125
114
  BossID.BUMBINO, // 94 (added in Repentance)
126
115
  ]);
127
116
 
128
- /** Contains just the bosses in Catacombs (not e.g. Flooded Caves). */
117
+ /** For `StageID.CATACOMBS` (5). */
129
118
  const CATACOMBS_BOSSES_SET = new ReadonlySet<BossID>([
130
119
  BossID.PESTILENCE, // 10
131
120
  BossID.PEEP, // 14
@@ -146,7 +135,7 @@ const CATACOMBS_BOSSES_SET = new ReadonlySet<BossID>([
146
135
  BossID.BUMBINO, // 94 (added in Repentance)
147
136
  ]);
148
137
 
149
- /** Contains just the bosses in Flooded Caves (not e.g. Catacombs). */
138
+ /** For `StageID.FLOODED_CAVES` (6). */
150
139
  const FLOODED_CAVES_BOSSES_SET = new ReadonlySet<BossID>([
151
140
  BossID.CHUB, // 3
152
141
  BossID.GURDY, // 4
@@ -169,7 +158,7 @@ const FLOODED_CAVES_BOSSES_SET = new ReadonlySet<BossID>([
169
158
  BossID.BUMBINO, // 94 (added in Repentance)
170
159
  ]);
171
160
 
172
- /** Contains just the bosses in Mines (not e.g. Flooded Caves). */
161
+ /** For `StageID.MINES` (29). */
173
162
  const MINES_BOSSES_SET = new ReadonlySet<BossID>([
174
163
  BossID.REAP_CREEP, // 74
175
164
  BossID.TUFF_TWINS, // 80
@@ -177,7 +166,7 @@ const MINES_BOSSES_SET = new ReadonlySet<BossID>([
177
166
  BossID.GREAT_GIDEON, // 83
178
167
  ]);
179
168
 
180
- /** Contains just the bosses in Ashpit (not e.g. Flooded Caves). */
169
+ /** For `StageID.ASHPIT` (30). */
181
170
  const ASHPIT_BOSSES_SET = new ReadonlySet<BossID>([
182
171
  BossID.PILE, // 73
183
172
  BossID.GREAT_GIDEON, // 83
@@ -186,7 +175,7 @@ const ASHPIT_BOSSES_SET = new ReadonlySet<BossID>([
186
175
  BossID.CLUTCH, // 102
187
176
  ]);
188
177
 
189
- /** The set of unique bosses for Caves, Catacombs, and so on. */
178
+ /** The set of unique bosses for Caves, Catacombs, Flooded Caves, Mines, and Ashpit. */
190
179
  const ALL_CAVES_BOSSES_SET: ReadonlySet<BossID> = combineSets(
191
180
  CAVES_BOSSES_SET,
192
181
  CATACOMBS_BOSSES_SET,
@@ -195,19 +184,8 @@ const ALL_CAVES_BOSSES_SET: ReadonlySet<BossID> = combineSets(
195
184
  ASHPIT_BOSSES_SET,
196
185
  );
197
186
 
198
- const CAVES_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
199
- StageType,
200
- ReadonlySet<BossID>
201
- >([
202
- [StageType.ORIGINAL, CAVES_BOSSES_SET],
203
- [StageType.WRATH_OF_THE_LAMB, CATACOMBS_BOSSES_SET],
204
- [StageType.AFTERBIRTH, FLOODED_CAVES_BOSSES_SET],
205
- [StageType.REPENTANCE, MINES_BOSSES_SET],
206
- [StageType.REPENTANCE_B, ASHPIT_BOSSES_SET],
207
- ]);
208
-
209
187
  /**
210
- * Contains just the bosses in Depths (not e.g. Dank Depths).
188
+ * For `StageID.DEPTHS` (7).
211
189
  *
212
190
  * Note that this set includes Mom, even though they are not technically in the boss pool.
213
191
  */
@@ -228,7 +206,7 @@ const DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
228
206
  ]);
229
207
 
230
208
  /**
231
- * Contains just the bosses in Necropolis (not e.g. Dank Depths).
209
+ * For `StageID.NECROPOLIS` (8).
232
210
  *
233
211
  * Note that this set includes Mom, even though they are not technically in the boss pool.
234
212
  */
@@ -248,7 +226,7 @@ const NECROPOLIS_BOSSES_SET = new ReadonlySet<BossID>([
248
226
  ]);
249
227
 
250
228
  /**
251
- * Contains just the bosses in Dank Depths (not e.g. Necropolis).
229
+ * For `StageID.DANK_DEPTHS` (9).
252
230
  *
253
231
  * Note that this set includes Mom, even though they are not technically in the boss pool.
254
232
  */
@@ -269,7 +247,7 @@ const DANK_DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
269
247
  ]);
270
248
 
271
249
  /**
272
- * Contains just the bosses in Mausoleum (not e.g. Dank Depths).
250
+ * For `StageID.MAUSOLEUM` (31).
273
251
  *
274
252
  * Note that this set includes Mausoleum Mom, even though they are not technically in the boss pool.
275
253
  */
@@ -280,7 +258,7 @@ const MAUSOLEUM_BOSSES_SET = new ReadonlySet<BossID>([
280
258
  ]);
281
259
 
282
260
  /**
283
- * Contains just the bosses in Gehenna (not e.g. Dank Depths).
261
+ * For `StageID.GEHENNA` (32).
284
262
  *
285
263
  * Note that this set includes Mausoleum Mom, even though they are not technically in the boss pool.
286
264
  */
@@ -290,7 +268,7 @@ const GEHENNA_BOSSES_SET = new ReadonlySet<BossID>([
290
268
  BossID.HORNY_BOYS, // 101
291
269
  ]);
292
270
 
293
- /** The set of unique bosses for Depths, Necropolis, and so on. */
271
+ /** The set of unique bosses for Depths, Necropolis, Dank Depths, Mausoleum, and Gehenna. */
294
272
  const ALL_DEPTHS_BOSSES_SET: ReadonlySet<BossID> = combineSets(
295
273
  DEPTHS_BOSSES_SET,
296
274
  NECROPOLIS_BOSSES_SET,
@@ -299,19 +277,8 @@ const ALL_DEPTHS_BOSSES_SET: ReadonlySet<BossID> = combineSets(
299
277
  GEHENNA_BOSSES_SET,
300
278
  );
301
279
 
302
- const DEPTHS_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
303
- StageType,
304
- ReadonlySet<BossID>
305
- >([
306
- [StageType.ORIGINAL, DEPTHS_BOSSES_SET],
307
- [StageType.WRATH_OF_THE_LAMB, NECROPOLIS_BOSSES_SET],
308
- [StageType.AFTERBIRTH, DANK_DEPTHS_BOSSES_SET],
309
- [StageType.REPENTANCE, MAUSOLEUM_BOSSES_SET],
310
- [StageType.REPENTANCE_B, GEHENNA_BOSSES_SET],
311
- ]);
312
-
313
280
  /**
314
- * Contains just the bosses in Womb (not e.g. Scarred Womb).
281
+ * For `StageID.WOMB` (10).
315
282
  *
316
283
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
317
284
  * boss pool.
@@ -337,7 +304,7 @@ const WOMB_BOSSES_SET = new ReadonlySet<BossID>([
337
304
  ]);
338
305
 
339
306
  /**
340
- * Contains just the bosses in Utero (not e.g. Scarred Womb).
307
+ * For `StageID.UTERO` (11).
341
308
  *
342
309
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
343
310
  * boss pool.
@@ -362,7 +329,7 @@ const UTERO_BOSSES_SET = new ReadonlySet<BossID>([
362
329
  ]);
363
330
 
364
331
  /**
365
- * Contains just the bosses in Scarred Womb (not e.g. Utero).
332
+ * For `StageID.SCARRED_WOMB` (12).
366
333
  *
367
334
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
368
335
  * boss pool.
@@ -388,9 +355,9 @@ const SCARRED_WOMB_BOSSES_SET = new ReadonlySet<BossID>([
388
355
  ]);
389
356
 
390
357
  /**
391
- * Contains just the bosses in Corpse (not e.g. Scarred Womb).
358
+ * For `StageID.CORPSE` (33).
392
359
  *
393
- * Note that this set includes Mother, even though they are not technically in the boss pool.
360
+ * Note that this set includes Mother, even though she is not technically in the boss pool.
394
361
  */
395
362
  const CORPSE_BOSSES_SET = new ReadonlySet<BossID>([
396
363
  BossID.SCOURGE, // 85
@@ -399,7 +366,7 @@ const CORPSE_BOSSES_SET = new ReadonlySet<BossID>([
399
366
  BossID.MOTHER, // 88
400
367
  ]);
401
368
 
402
- /** The set of unique bosses for Womb, Utero, and so on. */
369
+ /** The set of unique bosses for Womb, Utero, Scarred Womb, and Corpse. */
403
370
  const ALL_WOMB_BOSSES_SET: ReadonlySet<BossID> = combineSets(
404
371
  WOMB_BOSSES_SET,
405
372
  UTERO_BOSSES_SET,
@@ -407,28 +374,14 @@ const ALL_WOMB_BOSSES_SET: ReadonlySet<BossID> = combineSets(
407
374
  CORPSE_BOSSES_SET,
408
375
  );
409
376
 
410
- const WOMB_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
411
- StageType,
412
- ReadonlySet<BossID>
413
- >([
414
- [StageType.ORIGINAL, WOMB_BOSSES_SET],
415
- [StageType.WRATH_OF_THE_LAMB, UTERO_BOSSES_SET],
416
- [StageType.AFTERBIRTH, SCARRED_WOMB_BOSSES_SET],
417
- [StageType.REPENTANCE, CORPSE_BOSSES_SET],
418
- ]);
419
-
420
377
  const BLUE_WOMB_BOSSES_SET = new ReadonlySet<BossID>([
421
378
  BossID.HUSH, // 63
422
379
  ]);
423
380
 
424
- const BLUE_WOMB_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
425
- StageType,
426
- ReadonlySet<BossID>
427
- >([[StageType.ORIGINAL, BLUE_WOMB_BOSSES_SET]]);
428
-
429
381
  const SHEOL_BOSSES_SET = new ReadonlySet<BossID>([
430
382
  BossID.SATAN, // 24
431
383
  ]);
384
+
432
385
  const CATHEDRAL_BOSSES_SET = new ReadonlySet<BossID>([
433
386
  BossID.ISAAC, // 39
434
387
  ]);
@@ -438,14 +391,6 @@ const ALL_STAGE_10_BOSSES_SET: ReadonlySet<BossID> = combineSets(
438
391
  CATHEDRAL_BOSSES_SET,
439
392
  );
440
393
 
441
- const STAGE_10_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
442
- StageType,
443
- ReadonlySet<BossID>
444
- >([
445
- [StageType.ORIGINAL, SHEOL_BOSSES_SET],
446
- [StageType.WRATH_OF_THE_LAMB, CATHEDRAL_BOSSES_SET],
447
- ]);
448
-
449
394
  /**
450
395
  * Note that this set includes Mega Satan, even though they are not technically in the boss pool.
451
396
  */
@@ -467,48 +412,50 @@ const ALL_STAGE_11_BOSSES_SET: ReadonlySet<BossID> = combineSets(
467
412
  CHEST_BOSSES_SET,
468
413
  );
469
414
 
470
- const STAGE_11_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
471
- StageType,
472
- ReadonlySet<BossID>
473
- >([
474
- [StageType.ORIGINAL, DARK_ROOM_BOSSES_SET],
475
- [StageType.WRATH_OF_THE_LAMB, CHEST_BOSSES_SET],
476
- ]);
477
-
478
415
  const VOID_BOSSES_SET = new ReadonlySet<BossID>([
479
416
  BossID.DELIRIUM, // 70
480
417
  ]);
481
418
 
482
- const VOID_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
483
- StageType,
484
- ReadonlySet<BossID>
485
- >([[StageType.ORIGINAL, VOID_BOSSES_SET]]);
486
-
487
- /** Note that this does not include Ultra Famine, Ultra Pestilence, Ultra War, and Ultra Death. */
419
+ /**
420
+ * Includes Dogma and The Beast. Does not include Ultra Famine, Ultra Pestilence, Ultra War, and
421
+ * Ultra Death (since they do not have boss IDs).
422
+ */
488
423
  const HOME_BOSSES_SET = new ReadonlySet<BossID>([BossID.DOGMA, BossID.BEAST]);
489
424
 
490
- const HOME_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
491
- StageType,
425
+ export const STAGE_ID_TO_BOSS_SET_MAP = new ReadonlyMap<
426
+ StageID,
492
427
  ReadonlySet<BossID>
493
- >([[StageType.ORIGINAL, HOME_BOSSES_SET]]);
494
-
495
- export const STAGE_TO_STAGE_TYPE_TO_BOSS_SET_MAP = new ReadonlyMap<
496
- LevelStage,
497
- ReadonlyMap<int, ReadonlySet<BossID>>
498
428
  >([
499
- [LevelStage.BASEMENT_1, BASEMENT_STAGE_TYPE_TO_BOSS_SET_MAP], // 1
500
- [LevelStage.BASEMENT_2, BASEMENT_STAGE_TYPE_TO_BOSS_SET_MAP], // 2
501
- [LevelStage.CAVES_1, CAVES_STAGE_TYPE_TO_BOSS_SET_MAP], // 3
502
- [LevelStage.CAVES_2, CAVES_STAGE_TYPE_TO_BOSS_SET_MAP], // 4
503
- [LevelStage.DEPTHS_1, DEPTHS_STAGE_TYPE_TO_BOSS_SET_MAP], // 5
504
- [LevelStage.DEPTHS_2, DEPTHS_STAGE_TYPE_TO_BOSS_SET_MAP], // 6
505
- [LevelStage.WOMB_1, WOMB_STAGE_TYPE_TO_BOSS_SET_MAP], // 7
506
- [LevelStage.WOMB_2, WOMB_STAGE_TYPE_TO_BOSS_SET_MAP], // 8
507
- [LevelStage.BLUE_WOMB, BLUE_WOMB_STAGE_TYPE_TO_BOSS_SET_MAP], // 9
508
- [LevelStage.SHEOL_CATHEDRAL, STAGE_10_STAGE_TYPE_TO_BOSS_SET_MAP], // 10
509
- [LevelStage.DARK_ROOM_CHEST, STAGE_11_STAGE_TYPE_TO_BOSS_SET_MAP], // 11
510
- [LevelStage.VOID, VOID_STAGE_TYPE_TO_BOSS_SET_MAP], // 12
511
- [LevelStage.HOME, HOME_STAGE_TYPE_TO_BOSS_SET_MAP], // 13
429
+ [StageID.BASEMENT, BASEMENT_BOSSES_SET], // 1
430
+ [StageID.CELLAR, CELLAR_BOSSES_SET], // 2
431
+ [StageID.BURNING_BASEMENT, BURNING_BASEMENT_BOSSES_SET], // 3
432
+ [StageID.DOWNPOUR, DOWNPOUR_BOSSES_SET], // 27
433
+ [StageID.DROSS, DROSS_BOSSES_SET], // 28
434
+
435
+ [StageID.CAVES, CAVES_BOSSES_SET], // 4
436
+ [StageID.CATACOMBS, CATACOMBS_BOSSES_SET], // 5
437
+ [StageID.FLOODED_CAVES, FLOODED_CAVES_BOSSES_SET], // 6
438
+ [StageID.MINES, MINES_BOSSES_SET], // 29
439
+ [StageID.ASHPIT, ASHPIT_BOSSES_SET], // 30
440
+
441
+ [StageID.DEPTHS, DEPTHS_BOSSES_SET], // 7
442
+ [StageID.NECROPOLIS, NECROPOLIS_BOSSES_SET], // 8
443
+ [StageID.DANK_DEPTHS, DANK_DEPTHS_BOSSES_SET], // 9
444
+ [StageID.MAUSOLEUM, MAUSOLEUM_BOSSES_SET], // 31
445
+ [StageID.GEHENNA, GEHENNA_BOSSES_SET], // 32
446
+
447
+ [StageID.WOMB, WOMB_BOSSES_SET], // 10
448
+ [StageID.UTERO, UTERO_BOSSES_SET], // 11
449
+ [StageID.SCARRED_WOMB, SCARRED_WOMB_BOSSES_SET], // 12
450
+ [StageID.CORPSE, CORPSE_BOSSES_SET], // 33
451
+
452
+ [StageID.BLUE_WOMB, BLUE_WOMB_BOSSES_SET], // 13
453
+ [StageID.SHEOL, SHEOL_BOSSES_SET], // 14
454
+ [StageID.CATHEDRAL, CATHEDRAL_BOSSES_SET], // 15
455
+ [StageID.DARK_ROOM, DARK_ROOM_BOSSES_SET], // 16
456
+ [StageID.CHEST, CHEST_BOSSES_SET], // 17
457
+ [StageID.VOID, VOID_BOSSES_SET], // 26
458
+ [StageID.HOME, HOME_BOSSES_SET], // 35
512
459
  ]);
513
460
 
514
461
  export const STAGE_TO_COMBINED_BOSS_SET_MAP = new ReadonlyMap<
@@ -531,9 +478,26 @@ export const STAGE_TO_COMBINED_BOSS_SET_MAP = new ReadonlyMap<
531
478
  ]);
532
479
 
533
480
  export const ALL_BOSSES_SET = new ReadonlySet<BossID>(
534
- BOSS_IDS.filter((bossID) => bossID !== BossID.RAGLICH),
481
+ BOSS_ID_VALUES.filter((bossID) => bossID !== BossID.RAGLICH),
535
482
  );
536
483
 
537
484
  export const ALL_BOSSES_EXCLUDING_STORY_BOSSES_SET = new ReadonlySet(
538
485
  [...ALL_BOSSES_SET].filter((bossID) => !isStoryBossID(bossID)),
539
486
  );
487
+
488
+ export const BOSS_ID_TO_STAGE_IDS = (() => {
489
+ const bossIDsToStageIDs: Partial<Record<BossID, Set<StageID>>> = {};
490
+
491
+ for (const bossID of BOSS_ID_VALUES) {
492
+ const stageIDs = new Set<StageID>();
493
+ for (const [stageID, bossSet] of STAGE_ID_TO_BOSS_SET_MAP) {
494
+ if (bossSet.has(bossID)) {
495
+ stageIDs.add(stageID);
496
+ }
497
+ }
498
+
499
+ bossIDsToStageIDs[bossID] = stageIDs;
500
+ }
501
+
502
+ return bossIDsToStageIDs as Readonly<Record<BossID, ReadonlySet<StageID>>>;
503
+ })();