isaacscript-common 84.0.0 → 84.1.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.
Files changed (568) hide show
  1. package/dist/arrays/cachedEnumValues.js +33 -0
  2. package/dist/callbackClasses.js +289 -0
  3. package/dist/callbacks.js +181 -0
  4. package/dist/classes/DefaultMap.js +171 -0
  5. package/dist/classes/ModFeature.js +244 -0
  6. package/dist/classes/ModUpgraded.js +324 -0
  7. package/dist/classes/callbacks/EntityTakeDmgFilter.js +19 -0
  8. package/dist/classes/callbacks/EntityTakeDmgPlayer.js +29 -0
  9. package/dist/classes/callbacks/InputActionFilter.js +24 -0
  10. package/dist/classes/callbacks/InputActionPlayer.js +37 -0
  11. package/dist/classes/callbacks/PostAmbushFinished.js +40 -0
  12. package/dist/classes/callbacks/PostAmbushStarted.js +40 -0
  13. package/dist/classes/callbacks/PostBombExploded.js +24 -0
  14. package/dist/classes/callbacks/PostBombInitFilter.js +21 -0
  15. package/dist/classes/callbacks/PostBombInitLate.js +31 -0
  16. package/dist/classes/callbacks/PostBombRenderFilter.js +21 -0
  17. package/dist/classes/callbacks/PostBombUpdateFilter.js +21 -0
  18. package/dist/classes/callbacks/PostBoneSwing.js +53 -0
  19. package/dist/classes/callbacks/PostCollectibleEmpty.js +50 -0
  20. package/dist/classes/callbacks/PostCursedTeleport.js +119 -0
  21. package/dist/classes/callbacks/PostCustomRevive.js +17 -0
  22. package/dist/classes/callbacks/PostDiceRoomActivated.js +50 -0
  23. package/dist/classes/callbacks/PostDoorRender.js +24 -0
  24. package/dist/classes/callbacks/PostDoorUpdate.js +24 -0
  25. package/dist/classes/callbacks/PostEffectInitFilter.js +21 -0
  26. package/dist/classes/callbacks/PostEffectInitLate.js +31 -0
  27. package/dist/classes/callbacks/PostEffectRenderFilter.js +21 -0
  28. package/dist/classes/callbacks/PostEffectStateChanged.js +34 -0
  29. package/dist/classes/callbacks/PostEffectUpdateFilter.js +21 -0
  30. package/dist/classes/callbacks/PostEntityKillFilter.js +21 -0
  31. package/dist/classes/callbacks/PostEsauJr.js +12 -0
  32. package/dist/classes/callbacks/PostFamiliarInitFilter.js +21 -0
  33. package/dist/classes/callbacks/PostFamiliarInitLate.js +31 -0
  34. package/dist/classes/callbacks/PostFamiliarRenderFilter.js +21 -0
  35. package/dist/classes/callbacks/PostFamiliarStateChanged.js +34 -0
  36. package/dist/classes/callbacks/PostFamiliarUpdateFilter.js +21 -0
  37. package/dist/classes/callbacks/PostFirstEsauJr.js +12 -0
  38. package/dist/classes/callbacks/PostFirstFlip.js +12 -0
  39. package/dist/classes/callbacks/PostFlip.js +12 -0
  40. package/dist/classes/callbacks/PostGameEndFilter.js +21 -0
  41. package/dist/classes/callbacks/PostGameStartedReordered.js +14 -0
  42. package/dist/classes/callbacks/PostGameStartedReorderedLast.js +14 -0
  43. package/dist/classes/callbacks/PostGreedModeWave.js +35 -0
  44. package/dist/classes/callbacks/PostGridEntityBroken.js +14 -0
  45. package/dist/classes/callbacks/PostGridEntityCollision.js +28 -0
  46. package/dist/classes/callbacks/PostGridEntityCustomBroken.js +14 -0
  47. package/dist/classes/callbacks/PostGridEntityCustomCollision.js +24 -0
  48. package/dist/classes/callbacks/PostGridEntityCustomInit.js +14 -0
  49. package/dist/classes/callbacks/PostGridEntityCustomRemove.js +18 -0
  50. package/dist/classes/callbacks/PostGridEntityCustomRender.js +14 -0
  51. package/dist/classes/callbacks/PostGridEntityCustomStateChanged.js +14 -0
  52. package/dist/classes/callbacks/PostGridEntityCustomUpdate.js +14 -0
  53. package/dist/classes/callbacks/PostGridEntityInit.js +14 -0
  54. package/dist/classes/callbacks/PostGridEntityRemove.js +19 -0
  55. package/dist/classes/callbacks/PostGridEntityRender.js +14 -0
  56. package/dist/classes/callbacks/PostGridEntityStateChanged.js +14 -0
  57. package/dist/classes/callbacks/PostGridEntityUpdate.js +14 -0
  58. package/dist/classes/callbacks/PostHolyMantleRemoved.js +43 -0
  59. package/dist/classes/callbacks/PostItemDischarge.js +122 -0
  60. package/dist/classes/callbacks/PostItemPickup.js +14 -0
  61. package/dist/classes/callbacks/PostKeyboardChanged.js +46 -0
  62. package/dist/classes/callbacks/PostKnifeInitFilter.js +21 -0
  63. package/dist/classes/callbacks/PostKnifeInitLate.js +31 -0
  64. package/dist/classes/callbacks/PostKnifeRenderFilter.js +21 -0
  65. package/dist/classes/callbacks/PostKnifeUpdateFilter.js +21 -0
  66. package/dist/classes/callbacks/PostLaserInitFilter.js +21 -0
  67. package/dist/classes/callbacks/PostLaserInitLate.js +31 -0
  68. package/dist/classes/callbacks/PostLaserRenderFilter.js +21 -0
  69. package/dist/classes/callbacks/PostLaserUpdateFilter.js +21 -0
  70. package/dist/classes/callbacks/PostNPCDeathFilter.js +21 -0
  71. package/dist/classes/callbacks/PostNPCInitFilter.js +21 -0
  72. package/dist/classes/callbacks/PostNPCInitLate.js +31 -0
  73. package/dist/classes/callbacks/PostNPCRenderFilter.js +21 -0
  74. package/dist/classes/callbacks/PostNPCStateChanged.js +34 -0
  75. package/dist/classes/callbacks/PostNPCUpdateFilter.js +21 -0
  76. package/dist/classes/callbacks/PostNewLevelReordered.js +14 -0
  77. package/dist/classes/callbacks/PostNewRoomEarly.js +74 -0
  78. package/dist/classes/callbacks/PostNewRoomReordered.js +14 -0
  79. package/dist/classes/callbacks/PostPEffectUpdateReordered.js +14 -0
  80. package/dist/classes/callbacks/PostPickupChanged.js +14 -0
  81. package/dist/classes/callbacks/PostPickupCollect.js +38 -0
  82. package/dist/classes/callbacks/PostPickupInitFilter.js +21 -0
  83. package/dist/classes/callbacks/PostPickupInitFirst.js +33 -0
  84. package/dist/classes/callbacks/PostPickupInitLate.js +31 -0
  85. package/dist/classes/callbacks/PostPickupRenderFilter.js +21 -0
  86. package/dist/classes/callbacks/PostPickupSelectionFilter.js +29 -0
  87. package/dist/classes/callbacks/PostPickupStateChanged.js +34 -0
  88. package/dist/classes/callbacks/PostPickupUpdateFilter.js +21 -0
  89. package/dist/classes/callbacks/PostPitRender.js +24 -0
  90. package/dist/classes/callbacks/PostPitUpdate.js +24 -0
  91. package/dist/classes/callbacks/PostPlayerChangeHealth.js +47 -0
  92. package/dist/classes/callbacks/PostPlayerChangeStat.js +79 -0
  93. package/dist/classes/callbacks/PostPlayerChangeType.js +36 -0
  94. package/dist/classes/callbacks/PostPlayerCollectibleAdded.js +14 -0
  95. package/dist/classes/callbacks/PostPlayerCollectibleRemoved.js +14 -0
  96. package/dist/classes/callbacks/PostPlayerFatalDamage.js +83 -0
  97. package/dist/classes/callbacks/PostPlayerInitFirst.js +41 -0
  98. package/dist/classes/callbacks/PostPlayerInitLate.js +33 -0
  99. package/dist/classes/callbacks/PostPlayerRenderReordered.js +14 -0
  100. package/dist/classes/callbacks/PostPlayerUpdateReordered.js +14 -0
  101. package/dist/classes/callbacks/PostPoopRender.js +24 -0
  102. package/dist/classes/callbacks/PostPoopUpdate.js +24 -0
  103. package/dist/classes/callbacks/PostPressurePlateRender.js +24 -0
  104. package/dist/classes/callbacks/PostPressurePlateUpdate.js +24 -0
  105. package/dist/classes/callbacks/PostProjectileInitFilter.js +21 -0
  106. package/dist/classes/callbacks/PostProjectileInitLate.js +31 -0
  107. package/dist/classes/callbacks/PostProjectileKill.js +52 -0
  108. package/dist/classes/callbacks/PostProjectileRenderFilter.js +21 -0
  109. package/dist/classes/callbacks/PostProjectileUpdateFilter.js +21 -0
  110. package/dist/classes/callbacks/PostPurchase.js +90 -0
  111. package/dist/classes/callbacks/PostRockRender.js +24 -0
  112. package/dist/classes/callbacks/PostRockUpdate.js +24 -0
  113. package/dist/classes/callbacks/PostRoomClearChanged.js +46 -0
  114. package/dist/classes/callbacks/PostSacrifice.js +36 -0
  115. package/dist/classes/callbacks/PostSlotAnimationChanged.js +14 -0
  116. package/dist/classes/callbacks/PostSlotCollision.js +25 -0
  117. package/dist/classes/callbacks/PostSlotDestroyed.js +14 -0
  118. package/dist/classes/callbacks/PostSlotInit.js +14 -0
  119. package/dist/classes/callbacks/PostSlotRender.js +14 -0
  120. package/dist/classes/callbacks/PostSlotUpdate.js +14 -0
  121. package/dist/classes/callbacks/PostSpikesRender.js +24 -0
  122. package/dist/classes/callbacks/PostSpikesUpdate.js +24 -0
  123. package/dist/classes/callbacks/PostTNTRender.js +24 -0
  124. package/dist/classes/callbacks/PostTNTUpdate.js +24 -0
  125. package/dist/classes/callbacks/PostTearInitFilter.js +21 -0
  126. package/dist/classes/callbacks/PostTearInitLate.js +31 -0
  127. package/dist/classes/callbacks/PostTearInitVeryLate.js +35 -0
  128. package/dist/classes/callbacks/PostTearKill.js +52 -0
  129. package/dist/classes/callbacks/PostTearRenderFilter.js +21 -0
  130. package/dist/classes/callbacks/PostTearUpdateFilter.js +21 -0
  131. package/dist/classes/callbacks/PostTransformation.js +47 -0
  132. package/dist/classes/callbacks/PostTrinketBreak.js +70 -0
  133. package/dist/classes/callbacks/PostUsePillFilter.js +76 -0
  134. package/dist/classes/callbacks/PreBerserkDeath.js +41 -0
  135. package/dist/classes/callbacks/PreBombCollisionFilter.js +19 -0
  136. package/dist/classes/callbacks/PreCustomRevive.js +14 -0
  137. package/dist/classes/callbacks/PreEntitySpawnFilter.js +24 -0
  138. package/dist/classes/callbacks/PreFamiliarCollisionFilter.js +19 -0
  139. package/dist/classes/callbacks/PreGetPedestal.js +46 -0
  140. package/dist/classes/callbacks/PreItemPickup.js +14 -0
  141. package/dist/classes/callbacks/PreKnifeCollisionFilter.js +19 -0
  142. package/dist/classes/callbacks/PreNPCCollisionFilter.js +19 -0
  143. package/dist/classes/callbacks/PreNPCUpdateFilter.js +19 -0
  144. package/dist/classes/callbacks/PreNewLevel.js +51 -0
  145. package/dist/classes/callbacks/PreProjectileCollisionFilter.js +19 -0
  146. package/dist/classes/callbacks/PreRoomEntitySpawnFilter.js +26 -0
  147. package/dist/classes/callbacks/PreTearCollisionFilter.js +19 -0
  148. package/dist/classes/features/callbackLogic/CustomGridEntities.js +359 -0
  149. package/dist/classes/features/callbackLogic/CustomRevive.js +170 -0
  150. package/dist/classes/features/callbackLogic/EsauJrDetection.js +70 -0
  151. package/dist/classes/features/callbackLogic/FlipDetection.js +61 -0
  152. package/dist/classes/features/callbackLogic/GameReorderedCallbacks.js +220 -0
  153. package/dist/classes/features/callbackLogic/GridEntityCollisionDetection.js +62 -0
  154. package/dist/classes/features/callbackLogic/GridEntityRenderDetection.js +35 -0
  155. package/dist/classes/features/callbackLogic/GridEntityUpdateDetection.js +147 -0
  156. package/dist/classes/features/callbackLogic/ItemPickupDetection.js +68 -0
  157. package/dist/classes/features/callbackLogic/PickupChangeDetection.js +43 -0
  158. package/dist/classes/features/callbackLogic/PlayerCollectibleDetection.js +193 -0
  159. package/dist/classes/features/callbackLogic/PlayerReorderedCallbacks.js +109 -0
  160. package/dist/classes/features/callbackLogic/SlotDestroyedDetection.js +95 -0
  161. package/dist/classes/features/callbackLogic/SlotRenderDetection.js +48 -0
  162. package/dist/classes/features/callbackLogic/SlotUpdateDetection.js +52 -0
  163. package/dist/classes/features/other/CharacterHealthConversion.js +112 -0
  164. package/dist/classes/features/other/CharacterStats.js +68 -0
  165. package/dist/classes/features/other/CollectibleItemPoolType.js +75 -0
  166. package/dist/classes/features/other/CustomHotkeys.js +144 -0
  167. package/dist/classes/features/other/CustomItemPools.js +128 -0
  168. package/dist/classes/features/other/CustomPickups.js +118 -0
  169. package/dist/classes/features/other/CustomStages.js +471 -0
  170. package/dist/classes/features/other/CustomTrapdoors.js +596 -0
  171. package/dist/classes/features/other/DebugDisplay.js +699 -0
  172. package/dist/classes/features/other/DeployJSONRoom.js +301 -0
  173. package/dist/classes/features/other/DisableAllSound.js +90 -0
  174. package/dist/classes/features/other/DisableInputs.js +249 -0
  175. package/dist/classes/features/other/EdenStartingStatsHealth.js +197 -0
  176. package/dist/classes/features/other/ExtraConsoleCommands.js +292 -0
  177. package/dist/classes/features/other/FadeInRemover.js +67 -0
  178. package/dist/classes/features/other/FastReset.js +88 -0
  179. package/dist/classes/features/other/FlyingDetection.js +64 -0
  180. package/dist/classes/features/other/ForgottenSwitch.js +43 -0
  181. package/dist/classes/features/other/ItemPoolDetection.js +187 -0
  182. package/dist/classes/features/other/ModdedElementDetection.js +399 -0
  183. package/dist/classes/features/other/ModdedElementSets.js +1251 -0
  184. package/dist/classes/features/other/NoSirenSteal.js +88 -0
  185. package/dist/classes/features/other/Pause.js +197 -0
  186. package/dist/classes/features/other/PersistentEntities.js +168 -0
  187. package/dist/classes/features/other/PickupIndexCreation.js +229 -0
  188. package/dist/classes/features/other/PlayerCollectibleTracking.js +102 -0
  189. package/dist/classes/features/other/PonyDetection.js +86 -0
  190. package/dist/classes/features/other/PressInput.js +71 -0
  191. package/dist/classes/features/other/PreventChildEntities.js +60 -0
  192. package/dist/classes/features/other/PreventGridEntityRespawn.js +159 -0
  193. package/dist/classes/features/other/RerunDetection.js +69 -0
  194. package/dist/classes/features/other/RoomClearFrame.js +94 -0
  195. package/dist/classes/features/other/RoomHistory.js +196 -0
  196. package/dist/classes/features/other/RunInNFrames.js +323 -0
  197. package/dist/classes/features/other/RunNextRoom.js +53 -0
  198. package/dist/classes/features/other/RunNextRun.js +60 -0
  199. package/dist/classes/features/other/SaveDataManager.js +383 -0
  200. package/dist/classes/features/other/SpawnRockAltRewards.js +469 -0
  201. package/dist/classes/features/other/StageHistory.js +244 -0
  202. package/dist/classes/features/other/StartAmbush.js +62 -0
  203. package/dist/classes/features/other/TaintedLazarusPlayers.js +115 -0
  204. package/dist/classes/features/other/UnlockAchievementsDetection.js +60 -0
  205. package/dist/classes/features/other/customStages/backdrop.js +195 -0
  206. package/dist/classes/features/other/customStages/constants.js +19 -0
  207. package/dist/classes/features/other/customStages/gridEntities.js +177 -0
  208. package/dist/classes/features/other/customStages/shadows.js +67 -0
  209. package/dist/classes/features/other/customStages/streakText.js +222 -0
  210. package/dist/classes/features/other/customStages/utils.js +65 -0
  211. package/dist/classes/features/other/customStages/v.js +27 -0
  212. package/dist/classes/features/other/customStages/versusScreen.js +227 -0
  213. package/dist/classes/features/other/debugDisplay/DebugDisplayBomb.js +23 -0
  214. package/dist/classes/features/other/debugDisplay/DebugDisplayDoor.js +22 -0
  215. package/dist/classes/features/other/debugDisplay/DebugDisplayEffect.js +23 -0
  216. package/dist/classes/features/other/debugDisplay/DebugDisplayFamiliar.js +23 -0
  217. package/dist/classes/features/other/debugDisplay/DebugDisplayKnife.js +23 -0
  218. package/dist/classes/features/other/debugDisplay/DebugDisplayLaser.js +23 -0
  219. package/dist/classes/features/other/debugDisplay/DebugDisplayNPC.js +23 -0
  220. package/dist/classes/features/other/debugDisplay/DebugDisplayPickup.js +23 -0
  221. package/dist/classes/features/other/debugDisplay/DebugDisplayPit.js +22 -0
  222. package/dist/classes/features/other/debugDisplay/DebugDisplayPlayer.js +25 -0
  223. package/dist/classes/features/other/debugDisplay/DebugDisplayPoop.js +22 -0
  224. package/dist/classes/features/other/debugDisplay/DebugDisplayPressurePlate.js +25 -0
  225. package/dist/classes/features/other/debugDisplay/DebugDisplayProjectile.js +23 -0
  226. package/dist/classes/features/other/debugDisplay/DebugDisplayRock.js +22 -0
  227. package/dist/classes/features/other/debugDisplay/DebugDisplaySlot.js +22 -0
  228. package/dist/classes/features/other/debugDisplay/DebugDisplaySpikes.js +22 -0
  229. package/dist/classes/features/other/debugDisplay/DebugDisplayTNT.js +22 -0
  230. package/dist/classes/features/other/debugDisplay/DebugDisplayTear.js +23 -0
  231. package/dist/classes/features/other/debugDisplay/utils.js +13 -0
  232. package/dist/classes/features/other/extraConsoleCommands/commands.js +1598 -0
  233. package/dist/classes/features/other/extraConsoleCommands/subroutines.js +135 -0
  234. package/dist/classes/features/other/extraConsoleCommands/v.js +30 -0
  235. package/dist/classes/features/other/saveDataManager/constants.js +4 -0
  236. package/dist/classes/features/other/saveDataManager/glowingHourGlass.js +106 -0
  237. package/dist/classes/features/other/saveDataManager/loadFromDisk.js +69 -0
  238. package/dist/classes/features/other/saveDataManager/restoreDefaults.js +69 -0
  239. package/dist/classes/features/other/saveDataManager/saveToDisk.js +46 -0
  240. package/dist/classes/private/CustomCallback.js +59 -0
  241. package/dist/classes/private/Feature.js +39 -0
  242. package/dist/core/cachedClasses.js +61 -0
  243. package/dist/core/constants.js +289 -0
  244. package/dist/core/constantsFirstLast.js +98 -0
  245. package/dist/core/constantsVanilla.js +131 -0
  246. package/dist/core/upgradeMod.js +71 -0
  247. package/dist/customStageMetadata.json +1 -0
  248. package/dist/data/itempools.json +16625 -0
  249. package/dist/decorators.js +21 -0
  250. package/dist/enums/AmbushType.js +9 -0
  251. package/dist/enums/CornerType.js +11 -0
  252. package/dist/enums/HealthType.js +20 -0
  253. package/dist/enums/ISCFeature.js +65 -0
  254. package/dist/enums/LadderSubTypeCustom.js +20 -0
  255. package/dist/enums/ModCallbackCustom.js +2477 -0
  256. package/dist/enums/MysteriousPaperEffect.js +16 -0
  257. package/dist/enums/PlayerStat.js +37 -0
  258. package/dist/enums/PocketItemType.js +13 -0
  259. package/dist/enums/RockAltType.js +23 -0
  260. package/dist/enums/SaveDataKey.js +14 -0
  261. package/dist/enums/SerializationType.js +10 -0
  262. package/dist/enums/SlotDestructionType.js +22 -0
  263. package/dist/enums/private/GridEntityTypeCustom.js +10 -0
  264. package/dist/enums/private/SerializationBrand.js +42 -0
  265. package/dist/enums/private/StageTravelState.js +13 -0
  266. package/dist/enums/private/TrapdoorAnimation.js +9 -0
  267. package/dist/enums/private/UIStreakAnimation.js +10 -0
  268. package/dist/features.js +150 -0
  269. package/dist/functions/ambush.js +26 -0
  270. package/dist/functions/array.js +586 -0
  271. package/dist/functions/arrayLua.js +81 -0
  272. package/dist/functions/benchmark.js +36 -0
  273. package/dist/functions/bitSet128.js +64 -0
  274. package/dist/functions/bitwise.js +82 -0
  275. package/dist/functions/bombs.js +14 -0
  276. package/dist/functions/bosses.js +238 -0
  277. package/dist/functions/cards.js +164 -0
  278. package/dist/functions/challenges.js +117 -0
  279. package/dist/functions/characters.js +182 -0
  280. package/dist/functions/charge.js +251 -0
  281. package/dist/functions/chargeBar.js +54 -0
  282. package/dist/functions/collectibleTag.js +24 -0
  283. package/dist/functions/collectibles.js +581 -0
  284. package/dist/functions/color.js +88 -0
  285. package/dist/functions/console.js +18 -0
  286. package/dist/functions/curses.js +37 -0
  287. package/dist/functions/debugFunctions.js +108 -0
  288. package/dist/functions/decorators.js +113 -0
  289. package/dist/functions/deepCopy.js +406 -0
  290. package/dist/functions/deepCopyTests.js +361 -0
  291. package/dist/functions/dimensions.js +30 -0
  292. package/dist/functions/direction.js +78 -0
  293. package/dist/functions/doors.js +524 -0
  294. package/dist/functions/easing.js +327 -0
  295. package/dist/functions/effects.js +14 -0
  296. package/dist/functions/emptyRoom.js +79 -0
  297. package/dist/functions/entities.js +529 -0
  298. package/dist/functions/entitiesSpecific.js +582 -0
  299. package/dist/functions/entityTypes.js +9 -0
  300. package/dist/functions/enums.js +244 -0
  301. package/dist/functions/external.js +59 -0
  302. package/dist/functions/familiars.js +136 -0
  303. package/dist/functions/flag.js +146 -0
  304. package/dist/functions/frames.js +166 -0
  305. package/dist/functions/globals.js +291 -0
  306. package/dist/functions/gridEntities.js +990 -0
  307. package/dist/functions/gridEntitiesSpecific.js +456 -0
  308. package/dist/functions/gridIndex.js +35 -0
  309. package/dist/functions/hash.js +75 -0
  310. package/dist/functions/hex.js +57 -0
  311. package/dist/functions/input.js +185 -0
  312. package/dist/functions/isaacAPIClass.js +157 -0
  313. package/dist/functions/itemPool.js +118 -0
  314. package/dist/functions/jsonHelpers.js +73 -0
  315. package/dist/functions/jsonRoom.js +184 -0
  316. package/dist/functions/kColor.js +89 -0
  317. package/dist/functions/language.js +16 -0
  318. package/dist/functions/level.js +66 -0
  319. package/dist/functions/levelGrid.js +497 -0
  320. package/dist/functions/log.js +86 -0
  321. package/dist/functions/logEntities.js +308 -0
  322. package/dist/functions/logMisc.js +510 -0
  323. package/dist/functions/map.js +121 -0
  324. package/dist/functions/math.js +149 -0
  325. package/dist/functions/merge.js +159 -0
  326. package/dist/functions/mergeTests.js +313 -0
  327. package/dist/functions/minimap.js +204 -0
  328. package/dist/functions/modFeatures.js +39 -0
  329. package/dist/functions/newArray.js +30 -0
  330. package/dist/functions/nextStage.js +169 -0
  331. package/dist/functions/npcDataStructures.js +146 -0
  332. package/dist/functions/npcs.js +132 -0
  333. package/dist/functions/pickupVariants.js +63 -0
  334. package/dist/functions/pickups.js +168 -0
  335. package/dist/functions/pickupsSpecific.js +376 -0
  336. package/dist/functions/pills.js +200 -0
  337. package/dist/functions/playerCenter.js +53 -0
  338. package/dist/functions/playerCollectibles.js +300 -0
  339. package/dist/functions/playerDataStructures.js +145 -0
  340. package/dist/functions/playerEffects.js +63 -0
  341. package/dist/functions/playerHealth.js +604 -0
  342. package/dist/functions/playerIndex.js +186 -0
  343. package/dist/functions/playerTrinkets.js +149 -0
  344. package/dist/functions/players.js +471 -0
  345. package/dist/functions/pocketItems.js +165 -0
  346. package/dist/functions/positionVelocity.js +158 -0
  347. package/dist/functions/pressurePlate.js +26 -0
  348. package/dist/functions/projectiles.js +57 -0
  349. package/dist/functions/random.js +90 -0
  350. package/dist/functions/readOnly.js +33 -0
  351. package/dist/functions/render.js +36 -0
  352. package/dist/functions/revive.js +151 -0
  353. package/dist/functions/rng.js +140 -0
  354. package/dist/functions/rockAlt.js +50 -0
  355. package/dist/functions/roomData.js +155 -0
  356. package/dist/functions/roomGrid.js +97 -0
  357. package/dist/functions/roomShape.js +143 -0
  358. package/dist/functions/roomShapeWalls.js +187 -0
  359. package/dist/functions/roomTransition.js +43 -0
  360. package/dist/functions/rooms.js +782 -0
  361. package/dist/functions/run.js +121 -0
  362. package/dist/functions/seeds.js +22 -0
  363. package/dist/functions/serialization.js +98 -0
  364. package/dist/functions/set.js +215 -0
  365. package/dist/functions/slots.js +41 -0
  366. package/dist/functions/sort.js +158 -0
  367. package/dist/functions/sound.js +45 -0
  368. package/dist/functions/spawnCollectible.js +112 -0
  369. package/dist/functions/sprites.js +130 -0
  370. package/dist/functions/stage.js +540 -0
  371. package/dist/functions/stats.js +104 -0
  372. package/dist/functions/storyBosses.js +63 -0
  373. package/dist/functions/string.js +194 -0
  374. package/dist/functions/table.js +162 -0
  375. package/dist/functions/tears.js +128 -0
  376. package/dist/functions/transformations.js +89 -0
  377. package/dist/functions/trinketGive.js +145 -0
  378. package/dist/functions/trinkets.js +213 -0
  379. package/dist/functions/tstlClass.js +97 -0
  380. package/dist/functions/types.js +225 -0
  381. package/dist/functions/ui.js +148 -0
  382. package/dist/functions/utils.d.ts +4 -1
  383. package/dist/functions/utils.d.ts.map +1 -1
  384. package/dist/functions/utils.js +195 -0
  385. package/dist/functions/utils.lua +6 -2
  386. package/dist/functions/vector.js +150 -0
  387. package/dist/functions/versusScreen.js +58 -0
  388. package/dist/functions/weighted.js +57 -0
  389. package/dist/index.js +219 -0
  390. package/dist/index.rollup.d.ts +4 -1
  391. package/dist/indexLua.js +220 -0
  392. package/dist/interfaces/ChargeBarSprites.js +2 -0
  393. package/dist/interfaces/Corner.js +2 -0
  394. package/dist/interfaces/CustomStageTSConfig.js +2 -0
  395. package/dist/interfaces/GridEntityCustomData.js +2 -0
  396. package/dist/interfaces/JSONRoomsFile.js +2 -0
  397. package/dist/interfaces/PlayerHealth.js +2 -0
  398. package/dist/interfaces/PlayerStats.js +4 -0
  399. package/dist/interfaces/PocketItemDescription.js +2 -0
  400. package/dist/interfaces/RoomDescription.js +2 -0
  401. package/dist/interfaces/SaveData.js +98 -0
  402. package/dist/interfaces/StageHistoryEntry.js +2 -0
  403. package/dist/interfaces/TSTLClassMetatable.js +2 -0
  404. package/dist/interfaces/TrinketSituation.js +2 -0
  405. package/dist/interfaces/private/AddCallbackParametersCustom.js +4 -0
  406. package/dist/interfaces/private/CustomStage.js +2 -0
  407. package/dist/interfaces/private/CustomTrapdoorDescription.js +2 -0
  408. package/dist/interfaces/private/ModUpgradedInterface.js +2 -0
  409. package/dist/isaacscript-common.lua +7 -3
  410. package/dist/maps/PHDPillConversionsMap.js +23 -0
  411. package/dist/maps/cardNameToTypeMap.js +211 -0
  412. package/dist/maps/characterNameToTypeMap.js +91 -0
  413. package/dist/maps/collectibleNameToTypeMap.js +19 -0
  414. package/dist/maps/defaultPlayerStatMap.js +17 -0
  415. package/dist/maps/entityTypeVariantToBossIDMap.js +11 -0
  416. package/dist/maps/falsePHDPillConversionsMap.js +37 -0
  417. package/dist/maps/gridEntityTypeToBrokenStateMap.js +32 -0
  418. package/dist/maps/gridEntityXMLMap.js +133 -0
  419. package/dist/maps/itemPoolTypeToItemPoolName.js +38 -0
  420. package/dist/maps/keyboardToStringMap.js +71 -0
  421. package/dist/maps/pillNameToEffectMap.js +91 -0
  422. package/dist/maps/roomNameToTypeMap.js +43 -0
  423. package/dist/maps/roomShapeToTopLeftWallGridIndexMap.js +17 -0
  424. package/dist/maps/transformationNameToPlayerFormMap.js +35 -0
  425. package/dist/maps/trinketNameToTypeMap.js +19 -0
  426. package/dist/objects/LRoomShapeToRectangles.js +43 -0
  427. package/dist/objects/backdropTypeToRockAltType.js +68 -0
  428. package/dist/objects/batteryNames.js +13 -0
  429. package/dist/objects/bombNames.js +17 -0
  430. package/dist/objects/bossIDToEntityTypeVariant.js +228 -0
  431. package/dist/objects/bossNamePNGFileNames.js +120 -0
  432. package/dist/objects/bossNames.js +119 -0
  433. package/dist/objects/bossPortraitPNGFileNames.js +123 -0
  434. package/dist/objects/cardDescriptions.js +106 -0
  435. package/dist/objects/cardNames.js +106 -0
  436. package/dist/objects/challengeBosses.js +60 -0
  437. package/dist/objects/challengeCharacters.js +58 -0
  438. package/dist/objects/challengeCollectibleTypes.js +255 -0
  439. package/dist/objects/challengeNames.js +54 -0
  440. package/dist/objects/challengeTrinketType.js +58 -0
  441. package/dist/objects/characterDamageMultipliers.js +49 -0
  442. package/dist/objects/characterNames.js +48 -0
  443. package/dist/objects/characterSpritePNGFileNames.js +50 -0
  444. package/dist/objects/characterStartingCollectibleTypes.js +105 -0
  445. package/dist/objects/characterStartingTrinketTypes.js +90 -0
  446. package/dist/objects/chestNames.js +20 -0
  447. package/dist/objects/coinNames.js +16 -0
  448. package/dist/objects/coinSubTypeToValue.js +15 -0
  449. package/dist/objects/collectibleDescriptions.js +742 -0
  450. package/dist/objects/collectibleNames.js +745 -0
  451. package/dist/objects/colors.js +26 -0
  452. package/dist/objects/directionNames.js +11 -0
  453. package/dist/objects/directionToDegrees.js +11 -0
  454. package/dist/objects/directionToMoveAction.js +11 -0
  455. package/dist/objects/directionToShootAction.js +11 -0
  456. package/dist/objects/directionToVector.js +13 -0
  457. package/dist/objects/doorSlotFlagToDoorSlot.js +15 -0
  458. package/dist/objects/doorSlotToDirection.js +15 -0
  459. package/dist/objects/doorSlotToDoorSlotFlag.js +15 -0
  460. package/dist/objects/gridEntityTypeToANM2Name.js +37 -0
  461. package/dist/objects/heartNames.js +21 -0
  462. package/dist/objects/isaacAPIClassTypeToBrand.js +12 -0
  463. package/dist/objects/isaacAPIClassTypeToFunctions.js +46 -0
  464. package/dist/objects/itemPoolTypeToCollectibleTypesSet.js +57 -0
  465. package/dist/objects/kColors.js +27 -0
  466. package/dist/objects/keyNames.js +13 -0
  467. package/dist/objects/languageNames.js +13 -0
  468. package/dist/objects/oppositeDoorSlots.js +15 -0
  469. package/dist/objects/pillEffectClasses.js +57 -0
  470. package/dist/objects/pillEffectNames.js +57 -0
  471. package/dist/objects/pillEffectTypeToPillEffects.js +23 -0
  472. package/dist/objects/pillEffectTypes.js +57 -0
  473. package/dist/objects/playerNamePNGFileNames.js +57 -0
  474. package/dist/objects/playerPortraitPNGFileNames.js +54 -0
  475. package/dist/objects/roomShapeBounds.js +48 -0
  476. package/dist/objects/roomShapeCorners.js +330 -0
  477. package/dist/objects/roomShapeLayoutSizes.js +41 -0
  478. package/dist/objects/roomShapeToBottomRightPosition.js +25 -0
  479. package/dist/objects/roomShapeToDoorSlotCoordinates.js +111 -0
  480. package/dist/objects/roomShapeToDoorSlots.js +72 -0
  481. package/dist/objects/roomShapeToDoorSlotsToGridIndexDelta.js +118 -0
  482. package/dist/objects/roomShapeToGridWidth.js +20 -0
  483. package/dist/objects/roomShapeToTopLeftPosition.js +26 -0
  484. package/dist/objects/roomShapeVolumes.js +32 -0
  485. package/dist/objects/roomTypeNames.js +35 -0
  486. package/dist/objects/roomTypeSpecialGotoPrefixes.js +35 -0
  487. package/dist/objects/sackNames.js +11 -0
  488. package/dist/objects/slotNames.js +26 -0
  489. package/dist/objects/stageIDNames.js +43 -0
  490. package/dist/objects/stageToMusic.js +91 -0
  491. package/dist/objects/stageToStageID.js +117 -0
  492. package/dist/objects/stageTypeSuffixes.js +14 -0
  493. package/dist/objects/transformationNames.js +20 -0
  494. package/dist/objects/trinketDescriptions.js +199 -0
  495. package/dist/objects/trinketNames.js +202 -0
  496. package/dist/objects/versusScreenBackgroundColors.js +46 -0
  497. package/dist/objects/versusScreenDirtSpotColors.js +46 -0
  498. package/dist/patchErrorFunctions.js +65 -0
  499. package/dist/serialization.js +21 -0
  500. package/dist/sets/LRoomShapesSet.js +11 -0
  501. package/dist/sets/bigRoomShapesSet.js +14 -0
  502. package/dist/sets/bossSets.js +465 -0
  503. package/dist/sets/charactersThatStartWithAnActiveItemSet.js +18 -0
  504. package/dist/sets/charactersWithBlackHeartFromEternalHeartSet.js +9 -0
  505. package/dist/sets/charactersWithFreeDevilDealsSet.js +6 -0
  506. package/dist/sets/charactersWithNoRedHeartsSet.js +19 -0
  507. package/dist/sets/charactersWithNoSoulHeartsSet.js +16 -0
  508. package/dist/sets/consoleCommandsSet.js +64 -0
  509. package/dist/sets/entitiesWithArmorSet.js +59 -0
  510. package/dist/sets/familiarsThatShootPlayerTearsSet.js +15 -0
  511. package/dist/sets/itemConfigCardTypesForCards.js +14 -0
  512. package/dist/sets/lostStyleCharactersSet.js +16 -0
  513. package/dist/sets/mineShaftRoomSubTypesSet.js +12 -0
  514. package/dist/sets/narrowRoomShapesSet.js +11 -0
  515. package/dist/sets/poopGridEntityXMLTypesSet.js +16 -0
  516. package/dist/sets/redHeartSubTypesSet.js +10 -0
  517. package/dist/sets/repentanceBossIDsSet.js +30 -0
  518. package/dist/sets/sinEntityTypesSet.js +14 -0
  519. package/dist/sets/singleUseActiveCollectibleTypesSet.js +15 -0
  520. package/dist/shaderCrashFix.js +24 -0
  521. package/dist/shouldFire.js +226 -0
  522. package/dist/types/AddSubtract.js +2 -0
  523. package/dist/types/AllButFirst.js +2 -0
  524. package/dist/types/AllButLast.js +2 -0
  525. package/dist/types/AnyClass.js +2 -0
  526. package/dist/types/AnyEntity.js +2 -0
  527. package/dist/types/AnyFunction.js +2 -0
  528. package/dist/types/AnyGridEntity.js +2 -0
  529. package/dist/types/CompositionTypeSatisfiesEnum.js +11 -0
  530. package/dist/types/ConversionHeartSubType.js +2 -0
  531. package/dist/types/Decrement.js +2 -0
  532. package/dist/types/ERange.js +2 -0
  533. package/dist/types/EntityID.js +2 -0
  534. package/dist/types/FunctionTuple.js +2 -0
  535. package/dist/types/GridEntityID.js +2 -0
  536. package/dist/types/HasFunction.js +2 -0
  537. package/dist/types/IRange.js +2 -0
  538. package/dist/types/Immutable.js +2 -0
  539. package/dist/types/Increment.js +2 -0
  540. package/dist/types/LowercaseKeys.js +2 -0
  541. package/dist/types/NaturalNumbersLessThan.js +2 -0
  542. package/dist/types/NaturalNumbersLessThanOrEqualTo.js +2 -0
  543. package/dist/types/PickingUpItem.js +44 -0
  544. package/dist/types/PickupIndex.js +2 -0
  545. package/dist/types/PlayerIndex.js +2 -0
  546. package/dist/types/PossibleStatType.js +2 -0
  547. package/dist/types/PublicInterface.js +2 -0
  548. package/dist/types/ReadonlyMap.js +6 -0
  549. package/dist/types/ReadonlyRecord.js +2 -0
  550. package/dist/types/ReadonlySet.js +6 -0
  551. package/dist/types/StartsWithLowercase.js +2 -0
  552. package/dist/types/StartsWithUppercase.js +2 -0
  553. package/dist/types/TSTLClass.js +2 -0
  554. package/dist/types/Tuple.js +2 -0
  555. package/dist/types/TupleKeys.js +2 -0
  556. package/dist/types/TupleToIntersection.js +2 -0
  557. package/dist/types/TupleToUnion.js +2 -0
  558. package/dist/types/TupleWithLengthBetween.js +22 -0
  559. package/dist/types/TupleWithMaxLength.js +27 -0
  560. package/dist/types/UnionToIntersection.js +2 -0
  561. package/dist/types/UppercaseKeys.js +2 -0
  562. package/dist/types/WeightedArray.js +2 -0
  563. package/dist/types/WidenLiteral.js +2 -0
  564. package/dist/types/Writable.js +2 -0
  565. package/dist/types/private/CallbackTuple.js +2 -0
  566. package/dist/types/private/ModUpgradedWithFeatures.js +2 -0
  567. package/package.json +1 -1
  568. package/src/functions/utils.ts +6 -2
