isaacscript-common 82.0.2 → 83.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,18 +1,17 @@
1
1
  import { BossID, LevelStage, StageID } from "isaac-typescript-definitions";
2
2
  import { BOSS_ID_VALUES } from "../arrays/cachedEnumValues";
3
- import { combineSets } from "../functions/set";
4
3
  import { isStoryBossID } from "../functions/storyBosses";
5
4
  import { ReadonlyMap } from "../types/ReadonlyMap";
6
5
  import { ReadonlySet } from "../types/ReadonlySet";
7
6
 
8
- // The "bosspools.xml" file does not actually correspond to the real boss pools, so these sets were
9
- // determined through experimentation on v1.7.8a.
7
+ // The "bosspools.xml" file does not actually correspond to the real boss pools, so these data
8
+ // structures were determined through experimentation on v1.7.8a.
10
9
 
11
10
  // We use sets of strings instead of tuples for these data structures because TypeScript/Lua does
12
11
  // not have real tuples. If we store bosses as tuples, then we cannot do a set lookup in O(1).
13
12
 
14
13
  /** For `StageID.BASEMENT` (1). */
15
- const BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
14
+ const BASEMENT_BOSSES = [
16
15
  BossID.MONSTRO, // 1
17
16
  BossID.LARRY_JR, // 2
18
17
  BossID.FAMINE, // 9
@@ -28,10 +27,10 @@ const BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
28
27
  BossID.DANGLE, // 64
29
28
  BossID.TURDLING, // 65
30
29
  BossID.BABY_PLUM, // 84 (added in Repentance)
31
- ]);
30
+ ] as const;
32
31
 
33
32
  /** For `StageID.CELLAR` (2). */
34
- const CELLAR_BOSSES_SET = new ReadonlySet<BossID>([
33
+ const CELLAR_BOSSES = [
35
34
  BossID.FAMINE, // 9
36
35
  BossID.DUKE_OF_FLIES, // 13
37
36
  // - `BossID.FISTULA` (18) was removed in Repentance.
@@ -44,10 +43,10 @@ const CELLAR_BOSSES_SET = new ReadonlySet<BossID>([
44
43
  BossID.LITTLE_HORN, // 60
45
44
  BossID.RAG_MAN, // 61
46
45
  BossID.BABY_PLUM, // 84 (added in Repentance)
47
- ]);
46
+ ] as const;
48
47
 
49
48
  /** For `StageID.BURNING_BASEMENT` (3). */
50
- const BURNING_BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
49
+ const BURNING_BASEMENT_BOSSES = [
51
50
  BossID.MONSTRO, // 1
52
51
  BossID.LARRY_JR, // 2
53
52
  BossID.FAMINE, // 9
@@ -64,36 +63,36 @@ const BURNING_BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
64
63
  BossID.DANGLE, // 64 (added in Repentance)
65
64
  BossID.TURDLING, // 65 (added in Repentance)
66
65
  BossID.BABY_PLUM, // 84 (added in Repentance)
67
- ]);
66
+ ] as const;
68
67
 
69
68
  /** For `StageID.DOWNPOUR` (27). */
70
- const DOWNPOUR_BOSSES_SET = new ReadonlySet<BossID>([
69
+ const DOWNPOUR_BOSSES = [
71
70
  BossID.LIL_BLUB, // 75
72
71
  BossID.WORMWOOD, // 76
73
72
  BossID.RAINMAKER, // 77
74
73
  BossID.MIN_MIN, // 91
75
- ]);
74
+ ] as const;
76
75
 
77
76
  /** For `StageID.DROSS` (28). */
78
- const DROSS_BOSSES_SET = new ReadonlySet<BossID>([
77
+ const DROSS_BOSSES = [
79
78
  BossID.LIL_BLUB, // 75
80
79
  BossID.WORMWOOD, // 76
81
80
  BossID.CLOG, // 92
82
81
  BossID.COLOSTOMIA, // 95
83
82
  BossID.TURDLET, // 97
84
- ]);
83
+ ] as const;
85
84
 
86
85
  /** The set of unique bosses for Basement, Cellar, Burning Basement, Downpour, and Dross. */