@@ -0,0 +1,782 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMineShaft = exports.isMegaSatanRoom = exports.isLRoom = exports.isHomeCloset = exports.isGenesisRoom = exports.isDoubleTrouble = exports.isDogmaRoom = exports.isDevilsCrownTreasureRoom = exports.isDeathCertificateArea = exports.isCrawlSpaceWithBlackMarketEntrance = exports.isCrawlSpace = exports.isBossRoomOf = exports.isBigRoom = exports.isBeastRoom = exports.isAngelShop = exports.isAllRoomsClear = exports.is2x1Room = exports.inStartingRoom = exports.inSecretShop = exports.inSecretExit = exports.inRoomType = exports.inRoomShape = exports.inMirrorRoom = exports.inMinibossRoomOf = exports.inMineShaft = exports.inMegaSatanRoom = exports.inLRoom = exports.inHomeCloset = exports.inGenesisRoom = exports.inDoubleTrouble = exports.inDogmaRoom = exports.inDevilsCrownTreasureRoom = exports.inDeathCertificateArea = exports.inCrawlSpaceWithBlackMarketEntrance = exports.inCrawlSpace = exports.inBossRoomOf = exports.inBigRoom = exports.inBeastRoom = exports.inAngelShop = exports.in2x1Room = exports.getRoomsOutsideGrid = exports.getRoomsOfDimension = exports.getRoomsInsideGrid = exports.getRooms = exports.getRoomTypeName = exports.getRoomItemPoolType = exports.getRoomDataForTypeVariant = exports.getReadOnlyRooms = exports.getNumRooms = exports.changeRoom = void 0;
4
+ exports.setRoomUncleared = exports.setRoomCleared = exports.setBackdrop = exports.roomUpdateSafe = exports.isSecretShop = exports.isSecretRoomType = exports.isSecretExit = exports.isRoomType = exports.isRoomShape = exports.isMirrorRoom = exports.isMinibossRoomOf = void 0;
5
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
6
+ const cachedClasses_1 = require("../core/cachedClasses");
7
+ const constants_1 = require("../core/constants");
8
+ const roomTypeNames_1 = require("../objects/roomTypeNames");
9
+ const mineShaftRoomSubTypesSet_1 = require("../sets/mineShaftRoomSubTypesSet");
10
+ const ReadonlySet_1 = require("../types/ReadonlySet");
11
+ const dimensions_1 = require("./dimensions");
12
+ const doors_1 = require("./doors");
13
+ const entities_1 = require("./entities");
14
+ const flag_1 = require("./flag");
15
+ const positionVelocity_1 = require("./positionVelocity");
16
+ const roomData_1 = require("./roomData");
17
+ const roomShape_1 = require("./roomShape");
18
+ const roomTransition_1 = require("./roomTransition");
19
+ const stage_1 = require("./stage");
20
+ const utils_1 = require("./utils");
21
+ const SECRET_ROOM_TYPES = new ReadonlySet_1.ReadonlySet([
22
+ isaac_typescript_definitions_1.RoomType.SECRET,
23
+ isaac_typescript_definitions_1.RoomType.SUPER_SECRET,
24
+ isaac_typescript_definitions_1.RoomType.ULTRA_SECRET,
25
+ ]);
26
+ /**
27
+ * Helper function for quickly switching to a new room without playing a particular animation. Use
28
+ * this helper function over invoking the `Game.ChangeRoom` method directly to ensure that you do
29
+ * not forget to set the `LeaveDoor` field and to prevent crashing on invalid room grid indexes.
30
+ */
31
+ function changeRoom(roomGridIndex) {
32
+ const level = cachedClasses_1.game.GetLevel();
33
+ const roomData = (0, roomData_1.getRoomData)(roomGridIndex);
34
+ (0, utils_1.assertDefined)(roomData, `Failed to change the room to grid index ${roomGridIndex} because that room does not exist.`);
35
+ // LeaveDoor must be set before every `Game.ChangeRoom` invocation or else the function can send
36
+ // you to the wrong room.
37
+ level.LeaveDoor = isaac_typescript_definitions_1.DoorSlot.NO_DOOR_SLOT;
38
+ cachedClasses_1.game.ChangeRoom(roomGridIndex);
39
+ }
40
+ exports.changeRoom = changeRoom;
41
+ /**
42
+ * Helper function to get the number of rooms that are currently on the floor layout. This does not
43
+ * include off-grid rooms, like the Devil Room.
44
+ */
45
+ function getNumRooms() {
46
+ const roomsInsideGrid = getRoomsInsideGrid();
47
+ return roomsInsideGrid.length;
48
+ }
49
+ exports.getNumRooms = getNumRooms;
50
+ /**
51
+ * Helper function to get a read-only copy of the room descriptor for every room on the level. This
52
+ * includes off-grid rooms, such as the Devil Room, and extra-dimensional rooms, if they are
53
+ * generated and exist.
54
+ *
55
+ * Room descriptors without any data are assumed to be non-existent and are not included.
56
+ *
57
+ * Under the hood, this is performed by iterating over the `RoomList` from the `Level.GetRooms`
58
+ * method. This is the best way to see if off-grid rooms have been initialized, since it is possible
59
+ * for mods to insert room data at non-official negative room grid indexes.
60
+ */
61
+ function getReadOnlyRooms() {
62
+ const level = cachedClasses_1.game.GetLevel();
63
+ const roomList = level.GetRooms();
64
+ const readOnlyRoomDescriptors = [];
65
+ for (let i = 0; i < roomList.Size; i++) {
66
+ const readOnlyRoomDescriptor = roomList.Get(i);
67
+ if (readOnlyRoomDescriptor !== undefined &&
68
+ readOnlyRoomDescriptor.Data !== undefined) {
69
+ readOnlyRoomDescriptors.push(readOnlyRoomDescriptor);
70
+ }
71
+ }
72
+ return readOnlyRoomDescriptors;
73
+ }
74
+ exports.getReadOnlyRooms = getReadOnlyRooms;
75
+ /**
76
+ * Helper function to get the room data for a specific room type and variant combination. This is
77
+ * accomplished by using the "goto" console command to load the specified room into the
78
+ * `GridRoom.DEBUG` slot.
79
+ *
80
+ * Returns undefined if the provided room type and variant combination were not found. (A warning
81
+ * message will also appear on the console, since the "goto" command will fail.)
82
+ *
83
+ * Note that the side effect of using the "goto" console command is that it will trigger a room
84
+ * transition after a short delay. By default, this function cancels the incoming room transition by
85
+ * using the `Game.StartRoomTransition` method to travel to the same room.
86
+ *
87
+ * @param roomType The type of room to retrieve.
88
+ * @param roomVariant The room variant to retrieve. (The room variant is the "ID" of the room in
89
+ * Basement Renovator.)
90
+ * @param cancelRoomTransition Optional. Whether to cancel the room transition by using the
91
+ * `Game.StartRoomTransition` method to travel to the same room. Default
92
+ * is true. Set this to false if you are getting the data for many rooms
93
+ * at the same time, and then use the `teleport` helper function when
94
+ * you are finished.
95
+ * @param useSpecialRoomsForRoomTypeDefault Optional. Whether to use `s.default` as the prefix for
96
+ * the `goto` command (instead of `d`) if the room type is
97
+ * `RoomType.DEFAULT` (1). False by default.
98
+ */
99
+ function getRoomDataForTypeVariant(roomType, roomVariant, cancelRoomTransition = true, useSpecialRoomsForRoomTypeDefault = false) {
100
+ const command = (0, stage_1.getGotoCommand)(roomType, roomVariant, useSpecialRoomsForRoomTypeDefault);
101
+ // We do not want to log the command execution, because this function will potentially be called
102
+ // many times.
103
+ Isaac.ExecuteCommand(command);
104
+ const newRoomData = (0, roomData_1.getRoomData)(isaac_typescript_definitions_1.GridRoom.DEBUG);
105
+ if (cancelRoomTransition) {
106
+ (0, roomTransition_1.reloadRoom)();
107
+ }
108
+ return newRoomData;
109
+ }
110
+ exports.getRoomDataForTypeVariant = getRoomDataForTypeVariant;
111
+ /**
112
+ * Helper function to get the item pool type for the current room. For example, this returns
113
+ * `ItemPoolType.ItemPoolType.POOL_ANGEL` if you are in an Angel Room.
114
+ */
115
+ function getRoomItemPoolType() {
116
+ const itemPool = cachedClasses_1.game.GetItemPool();
117
+ const room = cachedClasses_1.game.GetRoom();
118
+ const roomType = room.GetType();
119
+ const roomSeed = room.GetSpawnSeed();
120
+ return itemPool.GetPoolForRoom(roomType, roomSeed);
121
+ }
122
+ exports.getRoomItemPoolType = getRoomItemPoolType;
123
+ /**
124
+ * Helper function to get the proper name of a room type.
125
+ *
126
+ * For example, `RoomType.TREASURE` will return "Treasure Room".
127
+ */
128
+ function getRoomTypeName(roomType) {
129
+ return roomTypeNames_1.ROOM_TYPE_NAMES[roomType];
130
+ }
131
+ exports.getRoomTypeName = getRoomTypeName;
132
+ /**
133
+ * Helper function to get the room descriptor for every room on the level. This includes off-grid
134
+ * rooms, such as the Devil Room.
135
+ *
136
+ * Room without any data are assumed to be non-existent and are not included.
137
+ *
138
+ * - If you want just the rooms inside of the grid, use the `getRoomsInsideGrid` helper function.
139
+ * - If you want just the rooms outside of the grid, use the `getRoomsOutsideGrid` helper function.
140
+ *
141
+ * @param includeExtraDimensionalRooms Optional. On some floors (e.g. Downpour 2, Mines 2),
142
+ * extra-dimensional rooms are automatically generated. Default is
143
+ * false.
144
+ */
145
+ function getRooms(includeExtraDimensionalRooms = false) {
146
+ // The naive way to get all of the rooms would be to iterate over the `RoomList` from the
147
+ // `Level.GetRooms` method. However, this results in read-only data, and we want to return a
148
+ // writable object. Instead, we let the heavy lifting be handled by other functions.
149
+ const roomsInGrid = getRoomsInsideGrid(includeExtraDimensionalRooms);
150
+ const roomsOutsideGrid = getRoomsOutsideGrid();
151
+ return [...roomsInGrid, ...roomsOutsideGrid];
152
+ }
153
+ exports.getRooms = getRooms;
154
+ /**
155
+ * Helper function to get the room descriptor for every room on the level that is on the grid. (For
156
+ * example, Devil Rooms are excluded.)
157
+ *
158
+ * Room descriptors without any data are assumed to be non-existent and are not included.
159
+ *
160
+ * @param includeExtraDimensionalRooms Optional. On some floors (e.g. Downpour 2, Mines 2),
161
+ * extra-dimensional rooms are automatically be generated. Default
162
+ * is false.
163
+ */
164
+ function getRoomsInsideGrid(includeExtraDimensionalRooms = false) {
165
+ const level = cachedClasses_1.game.GetLevel();
166
+ const dimensions = includeExtraDimensionalRooms
167
+ ? constants_1.DIMENSIONS
168
+ : [isaac_typescript_definitions_1.Dimension.CURRENT];
169
+ /** We use a map instead of an array because room shapes occupy more than one room grid index. */
170
+ const roomDescriptorMap = new Map();
171
+ for (const dimension of dimensions) {
172
+ for (const roomGridIndex of (0, utils_1.iRange)(constants_1.MAX_LEVEL_GRID_INDEX)) {
173
+ const roomDescriptor = level.GetRoomByIdx(roomGridIndex, dimension);
174
+ if (roomDescriptor.Data !== undefined) {
175
+ const ptrHash = GetPtrHash(roomDescriptor);
176
+ roomDescriptorMap.set(ptrHash, roomDescriptor);
177
+ }
178
+ }
179
+ }
180
+ return [...roomDescriptorMap.values()];
181
+ }
182
+ exports.getRoomsInsideGrid = getRoomsInsideGrid;
183
+ /**
184
+ * Helper function to get the room descriptor for every room on the level in a specific dimension.
185
+ * This will not include any off-grid rooms, such as the Devil Room.
186
+ *
187
+ * Room descriptors without any data are assumed to be non-existent and are not included.
188
+ */
189
+ function getRoomsOfDimension(dimension) {
190
+ const level = cachedClasses_1.game.GetLevel();
191
+ /** We use a map instead of an array because room shapes occupy more than one room grid index. */
192
+ const roomsMap = new Map();
193
+ for (const roomGridIndex of (0, utils_1.iRange)(constants_1.MAX_LEVEL_GRID_INDEX)) {
194
+ const roomDescriptor = level.GetRoomByIdx(roomGridIndex, dimension);
195
+ if (roomDescriptor.Data !== undefined) {
196
+ const ptrHash = GetPtrHash(roomDescriptor);
197
+ roomsMap.set(ptrHash, roomDescriptor);
198
+ }
199
+ }
200
+ return [...roomsMap.values()];
201
+ }
202
+ exports.getRoomsOfDimension = getRoomsOfDimension;
203
+ /**
204
+ * Helper function to get the room descriptor for every room on the level that is outside of the
205
+ * grid (like a Devil Room).
206
+ *
207
+ * Room descriptors without any data are assumed to be non-existent and are not included.
208
+ */
209
+ function getRoomsOutsideGrid() {
210
+ // We filter an array of all rooms instead of iterating over the `GridRoom` enum because it is
211
+ // possible for mods to insert data at arbitrary negative room grid indexes.
212
+ const readOnlyRooms = getReadOnlyRooms();
213
+ const readOnlyRoomsOffGrid = readOnlyRooms.filter((readOnlyRoomDescriptor) => readOnlyRoomDescriptor.SafeGridIndex < 0);
214
+ return readOnlyRoomsOffGrid.map((readOnlyRoomDescriptor) => (0, roomData_1.getRoomDescriptor)(readOnlyRoomDescriptor.SafeGridIndex));
215
+ }
216
+ exports.getRoomsOutsideGrid = getRoomsOutsideGrid;
217
+ /**
218
+ * Helper function to determine if the current room shape is equal to `RoomShape.1x2` or
219
+ * `RoomShape.2x1`.
220
+ */
221
+ function in2x1Room() {
222
+ const roomData = (0, roomData_1.getRoomData)();
223
+ return is2x1Room(roomData);
224
+ }
225
+ exports.in2x1Room = in2x1Room;
226
+ /**
227
+ * Helper function to check to see if the current room is an angel shop.
228
+ *
229
+ * Under the hood, this checks the room type being equal to `RoomType.ANGEL` (15) and the sub-type
230
+ * being equal to `AngelRoomSubType.SHOP` (1).
231
+ */
232
+ function inAngelShop() {
233
+ const roomData = (0, roomData_1.getRoomData)();
234
+ return isAngelShop(roomData);
235
+ }
236
+ exports.inAngelShop = inAngelShop;
237
+ /**
238
+ * Helper function to check to see if the current room is the Boss Room for The Beast.
239
+ *
240
+ * This function is useful because the `Room.GetBossID` method returns 0 for The Beast room.
241
+ *
242
+ * Under the hood, this checks the room type being equal to `RoomType.DUNGEON` (16) and the sub-type
243
+ * being equal to `DungeonSubType.BEAST_ROOM` (4).
244
+ */
245
+ function inBeastRoom() {
246
+ const roomData = (0, roomData_1.getRoomData)();
247
+ return isBeastRoom(roomData);
248
+ }
249
+ exports.inBeastRoom = inBeastRoom;
250
+ /**
251
+ * Helper function to detect if the current room is big. Specifically, this is all 1x2 rooms, 2x2
252
+ * rooms, and L rooms.
253
+ */
254
+ function inBigRoom() {
255
+ const roomData = (0, roomData_1.getRoomData)();
256
+ return isBigRoom(roomData);
257
+ }
258
+ exports.inBigRoom = inBigRoom;
259
+ /**
260
+ * Helper function to check if the current room is the Boss Room for a particular boss. This will
261
+ * only work for bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
262
+ */
263
+ function inBossRoomOf(bossID) {
264
+ const roomData = (0, roomData_1.getRoomData)();
265
+ return isBossRoomOf(roomData, bossID);
266
+ }
267
+ exports.inBossRoomOf = inBossRoomOf;
268
+ /**
269
+ * Helper function for determining whether the current room is a crawl space. Use this function over
270
+ * comparing to `RoomType.DUNGEON` or `GridRoom.DUNGEON_IDX` since there is a special case of the
271
+ * player being in a boss fight that takes place in a dungeon.
272
+ */
273
+ function inCrawlSpace() {
274
+ const roomData = (0, roomData_1.getRoomData)();
275
+ return isCrawlSpace(roomData);
276
+ }
277
+ exports.inCrawlSpace = inCrawlSpace;
278
+ /**
279
+ * Helper function for checking whether the current room is a crawl space with a door corresponding
280
+ * to `DoorSlotFlag.RIGHT_0` (1 << 2).
281
+ */
282
+ function inCrawlSpaceWithBlackMarketEntrance() {
283
+ const roomData = (0, roomData_1.getRoomData)();
284
+ return isCrawlSpaceWithBlackMarketEntrance(roomData);
285
+ }
286
+ exports.inCrawlSpaceWithBlackMarketEntrance = inCrawlSpaceWithBlackMarketEntrance;
287
+ /**
288
+ * Helper function to detect if the current room is one of the rooms in the Death Certificate area.
289
+ */
290
+ function inDeathCertificateArea() {
291
+ const roomData = (0, roomData_1.getRoomData)();
292
+ return isDeathCertificateArea(roomData);
293
+ }
294
+ exports.inDeathCertificateArea = inDeathCertificateArea;
295
+ /**
296
+ * Helper function to detect if the current room is a Treasure Room created when entering with a
297
+ * Devil's Crown trinket.
298
+ *
299
+ * Under the hood, this checks for `RoomDescriptorFlag.DEVIL_TREASURE`.
300
+ */
301
+ function inDevilsCrownTreasureRoom() {
302
+ const roomDescriptor = (0, roomData_1.getRoomDescriptorReadOnly)();
303
+ return isDevilsCrownTreasureRoom(roomDescriptor);
304
+ }
305
+ exports.inDevilsCrownTreasureRoom = inDevilsCrownTreasureRoom;
306
+ /**
307
+ * Helper function to check to see if the current room is the Boss Room for Dogma.
308
+ *
309
+ * This function is useful because the `Room.GetBossID` method returns 0 for the Dogma room.
310
+ *
311
+ * Note that the "living room" on the Home floor with the TV at the top of the room is not the Dogma
312
+ * Boss Room, as the player is teleported to a different room after watching the TV cutscene.
313
+ *
314
+ * Under the hood, this checks the stage ID being equal to `StageID.HOME` (35) and the room type
315
+ * being equal to `RoomType.DEFAULT` (1) and the variant being equal to 1000 (which is the only
316
+ * Dogma Boss Room that exists in vanilla) and the sub-type being equal to
317
+ * `HomeRoomSubType.LIVING_ROOM` (3).
318
+ */
319
+ function inDogmaRoom() {
320
+ const roomData = (0, roomData_1.getRoomData)();
321
+ return isDogmaRoom(roomData);
322
+ }
323
+ exports.inDogmaRoom = inDogmaRoom;
324
+ /**
325
+ * Helper function to detect if the current room is a Double Trouble Boss Room.
326
+ *
327
+ * This is performed by checking for the string "Double Trouble" inside of the room name. The
328
+ * vanilla game uses this convention for every Double Trouble Boss Room. Note that this method might
329
+ * fail for mods that add extra Double Trouble rooms but do not follow the convention.
330
+ *
331
+ * Internally, the game is coded to detect Double Trouble Boss Rooms by checking for the variant
332
+ * range of 3700 through 3850. We intentionally do not use this method since it may not work as well
333
+ * with modded rooms.
334
+ */
335
+ function inDoubleTrouble() {
336
+ const roomData = (0, roomData_1.getRoomData)();
337
+ return isDoubleTrouble(roomData);
338
+ }
339
+ exports.inDoubleTrouble = inDoubleTrouble;
340
+ /** Helper function to determine if the current room index is equal to `GridRoom.GENESIS`. */
341
+ function inGenesisRoom() {
342
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
343
+ return isGenesisRoom(roomGridIndex);
344
+ }
345
+ exports.inGenesisRoom = inGenesisRoom;
346
+ /**
347
+ * Helper function to check if the current room is either the left Home closet (behind the red door)
348
+ * or the right Home closet (with one random pickup).
349
+ *
350
+ * Home closets have a unique shape that is different from any other room in the game.
351
+ */
352
+ function inHomeCloset() {
353
+ const roomData = (0, roomData_1.getRoomData)();
354
+ return isHomeCloset(roomData);
355
+ }
356
+ exports.inHomeCloset = inHomeCloset;
357
+ /** Helper function to determine if the current room shape is one of the four L room shapes. */
358
+ function inLRoom() {
359
+ const roomData = (0, roomData_1.getRoomData)();
360
+ return isLRoom(roomData);
361
+ }
362
+ exports.inLRoom = inLRoom;
363
+ /** Helper function to determine if the current room index is equal to `GridRoom.MEGA_SATAN`. */
364
+ function inMegaSatanRoom() {
365
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
366
+ return isMegaSatanRoom(roomGridIndex);
367
+ }
368
+ exports.inMegaSatanRoom = inMegaSatanRoom;
369
+ /**
370
+ * Helper function to determine if the current room is part of the Repentance "escape sequence" in
371
+ * the Mines/Ashpit.
372
+ */
373
+ function inMineShaft() {
374
+ const roomData = (0, roomData_1.getRoomData)();
375
+ return isMineShaft(roomData);
376
+ }
377
+ exports.inMineShaft = inMineShaft;
378
+ /**
379
+ * Helper function to check if the current room is a miniboss room for a particular miniboss. This
380
+ * will only work for mini-bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
381
+ */
382
+ function inMinibossRoomOf(minibossID) {
383
+ const roomData = (0, roomData_1.getRoomData)();
384
+ return isMinibossRoomOf(roomData, minibossID);
385
+ }
386
+ exports.inMinibossRoomOf = inMinibossRoomOf;
387
+ /**
388
+ * Helper function to check if the current room is a "mirror room" in Downpour or Dross. (These
389
+ * rooms are marked with a specific sub-type.)
390
+ */
391
+ function inMirrorRoom() {
392
+ const roomData = (0, roomData_1.getRoomData)();
393
+ return isMirrorRoom(roomData);
394
+ }
395
+ exports.inMirrorRoom = inMirrorRoom;
396
+ /**
397
+ * Helper function to check if the current room shape matches one of the given room shapes.
398
+ *
399
+ * This function is variadic, which means you can pass as many room shapes as you want to match for.
400
+ */
401
+ function inRoomShape(...roomShapes) {
402
+ const roomData = (0, roomData_1.getRoomData)();
403
+ return isRoomShape(roomData, ...roomShapes);
404
+ }
405
+ exports.inRoomShape = inRoomShape;
406
+ /**
407
+ * Helper function to check if the current room matches one of the given room types.
408
+ *
409
+ * This function is variadic, which means you can pass as many room types as you want to match for.
410
+ */
411
+ function inRoomType(...roomTypes) {
412
+ const roomData = (0, roomData_1.getRoomData)();
413
+ return isRoomType(roomData, ...roomTypes);
414
+ }
415
+ exports.inRoomType = inRoomType;
416
+ /**
417
+ * Helper function for checking if the current room is a secret exit that leads to a Repentance
418
+ * floor.
419
+ */
420
+ function inSecretExit() {
421
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
422
+ return isSecretExit(roomGridIndex);
423
+ }
424
+ exports.inSecretExit = inSecretExit;
425
+ /**
426
+ * Helper function for checking if the current room is a secret shop (from the Member Card
427
+ * collectible).
428
+ *
429
+ * Secret shops are simply copies of normal shops, but with the backdrop of a secret room. In other
430
+ * words, they will have the same room type, room variant, and room sub-type of a normal shop. Thus,
431
+ * the only way to detect them is by using the grid index.
432
+ */
433
+ function inSecretShop() {
434
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
435
+ return isSecretShop(roomGridIndex);
436
+ }
437
+ exports.inSecretShop = inSecretShop;
438
+ /**
439
+ * Helper function to determine whether the current room is the starting room of a floor. It only
440
+ * returns true for the starting room of the primary dimension (meaning that being in the starting
441
+ * room of the mirror world does not count).
442
+ */
443
+ function inStartingRoom() {
444
+ const level = cachedClasses_1.game.GetLevel();
445
+ const startingRoomGridIndex = level.GetStartingRoomIndex();
446
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
447
+ return roomGridIndex === startingRoomGridIndex && (0, dimensions_1.inDimension)(isaac_typescript_definitions_1.Dimension.MAIN);
448
+ }
449
+ exports.inStartingRoom = inStartingRoom;
450
+ /**
451
+ * Helper function to determine if the provided room is equal to `RoomShape.1x2` or `RoomShape.2x1`.
452
+ */
453
+ function is2x1Room(roomData) {
454
+ return (0, roomShape_1.is2x1RoomShape)(roomData.Shape);
455
+ }
456
+ exports.is2x1Room = is2x1Room;
457
+ /**
458
+ * Helper function to loop through every room on the floor and see if it has been cleared.
459
+ *
460
+ * This function will only check rooms inside the grid and inside the current dimension.
461
+ *
462
+ * @param onlyCheckRoomTypes Optional. A whitelist of room types. If specified, room types not in
463
+ * the array will be ignored. If not specified, then all rooms will be
464
+ * checked. Undefined by default.
465
+ * @param includeSecretRoom Optional. Whether to include the Secret Room. Default is false.
466
+ * @param includeSuperSecretRoom Optional. Whether to include the Super Secret Room. Default is
467
+ * false.
468
+ * @param includeUltraSecretRoom Optional. Whether to include the Ultra Secret Room. Default is
469
+ * false.
470
+ * @allowEmptyVariadic
471
+ */
472
+ function isAllRoomsClear(onlyCheckRoomTypes, includeSecretRoom = false, includeSuperSecretRoom = false, includeUltraSecretRoom = false) {
473
+ const roomsInsideGrid = getRoomsInsideGrid();
474
+ let matchingRooms;
475
+ if (onlyCheckRoomTypes === undefined) {
476
+ matchingRooms = roomsInsideGrid;
477
+ }
478
+ else {
479
+ const roomTypeWhitelist = new ReadonlySet_1.ReadonlySet(onlyCheckRoomTypes);
480
+ matchingRooms = roomsInsideGrid.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
481
+ roomTypeWhitelist.has(roomDescriptor.Data.Type));
482
+ }
483
+ if (!includeSecretRoom) {
484
+ matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
485
+ roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.SECRET);
486
+ }
487
+ if (!includeSuperSecretRoom) {
488
+ matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
489
+ roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.SUPER_SECRET);
490
+ }
491
+ if (!includeUltraSecretRoom) {
492
+ matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
493
+ roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.ULTRA_SECRET);
494
+ }
495
+ return matchingRooms.every((roomDescriptor) => roomDescriptor.Clear);
496
+ }
497
+ exports.isAllRoomsClear = isAllRoomsClear;
498
+ /**
499
+ * Helper function to check to see if the current room is an angel shop.
500
+ *
501
+ * Under the hood, this checks the room type being equal to `RoomType.ANGEL` (15) and the sub-type
502
+ * being equal to `AngelRoomSubType.SHOP` (1).
503
+ */
504
+ function isAngelShop(roomData) {
505
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.ANGEL &&
506
+ roomData.Subtype === isaac_typescript_definitions_1.AngelRoomSubType.SHOP);
507
+ }
508
+ exports.isAngelShop = isAngelShop;
509
+ /**
510
+ * Helper function to check to see if the provided room is the Boss Room for The Beast.
511
+ *
512
+ * This function is useful because the `Room.GetBossID` method returns 0 for The Beast room.
513
+ *
514
+ * Under the hood, this checks the room type being equal to `RoomType.DUNGEON` (16) and the sub-type
515
+ * being equal to `DungeonSubType.BEAST_ROOM` (4).
516
+ */
517
+ function isBeastRoom(roomData) {
518
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.DUNGEON &&
519
+ roomData.Subtype === isaac_typescript_definitions_1.DungeonSubType.BEAST_ROOM);
520
+ }
521
+ exports.isBeastRoom = isBeastRoom;
522
+ /**
523
+ * Helper function to detect if the provided room is big. Specifically, this is all 1x2 rooms, 2x2
524
+ * rooms, and L rooms.
525
+ */
526
+ function isBigRoom(roomData) {
527
+ return (0, roomShape_1.isBigRoomShape)(roomData.Shape);
528
+ }
529
+ exports.isBigRoom = isBigRoom;
530
+ /**
531
+ * Helper function to check if the provided room is the Boss Room for a particular boss. This will
532
+ * only work for bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
533
+ */
534
+ function isBossRoomOf(roomData, bossID) {
535
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.BOSS &&
536
+ roomData.StageID === isaac_typescript_definitions_1.StageID.SPECIAL_ROOMS &&
537
+ roomData.Subtype === bossID);
538
+ }
539
+ exports.isBossRoomOf = isBossRoomOf;
540
+ /**
541
+ * Helper function for determining whether the provided room is a crawl space. Use this function
542
+ * over comparing to `RoomType.DUNGEON` or `GridRoom.DUNGEON_IDX` since there is a special case of
543
+ * the player being in a boss fight that takes place in a dungeon.
544
+ */
545
+ function isCrawlSpace(roomData) {
546
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.DUNGEON &&
547
+ roomData.Subtype === isaac_typescript_definitions_1.DungeonSubType.NORMAL);
548
+ }
549
+ exports.isCrawlSpace = isCrawlSpace;
550
+ /**
551
+ * Helper function for checking whether the provided room is a crawl space with a door corresponding
552
+ * to `DoorSlotFlag.RIGHT_0` (1 << 2).
553
+ */
554
+ function isCrawlSpaceWithBlackMarketEntrance(roomData) {
555
+ return (isCrawlSpace(roomData) && (0, flag_1.hasFlag)(roomData.Doors, isaac_typescript_definitions_1.DoorSlotFlag.RIGHT_0));
556
+ }
557
+ exports.isCrawlSpaceWithBlackMarketEntrance = isCrawlSpaceWithBlackMarketEntrance;
558
+ /**
559
+ * Helper function to detect if the provided room is one of the rooms in the Death Certificate area.
560
+ */
561
+ function isDeathCertificateArea(roomData) {
562
+ return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
563
+ (roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.DEATH_CERTIFICATE_ENTRANCE ||
564
+ roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.DEATH_CERTIFICATE_ITEMS));
565
+ }
566
+ exports.isDeathCertificateArea = isDeathCertificateArea;
567
+ /**
568
+ * Helper function to detect if the provided room is a Treasure Room created when entering with a
569
+ * Devil's Crown trinket.
570
+ *
571
+ * Under the hood, this checks for `RoomDescriptorFlag.DEVIL_TREASURE`.
572
+ */
573
+ function isDevilsCrownTreasureRoom(roomDescriptor) {
574
+ return (0, flag_1.hasFlag)(roomDescriptor.Flags, isaac_typescript_definitions_1.RoomDescriptorFlag.DEVIL_TREASURE);
575
+ }
576
+ exports.isDevilsCrownTreasureRoom = isDevilsCrownTreasureRoom;
577
+ /**
578
+ * Helper function to check to see if the provided room is the Boss Room for Dogma.
579
+ *
580
+ * This function is useful because the `Room.GetBossID` method returns 0 for the Dogma room.
581
+ *
582
+ * Note that the "living room" on the Home floor with the TV at the top of the room is not the Dogma
583
+ * Boss Room, as the player is teleported to a different room after watching the TV cutscene.
584
+ *
585
+ * Under the hood, this checks the stage ID being equal to `StageID.HOME` (35) and the room type
586
+ * being equal to `RoomType.DEFAULT` (1) and the variant being equal to 1000 (which is the only
587
+ * Dogma Boss Room that exists in vanilla) and the sub-type being equal to
588
+ * `HomeRoomSubType.LIVING_ROOM` (3).
589
+ */
590
+ function isDogmaRoom(roomData) {
591
+ return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
592
+ roomData.Type === isaac_typescript_definitions_1.RoomType.DEFAULT &&
593
+ roomData.Variant === 1000 &&
594
+ roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.LIVING_ROOM);
595
+ }
596
+ exports.isDogmaRoom = isDogmaRoom;
597
+ /**
598
+ * Helper function to detect if the provided room is a Double Trouble Boss Room.
599
+ *
600
+ * This is performed by checking for the string "Double Trouble" inside of the room name. The
601
+ * vanilla game uses this convention for every Double Trouble Boss Room. Note that this method might
602
+ * fail for mods that add extra Double Trouble rooms but do not follow the convention.
603
+ *
604
+ * Internally, the game is coded to detect Double Trouble Boss Rooms by checking for the variant
605
+ * range of 3700 through 3850. We intentionally do not use this method since it may not work as well
606
+ * with modded rooms.
607
+ */
608
+ function isDoubleTrouble(roomData) {
609
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.BOSS && roomData.Name.includes("Double Trouble"));
610
+ }
611
+ exports.isDoubleTrouble = isDoubleTrouble;
612
+ /**
613
+ * Helper function to determine if the index of the provided room is equal to `GridRoom.GENESIS`.
614
+ */
615
+ function isGenesisRoom(roomGridIndex) {
616
+ return roomGridIndex === isaac_typescript_definitions_1.GridRoom.GENESIS;
617
+ }
618
+ exports.isGenesisRoom = isGenesisRoom;
619
+ /**
620
+ * Helper function to check if the provided room is either the left Home closet (behind the red
621
+ * door) or the right Home closet (with one random pickup).
622
+ *
623
+ * Home closets have a unique shape that is different from any other room in the game.
624
+ */
625
+ function isHomeCloset(roomData) {
626
+ return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
627
+ (roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.CLOSET_LEFT ||
628
+ roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.CLOSET_RIGHT));
629
+ }
630
+ exports.isHomeCloset = isHomeCloset;
631
+ /** Helper function to determine if the provided room is one of the four L room shapes. */
632
+ function isLRoom(roomData) {
633
+ return (0, roomShape_1.isLRoomShape)(roomData.Shape);
634
+ }
635
+ exports.isLRoom = isLRoom;
636
+ /**
637
+ * Helper function to determine if the index of the provided room is equal to `GridRoom.MEGA_SATAN`.
638
+ */
639
+ function isMegaSatanRoom(roomGridIndex) {
640
+ return roomGridIndex === isaac_typescript_definitions_1.GridRoom.MEGA_SATAN;
641
+ }
642
+ exports.isMegaSatanRoom = isMegaSatanRoom;
643
+ /**
644
+ * Helper function to determine if the provided room is part of the Repentance "escape sequence" in
645
+ * the Mines/Ashpit.
646
+ */
647
+ function isMineShaft(roomData) {
648
+ return ((roomData.StageID === isaac_typescript_definitions_1.StageID.MINES ||
649
+ roomData.StageID === isaac_typescript_definitions_1.StageID.ASHPIT) &&
650
+ // eslint-disable-next-line isaacscript/strict-enums
651
+ mineShaftRoomSubTypesSet_1.MINE_SHAFT_ROOM_SUB_TYPE_SET.has(roomData.Subtype));
652
+ }
653
+ exports.isMineShaft = isMineShaft;
654
+ /**
655
+ * Helper function to check if the provided room is a miniboss room for a particular miniboss. This
656
+ * will only work for mini-bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
657
+ */
658
+ function isMinibossRoomOf(roomData, minibossID) {
659
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.MINI_BOSS &&
660
+ roomData.StageID === isaac_typescript_definitions_1.StageID.SPECIAL_ROOMS &&
661
+ roomData.Subtype === minibossID);
662
+ }
663
+ exports.isMinibossRoomOf = isMinibossRoomOf;
664
+ /**
665
+ * Helper function to check if the provided room is a "mirror room" in Downpour or Dross. (These
666
+ * rooms are marked with a specific sub-type.)
667
+ */
668
+ function isMirrorRoom(roomData) {
669
+ return (roomData.Type === isaac_typescript_definitions_1.RoomType.DEFAULT &&
670
+ (roomData.StageID === isaac_typescript_definitions_1.StageID.DOWNPOUR ||
671
+ roomData.StageID === isaac_typescript_definitions_1.StageID.DROSS) &&
672
+ roomData.Subtype === isaac_typescript_definitions_1.DownpourRoomSubType.MIRROR);
673
+ }
674
+ exports.isMirrorRoom = isMirrorRoom;
675
+ /**
676
+ * Helper function to check if the provided room matches one of the given room shapes.
677
+ *
678
+ * This function is variadic, which means you can pass as many room shapes as you want to match for.
679
+ */
680
+ function isRoomShape(roomData, ...roomShapes) {
681
+ return roomShapes.includes(roomData.Shape);
682
+ }
683
+ exports.isRoomShape = isRoomShape;
684
+ /**
685
+ * Helper function to check if the provided room matches one of the given room types.
686
+ *
687
+ * This function is variadic, which means you can pass as many room types as you want to match for.
688
+ */
689
+ function isRoomType(roomData, ...roomTypes) {
690
+ return roomTypes.includes(roomData.Type);
691
+ }
692
+ exports.isRoomType = isRoomType;
693
+ /**
694
+ * Helper function for checking if the provided room is a secret exit that leads to a Repentance
695
+ * floor.
696
+ */
697
+ function isSecretExit(roomGridIndex) {
698
+ return roomGridIndex === isaac_typescript_definitions_1.GridRoom.SECRET_EXIT;
699
+ }
700
+ exports.isSecretExit = isSecretExit;
701
+ /**
702
+ * Helper function to detect if a room type is a Secret Room, a Super Secret Room, or an Ultra
703
+ * Secret Room.
704
+ */
705
+ function isSecretRoomType(roomType) {
706
+ return SECRET_ROOM_TYPES.has(roomType);
707
+ }
708
+ exports.isSecretRoomType = isSecretRoomType;
709
+ /**
710
+ * Helper function for checking if the provided room is a secret shop (from the Member Card
711
+ * collectible).
712
+ *
713
+ * Secret shops are simply copies of normal shops, but with the backdrop of a secret room. In other
714
+ * words, they will have the same room type, room variant, and room sub-type of a normal shop. Thus,
715
+ * the only way to detect them is by using the grid index.
716
+ */
717
+ function isSecretShop(roomGridIndex) {
718
+ return roomGridIndex === isaac_typescript_definitions_1.GridRoom.SECRET_SHOP;
719
+ }
720
+ exports.isSecretShop = isSecretShop;
721
+ /**
722
+ * If the `Room.Update` method is called in a `POST_NEW_ROOM` callback, then some entities will
723
+ * slide around (such as the player). Since those entity velocities are already at zero, setting
724
+ * them to zero will have no effect. Thus, a generic solution is to record all of the entity
725
+ * positions/velocities before updating the room, and then restore those positions/velocities.
726
+ */
727
+ function roomUpdateSafe() {
728
+ const room = cachedClasses_1.game.GetRoom();
729
+ const entities = (0, entities_1.getEntities)();
730
+ const entityPositions = (0, positionVelocity_1.getEntityPositions)(entities);
731
+ const entityVelocities = (0, positionVelocity_1.getEntityVelocities)(entities);
732
+ room.Update();
733
+ (0, positionVelocity_1.setEntityPositions)(entityPositions, entities);
734
+ (0, positionVelocity_1.setEntityVelocities)(entityVelocities, entities);
735
+ }
736
+ exports.roomUpdateSafe = roomUpdateSafe;
737
+ /** Helper function to set the backdrop (i.e. background) of the current room. */
738
+ function setBackdrop(backdropType) {
739
+ cachedClasses_1.game.ShowHallucination(0, backdropType);
740
+ cachedClasses_1.sfxManager.Stop(isaac_typescript_definitions_1.SoundEffect.DEATH_CARD);
741
+ }
742
+ exports.setBackdrop = setBackdrop;
743
+ /**
744
+ * Helper function to convert an uncleared room to a cleared room in the `POST_NEW_ROOM` callback.
745
+ * This is useful because if enemies are removed in this callback, a room drop will be awarded and
746
+ * the doors will start closed and then open.
747
+ */
748
+ function setRoomCleared() {
749
+ const room = cachedClasses_1.game.GetRoom();
750
+ const roomClear = room.IsClear();
751
+ // If the room is already cleared, we don't have to do anything.
752
+ if (roomClear) {
753
+ return;
754
+ }
755
+ room.SetClear(true);
756
+ for (const door of (0, doors_1.getDoors)()) {
757
+ if ((0, doors_1.isHiddenSecretRoomDoor)(door)) {
758
+ continue;
759
+ }
760
+ // We don't use the `EntityDoor.Open` method since that will cause the door to play an
761
+ // animation.
762
+ (0, doors_1.openDoorFast)(door);
763
+ // If this is a mini-boss room, then the door would be barred in addition to being closed.
764
+ // Ensure that the bar is not visible.
765
+ door.ExtraVisible = false;
766
+ }
767
+ cachedClasses_1.sfxManager.Stop(isaac_typescript_definitions_1.SoundEffect.DOOR_HEAVY_OPEN);
768
+ // If the room contained Mom's Hands, then a screen shake will be queued. Override it with a 0
769
+ // frame shake.
770
+ cachedClasses_1.game.ShakeScreen(0);
771
+ }
772
+ exports.setRoomCleared = setRoomCleared;
773
+ /**
774
+ * Helper function to emulate what happens when you bomb an Angel Statue or push a Reward Plate that
775
+ * spawns an NPC.
776
+ */
777
+ function setRoomUncleared() {
778
+ const room = cachedClasses_1.game.GetRoom();
779
+ room.SetClear(false);
780
+ (0, doors_1.closeAllDoors)();
781
+ }
782
+ exports.setRoomUncleared = setRoomUncleared;