87
- const ALL_BASEMENT_BOSSES_SET: ReadonlySet<BossID> = combineSets(
88
- BASEMENT_BOSSES_SET,
89
- CELLAR_BOSSES_SET,
90
- BURNING_BASEMENT_BOSSES_SET,
91
- DOWNPOUR_BOSSES_SET,
92
- DROSS_BOSSES_SET,
93
- );
86
+ const ALL_BASEMENT_BOSSES_SET = new ReadonlySet<BossID>([
87
+ ...BASEMENT_BOSSES,
88
+ ...CELLAR_BOSSES,
89
+ ...BURNING_BASEMENT_BOSSES,
90
+ ...DOWNPOUR_BOSSES,
91
+ ...DROSS_BOSSES,
92
+ ]);
94
93
 
95
94
  /** For `StageID.CAVES` (4). */
96
- const CAVES_BOSSES_SET = new ReadonlySet<BossID>([
95
+ const CAVES_BOSSES = [
97
96
  BossID.CHUB, // 3
98
97
  BossID.GURDY, // 4
99
98
  BossID.PESTILENCE, // 10
@@ -112,10 +111,10 @@ const CAVES_BOSSES_SET = new ReadonlySet<BossID>([
112
111
  BossID.RAG_MEGA, // 67
113
112
  BossID.BIG_HORN, // 69
114
113
  BossID.BUMBINO, // 94 (added in Repentance)
115
- ]);
114
+ ] as const;
116
115
 
117
116
  /** For `StageID.CATACOMBS` (5). */
118
- const CATACOMBS_BOSSES_SET = new ReadonlySet<BossID>([
117
+ const CATACOMBS_BOSSES = [
119
118
  BossID.PESTILENCE, // 10
120
119
  BossID.PEEP, // 14
121
120
  BossID.HEADLESS_HORSEMAN, // 22
@@ -133,10 +132,10 @@ const CATACOMBS_BOSSES_SET = new ReadonlySet<BossID>([
133
132
  BossID.RAG_MEGA, // 67
134
133
  BossID.BIG_HORN, // 69
135
134
  BossID.BUMBINO, // 94 (added in Repentance)
136
- ]);
135
+ ] as const;
137
136
 
138
137
  /** For `StageID.FLOODED_CAVES` (6). */
139
- const FLOODED_CAVES_BOSSES_SET = new ReadonlySet<BossID>([
138
+ const FLOODED_CAVES_BOSSES = [
140
139
  BossID.CHUB, // 3
141
140
  BossID.GURDY, // 4
142
141
  BossID.PESTILENCE, // 10
@@ -156,40 +155,40 @@ const FLOODED_CAVES_BOSSES_SET = new ReadonlySet<BossID>([
156
155
  BossID.RAG_MEGA, // 67
157
156
  BossID.BIG_HORN, // 69
158
157
  BossID.BUMBINO, // 94 (added in Repentance)
159
- ]);
158
+ ] as const;
160
159
 
161
160
  /** For `StageID.MINES` (29). */
162
- const MINES_BOSSES_SET = new ReadonlySet<BossID>([
161
+ const MINES_BOSSES = [
163
162
  BossID.REAP_CREEP, // 74
164
163
  BossID.TUFF_TWINS, // 80
165
164
  BossID.HORNFEL, // 82
166
165
  BossID.GREAT_GIDEON, // 83
167
- ]);
166
+ ] as const;
168
167
 
169
168
  /** For `StageID.ASHPIT` (30). */
170
- const ASHPIT_BOSSES_SET = new ReadonlySet<BossID>([
169
+ const ASHPIT_BOSSES = [
171
170
  BossID.PILE, // 73
172
171
  BossID.GREAT_GIDEON, // 83
173
172
  BossID.SINGE, // 93
174
173
  BossID.SHELL, // 96
175
174
  BossID.CLUTCH, // 102
176
- ]);
175
+ ] as const;
177
176
 
178
177
  /** The set of unique bosses for Caves, Catacombs, Flooded Caves, Mines, and Ashpit. */
179
- const ALL_CAVES_BOSSES_SET: ReadonlySet<BossID> = combineSets(
180
- CAVES_BOSSES_SET,
181
- CATACOMBS_BOSSES_SET,
182
- FLOODED_CAVES_BOSSES_SET,
183
- MINES_BOSSES_SET,
184
- ASHPIT_BOSSES_SET,
185
- );
178
+ const ALL_CAVES_BOSSES_SET = new ReadonlySet<BossID>([
179
+ ...CAVES_BOSSES,
180
+ ...CATACOMBS_BOSSES,
181
+ ...FLOODED_CAVES_BOSSES,
182
+ ...MINES_BOSSES,
183
+ ...ASHPIT_BOSSES,
184
+ ]);
186
185
 
187
186
  /**
188
187
  * For `StageID.DEPTHS` (7).
189
188
  *
190
189
  * Note that this set includes Mom, even though they are not technically in the boss pool.
191
190
  */
192
- const DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
191
+ const DEPTHS_BOSSES = [
193
192
  BossID.MONSTRO_2, // 5
194
193
  BossID.MOM, // 6
195
194
  BossID.WAR, // 11
@@ -203,14 +202,14 @@ const DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
203
202
  BossID.BROWNIE, // 58
204
203
  BossID.SISTERS_VIS, // 68
205
204
  BossID.REAP_CREEP, // 74 (added in Repentance)
206
- ]);
205
+ ] as const;
207
206
 
208
207
  /**
209
208
  * For `StageID.NECROPOLIS` (8).
210
209
  *
211
210
  * Note that this set includes Mom, even though they are not technically in the boss pool.
212
211
  */
213
- const NECROPOLIS_BOSSES_SET = new ReadonlySet<BossID>([
212
+ const NECROPOLIS_BOSSES = [
214
213
  BossID.MOM, // 6
215
214
  BossID.WAR, // 11
216
215
  BossID.LOKI, // 15
@@ -223,14 +222,14 @@ const NECROPOLIS_BOSSES_SET = new ReadonlySet<BossID>([
223
222
  BossID.BROWNIE, // 58
224
223
  BossID.SISTERS_VIS, // 68
225
224
  BossID.PILE, // 73 (added in Repentance)
226
- ]);
225
+ ] as const;
227
226
 
228
227
  /**
229
228
  * For `StageID.DANK_DEPTHS` (9).
230
229
  *
231
230
  * Note that this set includes Mom, even though they are not technically in the boss pool.
232
231
  */
233
- const DANK_DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
232
+ const DANK_DEPTHS_BOSSES = [
234
233
  BossID.MONSTRO_2, // 5
235
234
  BossID.MOM, // 6
236
235
  BossID.WAR, // 11
@@ -244,38 +243,38 @@ const DANK_DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
244
243
  BossID.BROWNIE, // 58
245
244
  BossID.SISTERS_VIS, // 68
246
245
  BossID.REAP_CREEP, // 74 (added in Repentance)
247
- ]);
246
+ ] as const;
248
247
 
249
248
  /**
250
249
  * For `StageID.MAUSOLEUM` (31).
251
250
  *
252
251
  * Note that this set includes Mausoleum Mom, even though they are not technically in the boss pool.
253
252
  */
254
- const MAUSOLEUM_BOSSES_SET = new ReadonlySet<BossID>([
253
+ const MAUSOLEUM_BOSSES = [
255
254
  BossID.SIREN, // 79
256
255
  BossID.HERETIC, // 81
257
256
  BossID.MAUSOLEUM_MOM, // 89
258
- ]);
257
+ ] as const;
259
258
 
260
259
  /**
261
260
  * For `StageID.GEHENNA` (32).
262
261
  *
263
262
  * Note that this set includes Mausoleum Mom, even though they are not technically in the boss pool.
264
263
  */
265
- const GEHENNA_BOSSES_SET = new ReadonlySet<BossID>([
264
+ const GEHENNA_BOSSES = [
266
265
  BossID.VISAGE, // 78
267
266
  BossID.MAUSOLEUM_MOM, // 89
268
267
  BossID.HORNY_BOYS, // 101
269
- ]);
268
+ ] as const;
270
269
 
271
270
  /** The set of unique bosses for Depths, Necropolis, Dank Depths, Mausoleum, and Gehenna. */
272
- const ALL_DEPTHS_BOSSES_SET: ReadonlySet<BossID> = combineSets(
273
- DEPTHS_BOSSES_SET,
274
- NECROPOLIS_BOSSES_SET,
275
- DANK_DEPTHS_BOSSES_SET,
276
- MAUSOLEUM_BOSSES_SET,
277
- GEHENNA_BOSSES_SET,
278
- );
271
+ const ALL_DEPTHS_BOSSES_SET = new ReadonlySet<BossID>([
272
+ ...DEPTHS_BOSSES,
273
+ ...NECROPOLIS_BOSSES,
274
+ ...DANK_DEPTHS_BOSSES,
275
+ ...MAUSOLEUM_BOSSES,
276
+ ...GEHENNA_BOSSES,
277
+ ]);
279
278
 
280
279
  /**
281
280
  * For `StageID.WOMB` (10).
@@ -283,7 +282,7 @@ const ALL_DEPTHS_BOSSES_SET: ReadonlySet<BossID> = combineSets(
283
282
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
284
283
  * boss pool.
285
284
  */
286
- const WOMB_BOSSES_SET = new ReadonlySet<BossID>([
285
+ const WOMB_BOSSES = [
287
286
  BossID.SCOLEX, // 7
288
287
  BossID.MOMS_HEART, // 8
289
288
  BossID.DEATH, // 12
@@ -301,7 +300,7 @@ const WOMB_BOSSES_SET = new ReadonlySet<BossID>([
301
300
  BossID.MR_FRED, // 53
302
301
  // - `BossID.SISTERS_VIS` (68) was removed in Repentance.
303
302
  BossID.MATRIARCH, // 72
304
- ]);
303
+ ] as const;
305
304
 
306
305
  /**
307
306
  * For `StageID.UTERO` (11).
@@ -309,7 +308,7 @@ const WOMB_BOSSES_SET = new ReadonlySet<BossID>([
309
308
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
310
309
  * boss pool.
311
310
  */
312
- const UTERO_BOSSES_SET = new ReadonlySet<BossID>([
311
+ const UTERO_BOSSES = [
313
312
  BossID.MOMS_HEART, // 8
314
313
  BossID.DEATH, // 12
315
314
  // - `BossID.BLASTOCYST` (16) was removed in Repentance.
@@ -326,7 +325,7 @@ const UTERO_BOSSES_SET = new ReadonlySet<BossID>([
326
325
  // - `BossID.MR_FRED` (52) was removed in Repentance.
327
326
  // - `BossID.SISTERS_VIS` (68) was removed in Repentance.
328
327
  // - `BossID.MATRIARCH` (72) was removed in Repentance.
329
- ]);
328
+ ] as const;
330
329
 
331
330
  /**
332
331
  * For `StageID.SCARRED_WOMB` (12).
@@ -334,7 +333,7 @@ const UTERO_BOSSES_SET = new ReadonlySet<BossID>([
334
333
  * Note that this set includes Mom's Heart & It Lives, even though they are not technically in the
335
334
  * boss pool.
336
335
  */
337
- const SCARRED_WOMB_BOSSES_SET = new ReadonlySet<BossID>([
336
+ const SCARRED_WOMB_BOSSES = [
338
337
  BossID.SCOLEX, // 7
339
338
  BossID.MOMS_HEART, // 8
340
339
  BossID.DEATH, // 12
@@ -352,111 +351,119 @@ const SCARRED_WOMB_BOSSES_SET = new ReadonlySet<BossID>([
352
351
  BossID.MR_FRED, // 53 (added in Repentance)
353
352
  // - `BossID.SISTERS_VIS` (68) was removed in Repentance.
354
353
  BossID.MATRIARCH, // 72
355
- ]);
354
+ ] as const;
356
355
 
357
356
  /**
358
357
  * For `StageID.CORPSE` (33).
359
358
  *
360
359
  * Note that this set includes Mother, even though she is not technically in the boss pool.
361
360
  */
362
- const CORPSE_BOSSES_SET = new ReadonlySet<BossID>([
361
+ const CORPSE_BOSSES = [
363
362
  BossID.SCOURGE, // 85
364
363
  BossID.CHIMERA, // 86
365
364
  BossID.ROTGUT, // 87
366
365
  BossID.MOTHER, // 88
367
- ]);
366
+ ] as const;
368
367
 
369
368
  /** The set of unique bosses for Womb, Utero, Scarred Womb, and Corpse. */
370
- const ALL_WOMB_BOSSES_SET: ReadonlySet<BossID> = combineSets(
371
- WOMB_BOSSES_SET,
372
- UTERO_BOSSES_SET,
373
- SCARRED_WOMB_BOSSES_SET,
374
- CORPSE_BOSSES_SET,
375
- );
369
+ const ALL_WOMB_BOSSES_SET = new ReadonlySet([
370
+ ...WOMB_BOSSES,
371
+ ...UTERO_BOSSES,
372
+ ...SCARRED_WOMB_BOSSES,
373
+ ...CORPSE_BOSSES,
374
+ ]);
376
375
 
377
- const BLUE_WOMB_BOSSES_SET = new ReadonlySet<BossID>([
376
+ const BLUE_WOMB_BOSSES = [
378
377
  BossID.HUSH, // 63
379
- ]);
378
+ ] as const;
380
379
 
381
- const SHEOL_BOSSES_SET = new ReadonlySet<BossID>([
380
+ const ALL_BLUE_WOMB_BOSSES_SET = new ReadonlySet<BossID>([...BLUE_WOMB_BOSSES]);
381
+
382
+ const SHEOL_BOSSES = [
382
383
  BossID.SATAN, // 24
383
- ]);
384
+ ] as const;
384
385
 
385
- const CATHEDRAL_BOSSES_SET = new ReadonlySet<BossID>([
386
+ const CATHEDRAL_BOSSES = [
386
387
  BossID.ISAAC, // 39
387
- ]);
388
+ ] as const;
388
389
 
389
- const ALL_STAGE_10_BOSSES_SET: ReadonlySet<BossID> = combineSets(
390
- SHEOL_BOSSES_SET,
391
- CATHEDRAL_BOSSES_SET,
392
- );
390
+ const ALL_STAGE_10_BOSSES_SET = new ReadonlySet<BossID>([
391
+ ...SHEOL_BOSSES,
392
+ ...CATHEDRAL_BOSSES,
393
+ ]);
393
394
 
394
395
  /**
395
396
  * Note that this set includes Mega Satan, even though they are not technically in the boss pool.
396
397
  */
397
- const DARK_ROOM_BOSSES_SET = new ReadonlySet<BossID>([
398
+ const DARK_ROOM_BOSSES = [
398
399
  BossID.LAMB, // 54
399
400
  BossID.MEGA_SATAN, // 55
400
- ]);
401
+ ] as const;
401
402
 
402
403
  /**
403
404
  * Note that this set includes Mega Satan, even though they are not technically in the boss pool.
404
405
  */
405
- const CHEST_BOSSES_SET = new ReadonlySet<BossID>([
406
+ const CHEST_BOSSES = [
406
407
  BossID.BLUE_BABY, // 40
407
408
  BossID.MEGA_SATAN, // 55
408
- ]);
409
+ ] as const;
409
410
 
410
- const ALL_STAGE_11_BOSSES_SET: ReadonlySet<BossID> = combineSets(
411
- DARK_ROOM_BOSSES_SET,
412
- CHEST_BOSSES_SET,
413
- );
411
+ const ALL_STAGE_11_BOSSES_SET = new ReadonlySet<BossID>([
412
+ ...DARK_ROOM_BOSSES,
413
+ ...CHEST_BOSSES,
414
+ ]);
414
415
 
415
- const VOID_BOSSES_SET = new ReadonlySet<BossID>([
416
+ const VOID_BOSSES = [
416
417
  BossID.DELIRIUM, // 70
417
- ]);
418
+ ] as const;
419
+
420
+ const ALL_VOID_BOSSES_SET = new ReadonlySet<BossID>([...VOID_BOSSES]);
418
421
 
419
422
  /**
420
423
  * Includes Dogma and The Beast. Does not include Ultra Famine, Ultra Pestilence, Ultra War, and
421
424
  * Ultra Death (since they do not have boss IDs).
422
425
  */
423
- const HOME_BOSSES_SET = new ReadonlySet<BossID>([BossID.DOGMA, BossID.BEAST]);
424
-
425
- export const STAGE_ID_TO_BOSS_SET_MAP = new ReadonlyMap<
426
- StageID,
427
- ReadonlySet<BossID>
428
- >([
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
459
- ]);
426
+ const HOME_BOSSES = [
427
+ BossID.DOGMA, // 99
428
+ BossID.BEAST, // 100
429
+ ] as const;
430
+
431
+ const ALL_HOME_BOSSES_SET = new ReadonlySet<BossID>([...HOME_BOSSES]);
432
+
433
+ export const STAGE_ID_TO_BOSS_IDS = new ReadonlyMap<StageID, readonly BossID[]>(
434
+ [
435
+ [StageID.BASEMENT, BASEMENT_BOSSES], // 1
436
+ [StageID.CELLAR, CELLAR_BOSSES], // 2
437
+ [StageID.BURNING_BASEMENT, BURNING_BASEMENT_BOSSES], // 3
438
+ [StageID.DOWNPOUR, DOWNPOUR_BOSSES], // 27
439
+ [StageID.DROSS, DROSS_BOSSES], // 28
440
+
441
+ [StageID.CAVES, CAVES_BOSSES], // 4
442
+ [StageID.CATACOMBS, CATACOMBS_BOSSES], // 5
443
+ [StageID.FLOODED_CAVES, FLOODED_CAVES_BOSSES], // 6
444
+ [StageID.MINES, MINES_BOSSES], // 29
445
+ [StageID.ASHPIT, ASHPIT_BOSSES], // 30
446
+
447
+ [StageID.DEPTHS, DEPTHS_BOSSES], // 7
448
+ [StageID.NECROPOLIS, NECROPOLIS_BOSSES], // 8
449
+ [StageID.DANK_DEPTHS, DANK_DEPTHS_BOSSES], // 9
450
+ [StageID.MAUSOLEUM, MAUSOLEUM_BOSSES], // 31
451
+ [StageID.GEHENNA, GEHENNA_BOSSES], // 32
452
+
453
+ [StageID.WOMB, WOMB_BOSSES], // 10
454
+ [StageID.UTERO, UTERO_BOSSES], // 11
455
+ [StageID.SCARRED_WOMB, SCARRED_WOMB_BOSSES], // 12
456
+ [StageID.CORPSE, CORPSE_BOSSES], // 33
457
+
458
+ [StageID.BLUE_WOMB, BLUE_WOMB_BOSSES], // 13
459
+ [StageID.SHEOL, SHEOL_BOSSES], // 14
460
+ [StageID.CATHEDRAL, CATHEDRAL_BOSSES], // 15
461
+ [StageID.DARK_ROOM, DARK_ROOM_BOSSES], // 16
462
+ [StageID.CHEST, CHEST_BOSSES], // 17
463
+ [StageID.VOID, VOID_BOSSES], // 26
464
+ [StageID.HOME, HOME_BOSSES], // 35
465
+ ],
466
+ );
460
467
 
461
468
  export const STAGE_TO_COMBINED_BOSS_SET_MAP = new ReadonlyMap<
462
469
  LevelStage,
@@ -470,19 +477,19 @@ export const STAGE_TO_COMBINED_BOSS_SET_MAP = new ReadonlyMap<
470
477
  [LevelStage.DEPTHS_2, ALL_DEPTHS_BOSSES_SET], // 6
471
478
  [LevelStage.WOMB_1, ALL_WOMB_BOSSES_SET], // 7
472
479
  [LevelStage.WOMB_2, ALL_WOMB_BOSSES_SET], // 8
473
- [LevelStage.BLUE_WOMB, BLUE_WOMB_BOSSES_SET], // 9
480
+ [LevelStage.BLUE_WOMB, ALL_BLUE_WOMB_BOSSES_SET], // 9
474
481
  [LevelStage.SHEOL_CATHEDRAL, ALL_STAGE_10_BOSSES_SET], // 10
475
482
  [LevelStage.DARK_ROOM_CHEST, ALL_STAGE_11_BOSSES_SET], // 11
476
- [LevelStage.VOID, VOID_BOSSES_SET], // 12
477
- [LevelStage.HOME, HOME_BOSSES_SET], // 13
483
+ [LevelStage.VOID, ALL_VOID_BOSSES_SET], // 12
484
+ [LevelStage.HOME, ALL_HOME_BOSSES_SET], // 13
478
485
  ]);
479
486
 
480
- export const ALL_BOSSES_SET = new ReadonlySet<BossID>(
481
- BOSS_ID_VALUES.filter((bossID) => bossID !== BossID.RAGLICH),
487
+ export const ALL_BOSSES: readonly BossID[] = BOSS_ID_VALUES.filter(
488
+ (bossID) => bossID !== BossID.RAGLICH,
482
489
  );
483
490
 
484
- export const ALL_BOSSES_EXCLUDING_STORY_BOSSES_SET = new ReadonlySet(
485
- [...ALL_BOSSES_SET].filter((bossID) => !isStoryBossID(bossID)),
491
+ export const NON_STORY_BOSSES: readonly BossID[] = ALL_BOSSES.filter(
492
+ (bossID) => !isStoryBossID(bossID),
486
493
  );
487
494
 
488
495
  export const BOSS_ID_TO_STAGE_IDS = (() => {
@@ -490,8 +497,8 @@ export const BOSS_ID_TO_STAGE_IDS = (() => {
490
497
 
491
498
  for (const bossID of BOSS_ID_VALUES) {
492
499
  const stageIDs = new Set<StageID>();
493
- for (const [stageID, bossSet] of STAGE_ID_TO_BOSS_SET_MAP) {
494
- if (bossSet.has(bossID)) {
500
+ for (const [stageID, bossIDs] of STAGE_ID_TO_BOSS_IDS) {
501
+ if (bossIDs.includes(bossID)) {
495
502
  stageIDs.add(stageID);
496
503
  }
497
504
  }